From 1c40e27686ee5c3f163ea829bf47e9f5032e1ff1 Mon Sep 17 00:00:00 2001 From: Claes Mogren Date: Tue, 26 Mar 2019 17:38:55 -0700 Subject: [PATCH] dep ensure on the version bump of operator-framework --- vendor/github.com/google/btree/.travis.yml | 1 + vendor/github.com/google/btree/LICENSE | 202 + vendor/github.com/google/btree/README.md | 12 + vendor/github.com/google/btree/btree.go | 890 ++ vendor/github.com/google/btree/btree_mem.go | 76 + vendor/github.com/google/btree/btree_test.go | 785 ++ .../gregjones/httpcache/.travis.yml | 18 + .../gregjones/httpcache/LICENSE.txt | 7 + .../github.com/gregjones/httpcache/README.md | 25 + .../httpcache/diskcache/diskcache.go | 61 + .../httpcache/diskcache/diskcache_test.go | 19 + .../gregjones/httpcache/httpcache.go | 551 ++ .../gregjones/httpcache/httpcache_test.go | 1475 ++++ .../httpcache/leveldbcache/leveldbcache.go | 51 + .../leveldbcache/leveldbcache_test.go | 25 + .../gregjones/httpcache/memcache/appengine.go | 61 + .../httpcache/memcache/appengine_test.go | 20 + .../gregjones/httpcache/memcache/memcache.go | 60 + .../httpcache/memcache/memcache_test.go | 24 + .../gregjones/httpcache/redis/redis.go | 43 + .../gregjones/httpcache/redis/redis_test.go | 19 + .../gregjones/httpcache/test/test.go | 35 + .../gregjones/httpcache/test/test_test.go | 12 + vendor/github.com/howeyc/gopass/.travis.yml | 11 - vendor/github.com/howeyc/gopass/LICENSE.txt | 15 - .../howeyc/gopass/OPENSOLARIS.LICENSE | 384 - vendor/github.com/howeyc/gopass/README.md | 27 - vendor/github.com/howeyc/gopass/pass.go | 110 - vendor/github.com/howeyc/gopass/pass_test.go | 225 - vendor/github.com/howeyc/gopass/terminal.go | 25 - .../howeyc/gopass/terminal_solaris.go | 69 - .../operator-sdk/.gitignore | 3 + .../operator-sdk/.travis.yml | 61 +- .../operator-sdk/CHANGELOG.md | 23 +- .../operator-sdk/Gopkg.lock | 294 +- .../operator-sdk/Gopkg.toml | 12 +- .../operator-sdk/MAINTAINERS | 19 +- .../operator-framework/operator-sdk/Makefile | 58 +- .../operator-framework/operator-sdk/README.md | 7 + .../commands/operator-sdk/cmd/build.go | 169 +- .../commands/operator-sdk/cmd/build_test.go | 116 + .../commands/operator-sdk/cmd/cmdutil/util.go | 52 +- .../commands/operator-sdk/cmd/generate.go | 1 + .../commands/operator-sdk/cmd/generate/crd.go | 107 + .../commands/operator-sdk/cmd/new.go | 69 +- .../commands/operator-sdk/cmd/test.go | 70 +- .../commands/operator-sdk/cmd/test/cluster.go | 159 + .../commands/operator-sdk/cmd/test/local.go | 126 + .../commands/operator-sdk/cmd/up/local.go | 55 +- .../doc/ansible/project_layout.md | 12 + .../operator-sdk/doc/ansible/user-guide.md | 337 + .../doc/proposals/ansible-operator.md | 78 + .../doc/proposals/leader-for-life.md | 58 + .../operator-sdk/doc/release-versioning.md | 124 + .../operator-sdk/doc/sdk-cli-reference.md | 94 +- .../doc/test-framework/writing-e2e-tests.md | 118 +- .../operator-sdk/doc/user-guide.md | 73 +- .../memcached-operator/handler.go.tmpl | 27 +- .../operator-sdk/hack/ci/setup-minikube.sh | 11 + .../operator-sdk/hack/ci/setup-openshift.sh | 15 + .../pkg/ansible/controller/controller.go | 83 + .../pkg/ansible/controller/reconcile.go | 222 + .../pkg/ansible/controller/types.go | 136 + .../pkg/ansible/events/log_events.go | 97 + .../pkg/ansible/operator/operator.go | 51 + .../pkg/ansible/paramconv/paramconv.go | 164 + .../ansible/proxy/kubeconfig/kubeconfig.go | 101 + .../operator-sdk/pkg/ansible/proxy/kubectl.go | 265 + .../operator-sdk/pkg/ansible/proxy/proxy.go | 135 + .../pkg/ansible/runner/eventapi/eventapi.go | 184 + .../pkg/ansible/runner/eventapi/types.go | 76 + .../runner/internal/inputdir/inputdir.go | 123 + .../operator-sdk/pkg/ansible/runner/runner.go | 303 + .../operator-sdk/pkg/generator/generator.go | 321 +- .../pkg/generator/generator_test.go | 238 +- .../operator-sdk/pkg/generator/templates.go | 187 +- .../operator-sdk/pkg/k8sclient/client.go | 51 +- .../operator-sdk/pkg/leader/doc.go | 46 + .../operator-sdk/pkg/leader/leader.go | 187 + .../operator-sdk/pkg/sdk/action.go | 10 +- .../operator-sdk/pkg/sdk/api.go | 2 +- .../operator-sdk/pkg/sdk/informer-sync.go | 5 +- .../operator-sdk/pkg/sdk/informer.go | 12 +- .../operator-sdk/pkg/sdk/watch-opt.go | 9 +- .../operator-sdk/pkg/test/client.go | 106 + .../operator-sdk/pkg/test/context.go | 40 +- .../operator-sdk/pkg/test/framework.go | 75 +- .../operator-sdk/pkg/test/main_entry.go | 19 +- .../operator-sdk/pkg/test/resource_creator.go | 31 +- .../operator-sdk/pkg/tlsutil/error.go | 24 + .../operator-sdk/pkg/tlsutil/tls.go | 234 +- .../operator-sdk/pkg/util/k8sutil/k8sutil.go | 17 +- .../operator-sdk/release.sh | 42 + .../test/ansible-memcached/defaults.yml | 1 + .../ansible-memcached/memfin/tasks/main.yml | 2 + .../test/ansible-memcached/tasks.yml | 37 + .../ansible-memcached/watches-finalizer.yaml | 3 + .../test/ansible-operator/Dockerfile | 24 + .../test/ansible-operator/README.md | 2 + .../test/ansible-operator/bin/entrypoint | 12 + .../test/ansible-operator/bin/user_setup | 13 + .../cmd/ansible-operator/main.go | 91 + .../test/e2e/e2eutil/check_util.go | 3 +- .../test/e2e/e2eutil/retry_util.go | 62 - .../test/e2e/framework/framework.go | 76 +- .../test/e2e/framework/resource_creator.go | 108 +- .../e2e/incluster-test-code/main_test.go.tmpl | 25 + .../memcached_test.go.tmpl | 124 + .../operator-sdk/test/e2e/memcached_test.go | 169 +- .../test/e2e/testdata/ca-csr.json | 17 + .../operator-sdk/test/e2e/testdata/ca.crt | 21 + .../operator-sdk/test/e2e/testdata/ca.csr | 16 + .../operator-sdk/test/e2e/testdata/ca.key | 27 + .../test/e2e/testdata/gencert.json | 13 + .../operator-sdk/test/e2e/testdata/gencert.sh | 18 + .../operator-sdk/test/e2e/tls_util_test.go | 337 + .../operator-sdk/test/test-ansible.sh | 48 + .../test-framework/deploy/namespace-init.yaml | 87 + .../test/test-framework/deploy/operator.yaml | 1 + .../test/test-framework/deploy/rbac.yaml | 4 +- .../test/test-framework/deploy/sa.yaml | 4 + .../test/test-framework/memcached_test.go | 19 +- .../operator-sdk/test/test-go.sh | 28 + .../operator-sdk/version/version.go | 2 +- vendor/github.com/petar/GoLLRB/.gitignore | 23 + vendor/github.com/petar/GoLLRB/AUTHORS | 4 + vendor/github.com/petar/GoLLRB/LICENSE | 27 + vendor/github.com/petar/GoLLRB/README.md | 66 + .../petar/GoLLRB/doc/Sedgewick-LLRB.pdf | Bin 0 -> 819932 bytes .../GoLLRB/doc/Sedgewick-RedBlackBST.java | 475 ++ .../GoLLRB/doc/Sedgewick-Talk-Penn2008.pdf | Bin 0 -> 11636171 bytes vendor/github.com/petar/GoLLRB/example/ex1.go | 26 + vendor/github.com/petar/GoLLRB/llrb/avgvar.go | 39 + .../github.com/petar/GoLLRB/llrb/iterator.go | 93 + .../petar/GoLLRB/llrb/iterator_test.go | 76 + .../petar/GoLLRB/llrb/llrb-stats.go | 46 + vendor/github.com/petar/GoLLRB/llrb/llrb.go | 456 + .../github.com/petar/GoLLRB/llrb/llrb_test.go | 239 + vendor/github.com/petar/GoLLRB/llrb/util.go | 17 + vendor/github.com/peterbourgon/diskv/LICENSE | 19 + .../github.com/peterbourgon/diskv/README.md | 141 + .../peterbourgon/diskv/basic_test.go | 336 + .../peterbourgon/diskv/compression.go | 64 + .../peterbourgon/diskv/compression_test.go | 72 + vendor/github.com/peterbourgon/diskv/diskv.go | 624 ++ .../examples/content-addressable-store/cas.go | 63 + .../super-simple-store/super-simple-store.go | 30 + .../peterbourgon/diskv/import_test.go | 76 + vendor/github.com/peterbourgon/diskv/index.go | 115 + .../peterbourgon/diskv/index_test.go | 148 + .../peterbourgon/diskv/issues_test.go | 121 + .../peterbourgon/diskv/keys_test.go | 231 + .../peterbourgon/diskv/speed_test.go | 153 + .../peterbourgon/diskv/stream_test.go | 117 + vendor/k8s.io/api/Godeps/Godeps.json | 408 +- vendor/k8s.io/api/SECURITY_CONTACTS | 17 + vendor/k8s.io/api/admission/v1beta1/BUILD | 43 - .../api/admission/v1beta1/generated.pb.go | 2 +- .../api/admission/v1beta1/generated.proto | 2 +- .../v1beta1/types_swagger_doc_generated.go | 4 +- .../v1beta1/zz_generated.deepcopy.go | 2 +- .../api/admissionregistration/v1alpha1/BUILD | 44 - .../v1alpha1/generated.pb.go | 2 +- .../v1alpha1/generated.proto | 2 +- .../v1alpha1/types_swagger_doc_generated.go | 4 +- .../v1alpha1/zz_generated.deepcopy.go | 2 +- .../api/admissionregistration/v1beta1/BUILD | 44 - .../v1beta1/generated.pb.go | 2 +- .../v1beta1/generated.proto | 6 +- .../admissionregistration/v1beta1/types.go | 4 +- .../v1beta1/types_swagger_doc_generated.go | 6 +- .../v1beta1/zz_generated.deepcopy.go | 2 +- vendor/k8s.io/api/apps/v1/BUILD | 43 - vendor/k8s.io/api/apps/v1/generated.pb.go | 2 +- vendor/k8s.io/api/apps/v1/generated.proto | 12 +- vendor/k8s.io/api/apps/v1/types.go | 16 +- .../apps/v1/types_swagger_doc_generated.go | 8 +- .../api/apps/v1/zz_generated.deepcopy.go | 2 +- vendor/k8s.io/api/apps/v1beta1/BUILD | 47 - .../k8s.io/api/apps/v1beta1/generated.pb.go | 2 +- .../k8s.io/api/apps/v1beta1/generated.proto | 12 +- vendor/k8s.io/api/apps/v1beta1/types.go | 16 +- .../v1beta1/types_swagger_doc_generated.go | 8 +- .../api/apps/v1beta1/zz_generated.deepcopy.go | 2 +- vendor/k8s.io/api/apps/v1beta2/BUILD | 47 - .../k8s.io/api/apps/v1beta2/generated.pb.go | 2 +- .../k8s.io/api/apps/v1beta2/generated.proto | 12 +- vendor/k8s.io/api/apps/v1beta2/types.go | 16 +- .../v1beta2/types_swagger_doc_generated.go | 8 +- .../api/apps/v1beta2/zz_generated.deepcopy.go | 2 +- vendor/k8s.io/api/authentication/v1/BUILD | 46 - .../api/authentication/v1/generated.pb.go | 2 +- .../api/authentication/v1/generated.proto | 2 +- .../v1/types_swagger_doc_generated.go | 4 +- .../v1/zz_generated.deepcopy.go | 2 +- .../k8s.io/api/authentication/v1beta1/BUILD | 45 - .../authentication/v1beta1/generated.pb.go | 2 +- .../authentication/v1beta1/generated.proto | 2 +- .../v1beta1/types_swagger_doc_generated.go | 4 +- .../v1beta1/zz_generated.deepcopy.go | 2 +- vendor/k8s.io/api/authorization/v1/BUILD | 45 - .../api/authorization/v1/generated.pb.go | 2 +- .../api/authorization/v1/generated.proto | 2 +- .../v1/types_swagger_doc_generated.go | 4 +- .../authorization/v1/zz_generated.deepcopy.go | 2 +- vendor/k8s.io/api/authorization/v1beta1/BUILD | 45 - .../api/authorization/v1beta1/generated.pb.go | 2 +- .../api/authorization/v1beta1/generated.proto | 2 +- .../v1beta1/types_swagger_doc_generated.go | 4 +- .../v1beta1/zz_generated.deepcopy.go | 2 +- vendor/k8s.io/api/autoscaling/v1/BUILD | 46 - .../k8s.io/api/autoscaling/v1/generated.pb.go | 2 +- .../k8s.io/api/autoscaling/v1/generated.proto | 2 +- .../v1/types_swagger_doc_generated.go | 4 +- .../autoscaling/v1/zz_generated.deepcopy.go | 2 +- vendor/k8s.io/api/autoscaling/v2beta1/BUILD | 46 - .../api/autoscaling/v2beta1/generated.pb.go | 2 +- .../api/autoscaling/v2beta1/generated.proto | 2 +- .../v2beta1/types_swagger_doc_generated.go | 4 +- .../v2beta1/zz_generated.deepcopy.go | 2 +- vendor/k8s.io/api/batch/v1/BUILD | 45 - vendor/k8s.io/api/batch/v1/generated.pb.go | 2 +- vendor/k8s.io/api/batch/v1/generated.proto | 2 +- .../batch/v1/types_swagger_doc_generated.go | 4 +- .../api/batch/v1/zz_generated.deepcopy.go | 2 +- vendor/k8s.io/api/batch/v1beta1/BUILD | 46 - .../k8s.io/api/batch/v1beta1/generated.pb.go | 2 +- .../k8s.io/api/batch/v1beta1/generated.proto | 2 +- .../v1beta1/types_swagger_doc_generated.go | 4 +- .../batch/v1beta1/zz_generated.deepcopy.go | 2 +- vendor/k8s.io/api/batch/v2alpha1/BUILD | 46 - .../k8s.io/api/batch/v2alpha1/generated.pb.go | 2 +- .../k8s.io/api/batch/v2alpha1/generated.proto | 2 +- .../v2alpha1/types_swagger_doc_generated.go | 4 +- .../batch/v2alpha1/zz_generated.deepcopy.go | 2 +- vendor/k8s.io/api/certificates/v1beta1/BUILD | 45 - .../api/certificates/v1beta1/generated.pb.go | 2 +- .../api/certificates/v1beta1/generated.proto | 2 +- .../v1beta1/types_swagger_doc_generated.go | 4 +- .../v1beta1/zz_generated.deepcopy.go | 2 +- vendor/k8s.io/api/core/v1/BUILD | 64 - .../api/core/v1/annotation_key_constants.go | 21 +- vendor/k8s.io/api/core/v1/generated.pb.go | 7398 +++++++++-------- vendor/k8s.io/api/core/v1/generated.proto | 529 +- vendor/k8s.io/api/core/v1/meta.go | 108 - vendor/k8s.io/api/core/v1/register.go | 1 - vendor/k8s.io/api/core/v1/resource.go | 7 - vendor/k8s.io/api/core/v1/types.go | 618 +- .../core/v1/types_swagger_doc_generated.go | 212 +- .../api/core/v1/zz_generated.deepcopy.go | 447 +- vendor/k8s.io/api/events/v1beta1/BUILD | 42 - .../k8s.io/api/events/v1beta1/generated.pb.go | 2 +- .../k8s.io/api/events/v1beta1/generated.proto | 2 +- .../v1beta1/types_swagger_doc_generated.go | 4 +- .../events/v1beta1/zz_generated.deepcopy.go | 2 +- vendor/k8s.io/api/extensions/v1beta1/BUILD | 49 - .../api/extensions/v1beta1/generated.pb.go | 592 +- .../api/extensions/v1beta1/generated.proto | 138 +- vendor/k8s.io/api/extensions/v1beta1/types.go | 170 +- .../v1beta1/types_swagger_doc_generated.go | 81 +- .../v1beta1/zz_generated.deepcopy.go | 12 +- vendor/k8s.io/api/imagepolicy/v1alpha1/BUILD | 45 - .../api/imagepolicy/v1alpha1/generated.pb.go | 2 +- .../api/imagepolicy/v1alpha1/generated.proto | 2 +- .../v1alpha1/types_swagger_doc_generated.go | 4 +- .../v1alpha1/zz_generated.deepcopy.go | 2 +- vendor/k8s.io/api/networking/v1/BUILD | 46 - .../k8s.io/api/networking/v1/generated.pb.go | 2 +- .../k8s.io/api/networking/v1/generated.proto | 27 +- vendor/k8s.io/api/networking/v1/types.go | 25 +- .../v1/types_swagger_doc_generated.go | 12 +- .../networking/v1/zz_generated.deepcopy.go | 2 +- vendor/k8s.io/api/policy/v1beta1/BUILD | 47 - .../k8s.io/api/policy/v1beta1/generated.pb.go | 346 +- .../k8s.io/api/policy/v1beta1/generated.proto | 105 +- vendor/k8s.io/api/policy/v1beta1/types.go | 121 +- .../v1beta1/types_swagger_doc_generated.go | 69 +- .../policy/v1beta1/zz_generated.deepcopy.go | 12 +- vendor/k8s.io/api/rbac/v1/BUILD | 44 - vendor/k8s.io/api/rbac/v1/generated.pb.go | 2 +- vendor/k8s.io/api/rbac/v1/generated.proto | 4 +- vendor/k8s.io/api/rbac/v1/types.go | 6 +- .../rbac/v1/types_swagger_doc_generated.go | 4 +- .../api/rbac/v1/zz_generated.deepcopy.go | 2 +- vendor/k8s.io/api/rbac/v1alpha1/BUILD | 44 - .../k8s.io/api/rbac/v1alpha1/generated.pb.go | 2 +- .../k8s.io/api/rbac/v1alpha1/generated.proto | 4 +- vendor/k8s.io/api/rbac/v1alpha1/types.go | 6 +- .../v1alpha1/types_swagger_doc_generated.go | 4 +- .../rbac/v1alpha1/zz_generated.deepcopy.go | 2 +- vendor/k8s.io/api/rbac/v1beta1/BUILD | 44 - .../k8s.io/api/rbac/v1beta1/generated.pb.go | 2 +- .../k8s.io/api/rbac/v1beta1/generated.proto | 4 +- vendor/k8s.io/api/rbac/v1beta1/types.go | 6 +- .../v1beta1/types_swagger_doc_generated.go | 4 +- .../api/rbac/v1beta1/zz_generated.deepcopy.go | 2 +- vendor/k8s.io/api/roundtrip_test.go | 150 + vendor/k8s.io/api/scheduling/v1alpha1/BUILD | 44 - .../api/scheduling/v1alpha1/generated.pb.go | 2 +- .../api/scheduling/v1alpha1/generated.proto | 2 +- .../v1alpha1/types_swagger_doc_generated.go | 4 +- .../v1alpha1/zz_generated.deepcopy.go | 2 +- .../scheduling/v1beta1}/doc.go | 11 +- .../api/scheduling/v1beta1/generated.pb.go | 641 ++ .../api/scheduling/v1beta1/generated.proto | 68 + .../k8s.io/api/scheduling/v1beta1/register.go | 52 + vendor/k8s.io/api/scheduling/v1beta1/types.go | 66 + .../v1beta1/types_swagger_doc_generated.go | 52 + .../v1beta1/zz_generated.deepcopy.go | 84 + vendor/k8s.io/api/settings/v1alpha1/BUILD | 45 - .../api/settings/v1alpha1/generated.pb.go | 2 +- .../api/settings/v1alpha1/generated.proto | 2 +- .../v1alpha1/types_swagger_doc_generated.go | 4 +- .../v1alpha1/zz_generated.deepcopy.go | 2 +- vendor/k8s.io/api/storage/v1/BUILD | 43 - vendor/k8s.io/api/storage/v1/generated.pb.go | 136 +- vendor/k8s.io/api/storage/v1/generated.proto | 11 +- vendor/k8s.io/api/storage/v1/types.go | 8 + .../storage/v1/types_swagger_doc_generated.go | 5 +- .../api/storage/v1/zz_generated.deepcopy.go | 9 +- vendor/k8s.io/api/storage/v1alpha1/BUILD | 42 - .../api/storage/v1alpha1/generated.pb.go | 2 +- .../api/storage/v1alpha1/generated.proto | 2 +- .../v1alpha1/types_swagger_doc_generated.go | 4 +- .../storage/v1alpha1/zz_generated.deepcopy.go | 2 +- vendor/k8s.io/api/storage/v1beta1/BUILD | 43 - .../api/storage/v1beta1/generated.pb.go | 180 +- .../api/storage/v1beta1/generated.proto | 10 +- vendor/k8s.io/api/storage/v1beta1/types.go | 8 + .../v1beta1/types_swagger_doc_generated.go | 5 +- .../storage/v1beta1/zz_generated.deepcopy.go | 9 +- vendor/k8s.io/apimachinery/Godeps/Godeps.json | 360 +- vendor/k8s.io/apimachinery/SECURITY_CONTACTS | 17 + .../apimachinery/pkg/api/equality/BUILD | 32 - .../k8s.io/apimachinery/pkg/api/errors/BUILD | 47 - vendor/k8s.io/apimachinery/pkg/api/meta/BUILD | 72 - .../apimachinery/pkg/api/meta/interfaces.go | 21 +- .../k8s.io/apimachinery/pkg/api/meta/lazy.go | 25 +- .../k8s.io/apimachinery/pkg/api/meta/meta.go | 3 - .../apimachinery/pkg/api/meta/priority.go | 30 +- .../pkg/api/meta/priority_test.go | 63 + .../apimachinery/pkg/api/meta/restmapper.go | 38 +- .../pkg/api/meta/restmapper_test.go | 95 +- .../apimachinery/pkg/api/meta/table/BUILD | 29 - .../apimachinery/pkg/api/meta/table/table.go | 6 +- .../meta/testrestmapper/test_restmapper.go | 171 + .../apimachinery/pkg/api/meta/unstructured.go | 47 - .../apimachinery/pkg/api/resource/BUILD | 69 - .../pkg/api/resource/generated.pb.go | 2 +- .../pkg/api/resource/generated.proto | 2 +- .../apimachinery/pkg/api/resource/quantity.go | 42 - .../pkg/api/resource/quantity_test.go | 16 - .../pkg/api/resource/zz_generated.deepcopy.go | 2 +- .../k8s.io/apimachinery/pkg/api/testing/BUILD | 35 - .../apimachinery/pkg/api/testing/fuzzer/BUILD | 39 - .../pkg/api/testing/roundtrip/BUILD | 45 - .../pkg/api/testing/roundtrip/roundtrip.go | 30 +- .../apimachinery/pkg/api/validation/BUILD | 53 - .../pkg/api/validation/objectmeta.go | 39 +- .../pkg/api/validation/objectmeta_test.go | 24 +- .../pkg/api/validation/path/BUILD | 32 - .../apimachinery/pkg/apimachinery/BUILD | 45 - .../pkg/apimachinery/announced/BUILD | 45 - .../pkg/apimachinery/announced/announced.go | 99 - .../apimachinery/announced/announced_test.go | 64 - .../apimachinery/announced/group_factory.go | 255 - .../pkg/apimachinery/registered/BUILD | 43 - .../pkg/apimachinery/registered/registered.go | 336 - .../registered/registered_test.go | 71 - .../apimachinery/pkg/apimachinery/types.go | 87 - .../pkg/apimachinery/types_test.go | 43 - .../apimachinery/pkg/apis/meta/fuzzer/BUILD | 36 - .../pkg/apis/meta/fuzzer/fuzzer.go | 39 +- .../pkg/apis/meta/internalversion/BUILD | 59 - .../zz_generated.conversion.go | 2 +- .../internalversion/zz_generated.deepcopy.go | 2 +- .../apimachinery/pkg/apis/meta/v1/BUILD | 101 - .../pkg/apis/meta/v1/conversion.go | 12 + .../pkg/apis/meta/v1/conversion_test.go | 35 + .../apimachinery/pkg/apis/meta/v1/duration.go | 5 +- .../pkg/apis/meta/v1/generated.pb.go | 2 +- .../pkg/apis/meta/v1/generated.proto | 3 +- .../pkg/apis/meta/v1/group_version_test.go | 5 +- .../pkg/apis/meta/v1/micro_time.go | 5 +- .../apimachinery/pkg/apis/meta/v1/time.go | 5 +- .../apimachinery/pkg/apis/meta/v1/types.go | 3 +- .../meta/v1/types_swagger_doc_generated.go | 4 +- .../pkg/apis/meta/v1/types_test.go | 7 +- .../pkg/apis/meta/v1/unstructured/BUILD | 53 - .../pkg/apis/meta/v1/unstructured/helpers.go | 66 +- .../apis/meta/v1/unstructured/helpers_test.go | 76 + .../apis/meta/v1/unstructured/unstructured.go | 24 +- .../meta/v1/unstructured/unstructured_list.go | 17 +- .../meta/v1/unstructured/unstructured_test.go | 32 + .../unstructured/unstructuredscheme/scheme.go | 129 + .../v1/unstructured/zz_generated.deepcopy.go | 2 +- .../pkg/apis/meta/v1/validation/BUILD | 38 - .../pkg/apis/meta/v1/validation/validation.go | 6 +- .../pkg/apis/meta/v1/zz_generated.deepcopy.go | 2 +- .../pkg/apis/meta/v1/zz_generated.defaults.go | 2 +- .../apimachinery/pkg/apis/meta/v1beta1/BUILD | 45 - .../pkg/apis/meta/v1beta1/deepcopy.go | 23 +- .../pkg/apis/meta/v1beta1/generated.pb.go | 2 +- .../pkg/apis/meta/v1beta1/generated.proto | 2 +- .../pkg/apis/meta/v1beta1/types.go | 4 +- .../v1beta1/types_swagger_doc_generated.go | 6 +- .../meta/v1beta1/zz_generated.deepcopy.go | 2 +- .../meta/v1beta1/zz_generated.defaults.go | 2 +- .../apimachinery/pkg/apis/testapigroup/BUILD | 40 - .../pkg/apis/testapigroup/fuzzer/BUILD | 34 - .../pkg/apis/testapigroup/install/BUILD | 43 - .../pkg/apis/testapigroup/install/install.go | 20 +- .../pkg/apis/testapigroup/v1/BUILD | 50 - .../pkg/apis/testapigroup/v1/generated.pb.go | 2 +- .../pkg/apis/testapigroup/v1/generated.proto | 2 +- .../v1/zz_generated.conversion.go | 2 +- .../testapigroup/v1/zz_generated.deepcopy.go | 2 +- .../testapigroup/v1/zz_generated.defaults.go | 2 +- .../testapigroup/zz_generated.deepcopy.go | 2 +- .../k8s.io/apimachinery/pkg/conversion/BUILD | 49 - .../pkg/conversion/queryparams/BUILD | 39 - .../pkg/conversion/queryparams/convert.go | 3 + .../conversion/queryparams/convert_test.go | 6 +- vendor/k8s.io/apimachinery/pkg/fields/BUILD | 41 - .../apimachinery/pkg/fields/selector.go | 21 + vendor/k8s.io/apimachinery/pkg/labels/BUILD | 50 - .../pkg/labels/zz_generated.deepcopy.go | 2 +- vendor/k8s.io/apimachinery/pkg/runtime/BUILD | 98 - .../apimachinery/pkg/runtime/converter.go | 26 +- .../k8s.io/apimachinery/pkg/runtime/error.go | 8 + .../apimachinery/pkg/runtime/generated.pb.go | 2 +- .../apimachinery/pkg/runtime/generated.proto | 2 +- .../apimachinery/pkg/runtime/interfaces.go | 17 +- .../pkg/runtime/local_scheme_test.go | 150 + .../apimachinery/pkg/runtime/schema/BUILD | 43 - .../pkg/runtime/schema/generated.pb.go | 2 +- .../pkg/runtime/schema/generated.proto | 2 +- .../pkg/runtime/schema/group_version_test.go | 44 + .../k8s.io/apimachinery/pkg/runtime/scheme.go | 146 +- .../apimachinery/pkg/runtime/serializer/BUILD | 64 - .../pkg/runtime/serializer/json/BUILD | 55 - .../pkg/runtime/serializer/json/json.go | 27 +- .../pkg/runtime/serializer/json/json_test.go | 45 +- .../pkg/runtime/serializer/protobuf/BUILD | 35 - .../pkg/runtime/serializer/recognizer/BUILD | 32 - .../serializer/recognizer/testing/BUILD | 30 - .../pkg/runtime/serializer/sparse_test.go | 91 + .../pkg/runtime/serializer/streaming/BUILD | 41 - .../pkg/runtime/serializer/testing/BUILD | 33 - .../testing/zz_generated.deepcopy.go | 2 +- .../pkg/runtime/serializer/versioning/BUILD | 41 - .../serializer/versioning/versioning.go | 23 +- .../serializer/versioning/versioning_test.go | 16 +- .../pkg/runtime/serializer/yaml/BUILD | 30 - .../apimachinery/pkg/runtime/testing/BUILD | 34 - .../apimachinery/pkg/runtime/testing/types.go | 2 +- .../runtime/testing/zz_generated.deepcopy.go | 2 +- .../pkg/runtime/zz_generated.deepcopy.go | 2 +- .../k8s.io/apimachinery/pkg/selection/BUILD | 25 - vendor/k8s.io/apimachinery/pkg/test/BUILD | 65 - .../pkg/test/zz_generated.deepcopy.go | 2 +- vendor/k8s.io/apimachinery/pkg/types/BUILD | 31 - .../apimachinery/pkg/types/namespacedname.go | 17 - .../k8s.io/apimachinery/pkg/util/cache/BUILD | 43 - .../k8s.io/apimachinery/pkg/util/clock/BUILD | 32 - .../apimachinery/pkg/util/clock/clock.go | 63 +- .../apimachinery/pkg/util/clock/clock_test.go | 18 +- .../k8s.io/apimachinery/pkg/util/diff/BUILD | 36 - .../k8s.io/apimachinery/pkg/util/diff/diff.go | 44 +- .../apimachinery/pkg/util/diff/diff_test.go | 47 + .../apimachinery/pkg/util/duration/BUILD | 22 - .../k8s.io/apimachinery/pkg/util/errors/BUILD | 35 - .../k8s.io/apimachinery/pkg/util/framer/BUILD | 32 - .../apimachinery/pkg/util/httpstream/BUILD | 38 - .../pkg/util/httpstream/spdy/BUILD | 56 - .../pkg/util/httpstream/spdy/roundtripper.go | 12 +- .../util/httpstream/spdy/roundtripper_test.go | 2 +- .../pkg/util/initialization/BUILD | 27 - .../k8s.io/apimachinery/pkg/util/intstr/BUILD | 47 - .../pkg/util/intstr/generated.pb.go | 2 +- .../pkg/util/intstr/generated.proto | 2 +- .../k8s.io/apimachinery/pkg/util/json/BUILD | 32 - .../pkg/util/jsonmergepatch/BUILD | 43 - .../pkg/util/jsonmergepatch/patch.go | 18 +- .../pkg/util/jsonmergepatch/patch_test.go | 53 +- .../apimachinery/pkg/util/mergepatch/BUILD | 39 - vendor/k8s.io/apimachinery/pkg/util/net/BUILD | 50 - .../k8s.io/apimachinery/pkg/util/net/http.go | 12 +- .../apimachinery/pkg/util/net/port_range.go | 66 +- .../pkg/util/net/port_range_test.go | 12 +- .../k8s.io/apimachinery/pkg/util/proxy/BUILD | 61 - .../apimachinery/pkg/util/proxy/dial.go | 12 +- .../apimachinery/pkg/util/proxy/dial_test.go | 16 +- .../pkg/util/proxy/upgradeaware.go | 2 +- .../pkg/util/proxy/upgradeaware_test.go | 20 +- .../k8s.io/apimachinery/pkg/util/rand/BUILD | 32 - .../apimachinery/pkg/util/remotecommand/BUILD | 26 - .../apimachinery/pkg/util/runtime/BUILD | 33 - .../apimachinery/pkg/util/runtime/runtime.go | 10 +- .../k8s.io/apimachinery/pkg/util/sets/BUILD | 71 - .../k8s.io/apimachinery/pkg/util/sets/byte.go | 6 +- .../k8s.io/apimachinery/pkg/util/sets/doc.go | 4 +- .../apimachinery/pkg/util/sets/empty.go | 4 +- .../k8s.io/apimachinery/pkg/util/sets/int.go | 6 +- .../apimachinery/pkg/util/sets/int64.go | 6 +- .../apimachinery/pkg/util/sets/string.go | 6 +- .../apimachinery/pkg/util/sets/types/BUILD | 25 - .../pkg/util/strategicpatch/BUILD | 60 - .../pkg/util/strategicpatch/patch.go | 23 + .../pkg/util/strategicpatch/testing/BUILD | 30 - .../k8s.io/apimachinery/pkg/util/uuid/BUILD | 29 - .../apimachinery/pkg/util/validation/BUILD | 37 - .../pkg/util/validation/field/BUILD | 42 - .../k8s.io/apimachinery/pkg/util/wait/BUILD | 37 - .../k8s.io/apimachinery/pkg/util/wait/wait.go | 22 +- .../apimachinery/pkg/util/waitgroup/BUILD | 31 - .../k8s.io/apimachinery/pkg/util/yaml/BUILD | 36 - vendor/k8s.io/apimachinery/pkg/version/BUILD | 28 - .../apimachinery/pkg/version/helpers.go | 88 + .../apimachinery/pkg/version/helpers_test.go | 52 + vendor/k8s.io/apimachinery/pkg/watch/BUILD | 69 - .../k8s.io/apimachinery/pkg/watch/filter.go | 6 +- vendor/k8s.io/apimachinery/pkg/watch/mux.go | 6 +- .../pkg/watch/zz_generated.deepcopy.go | 2 +- .../third_party/forked/golang/json/BUILD | 32 - .../third_party/forked/golang/netutil/BUILD | 25 - .../third_party/forked/golang/reflect/BUILD | 32 - .../forked/golang/reflect/deep_equal.go | 2 +- .../.github/PULL_REQUEST_TEMPLATE.md | 5 +- vendor/k8s.io/client-go/CHANGELOG.md | 113 + vendor/k8s.io/client-go/Godeps/Godeps.json | 248 +- vendor/k8s.io/client-go/OWNERS | 39 +- vendor/k8s.io/client-go/README.md | 28 +- vendor/k8s.io/client-go/SECURITY_CONTACTS | 17 + .../client-go/deprecated-dynamic/bad_debt.go | 79 + .../client-go/deprecated-dynamic/client.go | 131 + .../client_pool.go | 4 +- .../deprecated-dynamic/client_test.go | 623 ++ .../client-go/discovery/cached/memcache.go | 10 +- .../client-go/discovery/cached_discovery.go | 282 + .../discovery/cached_discovery_test.go | 169 + .../client-go/discovery/discovery_client.go | 122 +- .../discovery/discovery_client_test.go | 36 +- .../client-go/discovery/round_tripper.go | 51 + .../client-go/discovery/round_tripper_test.go | 95 + .../client-go/discovery/unstructured.go | 24 +- vendor/k8s.io/client-go/dynamic/client.go | 379 - .../k8s.io/client-go/dynamic/client_test.go | 297 +- .../k8s.io/client-go/dynamic/dynamic_util.go | 96 - .../client-go/dynamic/dynamic_util_test.go | 79 - .../k8s.io/client-go/dynamic/fake/client.go | 163 - .../client-go/dynamic/fake/client_pool.go | 48 - .../k8s.io/client-go/dynamic/fake/simple.go | 363 + vendor/k8s.io/client-go/dynamic/interface.go | 59 + vendor/k8s.io/client-go/dynamic/scheme.go | 98 + vendor/k8s.io/client-go/dynamic/simple.go | 287 + .../create-update-delete-deployment/main.go | 34 +- .../admissionregistration/interface.go | 2 +- .../v1alpha1/initializerconfiguration.go | 2 +- .../v1alpha1/interface.go | 2 +- .../v1beta1/interface.go | 2 +- .../v1beta1/mutatingwebhookconfiguration.go | 2 +- .../v1beta1/validatingwebhookconfiguration.go | 2 +- .../client-go/informers/apps/interface.go | 2 +- .../informers/apps/v1/controllerrevision.go | 2 +- .../client-go/informers/apps/v1/daemonset.go | 2 +- .../client-go/informers/apps/v1/deployment.go | 2 +- .../client-go/informers/apps/v1/interface.go | 2 +- .../client-go/informers/apps/v1/replicaset.go | 2 +- .../informers/apps/v1/statefulset.go | 2 +- .../apps/v1beta1/controllerrevision.go | 2 +- .../informers/apps/v1beta1/deployment.go | 2 +- .../informers/apps/v1beta1/interface.go | 2 +- .../informers/apps/v1beta1/statefulset.go | 2 +- .../apps/v1beta2/controllerrevision.go | 2 +- .../informers/apps/v1beta2/daemonset.go | 2 +- .../informers/apps/v1beta2/deployment.go | 2 +- .../informers/apps/v1beta2/interface.go | 2 +- .../informers/apps/v1beta2/replicaset.go | 2 +- .../informers/apps/v1beta2/statefulset.go | 2 +- .../informers/autoscaling/interface.go | 2 +- .../autoscaling/v1/horizontalpodautoscaler.go | 2 +- .../informers/autoscaling/v1/interface.go | 2 +- .../v2beta1/horizontalpodautoscaler.go | 2 +- .../autoscaling/v2beta1/interface.go | 2 +- .../client-go/informers/batch/interface.go | 2 +- .../client-go/informers/batch/v1/interface.go | 2 +- .../client-go/informers/batch/v1/job.go | 2 +- .../informers/batch/v1beta1/cronjob.go | 2 +- .../informers/batch/v1beta1/interface.go | 2 +- .../informers/batch/v2alpha1/cronjob.go | 2 +- .../informers/batch/v2alpha1/interface.go | 2 +- .../informers/certificates/interface.go | 2 +- .../v1beta1/certificatesigningrequest.go | 2 +- .../certificates/v1beta1/interface.go | 2 +- .../client-go/informers/core/interface.go | 2 +- .../informers/core/v1/componentstatus.go | 2 +- .../client-go/informers/core/v1/configmap.go | 2 +- .../client-go/informers/core/v1/endpoints.go | 2 +- .../client-go/informers/core/v1/event.go | 2 +- .../client-go/informers/core/v1/interface.go | 2 +- .../client-go/informers/core/v1/limitrange.go | 2 +- .../client-go/informers/core/v1/namespace.go | 2 +- .../client-go/informers/core/v1/node.go | 2 +- .../informers/core/v1/persistentvolume.go | 2 +- .../core/v1/persistentvolumeclaim.go | 2 +- .../k8s.io/client-go/informers/core/v1/pod.go | 2 +- .../informers/core/v1/podtemplate.go | 2 +- .../core/v1/replicationcontroller.go | 2 +- .../informers/core/v1/resourcequota.go | 2 +- .../client-go/informers/core/v1/secret.go | 2 +- .../client-go/informers/core/v1/service.go | 2 +- .../informers/core/v1/serviceaccount.go | 2 +- .../client-go/informers/events/interface.go | 2 +- .../informers/events/v1beta1/event.go | 2 +- .../informers/events/v1beta1/interface.go | 2 +- .../informers/extensions/interface.go | 2 +- .../informers/extensions/v1beta1/daemonset.go | 2 +- .../extensions/v1beta1/deployment.go | 2 +- .../informers/extensions/v1beta1/ingress.go | 2 +- .../informers/extensions/v1beta1/interface.go | 2 +- .../extensions/v1beta1/podsecuritypolicy.go | 2 +- .../extensions/v1beta1/replicaset.go | 2 +- vendor/k8s.io/client-go/informers/factory.go | 63 +- vendor/k8s.io/client-go/informers/generic.go | 7 +- .../internalinterfaces/factory_interfaces.go | 2 +- .../informers/networking/interface.go | 2 +- .../informers/networking/v1/interface.go | 2 +- .../informers/networking/v1/networkpolicy.go | 2 +- .../client-go/informers/policy/interface.go | 2 +- .../informers/policy/v1beta1/interface.go | 2 +- .../policy/v1beta1/poddisruptionbudget.go | 2 +- .../policy/v1beta1/podsecuritypolicy.go | 2 +- .../client-go/informers/rbac/interface.go | 2 +- .../informers/rbac/v1/clusterrole.go | 2 +- .../informers/rbac/v1/clusterrolebinding.go | 2 +- .../client-go/informers/rbac/v1/interface.go | 2 +- .../client-go/informers/rbac/v1/role.go | 2 +- .../informers/rbac/v1/rolebinding.go | 2 +- .../informers/rbac/v1alpha1/clusterrole.go | 2 +- .../rbac/v1alpha1/clusterrolebinding.go | 2 +- .../informers/rbac/v1alpha1/interface.go | 2 +- .../client-go/informers/rbac/v1alpha1/role.go | 2 +- .../informers/rbac/v1alpha1/rolebinding.go | 2 +- .../informers/rbac/v1beta1/clusterrole.go | 2 +- .../rbac/v1beta1/clusterrolebinding.go | 2 +- .../informers/rbac/v1beta1/interface.go | 2 +- .../client-go/informers/rbac/v1beta1/role.go | 2 +- .../informers/rbac/v1beta1/rolebinding.go | 2 +- .../informers/scheduling/interface.go | 10 +- .../scheduling/v1alpha1/interface.go | 2 +- .../scheduling/v1alpha1/priorityclass.go | 2 +- .../informers/scheduling/v1beta1/interface.go | 45 + .../scheduling/v1beta1/priorityclass.go | 88 + .../client-go/informers/settings/interface.go | 2 +- .../informers/settings/v1alpha1/interface.go | 2 +- .../informers/settings/v1alpha1/podpreset.go | 2 +- .../client-go/informers/storage/interface.go | 2 +- .../informers/storage/v1/interface.go | 2 +- .../informers/storage/v1/storageclass.go | 2 +- .../informers/storage/v1alpha1/interface.go | 2 +- .../storage/v1alpha1/volumeattachment.go | 2 +- .../informers/storage/v1beta1/interface.go | 2 +- .../informers/storage/v1beta1/storageclass.go | 2 +- .../storage/v1beta1/volumeattachment.go | 2 +- .../k8s.io/client-go/kubernetes/clientset.go | 24 +- vendor/k8s.io/client-go/kubernetes/doc.go | 2 +- .../kubernetes/fake/clientset_generated.go | 24 +- .../k8s.io/client-go/kubernetes/fake/doc.go | 2 +- .../client-go/kubernetes/fake/register.go | 4 +- .../k8s.io/client-go/kubernetes/scheme/doc.go | 2 +- .../client-go/kubernetes/scheme/register.go | 4 +- .../v1alpha1/admissionregistration_client.go | 2 +- .../admissionregistration/v1alpha1/doc.go | 2 +- .../v1alpha1/fake/doc.go | 2 +- .../fake/fake_admissionregistration_client.go | 2 +- .../fake/fake_initializerconfiguration.go | 4 +- .../v1alpha1/generated_expansion.go | 2 +- .../v1alpha1/initializerconfiguration.go | 2 +- .../v1beta1/admissionregistration_client.go | 2 +- .../admissionregistration/v1beta1/doc.go | 2 +- .../admissionregistration/v1beta1/fake/doc.go | 2 +- .../fake/fake_admissionregistration_client.go | 2 +- .../fake/fake_mutatingwebhookconfiguration.go | 4 +- .../fake_validatingwebhookconfiguration.go | 4 +- .../v1beta1/generated_expansion.go | 2 +- .../v1beta1/mutatingwebhookconfiguration.go | 2 +- .../v1beta1/validatingwebhookconfiguration.go | 2 +- .../kubernetes/typed/apps/v1/apps_client.go | 2 +- .../typed/apps/v1/controllerrevision.go | 2 +- .../kubernetes/typed/apps/v1/daemonset.go | 2 +- .../kubernetes/typed/apps/v1/deployment.go | 2 +- .../client-go/kubernetes/typed/apps/v1/doc.go | 2 +- .../kubernetes/typed/apps/v1/fake/doc.go | 2 +- .../typed/apps/v1/fake/fake_apps_client.go | 2 +- .../apps/v1/fake/fake_controllerrevision.go | 4 +- .../typed/apps/v1/fake/fake_daemonset.go | 4 +- .../typed/apps/v1/fake/fake_deployment.go | 4 +- .../typed/apps/v1/fake/fake_replicaset.go | 4 +- .../typed/apps/v1/fake/fake_statefulset.go | 4 +- .../typed/apps/v1/generated_expansion.go | 2 +- .../kubernetes/typed/apps/v1/replicaset.go | 2 +- .../kubernetes/typed/apps/v1/statefulset.go | 2 +- .../typed/apps/v1beta1/apps_client.go | 2 +- .../typed/apps/v1beta1/controllerrevision.go | 2 +- .../typed/apps/v1beta1/deployment.go | 2 +- .../kubernetes/typed/apps/v1beta1/doc.go | 2 +- .../kubernetes/typed/apps/v1beta1/fake/doc.go | 2 +- .../apps/v1beta1/fake/fake_apps_client.go | 2 +- .../v1beta1/fake/fake_controllerrevision.go | 4 +- .../apps/v1beta1/fake/fake_deployment.go | 4 +- .../typed/apps/v1beta1/fake/fake_scale.go | 2 +- .../apps/v1beta1/fake/fake_statefulset.go | 4 +- .../typed/apps/v1beta1/generated_expansion.go | 2 +- .../kubernetes/typed/apps/v1beta1/scale.go | 2 +- .../typed/apps/v1beta1/statefulset.go | 2 +- .../typed/apps/v1beta2/apps_client.go | 2 +- .../typed/apps/v1beta2/controllerrevision.go | 2 +- .../typed/apps/v1beta2/daemonset.go | 2 +- .../typed/apps/v1beta2/deployment.go | 2 +- .../kubernetes/typed/apps/v1beta2/doc.go | 2 +- .../kubernetes/typed/apps/v1beta2/fake/doc.go | 2 +- .../apps/v1beta2/fake/fake_apps_client.go | 2 +- .../v1beta2/fake/fake_controllerrevision.go | 4 +- .../typed/apps/v1beta2/fake/fake_daemonset.go | 4 +- .../apps/v1beta2/fake/fake_deployment.go | 4 +- .../apps/v1beta2/fake/fake_replicaset.go | 4 +- .../typed/apps/v1beta2/fake/fake_scale.go | 2 +- .../apps/v1beta2/fake/fake_statefulset.go | 4 +- .../typed/apps/v1beta2/generated_expansion.go | 2 +- .../typed/apps/v1beta2/replicaset.go | 2 +- .../kubernetes/typed/apps/v1beta2/scale.go | 2 +- .../typed/apps/v1beta2/statefulset.go | 2 +- .../v1/authentication_client.go | 2 +- .../kubernetes/typed/authentication/v1/doc.go | 2 +- .../typed/authentication/v1/fake/doc.go | 2 +- .../v1/fake/fake_authentication_client.go | 2 +- .../v1/fake/fake_tokenreview.go | 2 +- .../authentication/v1/generated_expansion.go | 2 +- .../typed/authentication/v1/tokenreview.go | 2 +- .../v1beta1/authentication_client.go | 2 +- .../typed/authentication/v1beta1/doc.go | 2 +- .../typed/authentication/v1beta1/fake/doc.go | 2 +- .../fake/fake_authentication_client.go | 2 +- .../v1beta1/fake/fake_tokenreview.go | 2 +- .../v1beta1/generated_expansion.go | 2 +- .../authentication/v1beta1/tokenreview.go | 2 +- .../authorization/v1/authorization_client.go | 2 +- .../kubernetes/typed/authorization/v1/doc.go | 2 +- .../typed/authorization/v1/fake/doc.go | 2 +- .../v1/fake/fake_authorization_client.go | 2 +- .../v1/fake/fake_localsubjectaccessreview.go | 2 +- .../v1/fake/fake_selfsubjectaccessreview.go | 2 +- .../v1/fake/fake_selfsubjectrulesreview.go | 2 +- .../v1/fake/fake_subjectaccessreview.go | 2 +- .../authorization/v1/generated_expansion.go | 2 +- .../v1/localsubjectaccessreview.go | 2 +- .../v1/selfsubjectaccessreview.go | 2 +- .../v1/selfsubjectrulesreview.go | 2 +- .../authorization/v1/subjectaccessreview.go | 2 +- .../v1beta1/authorization_client.go | 2 +- .../typed/authorization/v1beta1/doc.go | 2 +- .../typed/authorization/v1beta1/fake/doc.go | 2 +- .../v1beta1/fake/fake_authorization_client.go | 2 +- .../fake/fake_localsubjectaccessreview.go | 2 +- .../fake/fake_selfsubjectaccessreview.go | 2 +- .../fake/fake_selfsubjectrulesreview.go | 2 +- .../v1beta1/fake/fake_subjectaccessreview.go | 2 +- .../v1beta1/generated_expansion.go | 2 +- .../v1beta1/localsubjectaccessreview.go | 2 +- .../v1beta1/selfsubjectaccessreview.go | 2 +- .../v1beta1/selfsubjectrulesreview.go | 2 +- .../v1beta1/subjectaccessreview.go | 2 +- .../autoscaling/v1/autoscaling_client.go | 2 +- .../kubernetes/typed/autoscaling/v1/doc.go | 2 +- .../typed/autoscaling/v1/fake/doc.go | 2 +- .../v1/fake/fake_autoscaling_client.go | 2 +- .../v1/fake/fake_horizontalpodautoscaler.go | 4 +- .../autoscaling/v1/generated_expansion.go | 2 +- .../autoscaling/v1/horizontalpodautoscaler.go | 2 +- .../autoscaling/v2beta1/autoscaling_client.go | 2 +- .../typed/autoscaling/v2beta1/doc.go | 2 +- .../typed/autoscaling/v2beta1/fake/doc.go | 2 +- .../v2beta1/fake/fake_autoscaling_client.go | 2 +- .../fake/fake_horizontalpodautoscaler.go | 4 +- .../v2beta1/generated_expansion.go | 2 +- .../v2beta1/horizontalpodautoscaler.go | 2 +- .../kubernetes/typed/batch/v1/batch_client.go | 2 +- .../kubernetes/typed/batch/v1/doc.go | 2 +- .../kubernetes/typed/batch/v1/fake/doc.go | 2 +- .../typed/batch/v1/fake/fake_batch_client.go | 2 +- .../typed/batch/v1/fake/fake_job.go | 4 +- .../typed/batch/v1/generated_expansion.go | 2 +- .../kubernetes/typed/batch/v1/job.go | 2 +- .../typed/batch/v1beta1/batch_client.go | 2 +- .../kubernetes/typed/batch/v1beta1/cronjob.go | 2 +- .../kubernetes/typed/batch/v1beta1/doc.go | 2 +- .../typed/batch/v1beta1/fake/doc.go | 2 +- .../batch/v1beta1/fake/fake_batch_client.go | 2 +- .../typed/batch/v1beta1/fake/fake_cronjob.go | 4 +- .../batch/v1beta1/generated_expansion.go | 2 +- .../typed/batch/v2alpha1/batch_client.go | 2 +- .../typed/batch/v2alpha1/cronjob.go | 2 +- .../kubernetes/typed/batch/v2alpha1/doc.go | 2 +- .../typed/batch/v2alpha1/fake/doc.go | 2 +- .../batch/v2alpha1/fake/fake_batch_client.go | 2 +- .../typed/batch/v2alpha1/fake/fake_cronjob.go | 4 +- .../batch/v2alpha1/generated_expansion.go | 2 +- .../v1beta1/certificates_client.go | 2 +- .../v1beta1/certificatesigningrequest.go | 2 +- .../typed/certificates/v1beta1/doc.go | 2 +- .../typed/certificates/v1beta1/fake/doc.go | 2 +- .../v1beta1/fake/fake_certificates_client.go | 2 +- .../fake/fake_certificatesigningrequest.go | 4 +- .../v1beta1/generated_expansion.go | 2 +- .../typed/core/v1/componentstatus.go | 2 +- .../kubernetes/typed/core/v1/configmap.go | 2 +- .../kubernetes/typed/core/v1/core_client.go | 2 +- .../client-go/kubernetes/typed/core/v1/doc.go | 2 +- .../kubernetes/typed/core/v1/endpoints.go | 2 +- .../kubernetes/typed/core/v1/event.go | 2 +- .../kubernetes/typed/core/v1/fake/doc.go | 2 +- .../core/v1/fake/fake_componentstatus.go | 4 +- .../typed/core/v1/fake/fake_configmap.go | 4 +- .../typed/core/v1/fake/fake_core_client.go | 2 +- .../typed/core/v1/fake/fake_endpoints.go | 4 +- .../typed/core/v1/fake/fake_event.go | 4 +- .../typed/core/v1/fake/fake_limitrange.go | 4 +- .../typed/core/v1/fake/fake_namespace.go | 12 +- .../typed/core/v1/fake/fake_node.go | 4 +- .../core/v1/fake/fake_persistentvolume.go | 4 +- .../v1/fake/fake_persistentvolumeclaim.go | 4 +- .../kubernetes/typed/core/v1/fake/fake_pod.go | 4 +- .../typed/core/v1/fake/fake_podtemplate.go | 4 +- .../v1/fake/fake_replicationcontroller.go | 4 +- .../typed/core/v1/fake/fake_resourcequota.go | 4 +- .../typed/core/v1/fake/fake_secret.go | 4 +- .../typed/core/v1/fake/fake_service.go | 12 +- .../typed/core/v1/fake/fake_serviceaccount.go | 4 +- .../typed/core/v1/generated_expansion.go | 2 +- .../kubernetes/typed/core/v1/limitrange.go | 2 +- .../kubernetes/typed/core/v1/namespace.go | 13 +- .../kubernetes/typed/core/v1/node.go | 2 +- .../typed/core/v1/persistentvolume.go | 2 +- .../typed/core/v1/persistentvolumeclaim.go | 2 +- .../client-go/kubernetes/typed/core/v1/pod.go | 2 +- .../kubernetes/typed/core/v1/podtemplate.go | 2 +- .../typed/core/v1/replicationcontroller.go | 2 +- .../kubernetes/typed/core/v1/resourcequota.go | 2 +- .../kubernetes/typed/core/v1/secret.go | 2 +- .../kubernetes/typed/core/v1/service.go | 14 +- .../typed/core/v1/serviceaccount.go | 2 +- .../kubernetes/typed/events/v1beta1/doc.go | 2 +- .../kubernetes/typed/events/v1beta1/event.go | 2 +- .../typed/events/v1beta1/events_client.go | 2 +- .../typed/events/v1beta1/fake/doc.go | 2 +- .../typed/events/v1beta1/fake/fake_event.go | 4 +- .../events/v1beta1/fake/fake_events_client.go | 2 +- .../events/v1beta1/generated_expansion.go | 2 +- .../typed/extensions/v1beta1/daemonset.go | 2 +- .../typed/extensions/v1beta1/deployment.go | 2 +- .../typed/extensions/v1beta1/doc.go | 2 +- .../extensions/v1beta1/extensions_client.go | 2 +- .../typed/extensions/v1beta1/fake/doc.go | 2 +- .../extensions/v1beta1/fake/fake_daemonset.go | 4 +- .../v1beta1/fake/fake_deployment.go | 4 +- .../v1beta1/fake/fake_extensions_client.go | 2 +- .../extensions/v1beta1/fake/fake_ingress.go | 4 +- .../v1beta1/fake/fake_podsecuritypolicy.go | 4 +- .../v1beta1/fake/fake_replicaset.go | 4 +- .../extensions/v1beta1/fake/fake_scale.go | 2 +- .../extensions/v1beta1/generated_expansion.go | 2 +- .../typed/extensions/v1beta1/ingress.go | 2 +- .../extensions/v1beta1/podsecuritypolicy.go | 2 +- .../typed/extensions/v1beta1/replicaset.go | 2 +- .../typed/extensions/v1beta1/scale.go | 2 +- .../kubernetes/typed/networking/v1/doc.go | 2 +- .../typed/networking/v1/fake/doc.go | 2 +- .../v1/fake/fake_networking_client.go | 2 +- .../networking/v1/fake/fake_networkpolicy.go | 4 +- .../networking/v1/generated_expansion.go | 2 +- .../typed/networking/v1/networking_client.go | 2 +- .../typed/networking/v1/networkpolicy.go | 2 +- .../kubernetes/typed/policy/v1beta1/doc.go | 2 +- .../typed/policy/v1beta1/eviction.go | 2 +- .../typed/policy/v1beta1/fake/doc.go | 2 +- .../policy/v1beta1/fake/fake_eviction.go | 2 +- .../v1beta1/fake/fake_poddisruptionbudget.go | 4 +- .../v1beta1/fake/fake_podsecuritypolicy.go | 4 +- .../policy/v1beta1/fake/fake_policy_client.go | 2 +- .../policy/v1beta1/generated_expansion.go | 2 +- .../policy/v1beta1/poddisruptionbudget.go | 2 +- .../typed/policy/v1beta1/podsecuritypolicy.go | 2 +- .../typed/policy/v1beta1/policy_client.go | 2 +- .../kubernetes/typed/rbac/v1/clusterrole.go | 2 +- .../typed/rbac/v1/clusterrolebinding.go | 2 +- .../client-go/kubernetes/typed/rbac/v1/doc.go | 2 +- .../kubernetes/typed/rbac/v1/fake/doc.go | 2 +- .../typed/rbac/v1/fake/fake_clusterrole.go | 4 +- .../rbac/v1/fake/fake_clusterrolebinding.go | 4 +- .../typed/rbac/v1/fake/fake_rbac_client.go | 2 +- .../typed/rbac/v1/fake/fake_role.go | 4 +- .../typed/rbac/v1/fake/fake_rolebinding.go | 4 +- .../typed/rbac/v1/generated_expansion.go | 2 +- .../kubernetes/typed/rbac/v1/rbac_client.go | 2 +- .../kubernetes/typed/rbac/v1/role.go | 2 +- .../kubernetes/typed/rbac/v1/rolebinding.go | 2 +- .../typed/rbac/v1alpha1/clusterrole.go | 2 +- .../typed/rbac/v1alpha1/clusterrolebinding.go | 2 +- .../kubernetes/typed/rbac/v1alpha1/doc.go | 2 +- .../typed/rbac/v1alpha1/fake/doc.go | 2 +- .../rbac/v1alpha1/fake/fake_clusterrole.go | 4 +- .../v1alpha1/fake/fake_clusterrolebinding.go | 4 +- .../rbac/v1alpha1/fake/fake_rbac_client.go | 2 +- .../typed/rbac/v1alpha1/fake/fake_role.go | 4 +- .../rbac/v1alpha1/fake/fake_rolebinding.go | 4 +- .../rbac/v1alpha1/generated_expansion.go | 2 +- .../typed/rbac/v1alpha1/rbac_client.go | 2 +- .../kubernetes/typed/rbac/v1alpha1/role.go | 2 +- .../typed/rbac/v1alpha1/rolebinding.go | 2 +- .../typed/rbac/v1beta1/clusterrole.go | 2 +- .../typed/rbac/v1beta1/clusterrolebinding.go | 2 +- .../kubernetes/typed/rbac/v1beta1/doc.go | 2 +- .../kubernetes/typed/rbac/v1beta1/fake/doc.go | 2 +- .../rbac/v1beta1/fake/fake_clusterrole.go | 4 +- .../v1beta1/fake/fake_clusterrolebinding.go | 4 +- .../rbac/v1beta1/fake/fake_rbac_client.go | 2 +- .../typed/rbac/v1beta1/fake/fake_role.go | 4 +- .../rbac/v1beta1/fake/fake_rolebinding.go | 4 +- .../typed/rbac/v1beta1/generated_expansion.go | 2 +- .../typed/rbac/v1beta1/rbac_client.go | 2 +- .../kubernetes/typed/rbac/v1beta1/role.go | 2 +- .../typed/rbac/v1beta1/rolebinding.go | 2 +- .../typed/scheduling/v1alpha1/doc.go | 2 +- .../typed/scheduling/v1alpha1/fake/doc.go | 2 +- .../v1alpha1/fake/fake_priorityclass.go | 4 +- .../v1alpha1/fake/fake_scheduling_client.go | 2 +- .../v1alpha1/generated_expansion.go | 2 +- .../scheduling/v1alpha1/priorityclass.go | 2 +- .../scheduling/v1alpha1/scheduling_client.go | 2 +- .../typed/scheduling/v1beta1/doc.go | 20 + .../typed/scheduling/v1beta1/fake/doc.go | 20 + .../v1beta1/fake/fake_priorityclass.go | 120 + .../v1beta1/fake/fake_scheduling_client.go | 40 + .../scheduling/v1beta1/generated_expansion.go | 21 + .../typed/scheduling/v1beta1/priorityclass.go | 147 + .../scheduling/v1beta1/scheduling_client.go | 90 + .../kubernetes/typed/settings/v1alpha1/doc.go | 2 +- .../typed/settings/v1alpha1/fake/doc.go | 2 +- .../settings/v1alpha1/fake/fake_podpreset.go | 4 +- .../v1alpha1/fake/fake_settings_client.go | 2 +- .../settings/v1alpha1/generated_expansion.go | 2 +- .../typed/settings/v1alpha1/podpreset.go | 2 +- .../settings/v1alpha1/settings_client.go | 2 +- .../kubernetes/typed/storage/v1/doc.go | 2 +- .../kubernetes/typed/storage/v1/fake/doc.go | 2 +- .../storage/v1/fake/fake_storage_client.go | 2 +- .../storage/v1/fake/fake_storageclass.go | 4 +- .../typed/storage/v1/generated_expansion.go | 2 +- .../typed/storage/v1/storage_client.go | 2 +- .../typed/storage/v1/storageclass.go | 2 +- .../kubernetes/typed/storage/v1alpha1/doc.go | 2 +- .../typed/storage/v1alpha1/fake/doc.go | 2 +- .../v1alpha1/fake/fake_storage_client.go | 2 +- .../v1alpha1/fake/fake_volumeattachment.go | 4 +- .../storage/v1alpha1/generated_expansion.go | 2 +- .../typed/storage/v1alpha1/storage_client.go | 2 +- .../storage/v1alpha1/volumeattachment.go | 2 +- .../kubernetes/typed/storage/v1beta1/doc.go | 2 +- .../typed/storage/v1beta1/fake/doc.go | 2 +- .../v1beta1/fake/fake_storage_client.go | 2 +- .../storage/v1beta1/fake/fake_storageclass.go | 4 +- .../v1beta1/fake/fake_volumeattachment.go | 4 +- .../storage/v1beta1/generated_expansion.go | 2 +- .../typed/storage/v1beta1/storage_client.go | 2 +- .../typed/storage/v1beta1/storageclass.go | 2 +- .../typed/storage/v1beta1/volumeattachment.go | 2 +- .../v1alpha1/expansion_generated.go | 2 +- .../v1alpha1/initializerconfiguration.go | 2 +- .../v1beta1/expansion_generated.go | 2 +- .../v1beta1/mutatingwebhookconfiguration.go | 2 +- .../v1beta1/validatingwebhookconfiguration.go | 2 +- .../listers/apps/v1/controllerrevision.go | 2 +- .../client-go/listers/apps/v1/daemonset.go | 2 +- .../client-go/listers/apps/v1/deployment.go | 2 +- .../listers/apps/v1/expansion_generated.go | 2 +- .../client-go/listers/apps/v1/replicaset.go | 2 +- .../client-go/listers/apps/v1/statefulset.go | 2 +- .../apps/v1beta1/controllerrevision.go | 2 +- .../listers/apps/v1beta1/deployment.go | 2 +- .../apps/v1beta1/expansion_generated.go | 2 +- .../client-go/listers/apps/v1beta1/scale.go | 2 +- .../listers/apps/v1beta1/statefulset.go | 2 +- .../apps/v1beta2/controllerrevision.go | 2 +- .../listers/apps/v1beta2/daemonset.go | 2 +- .../listers/apps/v1beta2/deployment.go | 2 +- .../apps/v1beta2/expansion_generated.go | 2 +- .../listers/apps/v1beta2/replicaset.go | 2 +- .../client-go/listers/apps/v1beta2/scale.go | 2 +- .../listers/apps/v1beta2/statefulset.go | 2 +- .../authentication/v1/expansion_generated.go | 2 +- .../listers/authentication/v1/tokenreview.go | 2 +- .../v1beta1/expansion_generated.go | 2 +- .../authentication/v1beta1/tokenreview.go | 2 +- .../authorization/v1/expansion_generated.go | 2 +- .../v1/localsubjectaccessreview.go | 2 +- .../v1/selfsubjectaccessreview.go | 2 +- .../v1/selfsubjectrulesreview.go | 2 +- .../authorization/v1/subjectaccessreview.go | 2 +- .../v1beta1/expansion_generated.go | 2 +- .../v1beta1/localsubjectaccessreview.go | 2 +- .../v1beta1/selfsubjectaccessreview.go | 2 +- .../v1beta1/selfsubjectrulesreview.go | 2 +- .../v1beta1/subjectaccessreview.go | 2 +- .../autoscaling/v1/expansion_generated.go | 2 +- .../autoscaling/v1/horizontalpodautoscaler.go | 2 +- .../v2beta1/expansion_generated.go | 2 +- .../v2beta1/horizontalpodautoscaler.go | 2 +- .../listers/batch/v1/expansion_generated.go | 2 +- .../k8s.io/client-go/listers/batch/v1/job.go | 2 +- .../listers/batch/v1beta1/cronjob.go | 2 +- .../batch/v1beta1/expansion_generated.go | 2 +- .../listers/batch/v2alpha1/cronjob.go | 2 +- .../batch/v2alpha1/expansion_generated.go | 2 +- .../v1beta1/certificatesigningrequest.go | 2 +- .../v1beta1/expansion_generated.go | 2 +- .../listers/core/v1/componentstatus.go | 2 +- .../client-go/listers/core/v1/configmap.go | 2 +- .../client-go/listers/core/v1/endpoints.go | 2 +- .../k8s.io/client-go/listers/core/v1/event.go | 2 +- .../listers/core/v1/expansion_generated.go | 2 +- .../client-go/listers/core/v1/limitrange.go | 2 +- .../client-go/listers/core/v1/namespace.go | 2 +- .../k8s.io/client-go/listers/core/v1/node.go | 2 +- .../listers/core/v1/persistentvolume.go | 2 +- .../listers/core/v1/persistentvolumeclaim.go | 2 +- .../k8s.io/client-go/listers/core/v1/pod.go | 2 +- .../client-go/listers/core/v1/podtemplate.go | 2 +- .../listers/core/v1/replicationcontroller.go | 2 +- .../listers/core/v1/resourcequota.go | 2 +- .../client-go/listers/core/v1/secret.go | 2 +- .../client-go/listers/core/v1/service.go | 2 +- .../listers/core/v1/serviceaccount.go | 2 +- .../client-go/listers/events/v1beta1/event.go | 2 +- .../events/v1beta1/expansion_generated.go | 2 +- .../listers/extensions/v1beta1/daemonset.go | 2 +- .../listers/extensions/v1beta1/deployment.go | 2 +- .../extensions/v1beta1/expansion_generated.go | 2 +- .../listers/extensions/v1beta1/ingress.go | 2 +- .../extensions/v1beta1/podsecuritypolicy.go | 2 +- .../listers/extensions/v1beta1/replicaset.go | 2 +- .../listers/extensions/v1beta1/scale.go | 2 +- .../v1alpha1/expansion_generated.go | 2 +- .../imagepolicy/v1alpha1/imagereview.go | 2 +- .../networking/v1/expansion_generated.go | 2 +- .../listers/networking/v1/networkpolicy.go | 2 +- .../listers/policy/v1beta1/eviction.go | 2 +- .../policy/v1beta1/expansion_generated.go | 2 +- .../policy/v1beta1/poddisruptionbudget.go | 2 +- .../policy/v1beta1/podsecuritypolicy.go | 2 +- .../client-go/listers/rbac/v1/clusterrole.go | 2 +- .../listers/rbac/v1/clusterrolebinding.go | 2 +- .../listers/rbac/v1/expansion_generated.go | 2 +- .../k8s.io/client-go/listers/rbac/v1/role.go | 2 +- .../client-go/listers/rbac/v1/rolebinding.go | 2 +- .../listers/rbac/v1alpha1/clusterrole.go | 2 +- .../rbac/v1alpha1/clusterrolebinding.go | 2 +- .../rbac/v1alpha1/expansion_generated.go | 2 +- .../client-go/listers/rbac/v1alpha1/role.go | 2 +- .../listers/rbac/v1alpha1/rolebinding.go | 2 +- .../listers/rbac/v1beta1/clusterrole.go | 2 +- .../rbac/v1beta1/clusterrolebinding.go | 2 +- .../rbac/v1beta1/expansion_generated.go | 2 +- .../client-go/listers/rbac/v1beta1/role.go | 2 +- .../listers/rbac/v1beta1/rolebinding.go | 2 +- .../v1alpha1/expansion_generated.go | 2 +- .../scheduling/v1alpha1/priorityclass.go | 2 +- .../scheduling/v1beta1/expansion_generated.go | 23 + .../scheduling/v1beta1/priorityclass.go | 65 + .../settings/v1alpha1/expansion_generated.go | 2 +- .../listers/settings/v1alpha1/podpreset.go | 2 +- .../listers/storage/v1/expansion_generated.go | 2 +- .../listers/storage/v1/storageclass.go | 2 +- .../storage/v1alpha1/expansion_generated.go | 2 +- .../storage/v1alpha1/volumeattachment.go | 2 +- .../storage/v1beta1/expansion_generated.go | 2 +- .../listers/storage/v1beta1/storageclass.go | 2 +- .../storage/v1beta1/volumeattachment.go | 2 +- .../clientauthentication/install/install.go | 20 +- .../pkg/apis/clientauthentication/types.go | 7 + .../clientauthentication/v1alpha1/types.go | 8 + .../v1alpha1/zz_generated.conversion.go | 6 +- .../v1alpha1/zz_generated.deepcopy.go | 2 +- .../v1alpha1/zz_generated.defaults.go | 2 +- .../v1beta1/conversion.go | 26 + .../apis/clientauthentication/v1beta1/doc.go | 23 + .../clientauthentication/v1beta1/register.go | 55 + .../clientauthentication/v1beta1/types.go | 59 + .../v1beta1/zz_generated.conversion.go | 114 + .../v1beta1/zz_generated.deepcopy.go | 100 + .../v1beta1/zz_generated.defaults.go | 32 + .../zz_generated.deepcopy.go | 2 +- vendor/k8s.io/client-go/pkg/version/base.go | 2 +- .../plugin/pkg/client/auth/azure/README.md | 18 +- .../plugin/pkg/client/auth/azure/azure.go | 2 +- .../plugin/pkg/client/auth/exec/exec.go | 156 +- .../plugin/pkg/client/auth/exec/exec_test.go | 359 +- .../client/auth/exec/testdata/test-plugin.sh | 2 +- .../plugin/pkg/client/auth/gcp/gcp.go | 2 +- .../plugin/pkg/client/auth/oidc/oidc.go | 2 +- .../pkg/client/auth/openstack/openstack.go | 49 +- .../client/auth/openstack/openstack_test.go | 57 + vendor/k8s.io/client-go/rest/config.go | 8 +- vendor/k8s.io/client-go/rest/config_test.go | 25 +- vendor/k8s.io/client-go/rest/request.go | 37 +- vendor/k8s.io/client-go/rest/request_test.go | 2 +- vendor/k8s.io/client-go/rest/transport.go | 65 +- .../client-go/rest/zz_generated.deepcopy.go | 2 +- .../restmapper/category_expansion.go | 119 + .../restmapper/category_expansion_test.go | 145 + .../restmapper.go => restmapper/discovery.go} | 34 +- .../discovery_test.go} | 6 +- .../k8s.io/client-go/restmapper/shortcut.go | 172 + .../client-go/restmapper/shortcut_test.go | 289 + vendor/k8s.io/client-go/scale/client.go | 14 +- vendor/k8s.io/client-go/scale/client_test.go | 7 +- .../appsv1beta1/zz_generated.conversion.go | 2 +- .../appsv1beta2/zz_generated.conversion.go | 2 +- .../autoscalingv1/zz_generated.conversion.go | 2 +- .../zz_generated.conversion.go | 2 +- .../scale/scheme/zz_generated.deepcopy.go | 2 +- vendor/k8s.io/client-go/scale/util.go | 10 + vendor/k8s.io/client-go/testing/actions.go | 155 +- vendor/k8s.io/client-go/testing/fake.go | 58 +- vendor/k8s.io/client-go/testing/fixture.go | 57 +- .../k8s.io/client-go/testing/fixture_test.go | 43 + .../tools/bootstrap/token/{api => }/OWNERS | 0 .../tools/bootstrap/token/api/doc.go | 4 +- .../tools/bootstrap/token/api/types.go | 22 +- .../tools/bootstrap/token/util/helpers.go | 93 +- .../bootstrap/token/util/helpers_test.go | 137 + .../k8s.io/client-go/tools/cache/listwatch.go | 3 +- .../tools/cache/mutation_detector.go | 3 + .../tools/clientcmd/api/v1/conversion.go | 25 +- .../clientcmd/api/v1/zz_generated.deepcopy.go | 2 +- .../clientcmd/api/zz_generated.deepcopy.go | 2 +- .../client-go/tools/clientcmd/auth_loaders.go | 11 +- .../tools/clientcmd/client_config.go | 23 +- .../client-go/tools/clientcmd/config.go | 4 +- .../client-go/tools/clientcmd/loader.go | 18 +- .../client-go/tools/clientcmd/loader_test.go | 195 + .../tools/clientcmd/merged_client_builder.go | 3 +- .../tools/leaderelection/leaderelection.go | 10 + vendor/k8s.io/client-go/tools/pager/pager.go | 3 +- .../client-go/tools/pager/pager_test.go | 2 +- vendor/k8s.io/client-go/tools/record/event.go | 28 +- vendor/k8s.io/client-go/tools/record/fake.go | 4 + .../k8s.io/client-go/tools/reference/ref.go | 8 +- .../client-go/tools/reference/ref_test.go | 72 + vendor/k8s.io/client-go/transport/cache.go | 12 +- .../k8s.io/client-go/transport/cache_test.go | 39 +- vendor/k8s.io/client-go/transport/config.go | 13 +- .../client-go/transport/round_trippers.go | 2 +- .../k8s.io/client-go/transport/transport.go | 34 +- .../client-go/transport/transport_test.go | 140 +- .../util/buffer/ring_growing_test.go | 2 +- vendor/k8s.io/client-go/util/cert/io.go | 37 +- .../util/certificate/certificate_store.go | 16 +- .../util/connrotation/connrotation.go | 105 + .../util/connrotation/connrotation_test.go | 61 + .../util/workqueue/delaying_queue.go | 10 +- .../workqueue/rate_limitting_queue_test.go | 2 +- 1172 files changed, 32243 insertions(+), 15580 deletions(-) create mode 100644 vendor/github.com/google/btree/.travis.yml create mode 100644 vendor/github.com/google/btree/LICENSE create mode 100644 vendor/github.com/google/btree/README.md create mode 100644 vendor/github.com/google/btree/btree.go create mode 100644 vendor/github.com/google/btree/btree_mem.go create mode 100644 vendor/github.com/google/btree/btree_test.go create mode 100644 vendor/github.com/gregjones/httpcache/.travis.yml create mode 100644 vendor/github.com/gregjones/httpcache/LICENSE.txt create mode 100644 vendor/github.com/gregjones/httpcache/README.md create mode 100644 vendor/github.com/gregjones/httpcache/diskcache/diskcache.go create mode 100644 vendor/github.com/gregjones/httpcache/diskcache/diskcache_test.go create mode 100644 vendor/github.com/gregjones/httpcache/httpcache.go create mode 100644 vendor/github.com/gregjones/httpcache/httpcache_test.go create mode 100644 vendor/github.com/gregjones/httpcache/leveldbcache/leveldbcache.go create mode 100644 vendor/github.com/gregjones/httpcache/leveldbcache/leveldbcache_test.go create mode 100644 vendor/github.com/gregjones/httpcache/memcache/appengine.go create mode 100644 vendor/github.com/gregjones/httpcache/memcache/appengine_test.go create mode 100644 vendor/github.com/gregjones/httpcache/memcache/memcache.go create mode 100644 vendor/github.com/gregjones/httpcache/memcache/memcache_test.go create mode 100644 vendor/github.com/gregjones/httpcache/redis/redis.go create mode 100644 vendor/github.com/gregjones/httpcache/redis/redis_test.go create mode 100644 vendor/github.com/gregjones/httpcache/test/test.go create mode 100644 vendor/github.com/gregjones/httpcache/test/test_test.go delete mode 100644 vendor/github.com/howeyc/gopass/.travis.yml delete mode 100644 vendor/github.com/howeyc/gopass/LICENSE.txt delete mode 100644 vendor/github.com/howeyc/gopass/OPENSOLARIS.LICENSE delete mode 100644 vendor/github.com/howeyc/gopass/README.md delete mode 100644 vendor/github.com/howeyc/gopass/pass.go delete mode 100644 vendor/github.com/howeyc/gopass/pass_test.go delete mode 100644 vendor/github.com/howeyc/gopass/terminal.go delete mode 100644 vendor/github.com/howeyc/gopass/terminal_solaris.go create mode 100644 vendor/github.com/operator-framework/operator-sdk/commands/operator-sdk/cmd/build_test.go create mode 100644 vendor/github.com/operator-framework/operator-sdk/commands/operator-sdk/cmd/generate/crd.go create mode 100644 vendor/github.com/operator-framework/operator-sdk/commands/operator-sdk/cmd/test/cluster.go create mode 100644 vendor/github.com/operator-framework/operator-sdk/commands/operator-sdk/cmd/test/local.go create mode 100644 vendor/github.com/operator-framework/operator-sdk/doc/ansible/project_layout.md create mode 100644 vendor/github.com/operator-framework/operator-sdk/doc/ansible/user-guide.md create mode 100644 vendor/github.com/operator-framework/operator-sdk/doc/proposals/ansible-operator.md create mode 100644 vendor/github.com/operator-framework/operator-sdk/doc/proposals/leader-for-life.md create mode 100644 vendor/github.com/operator-framework/operator-sdk/doc/release-versioning.md create mode 100755 vendor/github.com/operator-framework/operator-sdk/hack/ci/setup-minikube.sh create mode 100755 vendor/github.com/operator-framework/operator-sdk/hack/ci/setup-openshift.sh create mode 100644 vendor/github.com/operator-framework/operator-sdk/pkg/ansible/controller/controller.go create mode 100644 vendor/github.com/operator-framework/operator-sdk/pkg/ansible/controller/reconcile.go create mode 100644 vendor/github.com/operator-framework/operator-sdk/pkg/ansible/controller/types.go create mode 100644 vendor/github.com/operator-framework/operator-sdk/pkg/ansible/events/log_events.go create mode 100644 vendor/github.com/operator-framework/operator-sdk/pkg/ansible/operator/operator.go create mode 100644 vendor/github.com/operator-framework/operator-sdk/pkg/ansible/paramconv/paramconv.go create mode 100644 vendor/github.com/operator-framework/operator-sdk/pkg/ansible/proxy/kubeconfig/kubeconfig.go create mode 100644 vendor/github.com/operator-framework/operator-sdk/pkg/ansible/proxy/kubectl.go create mode 100644 vendor/github.com/operator-framework/operator-sdk/pkg/ansible/proxy/proxy.go create mode 100644 vendor/github.com/operator-framework/operator-sdk/pkg/ansible/runner/eventapi/eventapi.go create mode 100644 vendor/github.com/operator-framework/operator-sdk/pkg/ansible/runner/eventapi/types.go create mode 100644 vendor/github.com/operator-framework/operator-sdk/pkg/ansible/runner/internal/inputdir/inputdir.go create mode 100644 vendor/github.com/operator-framework/operator-sdk/pkg/ansible/runner/runner.go create mode 100644 vendor/github.com/operator-framework/operator-sdk/pkg/leader/doc.go create mode 100644 vendor/github.com/operator-framework/operator-sdk/pkg/leader/leader.go create mode 100644 vendor/github.com/operator-framework/operator-sdk/pkg/test/client.go create mode 100644 vendor/github.com/operator-framework/operator-sdk/pkg/tlsutil/error.go create mode 100755 vendor/github.com/operator-framework/operator-sdk/release.sh create mode 100644 vendor/github.com/operator-framework/operator-sdk/test/ansible-memcached/defaults.yml create mode 100644 vendor/github.com/operator-framework/operator-sdk/test/ansible-memcached/memfin/tasks/main.yml create mode 100644 vendor/github.com/operator-framework/operator-sdk/test/ansible-memcached/tasks.yml create mode 100644 vendor/github.com/operator-framework/operator-sdk/test/ansible-memcached/watches-finalizer.yaml create mode 100644 vendor/github.com/operator-framework/operator-sdk/test/ansible-operator/Dockerfile create mode 100644 vendor/github.com/operator-framework/operator-sdk/test/ansible-operator/README.md create mode 100755 vendor/github.com/operator-framework/operator-sdk/test/ansible-operator/bin/entrypoint create mode 100755 vendor/github.com/operator-framework/operator-sdk/test/ansible-operator/bin/user_setup create mode 100644 vendor/github.com/operator-framework/operator-sdk/test/ansible-operator/cmd/ansible-operator/main.go delete mode 100644 vendor/github.com/operator-framework/operator-sdk/test/e2e/e2eutil/retry_util.go create mode 100644 vendor/github.com/operator-framework/operator-sdk/test/e2e/incluster-test-code/main_test.go.tmpl create mode 100644 vendor/github.com/operator-framework/operator-sdk/test/e2e/incluster-test-code/memcached_test.go.tmpl create mode 100644 vendor/github.com/operator-framework/operator-sdk/test/e2e/testdata/ca-csr.json create mode 100644 vendor/github.com/operator-framework/operator-sdk/test/e2e/testdata/ca.crt create mode 100644 vendor/github.com/operator-framework/operator-sdk/test/e2e/testdata/ca.csr create mode 100644 vendor/github.com/operator-framework/operator-sdk/test/e2e/testdata/ca.key create mode 100644 vendor/github.com/operator-framework/operator-sdk/test/e2e/testdata/gencert.json create mode 100755 vendor/github.com/operator-framework/operator-sdk/test/e2e/testdata/gencert.sh create mode 100644 vendor/github.com/operator-framework/operator-sdk/test/e2e/tls_util_test.go create mode 100755 vendor/github.com/operator-framework/operator-sdk/test/test-ansible.sh create mode 100644 vendor/github.com/operator-framework/operator-sdk/test/test-framework/deploy/namespace-init.yaml create mode 100644 vendor/github.com/operator-framework/operator-sdk/test/test-framework/deploy/sa.yaml create mode 100755 vendor/github.com/operator-framework/operator-sdk/test/test-go.sh create mode 100644 vendor/github.com/petar/GoLLRB/.gitignore create mode 100644 vendor/github.com/petar/GoLLRB/AUTHORS create mode 100644 vendor/github.com/petar/GoLLRB/LICENSE create mode 100644 vendor/github.com/petar/GoLLRB/README.md create mode 100644 vendor/github.com/petar/GoLLRB/doc/Sedgewick-LLRB.pdf create mode 100644 vendor/github.com/petar/GoLLRB/doc/Sedgewick-RedBlackBST.java create mode 100644 vendor/github.com/petar/GoLLRB/doc/Sedgewick-Talk-Penn2008.pdf create mode 100644 vendor/github.com/petar/GoLLRB/example/ex1.go create mode 100644 vendor/github.com/petar/GoLLRB/llrb/avgvar.go create mode 100644 vendor/github.com/petar/GoLLRB/llrb/iterator.go create mode 100644 vendor/github.com/petar/GoLLRB/llrb/iterator_test.go create mode 100644 vendor/github.com/petar/GoLLRB/llrb/llrb-stats.go create mode 100644 vendor/github.com/petar/GoLLRB/llrb/llrb.go create mode 100644 vendor/github.com/petar/GoLLRB/llrb/llrb_test.go create mode 100644 vendor/github.com/petar/GoLLRB/llrb/util.go create mode 100644 vendor/github.com/peterbourgon/diskv/LICENSE create mode 100644 vendor/github.com/peterbourgon/diskv/README.md create mode 100644 vendor/github.com/peterbourgon/diskv/basic_test.go create mode 100644 vendor/github.com/peterbourgon/diskv/compression.go create mode 100644 vendor/github.com/peterbourgon/diskv/compression_test.go create mode 100644 vendor/github.com/peterbourgon/diskv/diskv.go create mode 100644 vendor/github.com/peterbourgon/diskv/examples/content-addressable-store/cas.go create mode 100644 vendor/github.com/peterbourgon/diskv/examples/super-simple-store/super-simple-store.go create mode 100644 vendor/github.com/peterbourgon/diskv/import_test.go create mode 100644 vendor/github.com/peterbourgon/diskv/index.go create mode 100644 vendor/github.com/peterbourgon/diskv/index_test.go create mode 100644 vendor/github.com/peterbourgon/diskv/issues_test.go create mode 100644 vendor/github.com/peterbourgon/diskv/keys_test.go create mode 100644 vendor/github.com/peterbourgon/diskv/speed_test.go create mode 100644 vendor/github.com/peterbourgon/diskv/stream_test.go create mode 100644 vendor/k8s.io/api/SECURITY_CONTACTS delete mode 100644 vendor/k8s.io/api/admission/v1beta1/BUILD delete mode 100644 vendor/k8s.io/api/admissionregistration/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/api/admissionregistration/v1beta1/BUILD delete mode 100644 vendor/k8s.io/api/apps/v1/BUILD delete mode 100644 vendor/k8s.io/api/apps/v1beta1/BUILD delete mode 100644 vendor/k8s.io/api/apps/v1beta2/BUILD delete mode 100644 vendor/k8s.io/api/authentication/v1/BUILD delete mode 100644 vendor/k8s.io/api/authentication/v1beta1/BUILD delete mode 100644 vendor/k8s.io/api/authorization/v1/BUILD delete mode 100644 vendor/k8s.io/api/authorization/v1beta1/BUILD delete mode 100644 vendor/k8s.io/api/autoscaling/v1/BUILD delete mode 100644 vendor/k8s.io/api/autoscaling/v2beta1/BUILD delete mode 100644 vendor/k8s.io/api/batch/v1/BUILD delete mode 100644 vendor/k8s.io/api/batch/v1beta1/BUILD delete mode 100644 vendor/k8s.io/api/batch/v2alpha1/BUILD delete mode 100644 vendor/k8s.io/api/certificates/v1beta1/BUILD delete mode 100644 vendor/k8s.io/api/core/v1/BUILD delete mode 100644 vendor/k8s.io/api/core/v1/meta.go delete mode 100644 vendor/k8s.io/api/events/v1beta1/BUILD delete mode 100644 vendor/k8s.io/api/extensions/v1beta1/BUILD delete mode 100644 vendor/k8s.io/api/imagepolicy/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/api/networking/v1/BUILD delete mode 100644 vendor/k8s.io/api/policy/v1beta1/BUILD delete mode 100644 vendor/k8s.io/api/rbac/v1/BUILD delete mode 100644 vendor/k8s.io/api/rbac/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/api/rbac/v1beta1/BUILD create mode 100644 vendor/k8s.io/api/roundtrip_test.go delete mode 100644 vendor/k8s.io/api/scheduling/v1alpha1/BUILD rename vendor/k8s.io/{apimachinery/pkg/apimachinery => api/scheduling/v1beta1}/doc.go (65%) create mode 100644 vendor/k8s.io/api/scheduling/v1beta1/generated.pb.go create mode 100644 vendor/k8s.io/api/scheduling/v1beta1/generated.proto create mode 100644 vendor/k8s.io/api/scheduling/v1beta1/register.go create mode 100644 vendor/k8s.io/api/scheduling/v1beta1/types.go create mode 100644 vendor/k8s.io/api/scheduling/v1beta1/types_swagger_doc_generated.go create mode 100644 vendor/k8s.io/api/scheduling/v1beta1/zz_generated.deepcopy.go delete mode 100644 vendor/k8s.io/api/settings/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/api/storage/v1/BUILD delete mode 100644 vendor/k8s.io/api/storage/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/api/storage/v1beta1/BUILD create mode 100644 vendor/k8s.io/apimachinery/SECURITY_CONTACTS delete mode 100644 vendor/k8s.io/apimachinery/pkg/api/equality/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/api/errors/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/api/meta/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/api/meta/table/BUILD create mode 100644 vendor/k8s.io/apimachinery/pkg/api/meta/testrestmapper/test_restmapper.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/api/meta/unstructured.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/api/resource/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/api/testing/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/api/testing/fuzzer/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/api/testing/roundtrip/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/api/validation/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/api/validation/path/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/apimachinery/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/apimachinery/announced/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/apimachinery/announced/announced.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/apimachinery/announced/announced_test.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/apimachinery/announced/group_factory.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/apimachinery/registered/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/apimachinery/registered/registered.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/apimachinery/registered/registered_test.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/apimachinery/types.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/apimachinery/types_test.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/fuzzer/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/BUILD create mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructured_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructuredscheme/scheme.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/validation/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/testapigroup/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/testapigroup/fuzzer/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/testapigroup/install/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/testapigroup/v1/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/conversion/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/conversion/queryparams/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/fields/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/labels/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/BUILD create mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/local_scheme_test.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/schema/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/serializer/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/serializer/json/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/serializer/protobuf/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/serializer/recognizer/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/serializer/recognizer/testing/BUILD create mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/serializer/sparse_test.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/serializer/streaming/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/serializer/testing/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/serializer/versioning/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/serializer/yaml/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/testing/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/selection/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/test/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/types/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/cache/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/clock/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/diff/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/duration/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/errors/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/framer/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/httpstream/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/initialization/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/intstr/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/json/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/jsonmergepatch/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/mergepatch/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/net/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/proxy/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/rand/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/remotecommand/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/runtime/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/sets/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/sets/types/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/strategicpatch/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/strategicpatch/testing/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/uuid/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/validation/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/validation/field/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/wait/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/waitgroup/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/yaml/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/version/BUILD create mode 100644 vendor/k8s.io/apimachinery/pkg/version/helpers.go create mode 100644 vendor/k8s.io/apimachinery/pkg/version/helpers_test.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/watch/BUILD delete mode 100644 vendor/k8s.io/apimachinery/third_party/forked/golang/json/BUILD delete mode 100644 vendor/k8s.io/apimachinery/third_party/forked/golang/netutil/BUILD delete mode 100644 vendor/k8s.io/apimachinery/third_party/forked/golang/reflect/BUILD create mode 100644 vendor/k8s.io/client-go/SECURITY_CONTACTS create mode 100644 vendor/k8s.io/client-go/deprecated-dynamic/bad_debt.go create mode 100644 vendor/k8s.io/client-go/deprecated-dynamic/client.go rename vendor/k8s.io/client-go/{dynamic => deprecated-dynamic}/client_pool.go (98%) create mode 100644 vendor/k8s.io/client-go/deprecated-dynamic/client_test.go create mode 100644 vendor/k8s.io/client-go/discovery/cached_discovery.go create mode 100644 vendor/k8s.io/client-go/discovery/cached_discovery_test.go create mode 100644 vendor/k8s.io/client-go/discovery/round_tripper.go create mode 100644 vendor/k8s.io/client-go/discovery/round_tripper_test.go delete mode 100644 vendor/k8s.io/client-go/dynamic/client.go delete mode 100644 vendor/k8s.io/client-go/dynamic/dynamic_util.go delete mode 100644 vendor/k8s.io/client-go/dynamic/dynamic_util_test.go delete mode 100644 vendor/k8s.io/client-go/dynamic/fake/client.go delete mode 100644 vendor/k8s.io/client-go/dynamic/fake/client_pool.go create mode 100644 vendor/k8s.io/client-go/dynamic/fake/simple.go create mode 100644 vendor/k8s.io/client-go/dynamic/interface.go create mode 100644 vendor/k8s.io/client-go/dynamic/scheme.go create mode 100644 vendor/k8s.io/client-go/dynamic/simple.go create mode 100644 vendor/k8s.io/client-go/informers/scheduling/v1beta1/interface.go create mode 100644 vendor/k8s.io/client-go/informers/scheduling/v1beta1/priorityclass.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/fake/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/fake/fake_priorityclass.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/fake/fake_scheduling_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/generated_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/priorityclass.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/scheduling_client.go create mode 100644 vendor/k8s.io/client-go/listers/scheduling/v1beta1/expansion_generated.go create mode 100644 vendor/k8s.io/client-go/listers/scheduling/v1beta1/priorityclass.go create mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1/conversion.go create mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1/doc.go create mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1/register.go create mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1/types.go create mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1/zz_generated.conversion.go create mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1/zz_generated.defaults.go create mode 100644 vendor/k8s.io/client-go/restmapper/category_expansion.go create mode 100644 vendor/k8s.io/client-go/restmapper/category_expansion_test.go rename vendor/k8s.io/client-go/{discovery/restmapper.go => restmapper/discovery.go} (92%) rename vendor/k8s.io/client-go/{discovery/restmapper_test.go => restmapper/discovery_test.go} (98%) create mode 100644 vendor/k8s.io/client-go/restmapper/shortcut.go create mode 100644 vendor/k8s.io/client-go/restmapper/shortcut_test.go rename vendor/k8s.io/client-go/tools/bootstrap/token/{api => }/OWNERS (100%) create mode 100644 vendor/k8s.io/client-go/tools/reference/ref_test.go create mode 100644 vendor/k8s.io/client-go/util/connrotation/connrotation.go create mode 100644 vendor/k8s.io/client-go/util/connrotation/connrotation_test.go diff --git a/vendor/github.com/google/btree/.travis.yml b/vendor/github.com/google/btree/.travis.yml new file mode 100644 index 0000000000..4f2ee4d973 --- /dev/null +++ b/vendor/github.com/google/btree/.travis.yml @@ -0,0 +1 @@ +language: go diff --git a/vendor/github.com/google/btree/LICENSE b/vendor/github.com/google/btree/LICENSE new file mode 100644 index 0000000000..d645695673 --- /dev/null +++ b/vendor/github.com/google/btree/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/google/btree/README.md b/vendor/github.com/google/btree/README.md new file mode 100644 index 0000000000..6062a4dacd --- /dev/null +++ b/vendor/github.com/google/btree/README.md @@ -0,0 +1,12 @@ +# BTree implementation for Go + +![Travis CI Build Status](https://api.travis-ci.org/google/btree.svg?branch=master) + +This package provides an in-memory B-Tree implementation for Go, useful as +an ordered, mutable data structure. + +The API is based off of the wonderful +http://godoc.org/github.com/petar/GoLLRB/llrb, and is meant to allow btree to +act as a drop-in replacement for gollrb trees. + +See http://godoc.org/github.com/google/btree for documentation. diff --git a/vendor/github.com/google/btree/btree.go b/vendor/github.com/google/btree/btree.go new file mode 100644 index 0000000000..6ff062f9bb --- /dev/null +++ b/vendor/github.com/google/btree/btree.go @@ -0,0 +1,890 @@ +// Copyright 2014 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 btree implements in-memory B-Trees of arbitrary degree. +// +// btree implements an in-memory B-Tree for use as an ordered data structure. +// It is not meant for persistent storage solutions. +// +// It has a flatter structure than an equivalent red-black or other binary tree, +// which in some cases yields better memory usage and/or performance. +// See some discussion on the matter here: +// http://google-opensource.blogspot.com/2013/01/c-containers-that-save-memory-and-time.html +// Note, though, that this project is in no way related to the C++ B-Tree +// implementation written about there. +// +// Within this tree, each node contains a slice of items and a (possibly nil) +// slice of children. For basic numeric values or raw structs, this can cause +// efficiency differences when compared to equivalent C++ template code that +// stores values in arrays within the node: +// * Due to the overhead of storing values as interfaces (each +// value needs to be stored as the value itself, then 2 words for the +// interface pointing to that value and its type), resulting in higher +// memory use. +// * Since interfaces can point to values anywhere in memory, values are +// most likely not stored in contiguous blocks, resulting in a higher +// number of cache misses. +// These issues don't tend to matter, though, when working with strings or other +// heap-allocated structures, since C++-equivalent structures also must store +// pointers and also distribute their values across the heap. +// +// This implementation is designed to be a drop-in replacement to gollrb.LLRB +// trees, (http://github.com/petar/gollrb), an excellent and probably the most +// widely used ordered tree implementation in the Go ecosystem currently. +// Its functions, therefore, exactly mirror those of +// llrb.LLRB where possible. Unlike gollrb, though, we currently don't +// support storing multiple equivalent values. +package btree + +import ( + "fmt" + "io" + "sort" + "strings" + "sync" +) + +// Item represents a single object in the tree. +type Item interface { + // Less tests whether the current item is less than the given argument. + // + // This must provide a strict weak ordering. + // If !a.Less(b) && !b.Less(a), we treat this to mean a == b (i.e. we can only + // hold one of either a or b in the tree). + Less(than Item) bool +} + +const ( + DefaultFreeListSize = 32 +) + +var ( + nilItems = make(items, 16) + nilChildren = make(children, 16) +) + +// FreeList represents a free list of btree nodes. By default each +// BTree has its own FreeList, but multiple BTrees can share the same +// FreeList. +// Two Btrees using the same freelist are safe for concurrent write access. +type FreeList struct { + mu sync.Mutex + freelist []*node +} + +// NewFreeList creates a new free list. +// size is the maximum size of the returned free list. +func NewFreeList(size int) *FreeList { + return &FreeList{freelist: make([]*node, 0, size)} +} + +func (f *FreeList) newNode() (n *node) { + f.mu.Lock() + index := len(f.freelist) - 1 + if index < 0 { + f.mu.Unlock() + return new(node) + } + n = f.freelist[index] + f.freelist[index] = nil + f.freelist = f.freelist[:index] + f.mu.Unlock() + return +} + +// freeNode adds the given node to the list, returning true if it was added +// and false if it was discarded. +func (f *FreeList) freeNode(n *node) (out bool) { + f.mu.Lock() + if len(f.freelist) < cap(f.freelist) { + f.freelist = append(f.freelist, n) + out = true + } + f.mu.Unlock() + return +} + +// ItemIterator allows callers of Ascend* to iterate in-order over portions of +// the tree. When this function returns false, iteration will stop and the +// associated Ascend* function will immediately return. +type ItemIterator func(i Item) bool + +// New creates a new B-Tree with the given degree. +// +// New(2), for example, will create a 2-3-4 tree (each node contains 1-3 items +// and 2-4 children). +func New(degree int) *BTree { + return NewWithFreeList(degree, NewFreeList(DefaultFreeListSize)) +} + +// NewWithFreeList creates a new B-Tree that uses the given node free list. +func NewWithFreeList(degree int, f *FreeList) *BTree { + if degree <= 1 { + panic("bad degree") + } + return &BTree{ + degree: degree, + cow: ©OnWriteContext{freelist: f}, + } +} + +// items stores items in a node. +type items []Item + +// insertAt inserts a value into the given index, pushing all subsequent values +// forward. +func (s *items) insertAt(index int, item Item) { + *s = append(*s, nil) + if index < len(*s) { + copy((*s)[index+1:], (*s)[index:]) + } + (*s)[index] = item +} + +// removeAt removes a value at a given index, pulling all subsequent values +// back. +func (s *items) removeAt(index int) Item { + item := (*s)[index] + copy((*s)[index:], (*s)[index+1:]) + (*s)[len(*s)-1] = nil + *s = (*s)[:len(*s)-1] + return item +} + +// pop removes and returns the last element in the list. +func (s *items) pop() (out Item) { + index := len(*s) - 1 + out = (*s)[index] + (*s)[index] = nil + *s = (*s)[:index] + return +} + +// truncate truncates this instance at index so that it contains only the +// first index items. index must be less than or equal to length. +func (s *items) truncate(index int) { + var toClear items + *s, toClear = (*s)[:index], (*s)[index:] + for len(toClear) > 0 { + toClear = toClear[copy(toClear, nilItems):] + } +} + +// find returns the index where the given item should be inserted into this +// list. 'found' is true if the item already exists in the list at the given +// index. +func (s items) find(item Item) (index int, found bool) { + i := sort.Search(len(s), func(i int) bool { + return item.Less(s[i]) + }) + if i > 0 && !s[i-1].Less(item) { + return i - 1, true + } + return i, false +} + +// children stores child nodes in a node. +type children []*node + +// insertAt inserts a value into the given index, pushing all subsequent values +// forward. +func (s *children) insertAt(index int, n *node) { + *s = append(*s, nil) + if index < len(*s) { + copy((*s)[index+1:], (*s)[index:]) + } + (*s)[index] = n +} + +// removeAt removes a value at a given index, pulling all subsequent values +// back. +func (s *children) removeAt(index int) *node { + n := (*s)[index] + copy((*s)[index:], (*s)[index+1:]) + (*s)[len(*s)-1] = nil + *s = (*s)[:len(*s)-1] + return n +} + +// pop removes and returns the last element in the list. +func (s *children) pop() (out *node) { + index := len(*s) - 1 + out = (*s)[index] + (*s)[index] = nil + *s = (*s)[:index] + return +} + +// truncate truncates this instance at index so that it contains only the +// first index children. index must be less than or equal to length. +func (s *children) truncate(index int) { + var toClear children + *s, toClear = (*s)[:index], (*s)[index:] + for len(toClear) > 0 { + toClear = toClear[copy(toClear, nilChildren):] + } +} + +// node is an internal node in a tree. +// +// It must at all times maintain the invariant that either +// * len(children) == 0, len(items) unconstrained +// * len(children) == len(items) + 1 +type node struct { + items items + children children + cow *copyOnWriteContext +} + +func (n *node) mutableFor(cow *copyOnWriteContext) *node { + if n.cow == cow { + return n + } + out := cow.newNode() + if cap(out.items) >= len(n.items) { + out.items = out.items[:len(n.items)] + } else { + out.items = make(items, len(n.items), cap(n.items)) + } + copy(out.items, n.items) + // Copy children + if cap(out.children) >= len(n.children) { + out.children = out.children[:len(n.children)] + } else { + out.children = make(children, len(n.children), cap(n.children)) + } + copy(out.children, n.children) + return out +} + +func (n *node) mutableChild(i int) *node { + c := n.children[i].mutableFor(n.cow) + n.children[i] = c + return c +} + +// split splits the given node at the given index. The current node shrinks, +// and this function returns the item that existed at that index and a new node +// containing all items/children after it. +func (n *node) split(i int) (Item, *node) { + item := n.items[i] + next := n.cow.newNode() + next.items = append(next.items, n.items[i+1:]...) + n.items.truncate(i) + if len(n.children) > 0 { + next.children = append(next.children, n.children[i+1:]...) + n.children.truncate(i + 1) + } + return item, next +} + +// maybeSplitChild checks if a child should be split, and if so splits it. +// Returns whether or not a split occurred. +func (n *node) maybeSplitChild(i, maxItems int) bool { + if len(n.children[i].items) < maxItems { + return false + } + first := n.mutableChild(i) + item, second := first.split(maxItems / 2) + n.items.insertAt(i, item) + n.children.insertAt(i+1, second) + return true +} + +// insert inserts an item into the subtree rooted at this node, making sure +// no nodes in the subtree exceed maxItems items. Should an equivalent item be +// be found/replaced by insert, it will be returned. +func (n *node) insert(item Item, maxItems int) Item { + i, found := n.items.find(item) + if found { + out := n.items[i] + n.items[i] = item + return out + } + if len(n.children) == 0 { + n.items.insertAt(i, item) + return nil + } + if n.maybeSplitChild(i, maxItems) { + inTree := n.items[i] + switch { + case item.Less(inTree): + // no change, we want first split node + case inTree.Less(item): + i++ // we want second split node + default: + out := n.items[i] + n.items[i] = item + return out + } + } + return n.mutableChild(i).insert(item, maxItems) +} + +// get finds the given key in the subtree and returns it. +func (n *node) get(key Item) Item { + i, found := n.items.find(key) + if found { + return n.items[i] + } else if len(n.children) > 0 { + return n.children[i].get(key) + } + return nil +} + +// min returns the first item in the subtree. +func min(n *node) Item { + if n == nil { + return nil + } + for len(n.children) > 0 { + n = n.children[0] + } + if len(n.items) == 0 { + return nil + } + return n.items[0] +} + +// max returns the last item in the subtree. +func max(n *node) Item { + if n == nil { + return nil + } + for len(n.children) > 0 { + n = n.children[len(n.children)-1] + } + if len(n.items) == 0 { + return nil + } + return n.items[len(n.items)-1] +} + +// toRemove details what item to remove in a node.remove call. +type toRemove int + +const ( + removeItem toRemove = iota // removes the given item + removeMin // removes smallest item in the subtree + removeMax // removes largest item in the subtree +) + +// remove removes an item from the subtree rooted at this node. +func (n *node) remove(item Item, minItems int, typ toRemove) Item { + var i int + var found bool + switch typ { + case removeMax: + if len(n.children) == 0 { + return n.items.pop() + } + i = len(n.items) + case removeMin: + if len(n.children) == 0 { + return n.items.removeAt(0) + } + i = 0 + case removeItem: + i, found = n.items.find(item) + if len(n.children) == 0 { + if found { + return n.items.removeAt(i) + } + return nil + } + default: + panic("invalid type") + } + // If we get to here, we have children. + if len(n.children[i].items) <= minItems { + return n.growChildAndRemove(i, item, minItems, typ) + } + child := n.mutableChild(i) + // Either we had enough items to begin with, or we've done some + // merging/stealing, because we've got enough now and we're ready to return + // stuff. + if found { + // The item exists at index 'i', and the child we've selected can give us a + // predecessor, since if we've gotten here it's got > minItems items in it. + out := n.items[i] + // We use our special-case 'remove' call with typ=maxItem to pull the + // predecessor of item i (the rightmost leaf of our immediate left child) + // and set it into where we pulled the item from. + n.items[i] = child.remove(nil, minItems, removeMax) + return out + } + // Final recursive call. Once we're here, we know that the item isn't in this + // node and that the child is big enough to remove from. + return child.remove(item, minItems, typ) +} + +// growChildAndRemove grows child 'i' to make sure it's possible to remove an +// item from it while keeping it at minItems, then calls remove to actually +// remove it. +// +// Most documentation says we have to do two sets of special casing: +// 1) item is in this node +// 2) item is in child +// In both cases, we need to handle the two subcases: +// A) node has enough values that it can spare one +// B) node doesn't have enough values +// For the latter, we have to check: +// a) left sibling has node to spare +// b) right sibling has node to spare +// c) we must merge +// To simplify our code here, we handle cases #1 and #2 the same: +// If a node doesn't have enough items, we make sure it does (using a,b,c). +// We then simply redo our remove call, and the second time (regardless of +// whether we're in case 1 or 2), we'll have enough items and can guarantee +// that we hit case A. +func (n *node) growChildAndRemove(i int, item Item, minItems int, typ toRemove) Item { + if i > 0 && len(n.children[i-1].items) > minItems { + // Steal from left child + child := n.mutableChild(i) + stealFrom := n.mutableChild(i - 1) + stolenItem := stealFrom.items.pop() + child.items.insertAt(0, n.items[i-1]) + n.items[i-1] = stolenItem + if len(stealFrom.children) > 0 { + child.children.insertAt(0, stealFrom.children.pop()) + } + } else if i < len(n.items) && len(n.children[i+1].items) > minItems { + // steal from right child + child := n.mutableChild(i) + stealFrom := n.mutableChild(i + 1) + stolenItem := stealFrom.items.removeAt(0) + child.items = append(child.items, n.items[i]) + n.items[i] = stolenItem + if len(stealFrom.children) > 0 { + child.children = append(child.children, stealFrom.children.removeAt(0)) + } + } else { + if i >= len(n.items) { + i-- + } + child := n.mutableChild(i) + // merge with right child + mergeItem := n.items.removeAt(i) + mergeChild := n.children.removeAt(i + 1) + child.items = append(child.items, mergeItem) + child.items = append(child.items, mergeChild.items...) + child.children = append(child.children, mergeChild.children...) + n.cow.freeNode(mergeChild) + } + return n.remove(item, minItems, typ) +} + +type direction int + +const ( + descend = direction(-1) + ascend = direction(+1) +) + +// iterate provides a simple method for iterating over elements in the tree. +// +// When ascending, the 'start' should be less than 'stop' and when descending, +// the 'start' should be greater than 'stop'. Setting 'includeStart' to true +// will force the iterator to include the first item when it equals 'start', +// thus creating a "greaterOrEqual" or "lessThanEqual" rather than just a +// "greaterThan" or "lessThan" queries. +func (n *node) iterate(dir direction, start, stop Item, includeStart bool, hit bool, iter ItemIterator) (bool, bool) { + var ok, found bool + var index int + switch dir { + case ascend: + if start != nil { + index, _ = n.items.find(start) + } + for i := index; i < len(n.items); i++ { + if len(n.children) > 0 { + if hit, ok = n.children[i].iterate(dir, start, stop, includeStart, hit, iter); !ok { + return hit, false + } + } + if !includeStart && !hit && start != nil && !start.Less(n.items[i]) { + hit = true + continue + } + hit = true + if stop != nil && !n.items[i].Less(stop) { + return hit, false + } + if !iter(n.items[i]) { + return hit, false + } + } + if len(n.children) > 0 { + if hit, ok = n.children[len(n.children)-1].iterate(dir, start, stop, includeStart, hit, iter); !ok { + return hit, false + } + } + case descend: + if start != nil { + index, found = n.items.find(start) + if !found { + index = index - 1 + } + } else { + index = len(n.items) - 1 + } + for i := index; i >= 0; i-- { + if start != nil && !n.items[i].Less(start) { + if !includeStart || hit || start.Less(n.items[i]) { + continue + } + } + if len(n.children) > 0 { + if hit, ok = n.children[i+1].iterate(dir, start, stop, includeStart, hit, iter); !ok { + return hit, false + } + } + if stop != nil && !stop.Less(n.items[i]) { + return hit, false // continue + } + hit = true + if !iter(n.items[i]) { + return hit, false + } + } + if len(n.children) > 0 { + if hit, ok = n.children[0].iterate(dir, start, stop, includeStart, hit, iter); !ok { + return hit, false + } + } + } + return hit, true +} + +// Used for testing/debugging purposes. +func (n *node) print(w io.Writer, level int) { + fmt.Fprintf(w, "%sNODE:%v\n", strings.Repeat(" ", level), n.items) + for _, c := range n.children { + c.print(w, level+1) + } +} + +// BTree is an implementation of a B-Tree. +// +// BTree stores Item instances in an ordered structure, allowing easy insertion, +// removal, and iteration. +// +// Write operations are not safe for concurrent mutation by multiple +// goroutines, but Read operations are. +type BTree struct { + degree int + length int + root *node + cow *copyOnWriteContext +} + +// copyOnWriteContext pointers determine node ownership... a tree with a write +// context equivalent to a node's write context is allowed to modify that node. +// A tree whose write context does not match a node's is not allowed to modify +// it, and must create a new, writable copy (IE: it's a Clone). +// +// When doing any write operation, we maintain the invariant that the current +// node's context is equal to the context of the tree that requested the write. +// We do this by, before we descend into any node, creating a copy with the +// correct context if the contexts don't match. +// +// Since the node we're currently visiting on any write has the requesting +// tree's context, that node is modifiable in place. Children of that node may +// not share context, but before we descend into them, we'll make a mutable +// copy. +type copyOnWriteContext struct { + freelist *FreeList +} + +// Clone clones the btree, lazily. Clone should not be called concurrently, +// but the original tree (t) and the new tree (t2) can be used concurrently +// once the Clone call completes. +// +// The internal tree structure of b is marked read-only and shared between t and +// t2. Writes to both t and t2 use copy-on-write logic, creating new nodes +// whenever one of b's original nodes would have been modified. Read operations +// should have no performance degredation. Write operations for both t and t2 +// will initially experience minor slow-downs caused by additional allocs and +// copies due to the aforementioned copy-on-write logic, but should converge to +// the original performance characteristics of the original tree. +func (t *BTree) Clone() (t2 *BTree) { + // Create two entirely new copy-on-write contexts. + // This operation effectively creates three trees: + // the original, shared nodes (old b.cow) + // the new b.cow nodes + // the new out.cow nodes + cow1, cow2 := *t.cow, *t.cow + out := *t + t.cow = &cow1 + out.cow = &cow2 + return &out +} + +// maxItems returns the max number of items to allow per node. +func (t *BTree) maxItems() int { + return t.degree*2 - 1 +} + +// minItems returns the min number of items to allow per node (ignored for the +// root node). +func (t *BTree) minItems() int { + return t.degree - 1 +} + +func (c *copyOnWriteContext) newNode() (n *node) { + n = c.freelist.newNode() + n.cow = c + return +} + +type freeType int + +const ( + ftFreelistFull freeType = iota // node was freed (available for GC, not stored in freelist) + ftStored // node was stored in the freelist for later use + ftNotOwned // node was ignored by COW, since it's owned by another one +) + +// freeNode frees a node within a given COW context, if it's owned by that +// context. It returns what happened to the node (see freeType const +// documentation). +func (c *copyOnWriteContext) freeNode(n *node) freeType { + if n.cow == c { + // clear to allow GC + n.items.truncate(0) + n.children.truncate(0) + n.cow = nil + if c.freelist.freeNode(n) { + return ftStored + } else { + return ftFreelistFull + } + } else { + return ftNotOwned + } +} + +// ReplaceOrInsert adds the given item to the tree. If an item in the tree +// already equals the given one, it is removed from the tree and returned. +// Otherwise, nil is returned. +// +// nil cannot be added to the tree (will panic). +func (t *BTree) ReplaceOrInsert(item Item) Item { + if item == nil { + panic("nil item being added to BTree") + } + if t.root == nil { + t.root = t.cow.newNode() + t.root.items = append(t.root.items, item) + t.length++ + return nil + } else { + t.root = t.root.mutableFor(t.cow) + if len(t.root.items) >= t.maxItems() { + item2, second := t.root.split(t.maxItems() / 2) + oldroot := t.root + t.root = t.cow.newNode() + t.root.items = append(t.root.items, item2) + t.root.children = append(t.root.children, oldroot, second) + } + } + out := t.root.insert(item, t.maxItems()) + if out == nil { + t.length++ + } + return out +} + +// Delete removes an item equal to the passed in item from the tree, returning +// it. If no such item exists, returns nil. +func (t *BTree) Delete(item Item) Item { + return t.deleteItem(item, removeItem) +} + +// DeleteMin removes the smallest item in the tree and returns it. +// If no such item exists, returns nil. +func (t *BTree) DeleteMin() Item { + return t.deleteItem(nil, removeMin) +} + +// DeleteMax removes the largest item in the tree and returns it. +// If no such item exists, returns nil. +func (t *BTree) DeleteMax() Item { + return t.deleteItem(nil, removeMax) +} + +func (t *BTree) deleteItem(item Item, typ toRemove) Item { + if t.root == nil || len(t.root.items) == 0 { + return nil + } + t.root = t.root.mutableFor(t.cow) + out := t.root.remove(item, t.minItems(), typ) + if len(t.root.items) == 0 && len(t.root.children) > 0 { + oldroot := t.root + t.root = t.root.children[0] + t.cow.freeNode(oldroot) + } + if out != nil { + t.length-- + } + return out +} + +// AscendRange calls the iterator for every value in the tree within the range +// [greaterOrEqual, lessThan), until iterator returns false. +func (t *BTree) AscendRange(greaterOrEqual, lessThan Item, iterator ItemIterator) { + if t.root == nil { + return + } + t.root.iterate(ascend, greaterOrEqual, lessThan, true, false, iterator) +} + +// AscendLessThan calls the iterator for every value in the tree within the range +// [first, pivot), until iterator returns false. +func (t *BTree) AscendLessThan(pivot Item, iterator ItemIterator) { + if t.root == nil { + return + } + t.root.iterate(ascend, nil, pivot, false, false, iterator) +} + +// AscendGreaterOrEqual calls the iterator for every value in the tree within +// the range [pivot, last], until iterator returns false. +func (t *BTree) AscendGreaterOrEqual(pivot Item, iterator ItemIterator) { + if t.root == nil { + return + } + t.root.iterate(ascend, pivot, nil, true, false, iterator) +} + +// Ascend calls the iterator for every value in the tree within the range +// [first, last], until iterator returns false. +func (t *BTree) Ascend(iterator ItemIterator) { + if t.root == nil { + return + } + t.root.iterate(ascend, nil, nil, false, false, iterator) +} + +// DescendRange calls the iterator for every value in the tree within the range +// [lessOrEqual, greaterThan), until iterator returns false. +func (t *BTree) DescendRange(lessOrEqual, greaterThan Item, iterator ItemIterator) { + if t.root == nil { + return + } + t.root.iterate(descend, lessOrEqual, greaterThan, true, false, iterator) +} + +// DescendLessOrEqual calls the iterator for every value in the tree within the range +// [pivot, first], until iterator returns false. +func (t *BTree) DescendLessOrEqual(pivot Item, iterator ItemIterator) { + if t.root == nil { + return + } + t.root.iterate(descend, pivot, nil, true, false, iterator) +} + +// DescendGreaterThan calls the iterator for every value in the tree within +// the range (pivot, last], until iterator returns false. +func (t *BTree) DescendGreaterThan(pivot Item, iterator ItemIterator) { + if t.root == nil { + return + } + t.root.iterate(descend, nil, pivot, false, false, iterator) +} + +// Descend calls the iterator for every value in the tree within the range +// [last, first], until iterator returns false. +func (t *BTree) Descend(iterator ItemIterator) { + if t.root == nil { + return + } + t.root.iterate(descend, nil, nil, false, false, iterator) +} + +// Get looks for the key item in the tree, returning it. It returns nil if +// unable to find that item. +func (t *BTree) Get(key Item) Item { + if t.root == nil { + return nil + } + return t.root.get(key) +} + +// Min returns the smallest item in the tree, or nil if the tree is empty. +func (t *BTree) Min() Item { + return min(t.root) +} + +// Max returns the largest item in the tree, or nil if the tree is empty. +func (t *BTree) Max() Item { + return max(t.root) +} + +// Has returns true if the given key is in the tree. +func (t *BTree) Has(key Item) bool { + return t.Get(key) != nil +} + +// Len returns the number of items currently in the tree. +func (t *BTree) Len() int { + return t.length +} + +// Clear removes all items from the btree. If addNodesToFreelist is true, +// t's nodes are added to its freelist as part of this call, until the freelist +// is full. Otherwise, the root node is simply dereferenced and the subtree +// left to Go's normal GC processes. +// +// This can be much faster +// than calling Delete on all elements, because that requires finding/removing +// each element in the tree and updating the tree accordingly. It also is +// somewhat faster than creating a new tree to replace the old one, because +// nodes from the old tree are reclaimed into the freelist for use by the new +// one, instead of being lost to the garbage collector. +// +// This call takes: +// O(1): when addNodesToFreelist is false, this is a single operation. +// O(1): when the freelist is already full, it breaks out immediately +// O(freelist size): when the freelist is empty and the nodes are all owned +// by this tree, nodes are added to the freelist until full. +// O(tree size): when all nodes are owned by another tree, all nodes are +// iterated over looking for nodes to add to the freelist, and due to +// ownership, none are. +func (t *BTree) Clear(addNodesToFreelist bool) { + if t.root != nil && addNodesToFreelist { + t.root.reset(t.cow) + } + t.root, t.length = nil, 0 +} + +// reset returns a subtree to the freelist. It breaks out immediately if the +// freelist is full, since the only benefit of iterating is to fill that +// freelist up. Returns true if parent reset call should continue. +func (n *node) reset(c *copyOnWriteContext) bool { + for _, child := range n.children { + if !child.reset(c) { + return false + } + } + return c.freeNode(n) != ftFreelistFull +} + +// Int implements the Item interface for integers. +type Int int + +// Less returns true if int(a) < int(b). +func (a Int) Less(b Item) bool { + return a < b.(Int) +} diff --git a/vendor/github.com/google/btree/btree_mem.go b/vendor/github.com/google/btree/btree_mem.go new file mode 100644 index 0000000000..cb95b7fa1b --- /dev/null +++ b/vendor/github.com/google/btree/btree_mem.go @@ -0,0 +1,76 @@ +// Copyright 2014 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. + +// +build ignore + +// This binary compares memory usage between btree and gollrb. +package main + +import ( + "flag" + "fmt" + "math/rand" + "runtime" + "time" + + "github.com/google/btree" + "github.com/petar/GoLLRB/llrb" +) + +var ( + size = flag.Int("size", 1000000, "size of the tree to build") + degree = flag.Int("degree", 8, "degree of btree") + gollrb = flag.Bool("llrb", false, "use llrb instead of btree") +) + +func main() { + flag.Parse() + vals := rand.Perm(*size) + var t, v interface{} + v = vals + var stats runtime.MemStats + for i := 0; i < 10; i++ { + runtime.GC() + } + fmt.Println("-------- BEFORE ----------") + runtime.ReadMemStats(&stats) + fmt.Printf("%+v\n", stats) + start := time.Now() + if *gollrb { + tr := llrb.New() + for _, v := range vals { + tr.ReplaceOrInsert(llrb.Int(v)) + } + t = tr // keep it around + } else { + tr := btree.New(*degree) + for _, v := range vals { + tr.ReplaceOrInsert(btree.Int(v)) + } + t = tr // keep it around + } + fmt.Printf("%v inserts in %v\n", *size, time.Since(start)) + fmt.Println("-------- AFTER ----------") + runtime.ReadMemStats(&stats) + fmt.Printf("%+v\n", stats) + for i := 0; i < 10; i++ { + runtime.GC() + } + fmt.Println("-------- AFTER GC ----------") + runtime.ReadMemStats(&stats) + fmt.Printf("%+v\n", stats) + if t == v { + fmt.Println("to make sure vals and tree aren't GC'd") + } +} diff --git a/vendor/github.com/google/btree/btree_test.go b/vendor/github.com/google/btree/btree_test.go new file mode 100644 index 0000000000..78a90cd8a6 --- /dev/null +++ b/vendor/github.com/google/btree/btree_test.go @@ -0,0 +1,785 @@ +// Copyright 2014 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 btree + +import ( + "flag" + "fmt" + "math/rand" + "reflect" + "sort" + "sync" + "testing" + "time" +) + +func init() { + seed := time.Now().Unix() + fmt.Println(seed) + rand.Seed(seed) +} + +// perm returns a random permutation of n Int items in the range [0, n). +func perm(n int) (out []Item) { + for _, v := range rand.Perm(n) { + out = append(out, Int(v)) + } + return +} + +// rang returns an ordered list of Int items in the range [0, n). +func rang(n int) (out []Item) { + for i := 0; i < n; i++ { + out = append(out, Int(i)) + } + return +} + +// all extracts all items from a tree in order as a slice. +func all(t *BTree) (out []Item) { + t.Ascend(func(a Item) bool { + out = append(out, a) + return true + }) + return +} + +// rangerev returns a reversed ordered list of Int items in the range [0, n). +func rangrev(n int) (out []Item) { + for i := n - 1; i >= 0; i-- { + out = append(out, Int(i)) + } + return +} + +// allrev extracts all items from a tree in reverse order as a slice. +func allrev(t *BTree) (out []Item) { + t.Descend(func(a Item) bool { + out = append(out, a) + return true + }) + return +} + +var btreeDegree = flag.Int("degree", 32, "B-Tree degree") + +func TestBTree(t *testing.T) { + tr := New(*btreeDegree) + const treeSize = 10000 + for i := 0; i < 10; i++ { + if min := tr.Min(); min != nil { + t.Fatalf("empty min, got %+v", min) + } + if max := tr.Max(); max != nil { + t.Fatalf("empty max, got %+v", max) + } + for _, item := range perm(treeSize) { + if x := tr.ReplaceOrInsert(item); x != nil { + t.Fatal("insert found item", item) + } + } + for _, item := range perm(treeSize) { + if x := tr.ReplaceOrInsert(item); x == nil { + t.Fatal("insert didn't find item", item) + } + } + if min, want := tr.Min(), Item(Int(0)); min != want { + t.Fatalf("min: want %+v, got %+v", want, min) + } + if max, want := tr.Max(), Item(Int(treeSize-1)); max != want { + t.Fatalf("max: want %+v, got %+v", want, max) + } + got := all(tr) + want := rang(treeSize) + if !reflect.DeepEqual(got, want) { + t.Fatalf("mismatch:\n got: %v\nwant: %v", got, want) + } + + gotrev := allrev(tr) + wantrev := rangrev(treeSize) + if !reflect.DeepEqual(gotrev, wantrev) { + t.Fatalf("mismatch:\n got: %v\nwant: %v", got, want) + } + + for _, item := range perm(treeSize) { + if x := tr.Delete(item); x == nil { + t.Fatalf("didn't find %v", item) + } + } + if got = all(tr); len(got) > 0 { + t.Fatalf("some left!: %v", got) + } + } +} + +func ExampleBTree() { + tr := New(*btreeDegree) + for i := Int(0); i < 10; i++ { + tr.ReplaceOrInsert(i) + } + fmt.Println("len: ", tr.Len()) + fmt.Println("get3: ", tr.Get(Int(3))) + fmt.Println("get100: ", tr.Get(Int(100))) + fmt.Println("del4: ", tr.Delete(Int(4))) + fmt.Println("del100: ", tr.Delete(Int(100))) + fmt.Println("replace5: ", tr.ReplaceOrInsert(Int(5))) + fmt.Println("replace100:", tr.ReplaceOrInsert(Int(100))) + fmt.Println("min: ", tr.Min()) + fmt.Println("delmin: ", tr.DeleteMin()) + fmt.Println("max: ", tr.Max()) + fmt.Println("delmax: ", tr.DeleteMax()) + fmt.Println("len: ", tr.Len()) + // Output: + // len: 10 + // get3: 3 + // get100: + // del4: 4 + // del100: + // replace5: 5 + // replace100: + // min: 0 + // delmin: 0 + // max: 100 + // delmax: 100 + // len: 8 +} + +func TestDeleteMin(t *testing.T) { + tr := New(3) + for _, v := range perm(100) { + tr.ReplaceOrInsert(v) + } + var got []Item + for v := tr.DeleteMin(); v != nil; v = tr.DeleteMin() { + got = append(got, v) + } + if want := rang(100); !reflect.DeepEqual(got, want) { + t.Fatalf("ascendrange:\n got: %v\nwant: %v", got, want) + } +} + +func TestDeleteMax(t *testing.T) { + tr := New(3) + for _, v := range perm(100) { + tr.ReplaceOrInsert(v) + } + var got []Item + for v := tr.DeleteMax(); v != nil; v = tr.DeleteMax() { + got = append(got, v) + } + // Reverse our list. + for i := 0; i < len(got)/2; i++ { + got[i], got[len(got)-i-1] = got[len(got)-i-1], got[i] + } + if want := rang(100); !reflect.DeepEqual(got, want) { + t.Fatalf("ascendrange:\n got: %v\nwant: %v", got, want) + } +} + +func TestAscendRange(t *testing.T) { + tr := New(2) + for _, v := range perm(100) { + tr.ReplaceOrInsert(v) + } + var got []Item + tr.AscendRange(Int(40), Int(60), func(a Item) bool { + got = append(got, a) + return true + }) + if want := rang(100)[40:60]; !reflect.DeepEqual(got, want) { + t.Fatalf("ascendrange:\n got: %v\nwant: %v", got, want) + } + got = got[:0] + tr.AscendRange(Int(40), Int(60), func(a Item) bool { + if a.(Int) > 50 { + return false + } + got = append(got, a) + return true + }) + if want := rang(100)[40:51]; !reflect.DeepEqual(got, want) { + t.Fatalf("ascendrange:\n got: %v\nwant: %v", got, want) + } +} + +func TestDescendRange(t *testing.T) { + tr := New(2) + for _, v := range perm(100) { + tr.ReplaceOrInsert(v) + } + var got []Item + tr.DescendRange(Int(60), Int(40), func(a Item) bool { + got = append(got, a) + return true + }) + if want := rangrev(100)[39:59]; !reflect.DeepEqual(got, want) { + t.Fatalf("descendrange:\n got: %v\nwant: %v", got, want) + } + got = got[:0] + tr.DescendRange(Int(60), Int(40), func(a Item) bool { + if a.(Int) < 50 { + return false + } + got = append(got, a) + return true + }) + if want := rangrev(100)[39:50]; !reflect.DeepEqual(got, want) { + t.Fatalf("descendrange:\n got: %v\nwant: %v", got, want) + } +} +func TestAscendLessThan(t *testing.T) { + tr := New(*btreeDegree) + for _, v := range perm(100) { + tr.ReplaceOrInsert(v) + } + var got []Item + tr.AscendLessThan(Int(60), func(a Item) bool { + got = append(got, a) + return true + }) + if want := rang(100)[:60]; !reflect.DeepEqual(got, want) { + t.Fatalf("ascendrange:\n got: %v\nwant: %v", got, want) + } + got = got[:0] + tr.AscendLessThan(Int(60), func(a Item) bool { + if a.(Int) > 50 { + return false + } + got = append(got, a) + return true + }) + if want := rang(100)[:51]; !reflect.DeepEqual(got, want) { + t.Fatalf("ascendrange:\n got: %v\nwant: %v", got, want) + } +} + +func TestDescendLessOrEqual(t *testing.T) { + tr := New(*btreeDegree) + for _, v := range perm(100) { + tr.ReplaceOrInsert(v) + } + var got []Item + tr.DescendLessOrEqual(Int(40), func(a Item) bool { + got = append(got, a) + return true + }) + if want := rangrev(100)[59:]; !reflect.DeepEqual(got, want) { + t.Fatalf("descendlessorequal:\n got: %v\nwant: %v", got, want) + } + got = got[:0] + tr.DescendLessOrEqual(Int(60), func(a Item) bool { + if a.(Int) < 50 { + return false + } + got = append(got, a) + return true + }) + if want := rangrev(100)[39:50]; !reflect.DeepEqual(got, want) { + t.Fatalf("descendlessorequal:\n got: %v\nwant: %v", got, want) + } +} +func TestAscendGreaterOrEqual(t *testing.T) { + tr := New(*btreeDegree) + for _, v := range perm(100) { + tr.ReplaceOrInsert(v) + } + var got []Item + tr.AscendGreaterOrEqual(Int(40), func(a Item) bool { + got = append(got, a) + return true + }) + if want := rang(100)[40:]; !reflect.DeepEqual(got, want) { + t.Fatalf("ascendrange:\n got: %v\nwant: %v", got, want) + } + got = got[:0] + tr.AscendGreaterOrEqual(Int(40), func(a Item) bool { + if a.(Int) > 50 { + return false + } + got = append(got, a) + return true + }) + if want := rang(100)[40:51]; !reflect.DeepEqual(got, want) { + t.Fatalf("ascendrange:\n got: %v\nwant: %v", got, want) + } +} + +func TestDescendGreaterThan(t *testing.T) { + tr := New(*btreeDegree) + for _, v := range perm(100) { + tr.ReplaceOrInsert(v) + } + var got []Item + tr.DescendGreaterThan(Int(40), func(a Item) bool { + got = append(got, a) + return true + }) + if want := rangrev(100)[:59]; !reflect.DeepEqual(got, want) { + t.Fatalf("descendgreaterthan:\n got: %v\nwant: %v", got, want) + } + got = got[:0] + tr.DescendGreaterThan(Int(40), func(a Item) bool { + if a.(Int) < 50 { + return false + } + got = append(got, a) + return true + }) + if want := rangrev(100)[:50]; !reflect.DeepEqual(got, want) { + t.Fatalf("descendgreaterthan:\n got: %v\nwant: %v", got, want) + } +} + +const benchmarkTreeSize = 10000 + +func BenchmarkInsert(b *testing.B) { + b.StopTimer() + insertP := perm(benchmarkTreeSize) + b.StartTimer() + i := 0 + for i < b.N { + tr := New(*btreeDegree) + for _, item := range insertP { + tr.ReplaceOrInsert(item) + i++ + if i >= b.N { + return + } + } + } +} + +func BenchmarkSeek(b *testing.B) { + b.StopTimer() + size := 100000 + insertP := perm(size) + tr := New(*btreeDegree) + for _, item := range insertP { + tr.ReplaceOrInsert(item) + } + b.StartTimer() + + for i := 0; i < b.N; i++ { + tr.AscendGreaterOrEqual(Int(i%size), func(i Item) bool { return false }) + } +} + +func BenchmarkDeleteInsert(b *testing.B) { + b.StopTimer() + insertP := perm(benchmarkTreeSize) + tr := New(*btreeDegree) + for _, item := range insertP { + tr.ReplaceOrInsert(item) + } + b.StartTimer() + for i := 0; i < b.N; i++ { + tr.Delete(insertP[i%benchmarkTreeSize]) + tr.ReplaceOrInsert(insertP[i%benchmarkTreeSize]) + } +} + +func BenchmarkDeleteInsertCloneOnce(b *testing.B) { + b.StopTimer() + insertP := perm(benchmarkTreeSize) + tr := New(*btreeDegree) + for _, item := range insertP { + tr.ReplaceOrInsert(item) + } + tr = tr.Clone() + b.StartTimer() + for i := 0; i < b.N; i++ { + tr.Delete(insertP[i%benchmarkTreeSize]) + tr.ReplaceOrInsert(insertP[i%benchmarkTreeSize]) + } +} + +func BenchmarkDeleteInsertCloneEachTime(b *testing.B) { + b.StopTimer() + insertP := perm(benchmarkTreeSize) + tr := New(*btreeDegree) + for _, item := range insertP { + tr.ReplaceOrInsert(item) + } + b.StartTimer() + for i := 0; i < b.N; i++ { + tr = tr.Clone() + tr.Delete(insertP[i%benchmarkTreeSize]) + tr.ReplaceOrInsert(insertP[i%benchmarkTreeSize]) + } +} + +func BenchmarkDelete(b *testing.B) { + b.StopTimer() + insertP := perm(benchmarkTreeSize) + removeP := perm(benchmarkTreeSize) + b.StartTimer() + i := 0 + for i < b.N { + b.StopTimer() + tr := New(*btreeDegree) + for _, v := range insertP { + tr.ReplaceOrInsert(v) + } + b.StartTimer() + for _, item := range removeP { + tr.Delete(item) + i++ + if i >= b.N { + return + } + } + if tr.Len() > 0 { + panic(tr.Len()) + } + } +} + +func BenchmarkGet(b *testing.B) { + b.StopTimer() + insertP := perm(benchmarkTreeSize) + removeP := perm(benchmarkTreeSize) + b.StartTimer() + i := 0 + for i < b.N { + b.StopTimer() + tr := New(*btreeDegree) + for _, v := range insertP { + tr.ReplaceOrInsert(v) + } + b.StartTimer() + for _, item := range removeP { + tr.Get(item) + i++ + if i >= b.N { + return + } + } + } +} + +func BenchmarkGetCloneEachTime(b *testing.B) { + b.StopTimer() + insertP := perm(benchmarkTreeSize) + removeP := perm(benchmarkTreeSize) + b.StartTimer() + i := 0 + for i < b.N { + b.StopTimer() + tr := New(*btreeDegree) + for _, v := range insertP { + tr.ReplaceOrInsert(v) + } + b.StartTimer() + for _, item := range removeP { + tr = tr.Clone() + tr.Get(item) + i++ + if i >= b.N { + return + } + } + } +} + +type byInts []Item + +func (a byInts) Len() int { + return len(a) +} + +func (a byInts) Less(i, j int) bool { + return a[i].(Int) < a[j].(Int) +} + +func (a byInts) Swap(i, j int) { + a[i], a[j] = a[j], a[i] +} + +func BenchmarkAscend(b *testing.B) { + arr := perm(benchmarkTreeSize) + tr := New(*btreeDegree) + for _, v := range arr { + tr.ReplaceOrInsert(v) + } + sort.Sort(byInts(arr)) + b.ResetTimer() + for i := 0; i < b.N; i++ { + j := 0 + tr.Ascend(func(item Item) bool { + if item.(Int) != arr[j].(Int) { + b.Fatalf("mismatch: expected: %v, got %v", arr[j].(Int), item.(Int)) + } + j++ + return true + }) + } +} + +func BenchmarkDescend(b *testing.B) { + arr := perm(benchmarkTreeSize) + tr := New(*btreeDegree) + for _, v := range arr { + tr.ReplaceOrInsert(v) + } + sort.Sort(byInts(arr)) + b.ResetTimer() + for i := 0; i < b.N; i++ { + j := len(arr) - 1 + tr.Descend(func(item Item) bool { + if item.(Int) != arr[j].(Int) { + b.Fatalf("mismatch: expected: %v, got %v", arr[j].(Int), item.(Int)) + } + j-- + return true + }) + } +} +func BenchmarkAscendRange(b *testing.B) { + arr := perm(benchmarkTreeSize) + tr := New(*btreeDegree) + for _, v := range arr { + tr.ReplaceOrInsert(v) + } + sort.Sort(byInts(arr)) + b.ResetTimer() + for i := 0; i < b.N; i++ { + j := 100 + tr.AscendRange(Int(100), arr[len(arr)-100], func(item Item) bool { + if item.(Int) != arr[j].(Int) { + b.Fatalf("mismatch: expected: %v, got %v", arr[j].(Int), item.(Int)) + } + j++ + return true + }) + if j != len(arr)-100 { + b.Fatalf("expected: %v, got %v", len(arr)-100, j) + } + } +} + +func BenchmarkDescendRange(b *testing.B) { + arr := perm(benchmarkTreeSize) + tr := New(*btreeDegree) + for _, v := range arr { + tr.ReplaceOrInsert(v) + } + sort.Sort(byInts(arr)) + b.ResetTimer() + for i := 0; i < b.N; i++ { + j := len(arr) - 100 + tr.DescendRange(arr[len(arr)-100], Int(100), func(item Item) bool { + if item.(Int) != arr[j].(Int) { + b.Fatalf("mismatch: expected: %v, got %v", arr[j].(Int), item.(Int)) + } + j-- + return true + }) + if j != 100 { + b.Fatalf("expected: %v, got %v", len(arr)-100, j) + } + } +} +func BenchmarkAscendGreaterOrEqual(b *testing.B) { + arr := perm(benchmarkTreeSize) + tr := New(*btreeDegree) + for _, v := range arr { + tr.ReplaceOrInsert(v) + } + sort.Sort(byInts(arr)) + b.ResetTimer() + for i := 0; i < b.N; i++ { + j := 100 + k := 0 + tr.AscendGreaterOrEqual(Int(100), func(item Item) bool { + if item.(Int) != arr[j].(Int) { + b.Fatalf("mismatch: expected: %v, got %v", arr[j].(Int), item.(Int)) + } + j++ + k++ + return true + }) + if j != len(arr) { + b.Fatalf("expected: %v, got %v", len(arr), j) + } + if k != len(arr)-100 { + b.Fatalf("expected: %v, got %v", len(arr)-100, k) + } + } +} +func BenchmarkDescendLessOrEqual(b *testing.B) { + arr := perm(benchmarkTreeSize) + tr := New(*btreeDegree) + for _, v := range arr { + tr.ReplaceOrInsert(v) + } + sort.Sort(byInts(arr)) + b.ResetTimer() + for i := 0; i < b.N; i++ { + j := len(arr) - 100 + k := len(arr) + tr.DescendLessOrEqual(arr[len(arr)-100], func(item Item) bool { + if item.(Int) != arr[j].(Int) { + b.Fatalf("mismatch: expected: %v, got %v", arr[j].(Int), item.(Int)) + } + j-- + k-- + return true + }) + if j != -1 { + b.Fatalf("expected: %v, got %v", -1, j) + } + if k != 99 { + b.Fatalf("expected: %v, got %v", 99, k) + } + } +} + +const cloneTestSize = 10000 + +func cloneTest(t *testing.T, b *BTree, start int, p []Item, wg *sync.WaitGroup, trees *[]*BTree) { + t.Logf("Starting new clone at %v", start) + *trees = append(*trees, b) + for i := start; i < cloneTestSize; i++ { + b.ReplaceOrInsert(p[i]) + if i%(cloneTestSize/5) == 0 { + wg.Add(1) + go cloneTest(t, b.Clone(), i+1, p, wg, trees) + } + } + wg.Done() +} + +func TestCloneConcurrentOperations(t *testing.T) { + b := New(*btreeDegree) + trees := []*BTree{} + p := perm(cloneTestSize) + var wg sync.WaitGroup + wg.Add(1) + go cloneTest(t, b, 0, p, &wg, &trees) + wg.Wait() + want := rang(cloneTestSize) + t.Logf("Starting equality checks on %d trees", len(trees)) + for i, tree := range trees { + if !reflect.DeepEqual(want, all(tree)) { + t.Errorf("tree %v mismatch", i) + } + } + t.Log("Removing half from first half") + toRemove := rang(cloneTestSize)[cloneTestSize/2:] + for i := 0; i < len(trees)/2; i++ { + tree := trees[i] + wg.Add(1) + go func() { + for _, item := range toRemove { + tree.Delete(item) + } + wg.Done() + }() + } + wg.Wait() + t.Log("Checking all values again") + for i, tree := range trees { + var wantpart []Item + if i < len(trees)/2 { + wantpart = want[:cloneTestSize/2] + } else { + wantpart = want + } + if got := all(tree); !reflect.DeepEqual(wantpart, got) { + t.Errorf("tree %v mismatch, want %v got %v", i, len(want), len(got)) + } + } +} + +func BenchmarkDeleteAndRestore(b *testing.B) { + items := perm(16392) + b.ResetTimer() + b.Run(`CopyBigFreeList`, func(b *testing.B) { + fl := NewFreeList(16392) + tr := NewWithFreeList(*btreeDegree, fl) + for _, v := range items { + tr.ReplaceOrInsert(v) + } + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + dels := make([]Item, 0, tr.Len()) + tr.Ascend(ItemIterator(func(b Item) bool { + dels = append(dels, b) + return true + })) + for _, del := range dels { + tr.Delete(del) + } + // tr is now empty, we make a new empty copy of it. + tr = NewWithFreeList(*btreeDegree, fl) + for _, v := range items { + tr.ReplaceOrInsert(v) + } + } + }) + b.Run(`Copy`, func(b *testing.B) { + tr := New(*btreeDegree) + for _, v := range items { + tr.ReplaceOrInsert(v) + } + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + dels := make([]Item, 0, tr.Len()) + tr.Ascend(ItemIterator(func(b Item) bool { + dels = append(dels, b) + return true + })) + for _, del := range dels { + tr.Delete(del) + } + // tr is now empty, we make a new empty copy of it. + tr = New(*btreeDegree) + for _, v := range items { + tr.ReplaceOrInsert(v) + } + } + }) + b.Run(`ClearBigFreelist`, func(b *testing.B) { + fl := NewFreeList(16392) + tr := NewWithFreeList(*btreeDegree, fl) + for _, v := range items { + tr.ReplaceOrInsert(v) + } + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + tr.Clear(true) + for _, v := range items { + tr.ReplaceOrInsert(v) + } + } + }) + b.Run(`Clear`, func(b *testing.B) { + tr := New(*btreeDegree) + for _, v := range items { + tr.ReplaceOrInsert(v) + } + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + tr.Clear(true) + for _, v := range items { + tr.ReplaceOrInsert(v) + } + } + }) +} diff --git a/vendor/github.com/gregjones/httpcache/.travis.yml b/vendor/github.com/gregjones/httpcache/.travis.yml new file mode 100644 index 0000000000..597bc9996f --- /dev/null +++ b/vendor/github.com/gregjones/httpcache/.travis.yml @@ -0,0 +1,18 @@ +sudo: false +language: go +matrix: + allow_failures: + - go: master + fast_finish: true + include: + - go: 1.10.x + - go: 1.11.x + env: GOFMT=1 + - go: master +install: + - # Do nothing. This is needed to prevent default install action "go get -t -v ./..." from happening here (we want it to happen inside script step). +script: + - go get -t -v ./... + - if test -n "${GOFMT}"; then gofmt -w -s . && git diff --exit-code; fi + - go tool vet . + - go test -v -race ./... diff --git a/vendor/github.com/gregjones/httpcache/LICENSE.txt b/vendor/github.com/gregjones/httpcache/LICENSE.txt new file mode 100644 index 0000000000..81316beb0c --- /dev/null +++ b/vendor/github.com/gregjones/httpcache/LICENSE.txt @@ -0,0 +1,7 @@ +Copyright © 2012 Greg Jones (greg.jones@gmail.com) + +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. \ No newline at end of file diff --git a/vendor/github.com/gregjones/httpcache/README.md b/vendor/github.com/gregjones/httpcache/README.md new file mode 100644 index 0000000000..09c9e7c173 --- /dev/null +++ b/vendor/github.com/gregjones/httpcache/README.md @@ -0,0 +1,25 @@ +httpcache +========= + +[![Build Status](https://travis-ci.org/gregjones/httpcache.svg?branch=master)](https://travis-ci.org/gregjones/httpcache) [![GoDoc](https://godoc.org/github.com/gregjones/httpcache?status.svg)](https://godoc.org/github.com/gregjones/httpcache) + +Package httpcache provides a http.RoundTripper implementation that works as a mostly [RFC 7234](https://tools.ietf.org/html/rfc7234) compliant cache for http responses. + +It is only suitable for use as a 'private' cache (i.e. for a web-browser or an API-client and not for a shared proxy). + +Cache Backends +-------------- + +- The built-in 'memory' cache stores responses in an in-memory map. +- [`github.com/gregjones/httpcache/diskcache`](https://github.com/gregjones/httpcache/tree/master/diskcache) provides a filesystem-backed cache using the [diskv](https://github.com/peterbourgon/diskv) library. +- [`github.com/gregjones/httpcache/memcache`](https://github.com/gregjones/httpcache/tree/master/memcache) provides memcache implementations, for both App Engine and 'normal' memcache servers. +- [`sourcegraph.com/sourcegraph/s3cache`](https://sourcegraph.com/github.com/sourcegraph/s3cache) uses Amazon S3 for storage. +- [`github.com/gregjones/httpcache/leveldbcache`](https://github.com/gregjones/httpcache/tree/master/leveldbcache) provides a filesystem-backed cache using [leveldb](https://github.com/syndtr/goleveldb/leveldb). +- [`github.com/die-net/lrucache`](https://github.com/die-net/lrucache) provides an in-memory cache that will evict least-recently used entries. +- [`github.com/die-net/lrucache/twotier`](https://github.com/die-net/lrucache/tree/master/twotier) allows caches to be combined, for example to use lrucache above with a persistent disk-cache. +- [`github.com/birkelund/boltdbcache`](https://github.com/birkelund/boltdbcache) provides a BoltDB implementation (based on the [bbolt](https://github.com/coreos/bbolt) fork). + +License +------- + +- [MIT License](LICENSE.txt) diff --git a/vendor/github.com/gregjones/httpcache/diskcache/diskcache.go b/vendor/github.com/gregjones/httpcache/diskcache/diskcache.go new file mode 100644 index 0000000000..42e3129d82 --- /dev/null +++ b/vendor/github.com/gregjones/httpcache/diskcache/diskcache.go @@ -0,0 +1,61 @@ +// Package diskcache provides an implementation of httpcache.Cache that uses the diskv package +// to supplement an in-memory map with persistent storage +// +package diskcache + +import ( + "bytes" + "crypto/md5" + "encoding/hex" + "github.com/peterbourgon/diskv" + "io" +) + +// Cache is an implementation of httpcache.Cache that supplements the in-memory map with persistent storage +type Cache struct { + d *diskv.Diskv +} + +// Get returns the response corresponding to key if present +func (c *Cache) Get(key string) (resp []byte, ok bool) { + key = keyToFilename(key) + resp, err := c.d.Read(key) + if err != nil { + return []byte{}, false + } + return resp, true +} + +// Set saves a response to the cache as key +func (c *Cache) Set(key string, resp []byte) { + key = keyToFilename(key) + c.d.WriteStream(key, bytes.NewReader(resp), true) +} + +// Delete removes the response with key from the cache +func (c *Cache) Delete(key string) { + key = keyToFilename(key) + c.d.Erase(key) +} + +func keyToFilename(key string) string { + h := md5.New() + io.WriteString(h, key) + return hex.EncodeToString(h.Sum(nil)) +} + +// New returns a new Cache that will store files in basePath +func New(basePath string) *Cache { + return &Cache{ + d: diskv.New(diskv.Options{ + BasePath: basePath, + CacheSizeMax: 100 * 1024 * 1024, // 100MB + }), + } +} + +// NewWithDiskv returns a new Cache using the provided Diskv as underlying +// storage. +func NewWithDiskv(d *diskv.Diskv) *Cache { + return &Cache{d} +} diff --git a/vendor/github.com/gregjones/httpcache/diskcache/diskcache_test.go b/vendor/github.com/gregjones/httpcache/diskcache/diskcache_test.go new file mode 100644 index 0000000000..98e168b3f4 --- /dev/null +++ b/vendor/github.com/gregjones/httpcache/diskcache/diskcache_test.go @@ -0,0 +1,19 @@ +package diskcache + +import ( + "io/ioutil" + "os" + "testing" + + "github.com/gregjones/httpcache/test" +) + +func TestDiskCache(t *testing.T) { + tempDir, err := ioutil.TempDir("", "httpcache") + if err != nil { + t.Fatalf("TempDir: %v", err) + } + defer os.RemoveAll(tempDir) + + test.Cache(t, New(tempDir)) +} diff --git a/vendor/github.com/gregjones/httpcache/httpcache.go b/vendor/github.com/gregjones/httpcache/httpcache.go new file mode 100644 index 0000000000..b41a63d1ff --- /dev/null +++ b/vendor/github.com/gregjones/httpcache/httpcache.go @@ -0,0 +1,551 @@ +// Package httpcache provides a http.RoundTripper implementation that works as a +// mostly RFC-compliant cache for http responses. +// +// It is only suitable for use as a 'private' cache (i.e. for a web-browser or an API-client +// and not for a shared proxy). +// +package httpcache + +import ( + "bufio" + "bytes" + "errors" + "io" + "io/ioutil" + "net/http" + "net/http/httputil" + "strings" + "sync" + "time" +) + +const ( + stale = iota + fresh + transparent + // XFromCache is the header added to responses that are returned from the cache + XFromCache = "X-From-Cache" +) + +// A Cache interface is used by the Transport to store and retrieve responses. +type Cache interface { + // Get returns the []byte representation of a cached response and a bool + // set to true if the value isn't empty + Get(key string) (responseBytes []byte, ok bool) + // Set stores the []byte representation of a response against a key + Set(key string, responseBytes []byte) + // Delete removes the value associated with the key + Delete(key string) +} + +// cacheKey returns the cache key for req. +func cacheKey(req *http.Request) string { + if req.Method == http.MethodGet { + return req.URL.String() + } else { + return req.Method + " " + req.URL.String() + } +} + +// CachedResponse returns the cached http.Response for req if present, and nil +// otherwise. +func CachedResponse(c Cache, req *http.Request) (resp *http.Response, err error) { + cachedVal, ok := c.Get(cacheKey(req)) + if !ok { + return + } + + b := bytes.NewBuffer(cachedVal) + return http.ReadResponse(bufio.NewReader(b), req) +} + +// MemoryCache is an implemtation of Cache that stores responses in an in-memory map. +type MemoryCache struct { + mu sync.RWMutex + items map[string][]byte +} + +// Get returns the []byte representation of the response and true if present, false if not +func (c *MemoryCache) Get(key string) (resp []byte, ok bool) { + c.mu.RLock() + resp, ok = c.items[key] + c.mu.RUnlock() + return resp, ok +} + +// Set saves response resp to the cache with key +func (c *MemoryCache) Set(key string, resp []byte) { + c.mu.Lock() + c.items[key] = resp + c.mu.Unlock() +} + +// Delete removes key from the cache +func (c *MemoryCache) Delete(key string) { + c.mu.Lock() + delete(c.items, key) + c.mu.Unlock() +} + +// NewMemoryCache returns a new Cache that will store items in an in-memory map +func NewMemoryCache() *MemoryCache { + c := &MemoryCache{items: map[string][]byte{}} + return c +} + +// Transport is an implementation of http.RoundTripper that will return values from a cache +// where possible (avoiding a network request) and will additionally add validators (etag/if-modified-since) +// to repeated requests allowing servers to return 304 / Not Modified +type Transport struct { + // The RoundTripper interface actually used to make requests + // If nil, http.DefaultTransport is used + Transport http.RoundTripper + Cache Cache + // If true, responses returned from the cache will be given an extra header, X-From-Cache + MarkCachedResponses bool +} + +// NewTransport returns a new Transport with the +// provided Cache implementation and MarkCachedResponses set to true +func NewTransport(c Cache) *Transport { + return &Transport{Cache: c, MarkCachedResponses: true} +} + +// Client returns an *http.Client that caches responses. +func (t *Transport) Client() *http.Client { + return &http.Client{Transport: t} +} + +// varyMatches will return false unless all of the cached values for the headers listed in Vary +// match the new request +func varyMatches(cachedResp *http.Response, req *http.Request) bool { + for _, header := range headerAllCommaSepValues(cachedResp.Header, "vary") { + header = http.CanonicalHeaderKey(header) + if header != "" && req.Header.Get(header) != cachedResp.Header.Get("X-Varied-"+header) { + return false + } + } + return true +} + +// RoundTrip takes a Request and returns a Response +// +// If there is a fresh Response already in cache, then it will be returned without connecting to +// the server. +// +// If there is a stale Response, then any validators it contains will be set on the new request +// to give the server a chance to respond with NotModified. If this happens, then the cached Response +// will be returned. +func (t *Transport) RoundTrip(req *http.Request) (resp *http.Response, err error) { + cacheKey := cacheKey(req) + cacheable := (req.Method == "GET" || req.Method == "HEAD") && req.Header.Get("range") == "" + var cachedResp *http.Response + if cacheable { + cachedResp, err = CachedResponse(t.Cache, req) + } else { + // Need to invalidate an existing value + t.Cache.Delete(cacheKey) + } + + transport := t.Transport + if transport == nil { + transport = http.DefaultTransport + } + + if cacheable && cachedResp != nil && err == nil { + if t.MarkCachedResponses { + cachedResp.Header.Set(XFromCache, "1") + } + + if varyMatches(cachedResp, req) { + // Can only use cached value if the new request doesn't Vary significantly + freshness := getFreshness(cachedResp.Header, req.Header) + if freshness == fresh { + return cachedResp, nil + } + + if freshness == stale { + var req2 *http.Request + // Add validators if caller hasn't already done so + etag := cachedResp.Header.Get("etag") + if etag != "" && req.Header.Get("etag") == "" { + req2 = cloneRequest(req) + req2.Header.Set("if-none-match", etag) + } + lastModified := cachedResp.Header.Get("last-modified") + if lastModified != "" && req.Header.Get("last-modified") == "" { + if req2 == nil { + req2 = cloneRequest(req) + } + req2.Header.Set("if-modified-since", lastModified) + } + if req2 != nil { + req = req2 + } + } + } + + resp, err = transport.RoundTrip(req) + if err == nil && req.Method == "GET" && resp.StatusCode == http.StatusNotModified { + // Replace the 304 response with the one from cache, but update with some new headers + endToEndHeaders := getEndToEndHeaders(resp.Header) + for _, header := range endToEndHeaders { + cachedResp.Header[header] = resp.Header[header] + } + resp = cachedResp + } else if (err != nil || (cachedResp != nil && resp.StatusCode >= 500)) && + req.Method == "GET" && canStaleOnError(cachedResp.Header, req.Header) { + // In case of transport failure and stale-if-error activated, returns cached content + // when available + return cachedResp, nil + } else { + if err != nil || resp.StatusCode != http.StatusOK { + t.Cache.Delete(cacheKey) + } + if err != nil { + return nil, err + } + } + } else { + reqCacheControl := parseCacheControl(req.Header) + if _, ok := reqCacheControl["only-if-cached"]; ok { + resp = newGatewayTimeoutResponse(req) + } else { + resp, err = transport.RoundTrip(req) + if err != nil { + return nil, err + } + } + } + + if cacheable && canStore(parseCacheControl(req.Header), parseCacheControl(resp.Header)) { + for _, varyKey := range headerAllCommaSepValues(resp.Header, "vary") { + varyKey = http.CanonicalHeaderKey(varyKey) + fakeHeader := "X-Varied-" + varyKey + reqValue := req.Header.Get(varyKey) + if reqValue != "" { + resp.Header.Set(fakeHeader, reqValue) + } + } + switch req.Method { + case "GET": + // Delay caching until EOF is reached. + resp.Body = &cachingReadCloser{ + R: resp.Body, + OnEOF: func(r io.Reader) { + resp := *resp + resp.Body = ioutil.NopCloser(r) + respBytes, err := httputil.DumpResponse(&resp, true) + if err == nil { + t.Cache.Set(cacheKey, respBytes) + } + }, + } + default: + respBytes, err := httputil.DumpResponse(resp, true) + if err == nil { + t.Cache.Set(cacheKey, respBytes) + } + } + } else { + t.Cache.Delete(cacheKey) + } + return resp, nil +} + +// ErrNoDateHeader indicates that the HTTP headers contained no Date header. +var ErrNoDateHeader = errors.New("no Date header") + +// Date parses and returns the value of the Date header. +func Date(respHeaders http.Header) (date time.Time, err error) { + dateHeader := respHeaders.Get("date") + if dateHeader == "" { + err = ErrNoDateHeader + return + } + + return time.Parse(time.RFC1123, dateHeader) +} + +type realClock struct{} + +func (c *realClock) since(d time.Time) time.Duration { + return time.Since(d) +} + +type timer interface { + since(d time.Time) time.Duration +} + +var clock timer = &realClock{} + +// getFreshness will return one of fresh/stale/transparent based on the cache-control +// values of the request and the response +// +// fresh indicates the response can be returned +// stale indicates that the response needs validating before it is returned +// transparent indicates the response should not be used to fulfil the request +// +// Because this is only a private cache, 'public' and 'private' in cache-control aren't +// signficant. Similarly, smax-age isn't used. +func getFreshness(respHeaders, reqHeaders http.Header) (freshness int) { + respCacheControl := parseCacheControl(respHeaders) + reqCacheControl := parseCacheControl(reqHeaders) + if _, ok := reqCacheControl["no-cache"]; ok { + return transparent + } + if _, ok := respCacheControl["no-cache"]; ok { + return stale + } + if _, ok := reqCacheControl["only-if-cached"]; ok { + return fresh + } + + date, err := Date(respHeaders) + if err != nil { + return stale + } + currentAge := clock.since(date) + + var lifetime time.Duration + var zeroDuration time.Duration + + // If a response includes both an Expires header and a max-age directive, + // the max-age directive overrides the Expires header, even if the Expires header is more restrictive. + if maxAge, ok := respCacheControl["max-age"]; ok { + lifetime, err = time.ParseDuration(maxAge + "s") + if err != nil { + lifetime = zeroDuration + } + } else { + expiresHeader := respHeaders.Get("Expires") + if expiresHeader != "" { + expires, err := time.Parse(time.RFC1123, expiresHeader) + if err != nil { + lifetime = zeroDuration + } else { + lifetime = expires.Sub(date) + } + } + } + + if maxAge, ok := reqCacheControl["max-age"]; ok { + // the client is willing to accept a response whose age is no greater than the specified time in seconds + lifetime, err = time.ParseDuration(maxAge + "s") + if err != nil { + lifetime = zeroDuration + } + } + if minfresh, ok := reqCacheControl["min-fresh"]; ok { + // the client wants a response that will still be fresh for at least the specified number of seconds. + minfreshDuration, err := time.ParseDuration(minfresh + "s") + if err == nil { + currentAge = time.Duration(currentAge + minfreshDuration) + } + } + + if maxstale, ok := reqCacheControl["max-stale"]; ok { + // Indicates that the client is willing to accept a response that has exceeded its expiration time. + // If max-stale is assigned a value, then the client is willing to accept a response that has exceeded + // its expiration time by no more than the specified number of seconds. + // If no value is assigned to max-stale, then the client is willing to accept a stale response of any age. + // + // Responses served only because of a max-stale value are supposed to have a Warning header added to them, + // but that seems like a hassle, and is it actually useful? If so, then there needs to be a different + // return-value available here. + if maxstale == "" { + return fresh + } + maxstaleDuration, err := time.ParseDuration(maxstale + "s") + if err == nil { + currentAge = time.Duration(currentAge - maxstaleDuration) + } + } + + if lifetime > currentAge { + return fresh + } + + return stale +} + +// Returns true if either the request or the response includes the stale-if-error +// cache control extension: https://tools.ietf.org/html/rfc5861 +func canStaleOnError(respHeaders, reqHeaders http.Header) bool { + respCacheControl := parseCacheControl(respHeaders) + reqCacheControl := parseCacheControl(reqHeaders) + + var err error + lifetime := time.Duration(-1) + + if staleMaxAge, ok := respCacheControl["stale-if-error"]; ok { + if staleMaxAge != "" { + lifetime, err = time.ParseDuration(staleMaxAge + "s") + if err != nil { + return false + } + } else { + return true + } + } + if staleMaxAge, ok := reqCacheControl["stale-if-error"]; ok { + if staleMaxAge != "" { + lifetime, err = time.ParseDuration(staleMaxAge + "s") + if err != nil { + return false + } + } else { + return true + } + } + + if lifetime >= 0 { + date, err := Date(respHeaders) + if err != nil { + return false + } + currentAge := clock.since(date) + if lifetime > currentAge { + return true + } + } + + return false +} + +func getEndToEndHeaders(respHeaders http.Header) []string { + // These headers are always hop-by-hop + hopByHopHeaders := map[string]struct{}{ + "Connection": {}, + "Keep-Alive": {}, + "Proxy-Authenticate": {}, + "Proxy-Authorization": {}, + "Te": {}, + "Trailers": {}, + "Transfer-Encoding": {}, + "Upgrade": {}, + } + + for _, extra := range strings.Split(respHeaders.Get("connection"), ",") { + // any header listed in connection, if present, is also considered hop-by-hop + if strings.Trim(extra, " ") != "" { + hopByHopHeaders[http.CanonicalHeaderKey(extra)] = struct{}{} + } + } + endToEndHeaders := []string{} + for respHeader := range respHeaders { + if _, ok := hopByHopHeaders[respHeader]; !ok { + endToEndHeaders = append(endToEndHeaders, respHeader) + } + } + return endToEndHeaders +} + +func canStore(reqCacheControl, respCacheControl cacheControl) (canStore bool) { + if _, ok := respCacheControl["no-store"]; ok { + return false + } + if _, ok := reqCacheControl["no-store"]; ok { + return false + } + return true +} + +func newGatewayTimeoutResponse(req *http.Request) *http.Response { + var braw bytes.Buffer + braw.WriteString("HTTP/1.1 504 Gateway Timeout\r\n\r\n") + resp, err := http.ReadResponse(bufio.NewReader(&braw), req) + if err != nil { + panic(err) + } + return resp +} + +// cloneRequest returns a clone of the provided *http.Request. +// The clone is a shallow copy of the struct and its Header map. +// (This function copyright goauth2 authors: https://code.google.com/p/goauth2) +func cloneRequest(r *http.Request) *http.Request { + // shallow copy of the struct + r2 := new(http.Request) + *r2 = *r + // deep copy of the Header + r2.Header = make(http.Header) + for k, s := range r.Header { + r2.Header[k] = s + } + return r2 +} + +type cacheControl map[string]string + +func parseCacheControl(headers http.Header) cacheControl { + cc := cacheControl{} + ccHeader := headers.Get("Cache-Control") + for _, part := range strings.Split(ccHeader, ",") { + part = strings.Trim(part, " ") + if part == "" { + continue + } + if strings.ContainsRune(part, '=') { + keyval := strings.Split(part, "=") + cc[strings.Trim(keyval[0], " ")] = strings.Trim(keyval[1], ",") + } else { + cc[part] = "" + } + } + return cc +} + +// headerAllCommaSepValues returns all comma-separated values (each +// with whitespace trimmed) for header name in headers. According to +// Section 4.2 of the HTTP/1.1 spec +// (http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2), +// values from multiple occurrences of a header should be concatenated, if +// the header's value is a comma-separated list. +func headerAllCommaSepValues(headers http.Header, name string) []string { + var vals []string + for _, val := range headers[http.CanonicalHeaderKey(name)] { + fields := strings.Split(val, ",") + for i, f := range fields { + fields[i] = strings.TrimSpace(f) + } + vals = append(vals, fields...) + } + return vals +} + +// cachingReadCloser is a wrapper around ReadCloser R that calls OnEOF +// handler with a full copy of the content read from R when EOF is +// reached. +type cachingReadCloser struct { + // Underlying ReadCloser. + R io.ReadCloser + // OnEOF is called with a copy of the content of R when EOF is reached. + OnEOF func(io.Reader) + + buf bytes.Buffer // buf stores a copy of the content of R. +} + +// Read reads the next len(p) bytes from R or until R is drained. The +// return value n is the number of bytes read. If R has no data to +// return, err is io.EOF and OnEOF is called with a full copy of what +// has been read so far. +func (r *cachingReadCloser) Read(p []byte) (n int, err error) { + n, err = r.R.Read(p) + r.buf.Write(p[:n]) + if err == io.EOF { + r.OnEOF(bytes.NewReader(r.buf.Bytes())) + } + return n, err +} + +func (r *cachingReadCloser) Close() error { + return r.R.Close() +} + +// NewMemoryCacheTransport returns a new Transport using the in-memory cache implementation +func NewMemoryCacheTransport() *Transport { + c := NewMemoryCache() + t := NewTransport(c) + return t +} diff --git a/vendor/github.com/gregjones/httpcache/httpcache_test.go b/vendor/github.com/gregjones/httpcache/httpcache_test.go new file mode 100644 index 0000000000..a504641804 --- /dev/null +++ b/vendor/github.com/gregjones/httpcache/httpcache_test.go @@ -0,0 +1,1475 @@ +package httpcache + +import ( + "bytes" + "errors" + "flag" + "io" + "io/ioutil" + "net/http" + "net/http/httptest" + "os" + "strconv" + "testing" + "time" +) + +var s struct { + server *httptest.Server + client http.Client + transport *Transport + done chan struct{} // Closed to unlock infinite handlers. +} + +type fakeClock struct { + elapsed time.Duration +} + +func (c *fakeClock) since(t time.Time) time.Duration { + return c.elapsed +} + +func TestMain(m *testing.M) { + flag.Parse() + setup() + code := m.Run() + teardown() + os.Exit(code) +} + +func setup() { + tp := NewMemoryCacheTransport() + client := http.Client{Transport: tp} + s.transport = tp + s.client = client + s.done = make(chan struct{}) + + mux := http.NewServeMux() + s.server = httptest.NewServer(mux) + + mux.HandleFunc("/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Cache-Control", "max-age=3600") + })) + + mux.HandleFunc("/method", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Cache-Control", "max-age=3600") + w.Write([]byte(r.Method)) + })) + + mux.HandleFunc("/range", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + lm := "Fri, 14 Dec 2010 01:01:50 GMT" + if r.Header.Get("if-modified-since") == lm { + w.WriteHeader(http.StatusNotModified) + return + } + w.Header().Set("last-modified", lm) + if r.Header.Get("range") == "bytes=4-9" { + w.WriteHeader(http.StatusPartialContent) + w.Write([]byte(" text ")) + return + } + w.Write([]byte("Some text content")) + })) + + mux.HandleFunc("/nostore", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Cache-Control", "no-store") + })) + + mux.HandleFunc("/etag", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + etag := "124567" + if r.Header.Get("if-none-match") == etag { + w.WriteHeader(http.StatusNotModified) + return + } + w.Header().Set("etag", etag) + })) + + mux.HandleFunc("/lastmodified", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + lm := "Fri, 14 Dec 2010 01:01:50 GMT" + if r.Header.Get("if-modified-since") == lm { + w.WriteHeader(http.StatusNotModified) + return + } + w.Header().Set("last-modified", lm) + })) + + mux.HandleFunc("/varyaccept", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Cache-Control", "max-age=3600") + w.Header().Set("Content-Type", "text/plain") + w.Header().Set("Vary", "Accept") + w.Write([]byte("Some text content")) + })) + + mux.HandleFunc("/doublevary", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Cache-Control", "max-age=3600") + w.Header().Set("Content-Type", "text/plain") + w.Header().Set("Vary", "Accept, Accept-Language") + w.Write([]byte("Some text content")) + })) + mux.HandleFunc("/2varyheaders", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Cache-Control", "max-age=3600") + w.Header().Set("Content-Type", "text/plain") + w.Header().Add("Vary", "Accept") + w.Header().Add("Vary", "Accept-Language") + w.Write([]byte("Some text content")) + })) + mux.HandleFunc("/varyunused", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Cache-Control", "max-age=3600") + w.Header().Set("Content-Type", "text/plain") + w.Header().Set("Vary", "X-Madeup-Header") + w.Write([]byte("Some text content")) + })) + + mux.HandleFunc("/cachederror", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + etag := "abc" + if r.Header.Get("if-none-match") == etag { + w.WriteHeader(http.StatusNotModified) + return + } + w.Header().Set("etag", etag) + w.WriteHeader(http.StatusNotFound) + w.Write([]byte("Not found")) + })) + + updateFieldsCounter := 0 + mux.HandleFunc("/updatefields", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("X-Counter", strconv.Itoa(updateFieldsCounter)) + w.Header().Set("Etag", `"e"`) + updateFieldsCounter++ + if r.Header.Get("if-none-match") != "" { + w.WriteHeader(http.StatusNotModified) + return + } + w.Write([]byte("Some text content")) + })) + + // Take 3 seconds to return 200 OK (for testing client timeouts). + mux.HandleFunc("/3seconds", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + time.Sleep(3 * time.Second) + })) + + mux.HandleFunc("/infinite", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + for { + select { + case <-s.done: + return + default: + w.Write([]byte{0}) + } + } + })) +} + +func teardown() { + close(s.done) + s.server.Close() +} + +func resetTest() { + s.transport.Cache = NewMemoryCache() + clock = &realClock{} +} + +// TestCacheableMethod ensures that uncacheable method does not get stored +// in cache and get incorrectly used for a following cacheable method request. +func TestCacheableMethod(t *testing.T) { + resetTest() + { + req, err := http.NewRequest("POST", s.server.URL+"/method", nil) + if err != nil { + t.Fatal(err) + } + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + var buf bytes.Buffer + _, err = io.Copy(&buf, resp.Body) + if err != nil { + t.Fatal(err) + } + err = resp.Body.Close() + if err != nil { + t.Fatal(err) + } + if got, want := buf.String(), "POST"; got != want { + t.Errorf("got %q, want %q", got, want) + } + if resp.StatusCode != http.StatusOK { + t.Errorf("response status code isn't 200 OK: %v", resp.StatusCode) + } + } + { + req, err := http.NewRequest("GET", s.server.URL+"/method", nil) + if err != nil { + t.Fatal(err) + } + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + var buf bytes.Buffer + _, err = io.Copy(&buf, resp.Body) + if err != nil { + t.Fatal(err) + } + err = resp.Body.Close() + if err != nil { + t.Fatal(err) + } + if got, want := buf.String(), "GET"; got != want { + t.Errorf("got wrong body %q, want %q", got, want) + } + if resp.StatusCode != http.StatusOK { + t.Errorf("response status code isn't 200 OK: %v", resp.StatusCode) + } + if resp.Header.Get(XFromCache) != "" { + t.Errorf("XFromCache header isn't blank") + } + } +} + +func TestDontServeHeadResponseToGetRequest(t *testing.T) { + resetTest() + url := s.server.URL + "/" + req, err := http.NewRequest(http.MethodHead, url, nil) + if err != nil { + t.Fatal(err) + } + _, err = s.client.Do(req) + if err != nil { + t.Fatal(err) + } + req, err = http.NewRequest(http.MethodGet, url, nil) + if err != nil { + t.Fatal(err) + } + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + if resp.Header.Get(XFromCache) != "" { + t.Errorf("Cache should not match") + } +} + +func TestDontStorePartialRangeInCache(t *testing.T) { + resetTest() + { + req, err := http.NewRequest("GET", s.server.URL+"/range", nil) + if err != nil { + t.Fatal(err) + } + req.Header.Set("range", "bytes=4-9") + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + var buf bytes.Buffer + _, err = io.Copy(&buf, resp.Body) + if err != nil { + t.Fatal(err) + } + err = resp.Body.Close() + if err != nil { + t.Fatal(err) + } + if got, want := buf.String(), " text "; got != want { + t.Errorf("got %q, want %q", got, want) + } + if resp.StatusCode != http.StatusPartialContent { + t.Errorf("response status code isn't 206 Partial Content: %v", resp.StatusCode) + } + } + { + req, err := http.NewRequest("GET", s.server.URL+"/range", nil) + if err != nil { + t.Fatal(err) + } + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + var buf bytes.Buffer + _, err = io.Copy(&buf, resp.Body) + if err != nil { + t.Fatal(err) + } + err = resp.Body.Close() + if err != nil { + t.Fatal(err) + } + if got, want := buf.String(), "Some text content"; got != want { + t.Errorf("got %q, want %q", got, want) + } + if resp.StatusCode != http.StatusOK { + t.Errorf("response status code isn't 200 OK: %v", resp.StatusCode) + } + if resp.Header.Get(XFromCache) != "" { + t.Error("XFromCache header isn't blank") + } + } + { + req, err := http.NewRequest("GET", s.server.URL+"/range", nil) + if err != nil { + t.Fatal(err) + } + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + var buf bytes.Buffer + _, err = io.Copy(&buf, resp.Body) + if err != nil { + t.Fatal(err) + } + err = resp.Body.Close() + if err != nil { + t.Fatal(err) + } + if got, want := buf.String(), "Some text content"; got != want { + t.Errorf("got %q, want %q", got, want) + } + if resp.StatusCode != http.StatusOK { + t.Errorf("response status code isn't 200 OK: %v", resp.StatusCode) + } + if resp.Header.Get(XFromCache) != "1" { + t.Errorf(`XFromCache header isn't "1": %v`, resp.Header.Get(XFromCache)) + } + } + { + req, err := http.NewRequest("GET", s.server.URL+"/range", nil) + if err != nil { + t.Fatal(err) + } + req.Header.Set("range", "bytes=4-9") + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + var buf bytes.Buffer + _, err = io.Copy(&buf, resp.Body) + if err != nil { + t.Fatal(err) + } + err = resp.Body.Close() + if err != nil { + t.Fatal(err) + } + if got, want := buf.String(), " text "; got != want { + t.Errorf("got %q, want %q", got, want) + } + if resp.StatusCode != http.StatusPartialContent { + t.Errorf("response status code isn't 206 Partial Content: %v", resp.StatusCode) + } + } +} + +func TestCacheOnlyIfBodyRead(t *testing.T) { + resetTest() + { + req, err := http.NewRequest("GET", s.server.URL, nil) + if err != nil { + t.Fatal(err) + } + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + if resp.Header.Get(XFromCache) != "" { + t.Fatal("XFromCache header isn't blank") + } + // We do not read the body + resp.Body.Close() + } + { + req, err := http.NewRequest("GET", s.server.URL, nil) + if err != nil { + t.Fatal(err) + } + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.Header.Get(XFromCache) != "" { + t.Fatalf("XFromCache header isn't blank") + } + } +} + +func TestOnlyReadBodyOnDemand(t *testing.T) { + resetTest() + + req, err := http.NewRequest("GET", s.server.URL+"/infinite", nil) + if err != nil { + t.Fatal(err) + } + resp, err := s.client.Do(req) // This shouldn't hang forever. + if err != nil { + t.Fatal(err) + } + buf := make([]byte, 10) // Only partially read the body. + _, err = resp.Body.Read(buf) + if err != nil { + t.Fatal(err) + } + resp.Body.Close() +} + +func TestGetOnlyIfCachedHit(t *testing.T) { + resetTest() + { + req, err := http.NewRequest("GET", s.server.URL, nil) + if err != nil { + t.Fatal(err) + } + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.Header.Get(XFromCache) != "" { + t.Fatal("XFromCache header isn't blank") + } + _, err = ioutil.ReadAll(resp.Body) + if err != nil { + t.Fatal(err) + } + } + { + req, err := http.NewRequest("GET", s.server.URL, nil) + if err != nil { + t.Fatal(err) + } + req.Header.Add("cache-control", "only-if-cached") + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.Header.Get(XFromCache) != "1" { + t.Fatalf(`XFromCache header isn't "1": %v`, resp.Header.Get(XFromCache)) + } + if resp.StatusCode != http.StatusOK { + t.Fatalf("response status code isn't 200 OK: %v", resp.StatusCode) + } + } +} + +func TestGetOnlyIfCachedMiss(t *testing.T) { + resetTest() + req, err := http.NewRequest("GET", s.server.URL, nil) + if err != nil { + t.Fatal(err) + } + req.Header.Add("cache-control", "only-if-cached") + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.Header.Get(XFromCache) != "" { + t.Fatal("XFromCache header isn't blank") + } + if resp.StatusCode != http.StatusGatewayTimeout { + t.Fatalf("response status code isn't 504 GatewayTimeout: %v", resp.StatusCode) + } +} + +func TestGetNoStoreRequest(t *testing.T) { + resetTest() + req, err := http.NewRequest("GET", s.server.URL, nil) + if err != nil { + t.Fatal(err) + } + req.Header.Add("Cache-Control", "no-store") + { + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.Header.Get(XFromCache) != "" { + t.Fatal("XFromCache header isn't blank") + } + } + { + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.Header.Get(XFromCache) != "" { + t.Fatal("XFromCache header isn't blank") + } + } +} + +func TestGetNoStoreResponse(t *testing.T) { + resetTest() + req, err := http.NewRequest("GET", s.server.URL+"/nostore", nil) + if err != nil { + t.Fatal(err) + } + { + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.Header.Get(XFromCache) != "" { + t.Fatal("XFromCache header isn't blank") + } + } + { + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.Header.Get(XFromCache) != "" { + t.Fatal("XFromCache header isn't blank") + } + } +} + +func TestGetWithEtag(t *testing.T) { + resetTest() + req, err := http.NewRequest("GET", s.server.URL+"/etag", nil) + if err != nil { + t.Fatal(err) + } + { + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.Header.Get(XFromCache) != "" { + t.Fatal("XFromCache header isn't blank") + } + _, err = ioutil.ReadAll(resp.Body) + if err != nil { + t.Fatal(err) + } + + } + { + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.Header.Get(XFromCache) != "1" { + t.Fatalf(`XFromCache header isn't "1": %v`, resp.Header.Get(XFromCache)) + } + // additional assertions to verify that 304 response is converted properly + if resp.StatusCode != http.StatusOK { + t.Fatalf("response status code isn't 200 OK: %v", resp.StatusCode) + } + if _, ok := resp.Header["Connection"]; ok { + t.Fatalf("Connection header isn't absent") + } + } +} + +func TestGetWithLastModified(t *testing.T) { + resetTest() + req, err := http.NewRequest("GET", s.server.URL+"/lastmodified", nil) + if err != nil { + t.Fatal(err) + } + { + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.Header.Get(XFromCache) != "" { + t.Fatal("XFromCache header isn't blank") + } + _, err = ioutil.ReadAll(resp.Body) + if err != nil { + t.Fatal(err) + } + } + { + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.Header.Get(XFromCache) != "1" { + t.Fatalf(`XFromCache header isn't "1": %v`, resp.Header.Get(XFromCache)) + } + } +} + +func TestGetWithVary(t *testing.T) { + resetTest() + req, err := http.NewRequest("GET", s.server.URL+"/varyaccept", nil) + if err != nil { + t.Fatal(err) + } + req.Header.Set("Accept", "text/plain") + { + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.Header.Get("Vary") != "Accept" { + t.Fatalf(`Vary header isn't "Accept": %v`, resp.Header.Get("Vary")) + } + _, err = ioutil.ReadAll(resp.Body) + if err != nil { + t.Fatal(err) + } + } + { + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.Header.Get(XFromCache) != "1" { + t.Fatalf(`XFromCache header isn't "1": %v`, resp.Header.Get(XFromCache)) + } + } + req.Header.Set("Accept", "text/html") + { + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.Header.Get(XFromCache) != "" { + t.Fatal("XFromCache header isn't blank") + } + } + req.Header.Set("Accept", "") + { + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.Header.Get(XFromCache) != "" { + t.Fatal("XFromCache header isn't blank") + } + } +} + +func TestGetWithDoubleVary(t *testing.T) { + resetTest() + req, err := http.NewRequest("GET", s.server.URL+"/doublevary", nil) + if err != nil { + t.Fatal(err) + } + req.Header.Set("Accept", "text/plain") + req.Header.Set("Accept-Language", "da, en-gb;q=0.8, en;q=0.7") + { + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.Header.Get("Vary") == "" { + t.Fatalf(`Vary header is blank`) + } + _, err = ioutil.ReadAll(resp.Body) + if err != nil { + t.Fatal(err) + } + } + { + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.Header.Get(XFromCache) != "1" { + t.Fatalf(`XFromCache header isn't "1": %v`, resp.Header.Get(XFromCache)) + } + } + req.Header.Set("Accept-Language", "") + { + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.Header.Get(XFromCache) != "" { + t.Fatal("XFromCache header isn't blank") + } + } + req.Header.Set("Accept-Language", "da") + { + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.Header.Get(XFromCache) != "" { + t.Fatal("XFromCache header isn't blank") + } + } +} + +func TestGetWith2VaryHeaders(t *testing.T) { + resetTest() + // Tests that multiple Vary headers' comma-separated lists are + // merged. See https://github.com/gregjones/httpcache/issues/27. + const ( + accept = "text/plain" + acceptLanguage = "da, en-gb;q=0.8, en;q=0.7" + ) + req, err := http.NewRequest("GET", s.server.URL+"/2varyheaders", nil) + if err != nil { + t.Fatal(err) + } + req.Header.Set("Accept", accept) + req.Header.Set("Accept-Language", acceptLanguage) + { + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.Header.Get("Vary") == "" { + t.Fatalf(`Vary header is blank`) + } + _, err = ioutil.ReadAll(resp.Body) + if err != nil { + t.Fatal(err) + } + } + { + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.Header.Get(XFromCache) != "1" { + t.Fatalf(`XFromCache header isn't "1": %v`, resp.Header.Get(XFromCache)) + } + } + req.Header.Set("Accept-Language", "") + { + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.Header.Get(XFromCache) != "" { + t.Fatal("XFromCache header isn't blank") + } + } + req.Header.Set("Accept-Language", "da") + { + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.Header.Get(XFromCache) != "" { + t.Fatal("XFromCache header isn't blank") + } + } + req.Header.Set("Accept-Language", acceptLanguage) + req.Header.Set("Accept", "") + { + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.Header.Get(XFromCache) != "" { + t.Fatal("XFromCache header isn't blank") + } + } + req.Header.Set("Accept", "image/png") + { + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.Header.Get(XFromCache) != "" { + t.Fatal("XFromCache header isn't blank") + } + _, err = ioutil.ReadAll(resp.Body) + if err != nil { + t.Fatal(err) + } + } + { + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.Header.Get(XFromCache) != "1" { + t.Fatalf(`XFromCache header isn't "1": %v`, resp.Header.Get(XFromCache)) + } + } +} + +func TestGetVaryUnused(t *testing.T) { + resetTest() + req, err := http.NewRequest("GET", s.server.URL+"/varyunused", nil) + if err != nil { + t.Fatal(err) + } + req.Header.Set("Accept", "text/plain") + { + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.Header.Get("Vary") == "" { + t.Fatalf(`Vary header is blank`) + } + _, err = ioutil.ReadAll(resp.Body) + if err != nil { + t.Fatal(err) + } + } + { + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.Header.Get(XFromCache) != "1" { + t.Fatalf(`XFromCache header isn't "1": %v`, resp.Header.Get(XFromCache)) + } + } +} + +func TestUpdateFields(t *testing.T) { + resetTest() + req, err := http.NewRequest("GET", s.server.URL+"/updatefields", nil) + if err != nil { + t.Fatal(err) + } + var counter, counter2 string + { + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + counter = resp.Header.Get("x-counter") + _, err = ioutil.ReadAll(resp.Body) + if err != nil { + t.Fatal(err) + } + } + { + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.Header.Get(XFromCache) != "1" { + t.Fatalf(`XFromCache header isn't "1": %v`, resp.Header.Get(XFromCache)) + } + counter2 = resp.Header.Get("x-counter") + } + if counter == counter2 { + t.Fatalf(`both "x-counter" values are equal: %v %v`, counter, counter2) + } +} + +// This tests the fix for https://github.com/gregjones/httpcache/issues/74. +// Previously, after validating a cached response, its StatusCode +// was incorrectly being replaced. +func TestCachedErrorsKeepStatus(t *testing.T) { + resetTest() + req, err := http.NewRequest("GET", s.server.URL+"/cachederror", nil) + if err != nil { + t.Fatal(err) + } + { + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + io.Copy(ioutil.Discard, resp.Body) + } + { + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.StatusCode != http.StatusNotFound { + t.Fatalf("Status code isn't 404: %d", resp.StatusCode) + } + } +} + +func TestParseCacheControl(t *testing.T) { + resetTest() + h := http.Header{} + for range parseCacheControl(h) { + t.Fatal("cacheControl should be empty") + } + + h.Set("cache-control", "no-cache") + { + cc := parseCacheControl(h) + if _, ok := cc["foo"]; ok { + t.Error(`Value "foo" shouldn't exist`) + } + noCache, ok := cc["no-cache"] + if !ok { + t.Fatalf(`"no-cache" value isn't set`) + } + if noCache != "" { + t.Fatalf(`"no-cache" value isn't blank: %v`, noCache) + } + } + h.Set("cache-control", "no-cache, max-age=3600") + { + cc := parseCacheControl(h) + noCache, ok := cc["no-cache"] + if !ok { + t.Fatalf(`"no-cache" value isn't set`) + } + if noCache != "" { + t.Fatalf(`"no-cache" value isn't blank: %v`, noCache) + } + if cc["max-age"] != "3600" { + t.Fatalf(`"max-age" value isn't "3600": %v`, cc["max-age"]) + } + } +} + +func TestNoCacheRequestExpiration(t *testing.T) { + resetTest() + respHeaders := http.Header{} + respHeaders.Set("Cache-Control", "max-age=7200") + + reqHeaders := http.Header{} + reqHeaders.Set("Cache-Control", "no-cache") + if getFreshness(respHeaders, reqHeaders) != transparent { + t.Fatal("freshness isn't transparent") + } +} + +func TestNoCacheResponseExpiration(t *testing.T) { + resetTest() + respHeaders := http.Header{} + respHeaders.Set("Cache-Control", "no-cache") + respHeaders.Set("Expires", "Wed, 19 Apr 3000 11:43:00 GMT") + + reqHeaders := http.Header{} + if getFreshness(respHeaders, reqHeaders) != stale { + t.Fatal("freshness isn't stale") + } +} + +func TestReqMustRevalidate(t *testing.T) { + resetTest() + // not paying attention to request setting max-stale means never returning stale + // responses, so always acting as if must-revalidate is set + respHeaders := http.Header{} + + reqHeaders := http.Header{} + reqHeaders.Set("Cache-Control", "must-revalidate") + if getFreshness(respHeaders, reqHeaders) != stale { + t.Fatal("freshness isn't stale") + } +} + +func TestRespMustRevalidate(t *testing.T) { + resetTest() + respHeaders := http.Header{} + respHeaders.Set("Cache-Control", "must-revalidate") + + reqHeaders := http.Header{} + if getFreshness(respHeaders, reqHeaders) != stale { + t.Fatal("freshness isn't stale") + } +} + +func TestFreshExpiration(t *testing.T) { + resetTest() + now := time.Now() + respHeaders := http.Header{} + respHeaders.Set("date", now.Format(time.RFC1123)) + respHeaders.Set("expires", now.Add(time.Duration(2)*time.Second).Format(time.RFC1123)) + + reqHeaders := http.Header{} + if getFreshness(respHeaders, reqHeaders) != fresh { + t.Fatal("freshness isn't fresh") + } + + clock = &fakeClock{elapsed: 3 * time.Second} + if getFreshness(respHeaders, reqHeaders) != stale { + t.Fatal("freshness isn't stale") + } +} + +func TestMaxAge(t *testing.T) { + resetTest() + now := time.Now() + respHeaders := http.Header{} + respHeaders.Set("date", now.Format(time.RFC1123)) + respHeaders.Set("cache-control", "max-age=2") + + reqHeaders := http.Header{} + if getFreshness(respHeaders, reqHeaders) != fresh { + t.Fatal("freshness isn't fresh") + } + + clock = &fakeClock{elapsed: 3 * time.Second} + if getFreshness(respHeaders, reqHeaders) != stale { + t.Fatal("freshness isn't stale") + } +} + +func TestMaxAgeZero(t *testing.T) { + resetTest() + now := time.Now() + respHeaders := http.Header{} + respHeaders.Set("date", now.Format(time.RFC1123)) + respHeaders.Set("cache-control", "max-age=0") + + reqHeaders := http.Header{} + if getFreshness(respHeaders, reqHeaders) != stale { + t.Fatal("freshness isn't stale") + } +} + +func TestBothMaxAge(t *testing.T) { + resetTest() + now := time.Now() + respHeaders := http.Header{} + respHeaders.Set("date", now.Format(time.RFC1123)) + respHeaders.Set("cache-control", "max-age=2") + + reqHeaders := http.Header{} + reqHeaders.Set("cache-control", "max-age=0") + if getFreshness(respHeaders, reqHeaders) != stale { + t.Fatal("freshness isn't stale") + } +} + +func TestMinFreshWithExpires(t *testing.T) { + resetTest() + now := time.Now() + respHeaders := http.Header{} + respHeaders.Set("date", now.Format(time.RFC1123)) + respHeaders.Set("expires", now.Add(time.Duration(2)*time.Second).Format(time.RFC1123)) + + reqHeaders := http.Header{} + reqHeaders.Set("cache-control", "min-fresh=1") + if getFreshness(respHeaders, reqHeaders) != fresh { + t.Fatal("freshness isn't fresh") + } + + reqHeaders = http.Header{} + reqHeaders.Set("cache-control", "min-fresh=2") + if getFreshness(respHeaders, reqHeaders) != stale { + t.Fatal("freshness isn't stale") + } +} + +func TestEmptyMaxStale(t *testing.T) { + resetTest() + now := time.Now() + respHeaders := http.Header{} + respHeaders.Set("date", now.Format(time.RFC1123)) + respHeaders.Set("cache-control", "max-age=20") + + reqHeaders := http.Header{} + reqHeaders.Set("cache-control", "max-stale") + clock = &fakeClock{elapsed: 10 * time.Second} + if getFreshness(respHeaders, reqHeaders) != fresh { + t.Fatal("freshness isn't fresh") + } + + clock = &fakeClock{elapsed: 60 * time.Second} + if getFreshness(respHeaders, reqHeaders) != fresh { + t.Fatal("freshness isn't fresh") + } +} + +func TestMaxStaleValue(t *testing.T) { + resetTest() + now := time.Now() + respHeaders := http.Header{} + respHeaders.Set("date", now.Format(time.RFC1123)) + respHeaders.Set("cache-control", "max-age=10") + + reqHeaders := http.Header{} + reqHeaders.Set("cache-control", "max-stale=20") + clock = &fakeClock{elapsed: 5 * time.Second} + if getFreshness(respHeaders, reqHeaders) != fresh { + t.Fatal("freshness isn't fresh") + } + + clock = &fakeClock{elapsed: 15 * time.Second} + if getFreshness(respHeaders, reqHeaders) != fresh { + t.Fatal("freshness isn't fresh") + } + + clock = &fakeClock{elapsed: 30 * time.Second} + if getFreshness(respHeaders, reqHeaders) != stale { + t.Fatal("freshness isn't stale") + } +} + +func containsHeader(headers []string, header string) bool { + for _, v := range headers { + if http.CanonicalHeaderKey(v) == http.CanonicalHeaderKey(header) { + return true + } + } + return false +} + +func TestGetEndToEndHeaders(t *testing.T) { + resetTest() + var ( + headers http.Header + end2end []string + ) + + headers = http.Header{} + headers.Set("content-type", "text/html") + headers.Set("te", "deflate") + + end2end = getEndToEndHeaders(headers) + if !containsHeader(end2end, "content-type") { + t.Fatal(`doesn't contain "content-type" header`) + } + if containsHeader(end2end, "te") { + t.Fatal(`doesn't contain "te" header`) + } + + headers = http.Header{} + headers.Set("connection", "content-type") + headers.Set("content-type", "text/csv") + headers.Set("te", "deflate") + end2end = getEndToEndHeaders(headers) + if containsHeader(end2end, "connection") { + t.Fatal(`doesn't contain "connection" header`) + } + if containsHeader(end2end, "content-type") { + t.Fatal(`doesn't contain "content-type" header`) + } + if containsHeader(end2end, "te") { + t.Fatal(`doesn't contain "te" header`) + } + + headers = http.Header{} + end2end = getEndToEndHeaders(headers) + if len(end2end) != 0 { + t.Fatal(`non-zero end2end headers`) + } + + headers = http.Header{} + headers.Set("connection", "content-type") + end2end = getEndToEndHeaders(headers) + if len(end2end) != 0 { + t.Fatal(`non-zero end2end headers`) + } +} + +type transportMock struct { + response *http.Response + err error +} + +func (t transportMock) RoundTrip(req *http.Request) (resp *http.Response, err error) { + return t.response, t.err +} + +func TestStaleIfErrorRequest(t *testing.T) { + resetTest() + now := time.Now() + tmock := transportMock{ + response: &http.Response{ + Status: http.StatusText(http.StatusOK), + StatusCode: http.StatusOK, + Header: http.Header{ + "Date": []string{now.Format(time.RFC1123)}, + "Cache-Control": []string{"no-cache"}, + }, + Body: ioutil.NopCloser(bytes.NewBuffer([]byte("some data"))), + }, + err: nil, + } + tp := NewMemoryCacheTransport() + tp.Transport = &tmock + + // First time, response is cached on success + r, _ := http.NewRequest("GET", "http://somewhere.com/", nil) + r.Header.Set("Cache-Control", "stale-if-error") + resp, err := tp.RoundTrip(r) + if err != nil { + t.Fatal(err) + } + if resp == nil { + t.Fatal("resp is nil") + } + _, err = ioutil.ReadAll(resp.Body) + if err != nil { + t.Fatal(err) + } + + // On failure, response is returned from the cache + tmock.response = nil + tmock.err = errors.New("some error") + resp, err = tp.RoundTrip(r) + if err != nil { + t.Fatal(err) + } + if resp == nil { + t.Fatal("resp is nil") + } +} + +func TestStaleIfErrorRequestLifetime(t *testing.T) { + resetTest() + now := time.Now() + tmock := transportMock{ + response: &http.Response{ + Status: http.StatusText(http.StatusOK), + StatusCode: http.StatusOK, + Header: http.Header{ + "Date": []string{now.Format(time.RFC1123)}, + "Cache-Control": []string{"no-cache"}, + }, + Body: ioutil.NopCloser(bytes.NewBuffer([]byte("some data"))), + }, + err: nil, + } + tp := NewMemoryCacheTransport() + tp.Transport = &tmock + + // First time, response is cached on success + r, _ := http.NewRequest("GET", "http://somewhere.com/", nil) + r.Header.Set("Cache-Control", "stale-if-error=100") + resp, err := tp.RoundTrip(r) + if err != nil { + t.Fatal(err) + } + if resp == nil { + t.Fatal("resp is nil") + } + _, err = ioutil.ReadAll(resp.Body) + if err != nil { + t.Fatal(err) + } + + // On failure, response is returned from the cache + tmock.response = nil + tmock.err = errors.New("some error") + resp, err = tp.RoundTrip(r) + if err != nil { + t.Fatal(err) + } + if resp == nil { + t.Fatal("resp is nil") + } + + // Same for http errors + tmock.response = &http.Response{StatusCode: http.StatusInternalServerError} + tmock.err = nil + resp, err = tp.RoundTrip(r) + if err != nil { + t.Fatal(err) + } + if resp == nil { + t.Fatal("resp is nil") + } + + // If failure last more than max stale, error is returned + clock = &fakeClock{elapsed: 200 * time.Second} + _, err = tp.RoundTrip(r) + if err != tmock.err { + t.Fatalf("got err %v, want %v", err, tmock.err) + } +} + +func TestStaleIfErrorResponse(t *testing.T) { + resetTest() + now := time.Now() + tmock := transportMock{ + response: &http.Response{ + Status: http.StatusText(http.StatusOK), + StatusCode: http.StatusOK, + Header: http.Header{ + "Date": []string{now.Format(time.RFC1123)}, + "Cache-Control": []string{"no-cache, stale-if-error"}, + }, + Body: ioutil.NopCloser(bytes.NewBuffer([]byte("some data"))), + }, + err: nil, + } + tp := NewMemoryCacheTransport() + tp.Transport = &tmock + + // First time, response is cached on success + r, _ := http.NewRequest("GET", "http://somewhere.com/", nil) + resp, err := tp.RoundTrip(r) + if err != nil { + t.Fatal(err) + } + if resp == nil { + t.Fatal("resp is nil") + } + _, err = ioutil.ReadAll(resp.Body) + if err != nil { + t.Fatal(err) + } + + // On failure, response is returned from the cache + tmock.response = nil + tmock.err = errors.New("some error") + resp, err = tp.RoundTrip(r) + if err != nil { + t.Fatal(err) + } + if resp == nil { + t.Fatal("resp is nil") + } +} + +func TestStaleIfErrorResponseLifetime(t *testing.T) { + resetTest() + now := time.Now() + tmock := transportMock{ + response: &http.Response{ + Status: http.StatusText(http.StatusOK), + StatusCode: http.StatusOK, + Header: http.Header{ + "Date": []string{now.Format(time.RFC1123)}, + "Cache-Control": []string{"no-cache, stale-if-error=100"}, + }, + Body: ioutil.NopCloser(bytes.NewBuffer([]byte("some data"))), + }, + err: nil, + } + tp := NewMemoryCacheTransport() + tp.Transport = &tmock + + // First time, response is cached on success + r, _ := http.NewRequest("GET", "http://somewhere.com/", nil) + resp, err := tp.RoundTrip(r) + if err != nil { + t.Fatal(err) + } + if resp == nil { + t.Fatal("resp is nil") + } + _, err = ioutil.ReadAll(resp.Body) + if err != nil { + t.Fatal(err) + } + + // On failure, response is returned from the cache + tmock.response = nil + tmock.err = errors.New("some error") + resp, err = tp.RoundTrip(r) + if err != nil { + t.Fatal(err) + } + if resp == nil { + t.Fatal("resp is nil") + } + + // If failure last more than max stale, error is returned + clock = &fakeClock{elapsed: 200 * time.Second} + _, err = tp.RoundTrip(r) + if err != tmock.err { + t.Fatalf("got err %v, want %v", err, tmock.err) + } +} + +// This tests the fix for https://github.com/gregjones/httpcache/issues/74. +// Previously, after a stale response was used after encountering an error, +// its StatusCode was being incorrectly replaced. +func TestStaleIfErrorKeepsStatus(t *testing.T) { + resetTest() + now := time.Now() + tmock := transportMock{ + response: &http.Response{ + Status: http.StatusText(http.StatusNotFound), + StatusCode: http.StatusNotFound, + Header: http.Header{ + "Date": []string{now.Format(time.RFC1123)}, + "Cache-Control": []string{"no-cache"}, + }, + Body: ioutil.NopCloser(bytes.NewBuffer([]byte("some data"))), + }, + err: nil, + } + tp := NewMemoryCacheTransport() + tp.Transport = &tmock + + // First time, response is cached on success + r, _ := http.NewRequest("GET", "http://somewhere.com/", nil) + r.Header.Set("Cache-Control", "stale-if-error") + resp, err := tp.RoundTrip(r) + if err != nil { + t.Fatal(err) + } + if resp == nil { + t.Fatal("resp is nil") + } + _, err = ioutil.ReadAll(resp.Body) + if err != nil { + t.Fatal(err) + } + + // On failure, response is returned from the cache + tmock.response = nil + tmock.err = errors.New("some error") + resp, err = tp.RoundTrip(r) + if err != nil { + t.Fatal(err) + } + if resp == nil { + t.Fatal("resp is nil") + } + if resp.StatusCode != http.StatusNotFound { + t.Fatalf("Status wasn't 404: %d", resp.StatusCode) + } +} + +// Test that http.Client.Timeout is respected when cache transport is used. +// That is so as long as request cancellation is propagated correctly. +// In the past, that required CancelRequest to be implemented correctly, +// but modern http.Client uses Request.Cancel (or request context) instead, +// so we don't have to do anything. +func TestClientTimeout(t *testing.T) { + if testing.Short() { + t.Skip("skipping timeout test in short mode") // Because it takes at least 3 seconds to run. + } + resetTest() + client := &http.Client{ + Transport: NewMemoryCacheTransport(), + Timeout: time.Second, + } + started := time.Now() + resp, err := client.Get(s.server.URL + "/3seconds") + taken := time.Since(started) + if err == nil { + t.Error("got nil error, want timeout error") + } + if resp != nil { + t.Error("got non-nil resp, want nil resp") + } + if taken >= 2*time.Second { + t.Error("client.Do took 2+ seconds, want < 2 seconds") + } +} diff --git a/vendor/github.com/gregjones/httpcache/leveldbcache/leveldbcache.go b/vendor/github.com/gregjones/httpcache/leveldbcache/leveldbcache.go new file mode 100644 index 0000000000..9bcb7e2771 --- /dev/null +++ b/vendor/github.com/gregjones/httpcache/leveldbcache/leveldbcache.go @@ -0,0 +1,51 @@ +// Package leveldbcache provides an implementation of httpcache.Cache that +// uses github.com/syndtr/goleveldb/leveldb +package leveldbcache + +import ( + "github.com/syndtr/goleveldb/leveldb" +) + +// Cache is an implementation of httpcache.Cache with leveldb storage +type Cache struct { + db *leveldb.DB +} + +// Get returns the response corresponding to key if present +func (c *Cache) Get(key string) (resp []byte, ok bool) { + var err error + resp, err = c.db.Get([]byte(key), nil) + if err != nil { + return []byte{}, false + } + return resp, true +} + +// Set saves a response to the cache as key +func (c *Cache) Set(key string, resp []byte) { + c.db.Put([]byte(key), resp, nil) +} + +// Delete removes the response with key from the cache +func (c *Cache) Delete(key string) { + c.db.Delete([]byte(key), nil) +} + +// New returns a new Cache that will store leveldb in path +func New(path string) (*Cache, error) { + cache := &Cache{} + + var err error + cache.db, err = leveldb.OpenFile(path, nil) + + if err != nil { + return nil, err + } + return cache, nil +} + +// NewWithDB returns a new Cache using the provided leveldb as underlying +// storage. +func NewWithDB(db *leveldb.DB) *Cache { + return &Cache{db} +} diff --git a/vendor/github.com/gregjones/httpcache/leveldbcache/leveldbcache_test.go b/vendor/github.com/gregjones/httpcache/leveldbcache/leveldbcache_test.go new file mode 100644 index 0000000000..e301e7b95f --- /dev/null +++ b/vendor/github.com/gregjones/httpcache/leveldbcache/leveldbcache_test.go @@ -0,0 +1,25 @@ +package leveldbcache + +import ( + "io/ioutil" + "os" + "path/filepath" + "testing" + + "github.com/gregjones/httpcache/test" +) + +func TestDiskCache(t *testing.T) { + tempDir, err := ioutil.TempDir("", "httpcache") + if err != nil { + t.Fatalf("TempDir: %v", err) + } + defer os.RemoveAll(tempDir) + + cache, err := New(filepath.Join(tempDir, "db")) + if err != nil { + t.Fatalf("New leveldb,: %v", err) + } + + test.Cache(t, cache) +} diff --git a/vendor/github.com/gregjones/httpcache/memcache/appengine.go b/vendor/github.com/gregjones/httpcache/memcache/appengine.go new file mode 100644 index 0000000000..e68d9bc092 --- /dev/null +++ b/vendor/github.com/gregjones/httpcache/memcache/appengine.go @@ -0,0 +1,61 @@ +// +build appengine + +// Package memcache provides an implementation of httpcache.Cache that uses App +// Engine's memcache package to store cached responses. +// +// When not built for Google App Engine, this package will provide an +// implementation that connects to a specified memcached server. See the +// memcache.go file in this package for details. +package memcache + +import ( + "appengine" + "appengine/memcache" +) + +// Cache is an implementation of httpcache.Cache that caches responses in App +// Engine's memcache. +type Cache struct { + appengine.Context +} + +// cacheKey modifies an httpcache key for use in memcache. Specifically, it +// prefixes keys to avoid collision with other data stored in memcache. +func cacheKey(key string) string { + return "httpcache:" + key +} + +// Get returns the response corresponding to key if present. +func (c *Cache) Get(key string) (resp []byte, ok bool) { + item, err := memcache.Get(c.Context, cacheKey(key)) + if err != nil { + if err != memcache.ErrCacheMiss { + c.Context.Errorf("error getting cached response: %v", err) + } + return nil, false + } + return item.Value, true +} + +// Set saves a response to the cache as key. +func (c *Cache) Set(key string, resp []byte) { + item := &memcache.Item{ + Key: cacheKey(key), + Value: resp, + } + if err := memcache.Set(c.Context, item); err != nil { + c.Context.Errorf("error caching response: %v", err) + } +} + +// Delete removes the response with key from the cache. +func (c *Cache) Delete(key string) { + if err := memcache.Delete(c.Context, cacheKey(key)); err != nil { + c.Context.Errorf("error deleting cached response: %v", err) + } +} + +// New returns a new Cache for the given context. +func New(ctx appengine.Context) *Cache { + return &Cache{ctx} +} diff --git a/vendor/github.com/gregjones/httpcache/memcache/appengine_test.go b/vendor/github.com/gregjones/httpcache/memcache/appengine_test.go new file mode 100644 index 0000000000..f46c379e05 --- /dev/null +++ b/vendor/github.com/gregjones/httpcache/memcache/appengine_test.go @@ -0,0 +1,20 @@ +// +build appengine + +package memcache + +import ( + "testing" + + "appengine/aetest" + "github.com/gregjones/httpcache/test" +) + +func TestAppEngine(t *testing.T) { + ctx, err := aetest.NewContext(nil) + if err != nil { + t.Fatal(err) + } + defer ctx.Close() + + test.Cache(t, New(ctx)) +} diff --git a/vendor/github.com/gregjones/httpcache/memcache/memcache.go b/vendor/github.com/gregjones/httpcache/memcache/memcache.go new file mode 100644 index 0000000000..462f0e5419 --- /dev/null +++ b/vendor/github.com/gregjones/httpcache/memcache/memcache.go @@ -0,0 +1,60 @@ +// +build !appengine + +// Package memcache provides an implementation of httpcache.Cache that uses +// gomemcache to store cached responses. +// +// When built for Google App Engine, this package will provide an +// implementation that uses App Engine's memcache service. See the +// appengine.go file in this package for details. +package memcache + +import ( + "github.com/bradfitz/gomemcache/memcache" +) + +// Cache is an implementation of httpcache.Cache that caches responses in a +// memcache server. +type Cache struct { + *memcache.Client +} + +// cacheKey modifies an httpcache key for use in memcache. Specifically, it +// prefixes keys to avoid collision with other data stored in memcache. +func cacheKey(key string) string { + return "httpcache:" + key +} + +// Get returns the response corresponding to key if present. +func (c *Cache) Get(key string) (resp []byte, ok bool) { + item, err := c.Client.Get(cacheKey(key)) + if err != nil { + return nil, false + } + return item.Value, true +} + +// Set saves a response to the cache as key. +func (c *Cache) Set(key string, resp []byte) { + item := &memcache.Item{ + Key: cacheKey(key), + Value: resp, + } + c.Client.Set(item) +} + +// Delete removes the response with key from the cache. +func (c *Cache) Delete(key string) { + c.Client.Delete(cacheKey(key)) +} + +// New returns a new Cache using the provided memcache server(s) with equal +// weight. If a server is listed multiple times, it gets a proportional amount +// of weight. +func New(server ...string) *Cache { + return NewWithClient(memcache.New(server...)) +} + +// NewWithClient returns a new Cache with the given memcache client. +func NewWithClient(client *memcache.Client) *Cache { + return &Cache{client} +} diff --git a/vendor/github.com/gregjones/httpcache/memcache/memcache_test.go b/vendor/github.com/gregjones/httpcache/memcache/memcache_test.go new file mode 100644 index 0000000000..cce9e024d7 --- /dev/null +++ b/vendor/github.com/gregjones/httpcache/memcache/memcache_test.go @@ -0,0 +1,24 @@ +// +build !appengine + +package memcache + +import ( + "net" + "testing" + + "github.com/gregjones/httpcache/test" +) + +const testServer = "localhost:11211" + +func TestMemCache(t *testing.T) { + conn, err := net.Dial("tcp", testServer) + if err != nil { + // TODO: rather than skip the test, fall back to a faked memcached server + t.Skipf("skipping test; no server running at %s", testServer) + } + conn.Write([]byte("flush_all\r\n")) // flush memcache + conn.Close() + + test.Cache(t, New(testServer)) +} diff --git a/vendor/github.com/gregjones/httpcache/redis/redis.go b/vendor/github.com/gregjones/httpcache/redis/redis.go new file mode 100644 index 0000000000..3d69c6c7bc --- /dev/null +++ b/vendor/github.com/gregjones/httpcache/redis/redis.go @@ -0,0 +1,43 @@ +// Package redis provides a redis interface for http caching. +package redis + +import ( + "github.com/gomodule/redigo/redis" + "github.com/gregjones/httpcache" +) + +// cache is an implementation of httpcache.Cache that caches responses in a +// redis server. +type cache struct { + redis.Conn +} + +// cacheKey modifies an httpcache key for use in redis. Specifically, it +// prefixes keys to avoid collision with other data stored in redis. +func cacheKey(key string) string { + return "rediscache:" + key +} + +// Get returns the response corresponding to key if present. +func (c cache) Get(key string) (resp []byte, ok bool) { + item, err := redis.Bytes(c.Do("GET", cacheKey(key))) + if err != nil { + return nil, false + } + return item, true +} + +// Set saves a response to the cache as key. +func (c cache) Set(key string, resp []byte) { + c.Do("SET", cacheKey(key), resp) +} + +// Delete removes the response with key from the cache. +func (c cache) Delete(key string) { + c.Do("DEL", cacheKey(key)) +} + +// NewWithClient returns a new Cache with the given redis connection. +func NewWithClient(client redis.Conn) httpcache.Cache { + return cache{client} +} diff --git a/vendor/github.com/gregjones/httpcache/redis/redis_test.go b/vendor/github.com/gregjones/httpcache/redis/redis_test.go new file mode 100644 index 0000000000..800863c55f --- /dev/null +++ b/vendor/github.com/gregjones/httpcache/redis/redis_test.go @@ -0,0 +1,19 @@ +package redis + +import ( + "testing" + + "github.com/gomodule/redigo/redis" + "github.com/gregjones/httpcache/test" +) + +func TestRedisCache(t *testing.T) { + conn, err := redis.Dial("tcp", "localhost:6379") + if err != nil { + // TODO: rather than skip the test, fall back to a faked redis server + t.Skipf("skipping test; no server running at localhost:6379") + } + conn.Do("FLUSHALL") + + test.Cache(t, NewWithClient(conn)) +} diff --git a/vendor/github.com/gregjones/httpcache/test/test.go b/vendor/github.com/gregjones/httpcache/test/test.go new file mode 100644 index 0000000000..c2ff257b1a --- /dev/null +++ b/vendor/github.com/gregjones/httpcache/test/test.go @@ -0,0 +1,35 @@ +package test + +import ( + "bytes" + "testing" + + "github.com/gregjones/httpcache" +) + +// Cache excercises a httpcache.Cache implementation. +func Cache(t *testing.T, cache httpcache.Cache) { + key := "testKey" + _, ok := cache.Get(key) + if ok { + t.Fatal("retrieved key before adding it") + } + + val := []byte("some bytes") + cache.Set(key, val) + + retVal, ok := cache.Get(key) + if !ok { + t.Fatal("could not retrieve an element we just added") + } + if !bytes.Equal(retVal, val) { + t.Fatal("retrieved a different value than what we put in") + } + + cache.Delete(key) + + _, ok = cache.Get(key) + if ok { + t.Fatal("deleted key still present") + } +} diff --git a/vendor/github.com/gregjones/httpcache/test/test_test.go b/vendor/github.com/gregjones/httpcache/test/test_test.go new file mode 100644 index 0000000000..41a9c200b9 --- /dev/null +++ b/vendor/github.com/gregjones/httpcache/test/test_test.go @@ -0,0 +1,12 @@ +package test_test + +import ( + "testing" + + "github.com/gregjones/httpcache" + "github.com/gregjones/httpcache/test" +) + +func TestMemoryCache(t *testing.T) { + test.Cache(t, httpcache.NewMemoryCache()) +} diff --git a/vendor/github.com/howeyc/gopass/.travis.yml b/vendor/github.com/howeyc/gopass/.travis.yml deleted file mode 100644 index cc5d509fdf..0000000000 --- a/vendor/github.com/howeyc/gopass/.travis.yml +++ /dev/null @@ -1,11 +0,0 @@ -language: go - -os: - - linux - - osx - -go: - - 1.3 - - 1.4 - - 1.5 - - tip diff --git a/vendor/github.com/howeyc/gopass/LICENSE.txt b/vendor/github.com/howeyc/gopass/LICENSE.txt deleted file mode 100644 index 14f74708a4..0000000000 --- a/vendor/github.com/howeyc/gopass/LICENSE.txt +++ /dev/null @@ -1,15 +0,0 @@ -ISC License - -Copyright (c) 2012 Chris Howey - -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. diff --git a/vendor/github.com/howeyc/gopass/OPENSOLARIS.LICENSE b/vendor/github.com/howeyc/gopass/OPENSOLARIS.LICENSE deleted file mode 100644 index da23621dc8..0000000000 --- a/vendor/github.com/howeyc/gopass/OPENSOLARIS.LICENSE +++ /dev/null @@ -1,384 +0,0 @@ -Unless otherwise noted, all files in this distribution are released -under the Common Development and Distribution License (CDDL). -Exceptions are noted within the associated source files. - --------------------------------------------------------------------- - - -COMMON DEVELOPMENT AND DISTRIBUTION LICENSE Version 1.0 - -1. Definitions. - - 1.1. "Contributor" means each individual or entity that creates - or contributes to the creation of Modifications. - - 1.2. "Contributor Version" means the combination of the Original - Software, prior Modifications used by a Contributor (if any), - and the Modifications made by that particular Contributor. - - 1.3. "Covered Software" means (a) the Original Software, or (b) - Modifications, or (c) the combination of files containing - Original Software with files containing Modifications, in - each case including portions thereof. - - 1.4. "Executable" means the Covered Software in any form other - than Source Code. - - 1.5. "Initial Developer" means the individual or entity that first - makes Original Software available under this License. - - 1.6. "Larger Work" means a work which combines Covered Software or - portions thereof with code not governed by the terms of this - License. - - 1.7. "License" means this document. - - 1.8. "Licensable" means having the right to grant, to the maximum - extent possible, whether at the time of the initial grant or - subsequently acquired, any and all of the rights conveyed - herein. - - 1.9. "Modifications" means the Source Code and Executable form of - any of the following: - - A. Any file that results from an addition to, deletion from or - modification of the contents of a file containing Original - Software or previous Modifications; - - B. Any new file that contains any part of the Original - Software or previous Modifications; or - - C. Any new file that is contributed or otherwise made - available under the terms of this License. - - 1.10. "Original Software" means the Source Code and Executable - form of computer software code that is originally released - under this License. - - 1.11. "Patent Claims" means any patent claim(s), now owned or - hereafter acquired, including without limitation, method, - process, and apparatus claims, in any patent Licensable by - grantor. - - 1.12. "Source Code" means (a) the common form of computer software - code in which modifications are made and (b) associated - documentation included in or with such code. - - 1.13. "You" (or "Your") means an individual or a legal entity - exercising rights under, and complying with all of the terms - of, this License. For legal entities, "You" includes any - entity which controls, is controlled by, or is under common - control with You. For purposes of this definition, - "control" means (a) the power, direct or indirect, to cause - the direction or management of such entity, whether by - contract or otherwise, or (b) ownership of more than fifty - percent (50%) of the outstanding shares or beneficial - ownership of such entity. - -2. License Grants. - - 2.1. The Initial Developer Grant. - - Conditioned upon Your compliance with Section 3.1 below and - subject to third party intellectual property claims, the Initial - Developer hereby grants You a world-wide, royalty-free, - non-exclusive license: - - (a) under intellectual property rights (other than patent or - trademark) Licensable by Initial Developer, to use, - reproduce, modify, display, perform, sublicense and - distribute the Original Software (or portions thereof), - with or without Modifications, and/or as part of a Larger - Work; and - - (b) under Patent Claims infringed by the making, using or - selling of Original Software, to make, have made, use, - practice, sell, and offer for sale, and/or otherwise - dispose of the Original Software (or portions thereof). - - (c) The licenses granted in Sections 2.1(a) and (b) are - effective on the date Initial Developer first distributes - or otherwise makes the Original Software available to a - third party under the terms of this License. - - (d) Notwithstanding Section 2.1(b) above, no patent license is - granted: (1) for code that You delete from the Original - Software, or (2) for infringements caused by: (i) the - modification of the Original Software, or (ii) the - combination of the Original Software with other software - or devices. - - 2.2. Contributor Grant. - - Conditioned upon Your compliance with Section 3.1 below and - subject to third party intellectual property claims, each - Contributor hereby grants You a world-wide, royalty-free, - non-exclusive license: - - (a) under intellectual property rights (other than patent or - trademark) Licensable by Contributor to use, reproduce, - modify, display, perform, sublicense and distribute the - Modifications created by such Contributor (or portions - thereof), either on an unmodified basis, with other - Modifications, as Covered Software and/or as part of a - Larger Work; and - - (b) under Patent Claims infringed by the making, using, or - selling of Modifications made by that Contributor either - alone and/or in combination with its Contributor Version - (or portions of such combination), to make, use, sell, - offer for sale, have made, and/or otherwise dispose of: - (1) Modifications made by that Contributor (or portions - thereof); and (2) the combination of Modifications made by - that Contributor with its Contributor Version (or portions - of such combination). - - (c) The licenses granted in Sections 2.2(a) and 2.2(b) are - effective on the date Contributor first distributes or - otherwise makes the Modifications available to a third - party. - - (d) Notwithstanding Section 2.2(b) above, no patent license is - granted: (1) for any code that Contributor has deleted - from the Contributor Version; (2) for infringements caused - by: (i) third party modifications of Contributor Version, - or (ii) the combination of Modifications made by that - Contributor with other software (except as part of the - Contributor Version) or other devices; or (3) under Patent - Claims infringed by Covered Software in the absence of - Modifications made by that Contributor. - -3. Distribution Obligations. - - 3.1. Availability of Source Code. - - Any Covered Software that You distribute or otherwise make - available in Executable form must also be made available in Source - Code form and that Source Code form must be distributed only under - the terms of this License. You must include a copy of this - License with every copy of the Source Code form of the Covered - Software You distribute or otherwise make available. You must - inform recipients of any such Covered Software in Executable form - as to how they can obtain such Covered Software in Source Code - form in a reasonable manner on or through a medium customarily - used for software exchange. - - 3.2. Modifications. - - The Modifications that You create or to which You contribute are - governed by the terms of this License. You represent that You - believe Your Modifications are Your original creation(s) and/or - You have sufficient rights to grant the rights conveyed by this - License. - - 3.3. Required Notices. - - You must include a notice in each of Your Modifications that - identifies You as the Contributor of the Modification. You may - not remove or alter any copyright, patent or trademark notices - contained within the Covered Software, or any notices of licensing - or any descriptive text giving attribution to any Contributor or - the Initial Developer. - - 3.4. Application of Additional Terms. - - You may not offer or impose any terms on any Covered Software in - Source Code form that alters or restricts the applicable version - of this License or the recipients' rights hereunder. You may - choose to offer, and to charge a fee for, warranty, support, - indemnity or liability obligations to one or more recipients of - Covered Software. However, you may do so only on Your own behalf, - and not on behalf of the Initial Developer or any Contributor. - You must make it absolutely clear that any such warranty, support, - indemnity or liability obligation is offered by You alone, and You - hereby agree to indemnify the Initial Developer and every - Contributor for any liability incurred by the Initial Developer or - such Contributor as a result of warranty, support, indemnity or - liability terms You offer. - - 3.5. Distribution of Executable Versions. - - You may distribute the Executable form of the Covered Software - under the terms of this License or under the terms of a license of - Your choice, which may contain terms different from this License, - provided that You are in compliance with the terms of this License - and that the license for the Executable form does not attempt to - limit or alter the recipient's rights in the Source Code form from - the rights set forth in this License. If You distribute the - Covered Software in Executable form under a different license, You - must make it absolutely clear that any terms which differ from - this License are offered by You alone, not by the Initial - Developer or Contributor. You hereby agree to indemnify the - Initial Developer and every Contributor for any liability incurred - by the Initial Developer or such Contributor as a result of any - such terms You offer. - - 3.6. Larger Works. - - You may create a Larger Work by combining Covered Software with - other code not governed by the terms of this License and - distribute the Larger Work as a single product. In such a case, - You must make sure the requirements of this License are fulfilled - for the Covered Software. - -4. Versions of the License. - - 4.1. New Versions. - - Sun Microsystems, Inc. is the initial license steward and may - publish revised and/or new versions of this License from time to - time. Each version will be given a distinguishing version number. - Except as provided in Section 4.3, no one other than the license - steward has the right to modify this License. - - 4.2. Effect of New Versions. - - You may always continue to use, distribute or otherwise make the - Covered Software available under the terms of the version of the - License under which You originally received the Covered Software. - If the Initial Developer includes a notice in the Original - Software prohibiting it from being distributed or otherwise made - available under any subsequent version of the License, You must - distribute and make the Covered Software available under the terms - of the version of the License under which You originally received - the Covered Software. Otherwise, You may also choose to use, - distribute or otherwise make the Covered Software available under - the terms of any subsequent version of the License published by - the license steward. - - 4.3. Modified Versions. - - When You are an Initial Developer and You want to create a new - license for Your Original Software, You may create and use a - modified version of this License if You: (a) rename the license - and remove any references to the name of the license steward - (except to note that the license differs from this License); and - (b) otherwise make it clear that the license contains terms which - differ from this License. - -5. DISCLAIMER OF WARRANTY. - - COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" - BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, - INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED - SOFTWARE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR - PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND - PERFORMANCE OF THE COVERED SOFTWARE IS WITH YOU. SHOULD ANY - COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE - INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY - NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF - WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF - ANY COVERED SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS - DISCLAIMER. - -6. TERMINATION. - - 6.1. This License and the rights granted hereunder will terminate - automatically if You fail to comply with terms herein and fail to - cure such breach within 30 days of becoming aware of the breach. - Provisions which, by their nature, must remain in effect beyond - the termination of this License shall survive. - - 6.2. If You assert a patent infringement claim (excluding - declaratory judgment actions) against Initial Developer or a - Contributor (the Initial Developer or Contributor against whom You - assert such claim is referred to as "Participant") alleging that - the Participant Software (meaning the Contributor Version where - the Participant is a Contributor or the Original Software where - the Participant is the Initial Developer) directly or indirectly - infringes any patent, then any and all rights granted directly or - indirectly to You by such Participant, the Initial Developer (if - the Initial Developer is not the Participant) and all Contributors - under Sections 2.1 and/or 2.2 of this License shall, upon 60 days - notice from Participant terminate prospectively and automatically - at the expiration of such 60 day notice period, unless if within - such 60 day period You withdraw Your claim with respect to the - Participant Software against such Participant either unilaterally - or pursuant to a written agreement with Participant. - - 6.3. In the event of termination under Sections 6.1 or 6.2 above, - all end user licenses that have been validly granted by You or any - distributor hereunder prior to termination (excluding licenses - granted to You by any distributor) shall survive termination. - -7. LIMITATION OF LIABILITY. - - UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT - (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE - INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF - COVERED SOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE - LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR - CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT - LIMITATION, DAMAGES FOR LOST PROFITS, LOSS OF GOODWILL, WORK - STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER - COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN - INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF - LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL - INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT - APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO - NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR - CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT - APPLY TO YOU. - -8. U.S. GOVERNMENT END USERS. - - The Covered Software is a "commercial item," as that term is - defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial - computer software" (as that term is defined at 48 - C.F.R. 252.227-7014(a)(1)) and "commercial computer software - documentation" as such terms are used in 48 C.F.R. 12.212 - (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 - C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all - U.S. Government End Users acquire Covered Software with only those - rights set forth herein. This U.S. Government Rights clause is in - lieu of, and supersedes, any other FAR, DFAR, or other clause or - provision that addresses Government rights in computer software - under this License. - -9. MISCELLANEOUS. - - This License represents the complete agreement concerning subject - matter hereof. If any provision of this License is held to be - unenforceable, such provision shall be reformed only to the extent - necessary to make it enforceable. This License shall be governed - by the law of the jurisdiction specified in a notice contained - within the Original Software (except to the extent applicable law, - if any, provides otherwise), excluding such jurisdiction's - conflict-of-law provisions. Any litigation relating to this - License shall be subject to the jurisdiction of the courts located - in the jurisdiction and venue specified in a notice contained - within the Original Software, with the losing party responsible - for costs, including, without limitation, court costs and - reasonable attorneys' fees and expenses. The application of the - United Nations Convention on Contracts for the International Sale - of Goods is expressly excluded. Any law or regulation which - provides that the language of a contract shall be construed - against the drafter shall not apply to this License. You agree - that You alone are responsible for compliance with the United - States export administration regulations (and the export control - laws and regulation of any other countries) when You use, - distribute or otherwise make available any Covered Software. - -10. RESPONSIBILITY FOR CLAIMS. - - As between Initial Developer and the Contributors, each party is - responsible for claims and damages arising, directly or - indirectly, out of its utilization of rights under this License - and You agree to work with Initial Developer and Contributors to - distribute such responsibility on an equitable basis. Nothing - herein is intended or shall be deemed to constitute any admission - of liability. - --------------------------------------------------------------------- - -NOTICE PURSUANT TO SECTION 9 OF THE COMMON DEVELOPMENT AND -DISTRIBUTION LICENSE (CDDL) - -For Covered Software in this distribution, this License shall -be governed by the laws of the State of California (excluding -conflict-of-law provisions). - -Any litigation relating to this License shall be subject to the -jurisdiction of the Federal Courts of the Northern District of -California and the state courts of the State of California, with -venue lying in Santa Clara County, California. diff --git a/vendor/github.com/howeyc/gopass/README.md b/vendor/github.com/howeyc/gopass/README.md deleted file mode 100644 index 2d6a4e72c9..0000000000 --- a/vendor/github.com/howeyc/gopass/README.md +++ /dev/null @@ -1,27 +0,0 @@ -# getpasswd in Go [![GoDoc](https://godoc.org/github.com/howeyc/gopass?status.svg)](https://godoc.org/github.com/howeyc/gopass) [![Build Status](https://secure.travis-ci.org/howeyc/gopass.png?branch=master)](http://travis-ci.org/howeyc/gopass) - -Retrieve password from user terminal or piped input without echo. - -Verified on BSD, Linux, and Windows. - -Example: -```go -package main - -import "fmt" -import "github.com/howeyc/gopass" - -func main() { - fmt.Printf("Password: ") - - // Silent. For printing *'s use gopass.GetPasswdMasked() - pass, err := gopass.GetPasswd() - if err != nil { - // Handle gopass.ErrInterrupted or getch() read error - } - - // Do something with pass -} -``` - -Caution: Multi-byte characters not supported! diff --git a/vendor/github.com/howeyc/gopass/pass.go b/vendor/github.com/howeyc/gopass/pass.go deleted file mode 100644 index f5bd5a51a8..0000000000 --- a/vendor/github.com/howeyc/gopass/pass.go +++ /dev/null @@ -1,110 +0,0 @@ -package gopass - -import ( - "errors" - "fmt" - "io" - "os" -) - -type FdReader interface { - io.Reader - Fd() uintptr -} - -var defaultGetCh = func(r io.Reader) (byte, error) { - buf := make([]byte, 1) - if n, err := r.Read(buf); n == 0 || err != nil { - if err != nil { - return 0, err - } - return 0, io.EOF - } - return buf[0], nil -} - -var ( - maxLength = 512 - ErrInterrupted = errors.New("interrupted") - ErrMaxLengthExceeded = fmt.Errorf("maximum byte limit (%v) exceeded", maxLength) - - // Provide variable so that tests can provide a mock implementation. - getch = defaultGetCh -) - -// getPasswd returns the input read from terminal. -// If prompt is not empty, it will be output as a prompt to the user -// If masked is true, typing will be matched by asterisks on the screen. -// Otherwise, typing will echo nothing. -func getPasswd(prompt string, masked bool, r FdReader, w io.Writer) ([]byte, error) { - var err error - var pass, bs, mask []byte - if masked { - bs = []byte("\b \b") - mask = []byte("*") - } - - if isTerminal(r.Fd()) { - if oldState, err := makeRaw(r.Fd()); err != nil { - return pass, err - } else { - defer func() { - restore(r.Fd(), oldState) - fmt.Fprintln(w) - }() - } - } - - if prompt != "" { - fmt.Fprint(w, prompt) - } - - // Track total bytes read, not just bytes in the password. This ensures any - // errors that might flood the console with nil or -1 bytes infinitely are - // capped. - var counter int - for counter = 0; counter <= maxLength; counter++ { - if v, e := getch(r); e != nil { - err = e - break - } else if v == 127 || v == 8 { - if l := len(pass); l > 0 { - pass = pass[:l-1] - fmt.Fprint(w, string(bs)) - } - } else if v == 13 || v == 10 { - break - } else if v == 3 { - err = ErrInterrupted - break - } else if v != 0 { - pass = append(pass, v) - fmt.Fprint(w, string(mask)) - } - } - - if counter > maxLength { - err = ErrMaxLengthExceeded - } - - return pass, err -} - -// GetPasswd returns the password read from the terminal without echoing input. -// The returned byte array does not include end-of-line characters. -func GetPasswd() ([]byte, error) { - return getPasswd("", false, os.Stdin, os.Stdout) -} - -// GetPasswdMasked returns the password read from the terminal, echoing asterisks. -// The returned byte array does not include end-of-line characters. -func GetPasswdMasked() ([]byte, error) { - return getPasswd("", true, os.Stdin, os.Stdout) -} - -// GetPasswdPrompt prompts the user and returns the password read from the terminal. -// If mask is true, then asterisks are echoed. -// The returned byte array does not include end-of-line characters. -func GetPasswdPrompt(prompt string, mask bool, r FdReader, w io.Writer) ([]byte, error) { - return getPasswd(prompt, mask, r, w) -} diff --git a/vendor/github.com/howeyc/gopass/pass_test.go b/vendor/github.com/howeyc/gopass/pass_test.go deleted file mode 100644 index 7ac3151357..0000000000 --- a/vendor/github.com/howeyc/gopass/pass_test.go +++ /dev/null @@ -1,225 +0,0 @@ -package gopass - -import ( - "bufio" - "bytes" - "fmt" - "io" - "io/ioutil" - "os" - "testing" - "time" -) - -// TestGetPasswd tests the password creation and output based on a byte buffer -// as input to mock the underlying getch() methods. -func TestGetPasswd(t *testing.T) { - type testData struct { - input []byte - - // Due to how backspaces are written, it is easier to manually write - // each expected output for the masked cases. - masked string - password string - byesLeft int - reason string - } - - ds := []testData{ - testData{[]byte("abc\n"), "***", "abc", 0, "Password parsing should stop at \\n"}, - testData{[]byte("abc\r"), "***", "abc", 0, "Password parsing should stop at \\r"}, - testData{[]byte("a\nbc\n"), "*", "a", 3, "Password parsing should stop at \\n"}, - testData{[]byte("*!]|\n"), "****", "*!]|", 0, "Special characters shouldn't affect the password."}, - - testData{[]byte("abc\r\n"), "***", "abc", 1, - "Password parsing should stop at \\r; Windows LINE_MODE should be unset so \\r is not converted to \\r\\n."}, - - testData{[]byte{'a', 'b', 'c', 8, '\n'}, "***\b \b", "ab", 0, "Backspace byte should remove the last read byte."}, - testData{[]byte{'a', 'b', 127, 'c', '\n'}, "**\b \b*", "ac", 0, "Delete byte should remove the last read byte."}, - testData{[]byte{'a', 'b', 127, 'c', 8, 127, '\n'}, "**\b \b*\b \b\b \b", "", 0, "Successive deletes continue to delete."}, - testData{[]byte{8, 8, 8, '\n'}, "", "", 0, "Deletes before characters are noops."}, - testData{[]byte{8, 8, 8, 'a', 'b', 'c', '\n'}, "***", "abc", 0, "Deletes before characters are noops."}, - - testData{[]byte{'a', 'b', 0, 'c', '\n'}, "***", "abc", 0, - "Nil byte should be ignored due; may get unintended nil bytes from syscalls on Windows."}, - } - - // Redirecting output for tests as they print to os.Stdout but we want to - // capture and test the output. - for _, masked := range []bool{true, false} { - for _, d := range ds { - pipeBytesToStdin(d.input) - - r, w, err := os.Pipe() - if err != nil { - t.Fatal(err.Error()) - } - - result, err := getPasswd("", masked, os.Stdin, w) - if err != nil { - t.Errorf("Error getting password: %s", err.Error()) - } - leftOnBuffer := flushStdin() - - // Test output (masked and unmasked). Delete/backspace actually - // deletes, overwrites and deletes again. As a result, we need to - // remove those from the pipe afterwards to mimic the console's - // interpretation of those bytes. - w.Close() - output, err := ioutil.ReadAll(r) - if err != nil { - t.Fatal(err.Error()) - } - var expectedOutput []byte - if masked { - expectedOutput = []byte(d.masked) - } else { - expectedOutput = []byte("") - } - if bytes.Compare(expectedOutput, output) != 0 { - t.Errorf("Expected output to equal %v (%q) but got %v (%q) instead when masked=%v. %s", expectedOutput, string(expectedOutput), output, string(output), masked, d.reason) - } - - if string(result) != d.password { - t.Errorf("Expected %q but got %q instead when masked=%v. %s", d.password, result, masked, d.reason) - } - - if leftOnBuffer != d.byesLeft { - t.Errorf("Expected %v bytes left on buffer but instead got %v when masked=%v. %s", d.byesLeft, leftOnBuffer, masked, d.reason) - } - } - } -} - -// TestPipe ensures we get our expected pipe behavior. -func TestPipe(t *testing.T) { - type testData struct { - input string - password string - expError error - } - ds := []testData{ - testData{"abc", "abc", io.EOF}, - testData{"abc\n", "abc", nil}, - testData{"abc\r", "abc", nil}, - testData{"abc\r\n", "abc", nil}, - } - - for _, d := range ds { - _, err := pipeToStdin(d.input) - if err != nil { - t.Log("Error writing input to stdin:", err) - t.FailNow() - } - pass, err := GetPasswd() - if string(pass) != d.password { - t.Errorf("Expected %q but got %q instead.", d.password, string(pass)) - } - if err != d.expError { - t.Errorf("Expected %v but got %q instead.", d.expError, err) - } - } -} - -// flushStdin reads from stdin for .5 seconds to ensure no bytes are left on -// the buffer. Returns the number of bytes read. -func flushStdin() int { - ch := make(chan byte) - go func(ch chan byte) { - reader := bufio.NewReader(os.Stdin) - for { - b, err := reader.ReadByte() - if err != nil { // Maybe log non io.EOF errors, if you want - close(ch) - return - } - ch <- b - } - close(ch) - }(ch) - - numBytes := 0 - for { - select { - case _, ok := <-ch: - if !ok { - return numBytes - } - numBytes++ - case <-time.After(500 * time.Millisecond): - return numBytes - } - } - return numBytes -} - -// pipeToStdin pipes the given string onto os.Stdin by replacing it with an -// os.Pipe. The write end of the pipe is closed so that EOF is read after the -// final byte. -func pipeToStdin(s string) (int, error) { - pipeReader, pipeWriter, err := os.Pipe() - if err != nil { - fmt.Println("Error getting os pipes:", err) - os.Exit(1) - } - os.Stdin = pipeReader - w, err := pipeWriter.WriteString(s) - pipeWriter.Close() - return w, err -} - -func pipeBytesToStdin(b []byte) (int, error) { - return pipeToStdin(string(b)) -} - -// TestGetPasswd_Err tests errors are properly handled from getch() -func TestGetPasswd_Err(t *testing.T) { - var inBuffer *bytes.Buffer - getch = func(io.Reader) (byte, error) { - b, err := inBuffer.ReadByte() - if err != nil { - return 13, err - } - if b == 'z' { - return 'z', fmt.Errorf("Forced error; byte returned should not be considered accurate.") - } - return b, nil - } - defer func() { getch = defaultGetCh }() - - for input, expectedPassword := range map[string]string{"abc": "abc", "abzc": "ab"} { - inBuffer = bytes.NewBufferString(input) - p, err := GetPasswdMasked() - if string(p) != expectedPassword { - t.Errorf("Expected %q but got %q instead.", expectedPassword, p) - } - if err == nil { - t.Errorf("Expected error to be returned.") - } - } -} - -func TestMaxPasswordLength(t *testing.T) { - type testData struct { - input []byte - expectedErr error - - // Helper field to output in case of failure; rather than hundreds of - // bytes. - inputDesc string - } - - ds := []testData{ - testData{append(bytes.Repeat([]byte{'a'}, maxLength), '\n'), nil, fmt.Sprintf("%v 'a' bytes followed by a newline", maxLength)}, - testData{append(bytes.Repeat([]byte{'a'}, maxLength+1), '\n'), ErrMaxLengthExceeded, fmt.Sprintf("%v 'a' bytes followed by a newline", maxLength+1)}, - testData{append(bytes.Repeat([]byte{0x00}, maxLength+1), '\n'), ErrMaxLengthExceeded, fmt.Sprintf("%v 0x00 bytes followed by a newline", maxLength+1)}, - } - - for _, d := range ds { - pipeBytesToStdin(d.input) - _, err := GetPasswd() - if err != d.expectedErr { - t.Errorf("Expected error to be %v; isntead got %v from %v", d.expectedErr, err, d.inputDesc) - } - } -} diff --git a/vendor/github.com/howeyc/gopass/terminal.go b/vendor/github.com/howeyc/gopass/terminal.go deleted file mode 100644 index 0835641462..0000000000 --- a/vendor/github.com/howeyc/gopass/terminal.go +++ /dev/null @@ -1,25 +0,0 @@ -// +build !solaris - -package gopass - -import "golang.org/x/crypto/ssh/terminal" - -type terminalState struct { - state *terminal.State -} - -func isTerminal(fd uintptr) bool { - return terminal.IsTerminal(int(fd)) -} - -func makeRaw(fd uintptr) (*terminalState, error) { - state, err := terminal.MakeRaw(int(fd)) - - return &terminalState{ - state: state, - }, err -} - -func restore(fd uintptr, oldState *terminalState) error { - return terminal.Restore(int(fd), oldState.state) -} diff --git a/vendor/github.com/howeyc/gopass/terminal_solaris.go b/vendor/github.com/howeyc/gopass/terminal_solaris.go deleted file mode 100644 index 257e1b4e81..0000000000 --- a/vendor/github.com/howeyc/gopass/terminal_solaris.go +++ /dev/null @@ -1,69 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License, Version 1.0 only - * (the "License"). You may not use this file except in compliance - * with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -// Below is derived from Solaris source, so CDDL license is included. - -package gopass - -import ( - "syscall" - - "golang.org/x/sys/unix" -) - -type terminalState struct { - state *unix.Termios -} - -// isTerminal returns true if there is a terminal attached to the given -// file descriptor. -// Source: http://src.illumos.org/source/xref/illumos-gate/usr/src/lib/libbc/libc/gen/common/isatty.c -func isTerminal(fd uintptr) bool { - var termio unix.Termio - err := unix.IoctlSetTermio(int(fd), unix.TCGETA, &termio) - return err == nil -} - -// makeRaw puts the terminal connected to the given file descriptor into raw -// mode and returns the previous state of the terminal so that it can be -// restored. -// Source: http://src.illumos.org/source/xref/illumos-gate/usr/src/lib/libast/common/uwin/getpass.c -func makeRaw(fd uintptr) (*terminalState, error) { - oldTermiosPtr, err := unix.IoctlGetTermios(int(fd), unix.TCGETS) - if err != nil { - return nil, err - } - oldTermios := *oldTermiosPtr - - newTermios := oldTermios - newTermios.Lflag &^= syscall.ECHO | syscall.ECHOE | syscall.ECHOK | syscall.ECHONL - if err := unix.IoctlSetTermios(int(fd), unix.TCSETS, &newTermios); err != nil { - return nil, err - } - - return &terminalState{ - state: oldTermiosPtr, - }, nil -} - -func restore(fd uintptr, oldState *terminalState) error { - return unix.IoctlSetTermios(int(fd), unix.TCSETS, oldState.state) -} diff --git a/vendor/github.com/operator-framework/operator-sdk/.gitignore b/vendor/github.com/operator-framework/operator-sdk/.gitignore index 090f5a2d34..4398fa902e 100644 --- a/vendor/github.com/operator-framework/operator-sdk/.gitignore +++ b/vendor/github.com/operator-framework/operator-sdk/.gitignore @@ -103,3 +103,6 @@ tags # End of https://www.gitignore.io/api/go,vim,emacs,visualstudiocode + +# Build artifacts +build/* diff --git a/vendor/github.com/operator-framework/operator-sdk/.travis.yml b/vendor/github.com/operator-framework/operator-sdk/.travis.yml index 8208163c13..aead491d96 100644 --- a/vendor/github.com/operator-framework/operator-sdk/.travis.yml +++ b/vendor/github.com/operator-framework/operator-sdk/.travis.yml @@ -6,44 +6,41 @@ services: - docker go: -- 1.10.1 +- 1.10.3 + +jobs: + include: + - before_script: hack/ci/setup-minikube.sh + env: + - CLUSTER=minikube + - CHANGE_MINIKUBE_NONE_USER=true + script: test/test-go.sh + name: Go on minikube + - before_script: hack/ci/setup-minikube.sh + env: + - CLUSTER=minikube + - CHANGE_MINIKUBE_NONE_USER=true + script: test/test-ansible.sh + name: Ansible on minikube + - before_script: hack/ci/setup-openshift.sh + env: CLUSTER=openshift + script: test/test-go.sh + name: Go on OpenShift + - before_script: hack/ci/setup-openshift.sh + env: CLUSTER=openshift + script: test/test-ansible.sh + name: Ansible on OpenShift -env: -- CHANGE_MINIKUBE_NONE_USER=true - -before_script: +install: - curl -Lo dep https://github.com/golang/dep/releases/download/v0.5.0/dep-linux-amd64 && chmod +x dep && sudo mv dep /usr/local/bin/ - dep ensure -# Download kubectl, which is a requirement for using minikube. -- curl -Lo kubectl https://storage.googleapis.com/kubernetes-release/release/v1.10.1/bin/linux/amd64/kubectl && chmod +x kubectl && sudo mv kubectl /usr/local/bin/ -# Download minikube. -# We need to pin to an old version due to minikube requiring systemd starting with v0.26.0 and travis not providing it -# - https://github.com/kubernetes/minikube/issues/2704 -- curl -Lo minikube https://storage.googleapis.com/minikube/releases/v0.25.2/minikube-linux-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/ -- sudo minikube start --vm-driver=none --kubernetes-version=v1.10.0 -# Fix the kubectl context, as it's often stale. -- minikube update-context -# Wait for Kubernetes to be up and ready. -- JSONPATH='{range .items[*]}{@.metadata.name}:{range @.status.conditions[*]}{@.type}={@.status};{end}{end}'; until kubectl get nodes -o jsonpath="$JSONPATH" 2>&1 | grep -q "Ready=True"; do sleep 1; done +- make install # Create example operator directory - mkdir -p $GOPATH/src/github.com/example-inc - -install: -- go get -t -d ./... - -script: -- make install -- go test ./pkg/... -- go test ./test/e2e/... -- go vet ./... -- ./hack/check_license.sh -- ./hack/check_error_case.sh +- sudo pip install ansible after_success: -- echo 'Build succeeded, operator was generated, memcached operator is running on minikube, and unit/integration tests pass' +- echo 'Build succeeded, operator was generated, memcached operator is running on $CLUSTER, and unit/integration tests pass' after_failure: -- echo 'Build failed, operator failed to generate, memcached operator is not running on minikube, or unit/integration tests failed' -- kubectl get deployment -- kubectl get pods -- kubectl describe pods +- echo 'Build failed, operator failed to generate, memcached operator is not running on $CLUSTER, or unit/integration tests failed' diff --git a/vendor/github.com/operator-framework/operator-sdk/CHANGELOG.md b/vendor/github.com/operator-framework/operator-sdk/CHANGELOG.md index 90979e33f5..cbfd7eec4c 100644 --- a/vendor/github.com/operator-framework/operator-sdk/CHANGELOG.md +++ b/vendor/github.com/operator-framework/operator-sdk/CHANGELOG.md @@ -1,9 +1,23 @@ -## [Unreleased] +## v0.0.7 + +### Added + +- Service account generation ([#454](https://github.com/operator-framework/operator-sdk/pull/454)) +- Leader election ([#530](https://github.com/operator-framework/operator-sdk/pull/530)) +- Incluster test support for test framework ([#469](https://github.com/operator-framework/operator-sdk/pull/469)) +- Ansible type operator generation support ([#486](https://github.com/operator-framework/operator-sdk/pull/486), [#559](https://github.com/operator-framework/operator-sdk/pull/559)) + +### Changed + +- Moved the rendering of `deploy/operator.yaml` to the `operator-sdk new` command instead of `operator-sdk build` + +## v0.0.6 ### Added - Added `operator-sdk up` command to help deploy an operator. Currently supports running an operator locally against an existing cluster e.g `operator-sdk up local --kubeconfig= --namespace=`. See `operator-sdk up -h` for help. [#219](https://github.com/operator-framework/operator-sdk/pull/219) [#274](https://github.com/operator-framework/operator-sdk/pull/274) - Added initial default metrics to be captured and exposed by Prometheus. [#323](https://github.com/operator-framework/operator-sdk/pull/323) exposes the metrics port and [#349](https://github.com/operator-framework/operator-sdk/pull/323) adds the initial default metrics. +- Added initial test framework for operators [#377](https://github.com/operator-framework/operator-sdk/pull/377), [#392](https://github.com/operator-framework/operator-sdk/pull/392), [#393](https://github.com/operator-framework/operator-sdk/pull/393) ### Changed @@ -11,13 +25,8 @@ - The SDK exposes the Kubernetes clientset via `k8sclient.GetKubeClient()` #295 - The SDK now vendors the k8s code-generators for an operator instead of using the prebuilt image `gcr.io/coreos-k8s-scale-testing/codegen:1.9.3` [#319](https://github.com/operator-framework/operator-sdk/pull/242) - The SDK exposes the Kubernetes rest config via `k8sclient.GetKubeConfig()` #338 - -### Removed +- Use `time.Duration` instead of `int` for `sdk.Watch` [#427](https://github.com/operator-framework/operator-sdk/pull/427) ### Fixed - The cache of available clients is being reset every minute for discovery of newely added resources to a cluster. [#280](https://github.com/operator-framework/operator-sdk/pull/280) - -### Deprecated - -### Security diff --git a/vendor/github.com/operator-framework/operator-sdk/Gopkg.lock b/vendor/github.com/operator-framework/operator-sdk/Gopkg.lock index b745be52b7..e9094a529d 100644 --- a/vendor/github.com/operator-framework/operator-sdk/Gopkg.lock +++ b/vendor/github.com/operator-framework/operator-sdk/Gopkg.lock @@ -10,12 +10,12 @@ revision = "3a771d992973f24aa725d07868b467d1ddfceafb" [[projects]] - digest = "1:56c130d885a4aacae1dd9c7b71cfe39912c7ebc1ff7d2b46083c8812996dc43b" + digest = "1:0deddd908b6b4b768cfc272c16ee61e7088a60f7fe2f06c547bd3d8e1f8b8e77" name = "github.com/davecgh/go-spew" packages = ["spew"] pruneopts = "" - revision = "346938d642f2ec3594ed81d874461961cd0faa76" - version = "v1.1.0" + revision = "8991bc29aa16c548c550c7ff78260e27b9ab7c73" + version = "v1.1.1" [[projects]] digest = "1:b13707423743d41665fd23f0c36b2f37bb49c30e94adb813319c44188a51ba22" @@ -26,15 +26,31 @@ version = "v1.0.0" [[projects]] - digest = "1:0a3f6a0c68ab8f3d455f8892295503b179e571b7fefe47cc6c556405d1f83411" + branch = "master" + digest = "1:65587005c6fa4293c0b8a2e457e689df7fda48cc5e1f5449ea2c1e7784551558" + name = "github.com/go-logr/logr" + packages = ["."] + pruneopts = "" + revision = "9fb12b3b21c5415d16ac18dc5cd42c1cfdd40c4e" + +[[projects]] + branch = "master" + digest = "1:ce43ad4015e7cdad3f0e8f2c8339439dd4470859a828d2a6988b0f713699e94a" + name = "github.com/go-logr/zapr" + packages = ["."] + pruneopts = "" + revision = "7536572e8d55209135cd5e7ccf7fce43dca217ab" + +[[projects]] + digest = "1:6e73003ecd35f4487a5e88270d3ca0a81bc80dc88053ac7e4dcfec5fba30d918" name = "github.com/gogo/protobuf" packages = [ "proto", "sortkeys", ] pruneopts = "" - revision = "1adfc126b41513cc696b209667c8656ea7aac67c" - version = "v1.0.0" + revision = "636bf0302bc95575d69441b25a2603156ffdddf1" + version = "v1.1.1" [[projects]] branch = "master" @@ -45,7 +61,15 @@ revision = "23def4e6c14b4da8ac2ed8007337bc5eb5007998" [[projects]] - digest = "1:f958a1c137db276e52f0b50efee41a1a389dcdded59a69711f3e872757dab34b" + branch = "master" + digest = "1:9854532d7b2fee9414d4fcd8d8bccd6b1c1e1663d8ec0337af63a19aaf4a778e" + name = "github.com/golang/groupcache" + packages = ["lru"] + pruneopts = "" + revision = "6f2cf27854a4a29e3811b0371547be335d411b8b" + +[[projects]] + digest = "1:3dd078fda7500c341bc26cfbc6c6a34614f295a2457149fc1045cab767cbcf18" name = "github.com/golang/protobuf" packages = [ "proto", @@ -55,8 +79,16 @@ "ptypes/timestamp", ] pruneopts = "" - revision = "b4deda0973fb4c70b50d226b1af49f3da59f5265" - version = "v1.1.0" + revision = "aa810b61a9c79d51363740d207bb46cf8e620ed5" + version = "v1.2.0" + +[[projects]] + branch = "master" + digest = "1:1e5b1e14524ed08301977b7b8e10c719ed853cbf3f24ecb66fae783a46f207a6" + name = "github.com/google/btree" + packages = ["."] + pruneopts = "" + revision = "4030bb1f1f0c35b30ca7009e9ebd06849dd45306" [[projects]] branch = "master" @@ -66,6 +98,14 @@ pruneopts = "" revision = "24818f796faf91cd76ec7bddd72458fbced7a6c1" +[[projects]] + digest = "1:5247b135b5492aa232a731acdcb52b08f32b874cb398f21ab460396eadbe866b" + name = "github.com/google/uuid" + packages = ["."] + pruneopts = "" + revision = "d460ce9f8df2e77fb1ba55ca87fafed96c607494" + version = "v1.0.0" + [[projects]] digest = "1:16b2837c8b3cf045fa2cdc82af0cf78b19582701394484ae76b2c3bc3c99ad73" name = "github.com/googleapis/gnostic" @@ -80,30 +120,33 @@ [[projects]] branch = "master" - digest = "1:9c776d7d9c54b7ed89f119e449983c3f24c0023e75001d6092442412ebca6b94" - name = "github.com/hashicorp/golang-lru" + digest = "1:009a1928b8c096338b68b5822d838a72b4d8520715c1463614476359f3282ec8" + name = "github.com/gregjones/httpcache" packages = [ ".", - "simplelru", + "diskcache", ] pruneopts = "" - revision = "0fb14efe8c47ae851c0034ed7a448854d3d34cf3" + revision = "9cad4c3443a7200dd6400aef47183728de563a38" [[projects]] - branch = "master" - digest = "1:f81c8d7354cc0c6340f2f7a48724ee6c2b3db3e918ecd441c985b4d2d97dd3e7" - name = "github.com/howeyc/gopass" - packages = ["."] + digest = "1:3313a63031ae281e5f6fd7b0bbca733dfa04d2429df86519e3b4d4c016ccb836" + name = "github.com/hashicorp/golang-lru" + packages = [ + ".", + "simplelru", + ] pruneopts = "" - revision = "bf9dde6d0d2c004a008c27aaee91170c786f6db8" + revision = "20f1fb78b0740ba8c3cb143a61e86ba5c8669768" + version = "v0.5.0" [[projects]] - digest = "1:302c6eb8e669c997bec516a138b8fc496018faa1ece4c13e445a2749fbe079bb" + digest = "1:7ab38c15bd21e056e3115c8b526d201eaf74e0308da9370997c6b3c187115d36" name = "github.com/imdario/mergo" packages = ["."] pruneopts = "" - revision = "9316a62528ac99aaecb4e47eadd6dc8aa6533d58" - version = "v0.3.5" + revision = "9f23e2d6bd2a77f959b2bf6acdbefd708a83a4a4" + version = "v0.3.6" [[projects]] digest = "1:870d441fe217b8e689d7949fef6e43efbc787e50f200cb1e70dbca9204a1d6be" @@ -114,12 +157,20 @@ version = "v1.0" [[projects]] - digest = "1:53ac4e911e12dde0ab68655e2006449d207a5a681f084974da2b06e5dbeaca72" + digest = "1:b79fc583e4dc7055ed86742e22164ac41bf8c0940722dbcb600f1a3ace1a8cb5" name = "github.com/json-iterator/go" packages = ["."] pruneopts = "" - revision = "ab8a2e0c74be9d3be70b3184d9acc634935ded82" - version = "1.1.4" + revision = "1624edc4454b8682399def8740d46db5e4362ba4" + version = "v1.1.5" + +[[projects]] + branch = "master" + digest = "1:58050e2bc9621cc6b68c1da3e4a0d1c40ad1f89062b9855c26521fd42a97a106" + name = "github.com/mattbaird/jsonpatch" + packages = ["."] + pruneopts = "" + revision = "81af80346b1a01caae0cbc27fd3c1ba5b11e189f" [[projects]] digest = "1:63722a4b1e1717be7b98fc686e0b30d5e7f734b9e93d7dee86293b6deab7ea28" @@ -145,6 +196,38 @@ revision = "4b7aa43c6742a2c18fdef89dd197aaae7dac7ccd" version = "1.0.1" +[[projects]] + branch = "master" + digest = "1:d33ce379780d7c43405b9251289493cabada82f6bf9ab35eea6915d04f6ac8e0" + name = "github.com/mxk/go-flowrate" + packages = ["flowrate"] + pruneopts = "" + revision = "cca7078d478f8520f85629ad7c68962d31ed7682" + +[[projects]] + digest = "1:a5484d4fa43127138ae6e7b2299a6a52ae006c7f803d98d717f60abf3e97192e" + name = "github.com/pborman/uuid" + packages = ["."] + pruneopts = "" + revision = "adf5a7427709b9deb95d29d3fa8a2bf9cfd388f1" + version = "v1.2" + +[[projects]] + branch = "master" + digest = "1:c24598ffeadd2762552269271b3b1510df2d83ee6696c1e543a0ff653af494bc" + name = "github.com/petar/GoLLRB" + packages = ["llrb"] + pruneopts = "" + revision = "53be0d36a84c2a886ca057d34b6aa4468df9ccb4" + +[[projects]] + digest = "1:b46305723171710475f2dd37547edd57b67b9de9f2a6267cafdd98331fd6897f" + name = "github.com/peterbourgon/diskv" + packages = ["."] + pruneopts = "" + revision = "5f041e8faa004a95c88a202771f4cc3e991971e6" + version = "v2.0.1" + [[projects]] digest = "1:4142d94383572e74b42352273652c62afec5b23f325222ed09198f46009022d1" name = "github.com/prometheus/client_golang" @@ -158,15 +241,15 @@ [[projects]] branch = "master" - digest = "1:60aca47f4eeeb972f1b9da7e7db51dee15ff6c59f7b401c1588b8e6771ba15ef" + digest = "1:185cf55b1f44a1bf243558901c3f06efa5c64ba62cfdcbb1bf7bbe8c3fb68561" name = "github.com/prometheus/client_model" packages = ["go"] pruneopts = "" - revision = "99fa1f4be8e564e8a6b613da7fa6f46c9edafc6c" + revision = "5c3871d89910bfb32f5fcab2aa4b9ec68e65a99f" [[projects]] branch = "master" - digest = "1:bfbc121ef802d245ef67421cff206615357d9202337a3d492b8f668906b485a8" + digest = "1:f477ef7b65d94fb17574fc6548cef0c99a69c1634ea3b6da248b63a61ebe0498" name = "github.com/prometheus/common" packages = [ "expfmt", @@ -174,11 +257,11 @@ "model", ] pruneopts = "" - revision = "7600349dcfe1abd18d72d3a1770870d9800a7801" + revision = "c7de2306084e37d54b8be01f3541a8464345e9a5" [[projects]] branch = "master" - digest = "1:b694a6bdecdace488f507cff872b30f6f490fdaf988abd74d87ea56406b23b6e" + digest = "1:5a57ea878c9a40657ebe7916eca6bea7c76808f5acb68fd42ea5e204dd35f6f7" name = "github.com/prometheus/procfs" packages = [ ".", @@ -187,7 +270,7 @@ "xfs", ] pruneopts = "" - revision = "ae68e2d4c00fed4943b5f6698d504a5fe083da8a" + revision = "418d78d0b9a7b7de3a6bbc8a23def624cc977bb2" [[projects]] digest = "1:3962f553b77bf6c03fc07cd687a22dd3b00fe11aa14d31194f5505f5bb65cdc8" @@ -198,12 +281,12 @@ version = "v1.0.0" [[projects]] - digest = "1:8cf46b6c18a91068d446e26b67512cf16f1540b45d90b28b9533706a127f0ca6" + digest = "1:3fcbf733a8d810a21265a7f2fe08a3353db2407da052b233f8b204b5afc03d9b" name = "github.com/sirupsen/logrus" packages = ["."] pruneopts = "" - revision = "c155da19408a8799da419ed3eeb0cb5db0ad5dbc" - version = "v1.0.5" + revision = "3e01752db0189b9157070a0e1668a620f9a85da2" + version = "v1.0.6" [[projects]] digest = "1:a1403cc8a94b8d7956ee5e9694badef0e7b051af289caad1cf668331e3ffa4f6" @@ -214,45 +297,78 @@ version = "v0.0.3" [[projects]] - digest = "1:8e243c568f36b09031ec18dff5f7d2769dcf5ca4d624ea511c8e3197dc3d352d" + digest = "1:0a52bcb568386d98f4894575d53ce3e456f56471de6897bb8b9de13c33d9340e" name = "github.com/spf13/pflag" packages = ["."] pruneopts = "" - revision = "583c0c0531f06d5278b7d917446061adc344b5cd" - version = "v1.0.1" + revision = "9a97c102cda95a86cec2345a6f09f55a939babf5" + version = "v1.0.2" + +[[projects]] + digest = "1:74f86c458e82e1c4efbab95233e0cf51b7cc02dc03193be9f62cd81224e10401" + name = "go.uber.org/atomic" + packages = ["."] + pruneopts = "" + revision = "1ea20fb1cbb1cc08cbd0d913a96dead89aa18289" + version = "v1.3.2" + +[[projects]] + digest = "1:22c7effcb4da0eacb2bb1940ee173fac010e9ef3c691f5de4b524d538bd980f5" + name = "go.uber.org/multierr" + packages = ["."] + pruneopts = "" + revision = "3c4937480c32f4c13a875a1829af76c98ca3d40a" + version = "v1.1.0" + +[[projects]] + digest = "1:246f378f80fba6fcf0f191c486b6613265abd2bc0f2fa55a36b928c67352021e" + name = "go.uber.org/zap" + packages = [ + ".", + "buffer", + "internal/bufferpool", + "internal/color", + "internal/exit", + "zapcore", + ] + pruneopts = "" + revision = "ff33455a0e382e8a81d14dd7c922020b6b5e7982" + version = "v1.9.1" [[projects]] branch = "master" - digest = "1:6ef14be530be39b6b9d75d54ce1d546ae9231e652d9e3eef198cbb19ce8ed3e7" + digest = "1:61a86f0be8b466d6e3fbdabb155aaa4006137cb5e3fd3b949329d103fa0ceb0f" name = "golang.org/x/crypto" packages = ["ssh/terminal"] pruneopts = "" - revision = "a49355c7e3f8fe157a85be2f77e6e269a0f89602" + revision = "0e37d006457bf46f9e6692014ba72ef82c33022c" [[projects]] branch = "master" - digest = "1:4c719bca528f83d5d42fd271bec965a9b10b8592c59ddd8acb19f381ec657016" + digest = "1:6846191f608c0dd6109f37ca46b784f9630191ff13f86ae974135c05a4c92971" name = "golang.org/x/net" packages = [ "context", + "html", + "html/atom", "http/httpguts", "http2", "http2/hpack", "idna", ] pruneopts = "" - revision = "6a8eb5e2b1816b30aa88d7e3ecf9eb7c4559d9e6" + revision = "f04abc6bdfa7a0171a8a0c9fd2ada9391044d056" [[projects]] branch = "master" - digest = "1:19f072f12708aaafef9064b49432953e3f813a98fcb356b30831cf2b0f5272b3" + digest = "1:18ebd6e65d5223778b5fc92bbf2afffb54c6ac3889bbc362df692b965f932fae" name = "golang.org/x/sys" packages = [ "unix", "windows", ] pruneopts = "" - revision = "1b2967e3c290b7c545b3db0deeda16e9be4f98a2" + revision = "b09afc3d579e346c4a7e4705953acaf6f9e551bd" [[projects]] digest = "1:5acd3512b047305d49e8763eef7ba423901e85d5dd2fd1e71778a0ea8de10bd4" @@ -302,9 +418,10 @@ version = "v2.2.1" [[projects]] - digest = "1:4d235221f43d5243b4929e098993fba365cd9a6448c613f4f8e59ea869ac094f" + digest = "1:2fe7efa9ea3052443378383d27c15ba088d03babe69a89815ce7fe9ec1d9aeb4" name = "k8s.io/api" packages = [ + "admission/v1beta1", "admissionregistration/v1alpha1", "admissionregistration/v1beta1", "apps/v1", @@ -329,31 +446,30 @@ "rbac/v1alpha1", "rbac/v1beta1", "scheduling/v1alpha1", + "scheduling/v1beta1", "settings/v1alpha1", "storage/v1", "storage/v1alpha1", "storage/v1beta1", ] pruneopts = "" - revision = "73d903622b7391f3312dcbac6483fed484e185f8" - version = "kubernetes-1.10.1" + revision = "2d6f90ab1293a1fb871cf149423ebb72aa7423aa" + version = "kubernetes-1.11.2" [[projects]] - digest = "1:34dff545860050793802bc3245899316d11ea036d37d3b396deff3785a66196a" + digest = "1:d04bb4b31e495fa35739550e4dec2dd4c6f45c57f6d7fccb830a6ab75762efaa" name = "k8s.io/apiextensions-apiserver" packages = [ "pkg/apis/apiextensions", "pkg/apis/apiextensions/v1beta1", - "pkg/client/clientset/clientset", "pkg/client/clientset/clientset/scheme", - "pkg/client/clientset/clientset/typed/apiextensions/v1beta1", ] pruneopts = "" - revision = "4347b330d0ff094db860f2f75fa725b4f4b53618" - version = "kubernetes-1.10.1" + revision = "408db4a50408e2149acbd657bceb2480c13cb0a4" + version = "kubernetes-1.11.2" [[projects]] - digest = "1:9b07c796baf391a2dfa8c64bd5ddc28cbeb00723389f2f3da2e3d09b961f2e31" + digest = "1:b6b2fb7b4da1ac973b64534ace2299a02504f16bc7820cb48edb8ca4077183e1" name = "k8s.io/apimachinery" packages = [ "pkg/api/errors", @@ -382,25 +498,32 @@ "pkg/util/diff", "pkg/util/errors", "pkg/util/framer", + "pkg/util/httpstream", "pkg/util/intstr", "pkg/util/json", + "pkg/util/mergepatch", "pkg/util/net", + "pkg/util/proxy", "pkg/util/runtime", "pkg/util/sets", + "pkg/util/strategicpatch", + "pkg/util/uuid", "pkg/util/validation", "pkg/util/validation/field", "pkg/util/wait", "pkg/util/yaml", "pkg/version", "pkg/watch", + "third_party/forked/golang/json", + "third_party/forked/golang/netutil", "third_party/forked/golang/reflect", ] pruneopts = "" - revision = "302974c03f7e50f16561ba237db776ab93594ef6" - version = "kubernetes-1.10.1" + revision = "103fd098999dc9c0c88536f5c9ad2e5da39373ae" + version = "kubernetes-1.11.2" [[projects]] - digest = "1:28504a7311d90506af4c62697951d66173c1b95b5b87368c42b06c143ce13e4a" + digest = "1:da788b52eda4a8cd4c564a69051b029f310f4ec232cfa3ec0e49b80b0e7b6616" name = "k8s.io/client-go" packages = [ "discovery", @@ -432,28 +555,35 @@ "kubernetes/typed/rbac/v1alpha1", "kubernetes/typed/rbac/v1beta1", "kubernetes/typed/scheduling/v1alpha1", + "kubernetes/typed/scheduling/v1beta1", "kubernetes/typed/settings/v1alpha1", "kubernetes/typed/storage/v1", "kubernetes/typed/storage/v1alpha1", "kubernetes/typed/storage/v1beta1", "pkg/apis/clientauthentication", "pkg/apis/clientauthentication/v1alpha1", + "pkg/apis/clientauthentication/v1beta1", "pkg/version", "plugin/pkg/client/auth/exec", "rest", "rest/watch", + "restmapper", "tools/auth", "tools/cache", "tools/clientcmd", "tools/clientcmd/api", "tools/clientcmd/api/latest", "tools/clientcmd/api/v1", + "tools/leaderelection", + "tools/leaderelection/resourcelock", "tools/metrics", "tools/pager", + "tools/record", "tools/reference", "transport", "util/buffer", "util/cert", + "util/connrotation", "util/flowcontrol", "util/homedir", "util/integer", @@ -461,18 +591,49 @@ "util/workqueue", ] pruneopts = "" - revision = "989be4278f353e42f26c416c53757d16fcff77db" - version = "kubernetes-1.10.1" + revision = "1f13a808da65775f22cbf47862c4e5898d8f4ca1" + version = "kubernetes-1.11.2" + +[[projects]] + branch = "master" + digest = "1:951bc2047eea6d316a17850244274554f26fd59189360e45f4056b424dadf2c1" + name = "k8s.io/kube-openapi" + packages = ["pkg/util/proto"] + pruneopts = "" + revision = "e3762e86a74c878ffed47484592986685639c2cd" [[projects]] - digest = "1:33b8dd2f2532df51be174418a1971fbaca14c1730b8d8476f33e2232787e057d" + digest = "1:6cad2468c5831529b860a01f09032f6ff38202bc4f76332ef7ad74a993e4aa5a" name = "sigs.k8s.io/controller-runtime" packages = [ + "pkg/cache", + "pkg/cache/internal", "pkg/client", "pkg/client/apiutil", + "pkg/client/config", + "pkg/controller", + "pkg/event", + "pkg/handler", + "pkg/internal/controller", + "pkg/internal/recorder", + "pkg/leaderelection", + "pkg/manager", + "pkg/patch", + "pkg/predicate", + "pkg/reconcile", + "pkg/recorder", + "pkg/runtime/inject", + "pkg/runtime/log", + "pkg/runtime/signals", + "pkg/source", + "pkg/source/internal", + "pkg/webhook/admission", + "pkg/webhook/admission/types", + "pkg/webhook/types", ] pruneopts = "" - revision = "60bb251ad86f9b313653618aad0c2c53f41a6625" + revision = "53fc44b56078cd095b11bd44cfa0288ee4cf718f" + version = "v0.1.4" [solve-meta] analyzer-name = "dep" @@ -485,11 +646,7 @@ "github.com/sirupsen/logrus", "github.com/spf13/cobra", "gopkg.in/yaml.v2", - "k8s.io/api/apps/v1", "k8s.io/api/core/v1", - "k8s.io/api/rbac/v1beta1", - "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1", - "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset", "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/scheme", "k8s.io/apimachinery/pkg/api/errors", "k8s.io/apimachinery/pkg/api/meta", @@ -500,18 +657,29 @@ "k8s.io/apimachinery/pkg/runtime/serializer", "k8s.io/apimachinery/pkg/types", "k8s.io/apimachinery/pkg/util/intstr", + "k8s.io/apimachinery/pkg/util/net", + "k8s.io/apimachinery/pkg/util/proxy", "k8s.io/apimachinery/pkg/util/wait", "k8s.io/apimachinery/pkg/watch", - "k8s.io/client-go/discovery", "k8s.io/client-go/discovery/cached", "k8s.io/client-go/dynamic", "k8s.io/client-go/kubernetes", "k8s.io/client-go/kubernetes/scheme", "k8s.io/client-go/rest", + "k8s.io/client-go/restmapper", "k8s.io/client-go/tools/cache", "k8s.io/client-go/tools/clientcmd", + "k8s.io/client-go/transport", "k8s.io/client-go/util/workqueue", "sigs.k8s.io/controller-runtime/pkg/client", + "sigs.k8s.io/controller-runtime/pkg/client/config", + "sigs.k8s.io/controller-runtime/pkg/controller", + "sigs.k8s.io/controller-runtime/pkg/handler", + "sigs.k8s.io/controller-runtime/pkg/manager", + "sigs.k8s.io/controller-runtime/pkg/reconcile", + "sigs.k8s.io/controller-runtime/pkg/runtime/log", + "sigs.k8s.io/controller-runtime/pkg/runtime/signals", + "sigs.k8s.io/controller-runtime/pkg/source", ] solver-name = "gps-cdcl" solver-version = 1 diff --git a/vendor/github.com/operator-framework/operator-sdk/Gopkg.toml b/vendor/github.com/operator-framework/operator-sdk/Gopkg.toml index a71e178248..ab038af9fb 100644 --- a/vendor/github.com/operator-framework/operator-sdk/Gopkg.toml +++ b/vendor/github.com/operator-framework/operator-sdk/Gopkg.toml @@ -4,23 +4,23 @@ [[constraint]] name = "github.com/spf13/cobra" - version = "0.0.2" + version = "0.0.3" [[override]] name = "k8s.io/api" - version = "kubernetes-1.10.1" + version = "kubernetes-1.11.2" [[override]] name = "k8s.io/apimachinery" - version = "kubernetes-1.10.1" + version = "kubernetes-1.11.2" [[override]] name = "k8s.io/apiextensions-apiserver" - version = "kubernetes-1.10.1" + version = "kubernetes-1.11.2" [[override]] name = "k8s.io/client-go" - version = "kubernetes-1.10.1" + version = "kubernetes-1.11.2" [[constraint]] name = "github.com/sergi/go-diff" @@ -28,4 +28,4 @@ [[constraint]] name = "sigs.k8s.io/controller-runtime" - revision = "60bb251ad86f9b313653618aad0c2c53f41a6625" + version = "v0.1.4" diff --git a/vendor/github.com/operator-framework/operator-sdk/MAINTAINERS b/vendor/github.com/operator-framework/operator-sdk/MAINTAINERS index 2af7743832..23ac9712bc 100644 --- a/vendor/github.com/operator-framework/operator-sdk/MAINTAINERS +++ b/vendor/github.com/operator-framework/operator-sdk/MAINTAINERS @@ -1,13 +1,14 @@ # This is the official list of operator-sdk maintainers. # # Names should be added to this file like so: -# Individual's name (@GITHUB_HANDLE) pkg:* -# Individual's name (@GITHUB_HANDLE) pkg:* -# -# Please keep the list sorted. +# Individual's name (@GITHUB_HANDLE) +# Individual's name (@GITHUB_HANDLE) -Fanmin Shi (@fanminshi) pkg:* -Haseeb Tariq (@hasbro17) pkg:* -Sebastien Pahl (@spahl) pkg:* -Verónica López (@Verolop) pkg:* -Rithu Leena John (@rithujohn191) pkg:* +Fanmin Shi (@fanminshi) +Haseeb Tariq (@hasbro17) +Sebastien Pahl (@spahl) +Rithu Leena John (@rithujohn191) +Alexander Pavel (@AlexNPavel) +Eric Stroczynski (@estroz) +Shawn Hurley (@shawn-hurley) +Lili Cosic (@LiliC) diff --git a/vendor/github.com/operator-framework/operator-sdk/Makefile b/vendor/github.com/operator-framework/operator-sdk/Makefile index 831e12fead..51ba488de4 100644 --- a/vendor/github.com/operator-framework/operator-sdk/Makefile +++ b/vendor/github.com/operator-framework/operator-sdk/Makefile @@ -1,14 +1,58 @@ -pkgs = $(shell go list ./... | grep -v /vendor/) +# kernel-style V=1 build verbosity +ifeq ("$(origin V)", "command line") + BUILD_VERBOSE = $(V) +endif -all: format test install +ifeq ($(BUILD_VERBOSE),1) + Q = +else + Q = @ +endif -install: - go install github.com/operator-framework/operator-sdk/commands/operator-sdk +VERSION = $(shell git describe --dirty --tags) +REPO = github.com/operator-framework/operator-sdk +BUILD_PATH = $(REPO)/commands/operator-sdk +PKGS = $(shell go list ./... | grep -v /vendor/) + +export CGO_ENABLED:=0 + +all: format test build/operator-sdk format: - go fmt $(pkgs) + $(Q)go fmt $(PKGS) dep: - dep ensure -v + $(Q)dep ensure -v + +clean: + $(Q)rm -rf build + +.PHONY: all test format dep clean + +install: + $(Q)go install $(BUILD_PATH) + +release_x86_64 := \ + build/operator-sdk-$(VERSION)-x86_64-linux-gnu \ + build/operator-sdk-$(VERSION)-x86_64-apple-darwin + +release: clean $(release_x86_64) + +build/operator-sdk-%-x86_64-linux-gnu: GOARGS = GOOS=linux GOARCH=amd64 +build/operator-sdk-%-x86_64-apple-darwin: GOARGS = GOOS=darwin GOARCH=amd64 + +build/%: + $(Q)$(GOARGS) go build -o $@ $(BUILD_PATH) + +DEFAULT_KEY = $(shell gpgconf --list-options gpg \ + | awk -F: '$$1 == "default-key" { gsub(/"/,""); print $$10}') +build/%.asc: +ifeq ("$(DEFAULT_KEY)","$(shell git config --get user.signingkey)") + $(Q)gpg --output $@ --detach-sig build/$* + $(Q)gpg --verify $@ build/$* +else + @echo "git and/or gpg are not configured to have default signing key ${DEFAULT_KEY}" + @exit 1 +endif -.PHONY: all install test format dep +.PHONY: install release_x86_64 release diff --git a/vendor/github.com/operator-framework/operator-sdk/README.md b/vendor/github.com/operator-framework/operator-sdk/README.md index 764c4d7601..9fd3cbeba2 100644 --- a/vendor/github.com/operator-framework/operator-sdk/README.md +++ b/vendor/github.com/operator-framework/operator-sdk/README.md @@ -57,6 +57,7 @@ Create and deploy an app-operator using the SDK CLI: ```sh # Create an app-operator project that defines the App CR. +$ mkdir -p $GOPATH/src/github.com/example-inc/ $ cd $GOPATH/src/github.com/example-inc/ $ operator-sdk new app-operator --api-version=app.example.com/v1alpha1 --kind=App $ cd app-operator @@ -65,7 +66,11 @@ $ cd app-operator $ operator-sdk build quay.io/example/app-operator $ docker push quay.io/example/app-operator +# Update the operator manifest to use the built image name +$ sed -i 's|REPLACE_IMAGE|quay.io/example/app-operator|g' deploy/operator.yaml + # Deploy the app-operator +$ kubectl create -f deploy/sa.yaml $ kubectl create -f deploy/rbac.yaml $ kubectl create -f deploy/crd.yaml $ kubectl create -f deploy/operator.yaml @@ -80,8 +85,10 @@ busy-box 1/1 Running 0 50s # Cleanup $ kubectl delete -f deploy/cr.yaml +$ kubectl delete -f deploy/crd.yaml $ kubectl delete -f deploy/operator.yaml $ kubectl delete -f deploy/rbac.yaml +$ kubectl delete -f deploy/sa.yaml ``` ## User Guide diff --git a/vendor/github.com/operator-framework/operator-sdk/commands/operator-sdk/cmd/build.go b/vendor/github.com/operator-framework/operator-sdk/commands/operator-sdk/cmd/build.go index e67dae1a7e..a060c7e876 100644 --- a/vendor/github.com/operator-framework/operator-sdk/commands/operator-sdk/cmd/build.go +++ b/vendor/github.com/operator-framework/operator-sdk/commands/operator-sdk/cmd/build.go @@ -15,19 +15,32 @@ package cmd import ( + "bytes" + "errors" "fmt" + "io/ioutil" + "log" "os" "os/exec" + "path/filepath" + "strings" "github.com/operator-framework/operator-sdk/commands/operator-sdk/cmd/cmdutil" cmdError "github.com/operator-framework/operator-sdk/commands/operator-sdk/error" "github.com/operator-framework/operator-sdk/pkg/generator" + "github.com/ghodss/yaml" "github.com/spf13/cobra" ) +var ( + namespacedManBuild string + testLocationBuild string + enableTests bool +) + func NewBuildCmd() *cobra.Command { - return &cobra.Command{ + buildCmd := &cobra.Command{ Use: "build ", Short: "Compiles code and builds artifacts", Long: `The operator-sdk build command compiles the code, builds the executables, @@ -44,37 +57,161 @@ For example: `, Run: buildFunc, } + buildCmd.Flags().BoolVar(&enableTests, "enable-tests", false, "Enable in-cluster testing by adding test binary to the image") + buildCmd.Flags().StringVar(&testLocationBuild, "test-location", "./test/e2e", "Location of tests") + buildCmd.Flags().StringVar(&namespacedManBuild, "namespaced-manifest", "deploy/operator.yaml", "Path of namespaced resources manifest for tests") + return buildCmd +} + +/* + * verifyDeploymentImages checks image names of pod 0 in deployments found in the provided yaml file. + * This is done because e2e tests require a namespaced manifest file to configure a namespace with + * required resources. This function is intended to identify if a user used a different image name + * for their operator in the provided yaml, which would result in the testing of the wrong operator + * image. As it is possible for a namespaced yaml to have multiple deployments (such as the vault + * operator, which depends on the etcd-operator), this is just a warning, not a fatal error. + */ +func verifyDeploymentImage(yamlFile []byte, imageName string) error { + warningMessages := "" + yamlSplit := bytes.Split(yamlFile, []byte("\n---\n")) + for _, yamlSpec := range yamlSplit { + yamlMap := make(map[string]interface{}) + err := yaml.Unmarshal(yamlSpec, &yamlMap) + if err != nil { + log.Fatal("Could not unmarshal yaml namespaced spec") + } + kind, ok := yamlMap["kind"].(string) + if !ok { + log.Fatal("Yaml manifest file contains a 'kind' field that is not a string") + } + if kind == "Deployment" { + // this is ugly and hacky; we should probably make this cleaner + nestedMap, ok := yamlMap["spec"].(map[string]interface{}) + if !ok { + continue + } + nestedMap, ok = nestedMap["template"].(map[string]interface{}) + if !ok { + continue + } + nestedMap, ok = nestedMap["spec"].(map[string]interface{}) + if !ok { + continue + } + containersArray, ok := nestedMap["containers"].([]interface{}) + if !ok { + continue + } + for _, item := range containersArray { + image, ok := item.(map[string]interface{})["image"].(string) + if !ok { + continue + } + if image != imageName { + warningMessages = fmt.Sprintf("%s\nWARNING: Namespace manifest contains a deployment with image %v, which does not match the name of the image being built: %v", warningMessages, image, imageName) + } + } + } + } + if warningMessages == "" { + return nil + } + return errors.New(warningMessages) +} + +func renderTestManifest(image string) { + namespacedBytes, err := ioutil.ReadFile(namespacedManBuild) + if err != nil { + log.Fatalf("could not read namespaced manifest: %v", err) + } + if err = generator.RenderTestYaml(cmdutil.GetConfig(), image); err != nil { + log.Fatalf("failed to generate deploy/test-pod.yaml: (%v)", err) + } + err = verifyDeploymentImage(namespacedBytes, image) + // the error from verifyDeploymentImage is just a warning, not fatal error + if err != nil { + fmt.Printf("%v\n", err) + } } const ( - build = "./tmp/build/build.sh" - dockerBuild = "./tmp/build/docker_build.sh" - configYaml = "./config/config.yaml" + build = "./tmp/build/build.sh" + configYaml = "./config/config.yaml" + mainGo = "./cmd/%s/main.go" ) func buildFunc(cmd *cobra.Command, args []string) { if len(args) != 1 { - cmdError.ExitWithError(cmdError.ExitBadArgs, fmt.Errorf("build command needs 1 argument.")) + cmdError.ExitWithError(cmdError.ExitBadArgs, fmt.Errorf("build command needs exactly 1 argument")) } - bcmd := exec.Command(build) - o, err := bcmd.CombinedOutput() + cmdutil.MustInProjectRoot() + goBuildEnv := append(os.Environ(), "GOOS=linux", "GOARCH=amd64", "CGO_ENABLED=0") + wd, err := os.Getwd() if err != nil { - cmdError.ExitWithError(cmdError.ExitError, fmt.Errorf("failed to build: (%v)", string(o))) + cmdError.ExitWithError(cmdError.ExitError, fmt.Errorf("could not identify current working directory: %v", err)) + } + + // Don't need to buld go code if Ansible Operator + if mainExists() { + buildCmd := exec.Command("go", "build", "-o", filepath.Join(wd, "tmp/_output/bin", filepath.Base(wd)), filepath.Join(cmdutil.GetCurrPkg(), "cmd", filepath.Base(wd))) + buildCmd.Env = goBuildEnv + o, err := buildCmd.CombinedOutput() + if err != nil { + log.Fatalf("failed to build operator binary: %v (%v)", err, string(o)) + } + fmt.Fprintln(os.Stdout, string(o)) } - fmt.Fprintln(os.Stdout, string(o)) image := args[0] - dbcmd := exec.Command(dockerBuild) - dbcmd.Env = append(os.Environ(), fmt.Sprintf("IMAGE=%v", image)) - o, err = dbcmd.CombinedOutput() + baseImageName := image + if enableTests { + baseImageName += "-intermediate" + } + dbcmd := exec.Command("docker", "build", ".", "-f", "tmp/build/Dockerfile", "-t", baseImageName) + o, err := dbcmd.CombinedOutput() if err != nil { - cmdError.ExitWithError(cmdError.ExitError, fmt.Errorf("failed to output build image %v: (%v)", image, string(o))) + if enableTests { + cmdError.ExitWithError(cmdError.ExitError, fmt.Errorf("failed to build intermediate image for %s image: (%s)", image, string(o))) + } else { + cmdError.ExitWithError(cmdError.ExitError, fmt.Errorf("failed to output build image %s: (%s)", image, string(o))) + } } fmt.Fprintln(os.Stdout, string(o)) - c := cmdutil.GetConfig() - if err = generator.RenderOperatorYaml(c, image); err != nil { - cmdError.ExitWithError(cmdError.ExitError, fmt.Errorf("failed to generate deploy/operator.yaml: (%v)", err)) + if enableTests { + buildTestCmd := exec.Command("go", "test", "-c", "-o", filepath.Join(wd, "tmp/_output/bin", filepath.Base(wd)+"-test"), testLocationBuild+"/...") + buildTestCmd.Env = goBuildEnv + o, err := buildTestCmd.CombinedOutput() + if err != nil { + log.Fatalf("failed to build test binary: %v (%v)", err, string(o)) + } + fmt.Fprintln(os.Stdout, string(o)) + // if a user is using an older sdk repo as their library, make sure they have required build files + _, err = os.Stat("tmp/build/test-framework/Dockerfile") + if err != nil { + generator.RenderTestingContainerFiles(filepath.Join(wd, "tmp/build"), filepath.Base(wd)) + } + testDbcmd := exec.Command("docker", "build", ".", "-f", "tmp/build/test-framework/Dockerfile", "-t", image, "--build-arg", "NAMESPACEDMAN="+namespacedManBuild, "--build-arg", "BASEIMAGE="+baseImageName) + o, err = testDbcmd.CombinedOutput() + if err != nil { + cmdError.ExitWithError(cmdError.ExitError, fmt.Errorf("failed to output build image %v: (%v)", image, string(o))) + } + fmt.Fprintln(os.Stdout, string(o)) + // create test-pod.yaml as well as check image name of deployments in namespaced manifest + renderTestManifest(image) + } +} + +func mainExists() bool { + dir, err := os.Getwd() + if err != nil { + cmdError.ExitWithError(cmdError.ExitError, fmt.Errorf("failed to get current working dir: %v", err)) + } + dirSplit := strings.Split(dir, "/") + projectName := dirSplit[len(dirSplit)-1] + if _, err = os.Stat(fmt.Sprintf(mainGo, projectName)); err == nil { + return true } + return false } diff --git a/vendor/github.com/operator-framework/operator-sdk/commands/operator-sdk/cmd/build_test.go b/vendor/github.com/operator-framework/operator-sdk/commands/operator-sdk/cmd/build_test.go new file mode 100644 index 0000000000..054336db87 --- /dev/null +++ b/vendor/github.com/operator-framework/operator-sdk/commands/operator-sdk/cmd/build_test.go @@ -0,0 +1,116 @@ +// Copyright 2018 The Operator-SDK 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 cmd + +import "testing" + +var memcachedNamespaceManExample = `apiVersion: v1 +kind: ServiceAccount +metadata: + name: memcached-operator + +--- + +kind: Role +apiVersion: rbac.authorization.k8s.io/v1beta1 +metadata: + name: memcached-operator +rules: +- apiGroups: + - cache.example.com + resources: + - "*" + verbs: + - "*" +- apiGroups: + - "" + resources: + - pods + - services + - endpoints + - persistentvolumeclaims + - events + - configmaps + - secrets + verbs: + - "*" +- apiGroups: + - apps + resources: + - deployments + - daemonsets + - replicasets + - statefulsets + verbs: + - "*" + +--- + +kind: RoleBinding +apiVersion: rbac.authorization.k8s.io/v1beta1 +metadata: + name: memcached-operator +subjects: +- kind: ServiceAccount + name: memcached-operator +roleRef: + kind: Role + name: memcached-operator + apiGroup: rbac.authorization.k8s.io + +--- + +apiVersion: apps/v1 +kind: Deployment +metadata: + name: memcached-operator +spec: + replicas: 1 + selector: + matchLabels: + name: memcached-operator + template: + metadata: + labels: + name: memcached-operator + spec: + serviceAccountName: memcached-operator + containers: + - name: memcached-operator + image: quay.io/coreos/operator-sdk-dev:test-framework-operator + ports: + - containerPort: 60000 + name: metrics + command: + - memcached-operator + imagePullPolicy: Always + env: + - name: WATCH_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: OPERATOR_NAME + value: "memcached-operator" + +` + +func TestVerifyDeploymentImage(t *testing.T) { + if err := verifyDeploymentImage([]byte(memcachedNamespaceManExample), "quay.io/coreos/operator-sdk-dev:test-framework-operator"); err != nil { + t.Fatalf("verifyDeploymentImage incorrectly reported an error: %v", err) + } + if err := verifyDeploymentImage([]byte(memcachedNamespaceManExample), "different-image-name"); err == nil { + t.Fatal("verifyDeploymentImage did not report an error on an incorrect manifest") + } +} diff --git a/vendor/github.com/operator-framework/operator-sdk/commands/operator-sdk/cmd/cmdutil/util.go b/vendor/github.com/operator-framework/operator-sdk/commands/operator-sdk/cmd/cmdutil/util.go index 29816eefc8..9eed7d1f3b 100644 --- a/vendor/github.com/operator-framework/operator-sdk/commands/operator-sdk/cmd/cmdutil/util.go +++ b/vendor/github.com/operator-framework/operator-sdk/commands/operator-sdk/cmd/cmdutil/util.go @@ -15,9 +15,13 @@ package cmdutil import ( + "errors" "fmt" + gobuild "go/build" "io/ioutil" "os" + "path/filepath" + "strings" cmdError "github.com/operator-framework/operator-sdk/commands/operator-sdk/error" "github.com/operator-framework/operator-sdk/pkg/generator" @@ -25,13 +29,23 @@ import ( yaml "gopkg.in/yaml.v2" ) -const configYaml = "./config/config.yaml" +type OperatorType int + +const ( + configYaml = "./config/config.yaml" + gopkgToml = "./Gopkg.toml" + tmpDockerfile = "./tmp/build/Dockerfile" +) +const ( + OperatorTypeGo OperatorType = iota + OperatorTypeAnsible +) // MustInProjectRoot checks if the current dir is the project root. func MustInProjectRoot() { - // if the current directory has the "./config/config.yaml" file, then it is safe to say + // if the current directory has the "./tmp/build/Dockerfile" file, then it is safe to say // we are at the project root. - _, err := os.Stat(configYaml) + _, err := os.Stat(tmpDockerfile) if err != nil && os.IsNotExist(err) { cmdError.ExitWithError(cmdError.ExitError, fmt.Errorf("must in project root dir: %v", err)) } @@ -49,3 +63,35 @@ func GetConfig() *generator.Config { } return c } + +// GetCurrPkg returns the current directory's import path +// e.g: "github.com/example-inc/app-operator" +func GetCurrPkg() string { + gopath := os.Getenv("GOPATH") + if len(gopath) == 0 { + gopath = gobuild.Default.GOPATH + } + goSrc := filepath.Join(gopath, "src") + + wd, err := os.Getwd() + if err != nil { + cmdError.ExitWithError(cmdError.ExitError, fmt.Errorf("failed to get working directory: (%v)", err)) + } + if !strings.HasPrefix(filepath.Dir(wd), goSrc) { + cmdError.ExitWithError(cmdError.ExitError, errors.New("must run from gopath")) + } + currPkg := strings.Replace(wd, goSrc+string(filepath.Separator), "", 1) + return currPkg +} + +// GetOperatorType returns type of operator is in cwd +// This function should be called after verifying the user is in project root +// e.g: "go", "ansible" +func GetOperatorType() OperatorType { + // Assuming that if Gopkg.toml exists then this is a Go operator + _, err := os.Stat(gopkgToml) + if err != nil && os.IsNotExist(err) { + return OperatorTypeAnsible + } + return OperatorTypeGo +} diff --git a/vendor/github.com/operator-framework/operator-sdk/commands/operator-sdk/cmd/generate.go b/vendor/github.com/operator-framework/operator-sdk/commands/operator-sdk/cmd/generate.go index 73511baa1a..e164a919c3 100644 --- a/vendor/github.com/operator-framework/operator-sdk/commands/operator-sdk/cmd/generate.go +++ b/vendor/github.com/operator-framework/operator-sdk/commands/operator-sdk/cmd/generate.go @@ -29,5 +29,6 @@ func NewGenerateCmd() *cobra.Command { } cmd.AddCommand(generate.NewGenerateK8SCmd()) cmd.AddCommand(generate.NewGenerateOlmCatalogCmd()) + cmd.AddCommand(generate.NewGenerateCrdCmd()) return cmd } diff --git a/vendor/github.com/operator-framework/operator-sdk/commands/operator-sdk/cmd/generate/crd.go b/vendor/github.com/operator-framework/operator-sdk/commands/operator-sdk/cmd/generate/crd.go new file mode 100644 index 0000000000..b9f1c0e899 --- /dev/null +++ b/vendor/github.com/operator-framework/operator-sdk/commands/operator-sdk/cmd/generate/crd.go @@ -0,0 +1,107 @@ +// Copyright 2018 The Operator-SDK 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 generate + +import ( + "errors" + "fmt" + "os" + "path/filepath" + "strings" + + cmdError "github.com/operator-framework/operator-sdk/commands/operator-sdk/error" + "github.com/operator-framework/operator-sdk/pkg/generator" + + "github.com/spf13/cobra" +) + +var ( + apiVersion string + kind string +) + +const ( + goDir = "GOPATH" + deployCrdDir = "deploy" +) + +func NewGenerateCrdCmd() *cobra.Command { + crdCmd := &cobra.Command{ + Use: "crd", + Short: "Generates a custom resource definition (CRD) and the custom resource (CR) files", + Long: `The operator-sdk generate command will create a custom resource definition (CRD) and the custom resource (CR) files for the specified api-version and kind. + +Generated CRD filename: /deploy/___crd.yaml +Generated CR filename: /deploy/___cr.yaml + + /deploy path must already exist + --api-version and --kind are required flags to generate the new operator application. +`, + Run: crdFunc, + } + crdCmd.Flags().StringVar(&apiVersion, "api-version", "", "Kubernetes apiVersion and has a format of $GROUP_NAME/$VERSION (e.g app.example.com/v1alpha1)") + crdCmd.MarkFlagRequired("api-version") + crdCmd.Flags().StringVar(&kind, "kind", "", "Kubernetes CustomResourceDefintion kind. (e.g AppService)") + crdCmd.MarkFlagRequired("kind") + return crdCmd +} + +func crdFunc(cmd *cobra.Command, args []string) { + if len(args) != 0 { + cmdError.ExitWithError(cmdError.ExitBadArgs, errors.New("crd command doesn't accept any arguments.")) + } + verifyCrdFlags() + verifyCrdDeployPath() + + fmt.Fprintln(os.Stdout, "Generating custom resource definition (CRD) file") + + // generate CR/CRD file + wd, err := os.Getwd() + if err != nil { + cmdError.ExitWithError(cmdError.ExitError, err) + } + if err := generator.RenderDeployCrdFiles(filepath.Join(wd, deployCrdDir), apiVersion, kind); err != nil { + cmdError.ExitWithError(cmdError.ExitError, fmt.Errorf("failed to generate CRD and CR files: (%v)", err)) + } +} + +func verifyCrdFlags() { + if len(apiVersion) == 0 { + cmdError.ExitWithError(cmdError.ExitBadArgs, errors.New("--api-version must not have empty value")) + } + if len(kind) == 0 { + cmdError.ExitWithError(cmdError.ExitBadArgs, errors.New("--kind must not have empty value")) + } + kindFirstLetter := string(kind[0]) + if kindFirstLetter != strings.ToUpper(kindFirstLetter) { + cmdError.ExitWithError(cmdError.ExitBadArgs, errors.New("--kind must start with an uppercase letter")) + } + if strings.Count(apiVersion, "/") != 1 { + cmdError.ExitWithError(cmdError.ExitBadArgs, fmt.Errorf("api-version has wrong format (%v); format must be $GROUP_NAME/$VERSION (e.g app.example.com/v1alpha1)", apiVersion)) + } +} + +// verifyCrdDeployPath checks if the path /deploy sub-directory is exists, and that is rooted under $GOPATH +func verifyCrdDeployPath() { + wd, err := os.Getwd() + if err != nil { + cmdError.ExitWithError(cmdError.ExitError, fmt.Errorf("failed to determine the full path of the current directory: %v", err)) + } + // check if the deploy sub-directory exist + _, err = os.Stat(filepath.Join(wd, deployCrdDir)) + if err != nil { + cmdError.ExitWithError(cmdError.ExitError, fmt.Errorf("the path (./%v) does not exist. run this command in your project directory", deployCrdDir)) + } +} diff --git a/vendor/github.com/operator-framework/operator-sdk/commands/operator-sdk/cmd/new.go b/vendor/github.com/operator-framework/operator-sdk/commands/operator-sdk/cmd/new.go index d36ed44833..5c68d1f143 100644 --- a/vendor/github.com/operator-framework/operator-sdk/commands/operator-sdk/cmd/new.go +++ b/vendor/github.com/operator-framework/operator-sdk/commands/operator-sdk/cmd/new.go @@ -53,39 +53,47 @@ generates a skeletal app-operator application in $GOPATH/src/github.com/example. newCmd.MarkFlagRequired("api-version") newCmd.Flags().StringVar(&kind, "kind", "", "Kubernetes CustomResourceDefintion kind. (e.g AppService)") newCmd.MarkFlagRequired("kind") + newCmd.Flags().StringVar(&operatorType, "type", "go", "Type of operator to initialize (e.g \"ansible\")") newCmd.Flags().BoolVar(&skipGit, "skip-git-init", false, "Do not init the directory as a git repository") + newCmd.Flags().BoolVar(&generatePlaybook, "generate-playbook", false, "Generate a playbook skeleton. (Only used for --type ansible)") return newCmd } var ( - apiVersion string - kind string - projectName string - skipGit bool + apiVersion string + kind string + operatorType string + projectName string + skipGit bool + generatePlaybook bool ) const ( - gopath = "GOPATH" - src = "src" - dep = "dep" - ensureCmd = "ensure" + gopath = "GOPATH" + src = "src" + dep = "dep" + ensureCmd = "ensure" + goOperatorType = "go" + ansibleOperatorType = "ansible" ) func newFunc(cmd *cobra.Command, args []string) { if len(args) != 1 { - cmdError.ExitWithError(cmdError.ExitBadArgs, fmt.Errorf("new command needs 1 argument.")) + cmdError.ExitWithError(cmdError.ExitBadArgs, fmt.Errorf("new command needs 1 argument")) } parse(args) mustBeNewProject() verifyFlags() - g := generator.NewGenerator(apiVersion, kind, projectName, repoPath()) + g := generator.NewGenerator(apiVersion, kind, operatorType, projectName, repoPath(), generatePlaybook) err := g.Render() if err != nil { cmdError.ExitWithError(cmdError.ExitError, fmt.Errorf("failed to create project %v: %v", projectName, err)) } - pullDep() - generate.K8sCodegen(projectName) + if operatorType == goOperatorType { + pullDep() + generate.K8sCodegen(projectName) + } initGit() } @@ -113,20 +121,25 @@ func mustBeNewProject() { } // repoPath checks if this project's repository path is rooted under $GOPATH and returns project's repository path. +// repoPath field on generator is used primarily in generation of Go operator. For Ansible we will set it to cwd func repoPath() string { - gp := os.Getenv(gopath) - if len(gp) == 0 { - cmdError.ExitWithError(cmdError.ExitError, fmt.Errorf("$GOPATH env not set")) - } + // We only care about GOPATH constraint checks if we are a Go operator wd := mustGetwd() - // check if this project's repository path is rooted under $GOPATH - if !strings.HasPrefix(wd, gp) { - cmdError.ExitWithError(cmdError.ExitError, fmt.Errorf("project's repository path (%v) is not rooted under GOPATH (%v)", wd, gp)) - } - // compute the repo path by stripping "$GOPATH/src/" from the path of the current directory. - rp := filepath.Join(string(wd[len(filepath.Join(gp, src)):]), projectName) - // strip any "/" prefix from the repo path. - return strings.TrimPrefix(rp, string(filepath.Separator)) + if operatorType == goOperatorType { + gp := os.Getenv(gopath) + if len(gp) == 0 { + cmdError.ExitWithError(cmdError.ExitError, fmt.Errorf("$GOPATH env not set")) + } + // check if this project's repository path is rooted under $GOPATH + if !strings.HasPrefix(wd, gp) { + cmdError.ExitWithError(cmdError.ExitError, fmt.Errorf("project's repository path (%v) is not rooted under GOPATH (%v)", wd, gp)) + } + // compute the repo path by stripping "$GOPATH/src/" from the path of the current directory. + rp := filepath.Join(string(wd[len(filepath.Join(gp, src)):]), projectName) + // strip any "/" prefix from the repo path. + return strings.TrimPrefix(rp, string(filepath.Separator)) + } + return wd } func verifyFlags() { @@ -136,6 +149,12 @@ func verifyFlags() { if len(kind) == 0 { cmdError.ExitWithError(cmdError.ExitBadArgs, errors.New("--kind must not have empty value")) } + if operatorType != goOperatorType && operatorType != ansibleOperatorType { + cmdError.ExitWithError(cmdError.ExitBadArgs, errors.New("--type can only be `go` or `ansible`")) + } + if operatorType != ansibleOperatorType && generatePlaybook { + cmdError.ExitWithError(cmdError.ExitBadArgs, errors.New("--generate-playbook can only be used with --type `ansible`")) + } kindFirstLetter := string(kind[0]) if kindFirstLetter != strings.ToUpper(kindFirstLetter) { cmdError.ExitWithError(cmdError.ExitBadArgs, errors.New("--kind must start with an uppercase letter")) @@ -181,6 +200,6 @@ func initGit() { fmt.Fprintln(os.Stdout, "Run git init ...") execCmd(os.Stdout, "git", "init") execCmd(os.Stdout, "git", "add", "--all") - execCmd(nil, "git", "commit", "-m", "INITIAL COMMIT") + execCmd(os.Stdout, "git", "commit", "-q", "-m", "INITIAL COMMIT") fmt.Fprintln(os.Stdout, "Run git init done") } diff --git a/vendor/github.com/operator-framework/operator-sdk/commands/operator-sdk/cmd/test.go b/vendor/github.com/operator-framework/operator-sdk/commands/operator-sdk/cmd/test.go index 22013fc936..9f7cea7e80 100644 --- a/vendor/github.com/operator-framework/operator-sdk/commands/operator-sdk/cmd/test.go +++ b/vendor/github.com/operator-framework/operator-sdk/commands/operator-sdk/cmd/test.go @@ -15,76 +15,20 @@ package cmd import ( - "io/ioutil" - "log" - "os" - "strings" - - "github.com/operator-framework/operator-sdk/pkg/test" + "github.com/operator-framework/operator-sdk/commands/operator-sdk/cmd/test" "github.com/spf13/cobra" ) -var ( - testLocation string - kubeconfig string - globalManifestPath string - namespacedManifestPath string - goTestFlags string -) - func NewTestCmd() *cobra.Command { testCmd := &cobra.Command{ - Use: "test --test-location [flags]", - Short: "Run End-To-End tests", - Run: testFunc, - } - defaultKubeConfig := "" - homedir, ok := os.LookupEnv("HOME") - if ok { - defaultKubeConfig = homedir + "/.kube/config" + Use: "test", + Short: "Tests the operator", + Long: `The test command has subcommands that can test the operator locally or from within a cluster. +`, } - testCmd.Flags().StringVarP(&testLocation, "test-location", "t", "", "Location of test files (e.g. ./test/e2e/)") - testCmd.MarkFlagRequired("test-location") - testCmd.Flags().StringVarP(&kubeconfig, "kubeconfig", "k", defaultKubeConfig, "Kubeconfig path") - testCmd.Flags().StringVarP(&globalManifestPath, "global-init", "g", "deploy/crd.yaml", "Path to manifest for Global resources (e.g. CRD manifest)") - testCmd.Flags().StringVarP(&namespacedManifestPath, "namespaced-init", "n", "", "Path to manifest for per-test, namespaced resources (e.g. RBAC and Operator manifest)") - testCmd.Flags().StringVarP(&goTestFlags, "go-test-flags", "f", "", "Additional flags to pass to go test") + testCmd.AddCommand(cmdtest.NewTestLocalCmd()) + testCmd.AddCommand(cmdtest.NewTestClusterCmd()) return testCmd } - -func testFunc(cmd *cobra.Command, args []string) { - // if no namespaced manifest path is given, combine deploy/rbac.yaml and deploy/operator.yaml - if namespacedManifestPath == "" { - os.Mkdir("deploy/test", os.FileMode(int(0775))) - namespacedManifestPath = "deploy/test/namespace-manifests.yaml" - rbac, err := ioutil.ReadFile("deploy/rbac.yaml") - if err != nil { - log.Fatalf("could not find rbac manifest: %v", err) - } - operator, err := ioutil.ReadFile("deploy/operator.yaml") - if err != nil { - log.Fatalf("could not find operator manifest: %v", err) - } - combined := append(rbac, []byte("\n---\n")...) - combined = append(combined, operator...) - err = ioutil.WriteFile(namespacedManifestPath, combined, os.FileMode(int(0664))) - if err != nil { - log.Fatalf("could not create temporary namespaced manifest file: %v", err) - } - defer func() { - err := os.Remove(namespacedManifestPath) - if err != nil { - log.Fatalf("could not delete temporary namespace manifest file") - } - }() - } - testArgs := []string{"test", testLocation + "/..."} - testArgs = append(testArgs, "-"+test.KubeConfigFlag, kubeconfig) - testArgs = append(testArgs, "-"+test.NamespacedManPathFlag, namespacedManifestPath) - testArgs = append(testArgs, "-"+test.GlobalManPathFlag, globalManifestPath) - testArgs = append(testArgs, "-"+test.ProjRootFlag, mustGetwd()) - testArgs = append(testArgs, strings.Split(goTestFlags, " ")...) - execCmd(os.Stdout, "go", testArgs...) -} diff --git a/vendor/github.com/operator-framework/operator-sdk/commands/operator-sdk/cmd/test/cluster.go b/vendor/github.com/operator-framework/operator-sdk/commands/operator-sdk/cmd/test/cluster.go new file mode 100644 index 0000000000..8c0ae4c790 --- /dev/null +++ b/vendor/github.com/operator-framework/operator-sdk/commands/operator-sdk/cmd/test/cluster.go @@ -0,0 +1,159 @@ +// Copyright 2018 The Operator-SDK 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 cmdtest + +import ( + "bytes" + "fmt" + "os" + "strings" + "time" + + "github.com/operator-framework/operator-sdk/pkg/test" + + "github.com/spf13/cobra" + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/wait" + "k8s.io/client-go/kubernetes" + "k8s.io/client-go/tools/clientcmd" +) + +type testClusterConfig struct { + namespace string + kubeconfig string + imagePullPolicy string + serviceAccount string + pendingTimeout int +} + +var tcConfig testClusterConfig + +func NewTestClusterCmd() *cobra.Command { + testCmd := &cobra.Command{ + Use: "cluster [flags]", + Short: "Run End-To-End tests using image with embedded test binary", + RunE: testClusterFunc, + } + defaultKubeConfig := "" + homedir, ok := os.LookupEnv("HOME") + if ok { + defaultKubeConfig = homedir + "/.kube/config" + } + testCmd.Flags().StringVar(&tcConfig.namespace, "namespace", "default", "Namespace to run tests in") + testCmd.Flags().StringVar(&tcConfig.kubeconfig, "kubeconfig", defaultKubeConfig, "Kubeconfig path") + testCmd.Flags().StringVar(&tcConfig.imagePullPolicy, "image-pull-policy", "Always", "Set test pod image pull policy. Allowed values: Always, Never") + testCmd.Flags().StringVar(&tcConfig.serviceAccount, "service-account", "default", "Service account to run tests on") + testCmd.Flags().IntVar(&tcConfig.pendingTimeout, "pending-timeout", 60, "Timeout in seconds for testing pod to stay in pending state (default 60s)") + + return testCmd +} + +func testClusterFunc(cmd *cobra.Command, args []string) error { + // in main.go, we catch and print errors, so we don't want cobra to print the error itself + cmd.SilenceErrors = true + if len(args) != 1 { + return fmt.Errorf("operator-sdk test cluster requires exactly 1 argument") + } + var pullPolicy v1.PullPolicy + if strings.ToLower(tcConfig.imagePullPolicy) == "always" { + pullPolicy = v1.PullAlways + } else if strings.ToLower(tcConfig.imagePullPolicy) == "never" { + pullPolicy = v1.PullNever + } else { + return fmt.Errorf("invalid imagePullPolicy '%v'", tcConfig.imagePullPolicy) + } + // cobra prints its help message on error; we silence that here because any errors below + // are due to the test failing, not incorrect user input + cmd.SilenceUsage = true + testPod := &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: "operator-test", + }, + Spec: v1.PodSpec{ + ServiceAccountName: tcConfig.serviceAccount, + RestartPolicy: v1.RestartPolicyNever, + Containers: []v1.Container{{ + Name: "operator-test", + Image: args[0], + ImagePullPolicy: pullPolicy, + Command: []string{"/go-test.sh"}, + Env: []v1.EnvVar{{ + Name: test.TestNamespaceEnv, + ValueFrom: &v1.EnvVarSource{FieldRef: &v1.ObjectFieldSelector{FieldPath: "metadata.namespace"}}, + }}, + }}, + }, + } + kubeconfig, err := clientcmd.BuildConfigFromFlags("", tcConfig.kubeconfig) + if err != nil { + return fmt.Errorf("failed to get kubeconfig: %v", err) + } + kubeclient, err := kubernetes.NewForConfig(kubeconfig) + if err != nil { + return fmt.Errorf("failed to create kubeclient: %v", err) + } + testPod, err = kubeclient.CoreV1().Pods(tcConfig.namespace).Create(testPod) + if err != nil { + return fmt.Errorf("failed to create test pod: %v", err) + } + defer func() { + err = kubeclient.CoreV1().Pods(tcConfig.namespace).Delete(testPod.Name, &metav1.DeleteOptions{}) + if err != nil { + fmt.Printf("Warning: failed to delete test pod") + } + }() + err = wait.Poll(time.Second*5, time.Second*time.Duration(tcConfig.pendingTimeout), func() (bool, error) { + testPod, err = kubeclient.CoreV1().Pods(tcConfig.namespace).Get(testPod.Name, metav1.GetOptions{}) + if err != nil { + return false, fmt.Errorf("failed to get test pod: %v", err) + } + if testPod.Status.Phase == v1.PodPending { + return false, nil + } + return true, nil + }) + if err != nil { + testPod, err = kubeclient.CoreV1().Pods(tcConfig.namespace).Get(testPod.Name, metav1.GetOptions{}) + if err != nil { + return fmt.Errorf("failed to get test pod: %v", err) + } + waitingState := testPod.Status.ContainerStatuses[0].State.Waiting + return fmt.Errorf("test pod stuck in 'Pending' phase for longer than %d seconds.\nMessage: %s\nReason: %s", tcConfig.pendingTimeout, waitingState.Message, waitingState.Reason) + } + for { + testPod, err = kubeclient.CoreV1().Pods(tcConfig.namespace).Get(testPod.Name, metav1.GetOptions{}) + if err != nil { + return fmt.Errorf("failed to get test pod: %v", err) + } + if testPod.Status.Phase != v1.PodSucceeded && testPod.Status.Phase != v1.PodFailed { + time.Sleep(time.Second * 5) + continue + } else if testPod.Status.Phase == v1.PodSucceeded { + fmt.Printf("Test Successfully Completed\n") + return nil + } else if testPod.Status.Phase == v1.PodFailed { + req := kubeclient.CoreV1().Pods(tcConfig.namespace).GetLogs(testPod.Name, &v1.PodLogOptions{}) + readCloser, err := req.Stream() + if err != nil { + return fmt.Errorf("test failed and failed to get error logs") + } + defer readCloser.Close() + buf := new(bytes.Buffer) + buf.ReadFrom(readCloser) + return fmt.Errorf("test failed:\n%s", buf.String()) + } + } +} diff --git a/vendor/github.com/operator-framework/operator-sdk/commands/operator-sdk/cmd/test/local.go b/vendor/github.com/operator-framework/operator-sdk/commands/operator-sdk/cmd/test/local.go new file mode 100644 index 0000000000..45b61f084f --- /dev/null +++ b/vendor/github.com/operator-framework/operator-sdk/commands/operator-sdk/cmd/test/local.go @@ -0,0 +1,126 @@ +// Copyright 2018 The Operator-SDK 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 cmdtest + +import ( + "fmt" + "io/ioutil" + "log" + "os" + "os/exec" + "strings" + + cmdError "github.com/operator-framework/operator-sdk/commands/operator-sdk/error" + "github.com/operator-framework/operator-sdk/pkg/test" + + "github.com/spf13/cobra" +) + +type testLocalConfig struct { + kubeconfig string + globalManPath string + namespacedManPath string + goTestFlags string + namespace string +} + +var tlConfig testLocalConfig + +func NewTestLocalCmd() *cobra.Command { + testCmd := &cobra.Command{ + Use: "local [flags]", + Short: "Run End-To-End tests locally", + Run: testLocalFunc, + } + defaultKubeConfig := "" + homedir, ok := os.LookupEnv("HOME") + if ok { + defaultKubeConfig = homedir + "/.kube/config" + } + testCmd.Flags().StringVar(&tlConfig.kubeconfig, "kubeconfig", defaultKubeConfig, "Kubeconfig path") + testCmd.Flags().StringVar(&tlConfig.globalManPath, "global-manifest", "deploy/crd.yaml", "Path to manifest for Global resources (e.g. CRD manifest)") + testCmd.Flags().StringVar(&tlConfig.namespacedManPath, "namespaced-manifest", "", "Path to manifest for per-test, namespaced resources (e.g. RBAC and Operator manifest)") + testCmd.Flags().StringVar(&tlConfig.goTestFlags, "go-test-flags", "", "Additional flags to pass to go test") + testCmd.Flags().StringVar(&tlConfig.namespace, "namespace", "", "If non-empty, single namespace to run tests in") + + return testCmd +} + +func testLocalFunc(cmd *cobra.Command, args []string) { + if len(args) != 1 { + cmdError.ExitWithError(cmdError.ExitBadArgs, fmt.Errorf("operator-sdk test local requires exactly 1 argument")) + } + // if no namespaced manifest path is given, combine deploy/sa.yaml, deploy/rbac.yaml and deploy/operator.yaml + if tlConfig.namespacedManPath == "" { + os.Mkdir("deploy/test", os.FileMode(int(0775))) + tlConfig.namespacedManPath = "deploy/test/namespace-manifests.yaml" + sa, err := ioutil.ReadFile("deploy/sa.yaml") + if err != nil { + log.Fatalf("could not find sa manifest: %v", err) + } + rbac, err := ioutil.ReadFile("deploy/rbac.yaml") + if err != nil { + log.Fatalf("could not find rbac manifest: %v", err) + } + operator, err := ioutil.ReadFile("deploy/operator.yaml") + if err != nil { + log.Fatalf("could not find operator manifest: %v", err) + } + combined := append(sa, []byte("\n---\n")...) + combined = append(combined, rbac...) + combined = append(combined, []byte("\n---\n")...) + combined = append(combined, operator...) + err = ioutil.WriteFile(tlConfig.namespacedManPath, combined, os.FileMode(int(0664))) + if err != nil { + log.Fatalf("could not create temporary namespaced manifest file: %v", err) + } + defer func() { + err := os.Remove(tlConfig.namespacedManPath) + if err != nil { + log.Fatalf("could not delete temporary namespace manifest file") + } + }() + } + testArgs := []string{"test", args[0] + "/..."} + testArgs = append(testArgs, "-"+test.KubeConfigFlag, tlConfig.kubeconfig) + testArgs = append(testArgs, "-"+test.NamespacedManPathFlag, tlConfig.namespacedManPath) + testArgs = append(testArgs, "-"+test.GlobalManPathFlag, tlConfig.globalManPath) + testArgs = append(testArgs, "-"+test.ProjRootFlag, mustGetwd()) + // if we do the append using an empty go flags, it inserts an empty arg, which causes + // any later flags to be ignored + if tlConfig.goTestFlags != "" { + testArgs = append(testArgs, strings.Split(tlConfig.goTestFlags, " ")...) + } + if tlConfig.namespace != "" { + testArgs = append(testArgs, "-"+test.SingleNamespaceFlag, "-parallel=1") + } + dc := exec.Command("go", testArgs...) + dc.Env = append(os.Environ(), fmt.Sprintf("%v=%v", test.TestNamespaceEnv, tlConfig.namespace)) + dc.Dir = mustGetwd() + dc.Stdout = os.Stdout + dc.Stderr = os.Stderr + err := dc.Run() + if err != nil { + cmdError.ExitWithError(cmdError.ExitError, fmt.Errorf("failed to exec `go %s`: %v", strings.Join(testArgs, " "), err)) + } +} + +func mustGetwd() string { + wd, err := os.Getwd() + if err != nil { + cmdError.ExitWithError(cmdError.ExitError, fmt.Errorf("failed to determine the full path of the current directory: %v", err)) + } + return wd +} diff --git a/vendor/github.com/operator-framework/operator-sdk/commands/operator-sdk/cmd/up/local.go b/vendor/github.com/operator-framework/operator-sdk/commands/operator-sdk/cmd/up/local.go index 8225e14caa..c3c6d23536 100644 --- a/vendor/github.com/operator-framework/operator-sdk/commands/operator-sdk/cmd/up/local.go +++ b/vendor/github.com/operator-framework/operator-sdk/commands/operator-sdk/cmd/up/local.go @@ -16,19 +16,26 @@ package up import ( "fmt" + "log" "os" "os/exec" "os/signal" "os/user" "path/filepath" + "runtime" "strings" "syscall" "github.com/operator-framework/operator-sdk/commands/operator-sdk/cmd/cmdutil" cmdError "github.com/operator-framework/operator-sdk/commands/operator-sdk/error" + ansibleOperator "github.com/operator-framework/operator-sdk/pkg/ansible/operator" + proxy "github.com/operator-framework/operator-sdk/pkg/ansible/proxy" "github.com/operator-framework/operator-sdk/pkg/util/k8sutil" - + sdkVersion "github.com/operator-framework/operator-sdk/version" + "github.com/sirupsen/logrus" "github.com/spf13/cobra" + "sigs.k8s.io/controller-runtime/pkg/client/config" + "sigs.k8s.io/controller-runtime/pkg/manager" ) func NewLocalCmd() *cobra.Command { @@ -66,8 +73,15 @@ const ( func upLocalFunc(cmd *cobra.Command, args []string) { mustKubeConfig() cmdutil.MustInProjectRoot() - c := cmdutil.GetConfig() - upLocal(c.ProjectName) + switch cmdutil.GetOperatorType() { + case cmdutil.OperatorTypeGo: + c := cmdutil.GetConfig() + upLocal(c.ProjectName) + case cmdutil.OperatorTypeAnsible: + upLocalAnsible() + default: + cmdError.ExitWithError(cmdError.ExitError, fmt.Errorf("failed to determine operator type")) + } } // mustKubeConfig checks if the kubeconfig file exists. @@ -112,3 +126,38 @@ func upLocal(projectName string) { cmdError.ExitWithError(cmdError.ExitError, fmt.Errorf("failed to run operator locally: %v", err)) } } + +func upLocalAnsible() { + mgr, err := manager.New(config.GetConfigOrDie(), manager.Options{Namespace: namespace}) + if err != nil { + log.Fatal(err) + } + + printVersion() + logrus.Infof("watching namespace: %s", namespace) + done := make(chan error) + + // start the proxy + proxy.RunProxy(done, proxy.Options{ + Address: "localhost", + Port: 8888, + KubeConfig: mgr.GetConfig(), + }) + + // start the operator + go ansibleOperator.Run(done, mgr) + + // wait for either to finish + err = <-done + if err == nil { + logrus.Info("Exiting") + } else { + logrus.Fatal(err.Error()) + } +} + +func printVersion() { + logrus.Infof("Go Version: %s", runtime.Version()) + logrus.Infof("Go OS/Arch: %s/%s", runtime.GOOS, runtime.GOARCH) + logrus.Infof("operator-sdk Version: %v", sdkVersion.Version) +} diff --git a/vendor/github.com/operator-framework/operator-sdk/doc/ansible/project_layout.md b/vendor/github.com/operator-framework/operator-sdk/doc/ansible/project_layout.md new file mode 100644 index 0000000000..b16eddcabf --- /dev/null +++ b/vendor/github.com/operator-framework/operator-sdk/doc/ansible/project_layout.md @@ -0,0 +1,12 @@ +# Project Scaffolding Layout + +After creating a new operator project using +`operator-sdk new --type ansible`, the project directory has numerous generated folders and files. The following table describes a basic rundown of each generated file/directory. + + +| File/Folders | Purpose | +| :--- | :--- | +| deploy | Contains a generic set of kubernetes manifests for deploying this operator on a kubernetes cluster. | +| roles/ | Contains an Ansible Role initialized using [Ansible Galaxy](https://docs.ansible.com/ansible/latest/reference_appendices/galaxy.html) | +| tmp | Contains scripts that the operator-sdk uses for build and initialization. | +| watches.yaml | Contains Group, Version, Kind, and Ansible invocation method. | diff --git a/vendor/github.com/operator-framework/operator-sdk/doc/ansible/user-guide.md b/vendor/github.com/operator-framework/operator-sdk/doc/ansible/user-guide.md new file mode 100644 index 0000000000..112098c420 --- /dev/null +++ b/vendor/github.com/operator-framework/operator-sdk/doc/ansible/user-guide.md @@ -0,0 +1,337 @@ +# User Guide + +This guide walks through an example of building a simple memcached-operator +powered by Ansible using tools and libraries provided by the Operator SDK. + +## Prerequisites + +- [git][git_tool] +- [docker][docker_tool] version 17.03+. +- [kubectl][kubectl_tool] version v1.9.0+. +- [ansible][ansible_tool] version v2.6.0+ +- [ansible-runner][ansible_runner_tool] version v1.1.0+ +- [ansible-runner-http][ansible_runner_http_plugin] version v1.0.0+ +- [dep][dep_tool] version v0.5.0+. (Optional if you aren't installing from source) +- [go][go_tool] version v1.10+. (Optional if you aren't installing from source) +- Access to a kubernetes v.1.9.0+ cluster. + +**Note**: This guide uses [minikube][minikube_tool] version v0.25.0+ as the +local kubernetes cluster and quay.io for the public registry. + +## Install the Operator SDK CLI + +The Operator SDK has a CLI tool that helps the developer to create, build, and +deploy a new operator project. + +Checkout the desired release tag and install the SDK CLI tool: + +```sh +$ mkdir -p $GOPATH/src/github.com/operator-framework +$ cd $GOPATH/src/github.com/operator-framework +$ git clone https://github.com/operator-framework/operator-sdk +$ cd operator-sdk +$ git checkout master +$ make dep +$ make install +``` + +This installs the CLI binary `operator-sdk` at `$GOPATH/bin`. + +## Create a new project + +Use the CLI to create a new Ansible-based memcached-operator project: + +```sh +$ mkdir -p $GOPATH/src/github.com/example-inc/ +$ cd $GOPATH/src/github.com/example-inc/ +$ operator-sdk new memcached-operator --api-version=cache.example.com/v1alpha1 --kind=Memcached --type=ansible +$ cd memcached-operator +``` + +This creates the memcached-operator project specifically for watching the +Memcached resource with APIVersion `cache.example.com/v1apha1` and Kind +`Memcached`. + +To learn more about the project directory structure, see [project +layout][layout_doc] doc. + +## Customize the operator logic + +For this example the memcached-operator will execute the following +reconciliation logic for each `Memcached` Custom Resource (CR): +- Create a memcached Deployment if it doesn't exist +- Ensure that the Deployment size is the same as specified by the `Memcached` +CR + +### Watch the Memcached CR + +By default, the memcached-operator watches `Memcached` resource events as shown +in `watches.yaml` and executes Ansible Role `Memached`: + +```yaml +--- +- version: v1alpha1 + group: cache.example.com + kind: Memcached +``` + +#### Options +**Role** +Specifying a `role` option in `watches.yaml` will configure the operator to use +this specified path when launching `ansible-runner` with an Ansible Role. By +default, the `new` command will fill in an absolute path to where your role +should go. +```yaml +--- +- version: v1alpha1 + group: cache.example.com + kind: Memcached + role: /opt/ansible/roles/Memcached +``` + +**Playbook** +Specifying a `playbook` option in `watches.yaml` will configure the operator to +use this specified path when launching `ansible-runner` with an Ansible +Playbook +```yaml +--- +- version: v1alpha1 + group: cache.example.com + kind: Memcached + playbook: /opt/ansible/playbook.yaml +``` + +## Building the Memcached Ansible Role + +The first thing to do is to modify the generated Ansible role under +`roles/Memcached`. This Ansible Role controls the logic that is executed when a +resource is modified. + +### Define the Memcached spec + +Defining the spec for an Ansible Operator can be done entirely in Ansible. The +Ansible Operator will simply pass all key value pairs listed in the Custom +Resource spec field along to Ansible as +[variables](https://docs.ansible.com/ansible/2.5/user_guide/playbooks_variables.html#passing-variables-on-the-command-line). +It is recommended that you perform some type validation in Ansible on the +variables to ensure that your application is receiving expected input. + +First, set a default in case the user doesn't set the `spec` field by modifying +`roles/Memcached/defaults/main.yml`: +```yaml +size: 1 +``` + +### Defining the Memcached deployment + +Now that we have the spec defined, we can define what Ansible is actually +executed on resource changes. Since this is an Ansible Role, the default +behavior will be to execute the tasks in `roles/Memcached/tasks/main.yml`. We +want Ansible to create a deployment if it does not exist which runs the +`memcached:1.4.36-alpine` image. Ansible 2.5+ supports the [k8s Ansible +Module](https://docs.ansible.com/ansible/2.6/modules/k8s_module.html) which we +will leverage to control the deployment definition. + +Modify `roles/Memcached/tasks/main.yml` to look like the following: +```yaml +--- +- name: start memcached + k8s: + definition: + kind: Deployment + apiVersion: apps/v1 + metadata: + name: '{{ meta.name }}-memcached' + namespace: '{{ meta.namespace }}' + spec: + replicas: "{{size}}" + selector: + matchLabels: + app: memcached + template: + metadata: + labels: + app: memcached + spec: + containers: + - name: memcached + command: + - memcached + - -m=64 + - -o + - modern + - -v + image: "docker.io/memcached:1.4.36-alpine" + ports: + - containerPort: 11211 + +``` + +It is important to note that we used the `size` variable to control how many +replicas of the Memcached deployment we want. We set the default to `1`, but +any user can create a Custom Resource that overwrites the default. + +### Build and run the operator + +Before running the operator, Kubernetes needs to know about the new custom +resource definition the operator will be watching. + +Deploy the CRD: + +```sh +$ kubectl create -f deploy/crd.yaml +``` + +Once this is done, there are two ways to run the operator: + +- As a pod inside a Kubernetes cluster +- As a go program outside the cluster using `operator-sdk` + +#### 1. Run as a pod inside a Kubernetes cluster + +Running as a pod inside a Kubernetes cluster is preferred for production use. + +Build the memcached-operator image and push it to a registry: +``` +$ operator-sdk build quay.io/example/memcached-operator:v0.0.1 +$ docker push quay.io/example/memcached-operator:v0.0.1 +``` + +Kubernetes deployment manifests are generated in `deploy/operator.yaml`. The +deployment image in this file needs to be modified from the placeholder +`REPLACE_IMAGE` to the previous built image. To do this run: +``` +$ sed -i 's|REPLACE_IMAGE|quay.io/example/memcached-operator:v0.0.1|g' deploy/operator.yaml +``` + +Deploy the memcached-operator: + +```sh +$ kubectl create -f deploy/rbac.yaml +$ kubectl create -f deploy/operator.yaml +``` + +**NOTE**: `deploy/rbac.yaml` creates a `ClusterRoleBinding` and assumes we are +working in namespace `default`. If you are working in a different namespace you +must modify this file before creating it. + +Verify that the memcached-operator is up and running: + +```sh +$ kubectl get deployment +NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE +memcached-operator 1 1 1 1 1m +``` + +#### 2. Run outside the cluster + +This method is preferred during the development cycle to speed up deployment and testing. + +**Note**: Ensure that [Ansible Runner][ansible_runner_tool] and [Ansible Runner +HTTP Plugin][ansible_runner_http_plugin] is installed or else you will see +unexpected errors from Ansible Runner when a Custom Resource is created. + +It is also important that the `role` path referenced in `watches.yaml` exists +on your machine. Since we are normally used to using a container where the Role +is put on disk for us, we need to manually copy our role to the configured +Ansible Roles path (e.g `/etc/ansible/roles`. + +Run the operator locally with the default kubernetes config file present at +`$HOME/.kube/config`: + +```sh +$ operator-sdk up local +INFO[0000] Go Version: go1.10 +INFO[0000] Go OS/Arch: darwin/amd64 +INFO[0000] operator-sdk Version: 0.0.5+git +``` + +Run the operator locally with a provided kubernetes config file: + +```sh +$ operator-sdk up local --kubeconfig=config +INFO[0000] Go Version: go1.10 +INFO[0000] Go OS/Arch: darwin/amd64 +INFO[0000] operator-sdk Version: 0.0.5+git +``` + +### Create a Memcached CR + +Modify `deploy/cr.yaml` as shown and create a `Memcached` custom resource: + +```sh +$ cat deploy/cr.yaml +apiVersion: "cache.example.com/v1alpha1" +kind: "Memcached" +metadata: + name: "example-memcached" +spec: + size: 3 + +$ kubectl apply -f deploy/cr.yaml +``` + +Ensure that the memcached-operator creates the deployment for the CR: + +```sh +$ kubectl get deployment +NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE +memcached-operator 1 1 1 1 2m +example-memcached 3 3 3 3 1m +``` + +Check the pods to confirm 3 replicas were created: + +```sh +$ kubectl get pods +NAME READY STATUS RESTARTS AGE +example-memcached-6fd7c98d8-7dqdr 1/1 Running 0 1m +example-memcached-6fd7c98d8-g5k7v 1/1 Running 0 1m +example-memcached-6fd7c98d8-m7vn7 1/1 Running 0 1m +memcached-operator-7cc7cfdf86-vvjqk 1/1 Running 0 2m +``` + +### Update the size + +Change the `spec.size` field in the memcached CR from 3 to 4 and apply the +change: + +```sh +$ cat deploy/cr.yaml +apiVersion: "cache.example.com/v1alpha1" +kind: "Memcached" +metadata: + name: "example-memcached" +spec: + size: 4 + +$ kubectl apply -f deploy/cr.yaml +``` + +Confirm that the operator changes the deployment size: + +```sh +$ kubectl get deployment +NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE +example-memcached 4 4 4 4 5m +``` + +### Cleanup + +Clean up the resources: + +```sh +$ kubectl delete -f deploy/cr.yaml +$ kubectl delete -f deploy/operator.yaml +``` + +[layout_doc]:./project_layout.md +[dep_tool]:https://golang.github.io/dep/docs/installation.html +[git_tool]:https://git-scm.com/downloads +[go_tool]:https://golang.org/dl/ +[docker_tool]:https://docs.docker.com/install/ +[kubectl_tool]:https://kubernetes.io/docs/tasks/tools/install-kubectl/ +[minikube_tool]:https://github.com/kubernetes/minikube#installation +[ansible_tool]:https://docs.ansible.com/ansible/latest/index.html +[ansible_runner_tool]:https://ansible-runner.readthedocs.io/en/latest/install.html +[ansible_runner_http_plugin]:https://github.com/ansible/ansible-runner-http diff --git a/vendor/github.com/operator-framework/operator-sdk/doc/proposals/ansible-operator.md b/vendor/github.com/operator-framework/operator-sdk/doc/proposals/ansible-operator.md new file mode 100644 index 0000000000..f40bc6e180 --- /dev/null +++ b/vendor/github.com/operator-framework/operator-sdk/doc/proposals/ansible-operator.md @@ -0,0 +1,78 @@ +## Ansible Operator Proposal + +### Background + +Not everyone is a golang developer, and therefore gaining adoption for the operator-sdk is capped by the number of golang developers. Also, tooling for kubernetes in other languages is lacking support for things such as informers, caches, and listers. + +Operators purpose is to codify the operations of an application on kubernetes. [Ansible](https://www.ansible.com/) is already an industry standard tool for automation and is a good fit for the kind of work that kubernetes operators need to do. Adding the ability for users of the SDK to choose which between ansible and golang to follow will increase the number of potential users, and will grant existing users even more behavior. + +### Goals + +The goal of the Ansible Operator will be to create a fully functional framework for Ansible developers to create operators. It will also expose a library for golang users to use ansible in their operator if they so choose. These two goals in conjunction will allow users to select the best technology for their project or skillset. + +### New Operator Type + +This proposal creates a new type of operator called `ansible`. The new type is used to tell the tooling to act on that type of operator. + +### Package Structure +Packages will be added to the operator-sdk. These packages are designed to be usable by the end user if they choose to and should have a well documented public API. The proposed packages are: +* /operator-sdk/pkg/ansible/controller + * Will contain the ansible operator controller. + * Will contain a exposed reconciler. But the default `Add` method will use this reconciler. +* /operator-sdk/pkg/ansible/runner + * Contains the runner types and interfaces + * Implementation is behind an internal package (/operator-sdk/pkg/ansible/runner/internal) + * New Methods are exposed and are the main way a user interacts with the package + * Runner interface for running ansible from the operator. + * NewForWatchers - the method that returns a map of GVK to Runner types based on the watchers file. + * NewPlaybookRunner - the method that returns a new Runner for a playbook. + * NewRoleRunner - the method that returns a new Runner for a role. + * This contains the events API code and public methods. Implementation should probably be in the internal package. The events API is used for recieving events from ansible runner. + +* /operator-sdk/pkg/ansible/proxy + * This is a reverse proxy for the kubernetes API that is used for owner reference injection. +* /operator-sdk/pkg/ansible/proxy/kubeconfig + * Code needed to generate the kubeconfig for the proxy. +* /operator-sdk/pkg/ansible/events + * Package for event handlers from ansible runner events. + * Default has only the event logger. + + +### Commands +We are adding and updating existing commands to accommodate the ansible operator. Changes to the `cmd` package as well as changes to the generator are needed. + +`operator-sdk new --type ansible --kind --api-version ` This will be a new generation command under the hood. We will: +* Create a new ansible role in the roles directory +* Create a new watchers file. The role and GVK are defaulted based on input to the command. +* A CRD is generated. This CRD does not have any validations defined. +* A dockerfile is created using the watchers file and the ansible role with the base image being the ansible operator base image. + +The resulting structure should be +``` +|- Dockerfile +| +|- roles +\ | - +| \ | - generated ansible role +| +| - watchers.yaml +| +| - deploy +\ | - -CRD.yaml +| | - rbac.yaml +| | - operator.yaml +| | - cr.yaml +``` + +`operator-sdk generate crd ` This will be used to generate new CRDs based on ansible code. The command helps when a user wants to watch more than one CRD for their operator. +Args: +Required kind - the kind for the object. +Required api-version - the / for the CRD. +Flags: +Optional: --defaults-file - A path to the defaults file to use to generate a new CRD.yaml. If this is not defined, then an empty CRD is created. + +`operator-sdk up local` - This should use the known structure and the ansible operator code to run the operator from this location. This will need to be changed to determine if it is an ansible operator or a golang operator. The command works by running the operator-sdk binary, which includes the ansible operator code, as the operator process. This is slightly different than the current up local command. + +`operator-sdk build ` - This builds the operator image. This will need to be changed to determine if ansbile operator or golang operator. + + diff --git a/vendor/github.com/operator-framework/operator-sdk/doc/proposals/leader-for-life.md b/vendor/github.com/operator-framework/operator-sdk/doc/proposals/leader-for-life.md new file mode 100644 index 0000000000..72d250f45f --- /dev/null +++ b/vendor/github.com/operator-framework/operator-sdk/doc/proposals/leader-for-life.md @@ -0,0 +1,58 @@ +# Leader for Life + +## Background + +Operators need leader election to ensure that if the same operator is running +in two separate pods within the same namespace, only one of them will be +active. The primary goal of leader election is to avoid contention between +multiple active operators of the same type. + +High availability is not a goal of leader election for operators. + +Controller-runtime is adding leader election based on functionality present [in +client-go](git@github.com:operator-framework/operator-sdk.git). However that +implementation allows for the possibility of brief periods during which +multiple leaders are active. + +Requirements have been [discussed on +GitHub](https://github.com/operator-framework/operator-sdk/issues/136). + +This proposal is to add leader election to the SDK that follows a "leader for +life" model, which does not allow for multiple concurrent leaders. + +## Goals + +* Provide leader election that is easy to use +* Provide leader election that prohibits multiple leaders + +## Non-Goals + +* Make operators highly available + +## Solution + +The "leader for life" approach uses Kubernetes features to detect when a leader +has disappeared and then automatically remove its lock. + +The approach and a PoC is detailed in [a separate +repository](https://github.com/mhrivnak/leaderelection). This proposal is to move +that implementation into `operator-sdk` and finish/modify it as appropriate. + +### Usage + +```golang +func main() { + // create a lock named "myapp-lock", retrying every 5 seconds until it succeeds + err := leader.Become("myapp-lock", 5) + if err != nil { + log.Fatal(err.Error()) + } + ... + // do whatever else your app does +} +``` + +## Future + +Once accepted into operator-sdk, this would be valuable to contribute back to either +controller-runtime directly or client-go. diff --git a/vendor/github.com/operator-framework/operator-sdk/doc/release-versioning.md b/vendor/github.com/operator-framework/operator-sdk/doc/release-versioning.md new file mode 100644 index 0000000000..58bbb61eda --- /dev/null +++ b/vendor/github.com/operator-framework/operator-sdk/doc/release-versioning.md @@ -0,0 +1,124 @@ +# Versioning + +The following is a concise explanation of how Operator SDK versions are determined. The Operator SDK versioning follows [semantic versioning][link-semver] standards. + +## Milestones + +Operator SDK [milestones][link-github-milestones] represent changes to the SDK spanning multiple issues, such as a design change. Milestones help SDK developers determine how close we are to new releases, either major or minor; a milestone must be completed before a new version is released. Milestones and their involved issues are determined by maintainers. + +Milestone labels have the form: `milestone-x.y.0`, where `x` and `y` are major and minor SDK versions, respectively. This particular milestone demarcates the SDK `x.y.0` release; once issues within this milestone are addressed, the release process can begin. + +## Major versions + +Major version changes can break compatibility between the previous major versions; they are not necessarily backwards or forwards compatible. SDK change targets include but are not limited to: +- `operator-sdk` command and sub-commands +- Golang API +- Formats of various yaml manifest files + +## Minor versions + +Minor version changes will not break compatibility between the previous minor versions; to do so is a bug. SDK changes will involve addition of optional features, non-breaking enhancements, and *minor* bug fixes identified from previous versions. + +### Creating a minor version branch + +We expect to release patches for minor releases, so we create a patch trunk to branch from. The naming convention follows "v2.1.x", where the major version is 2, minor is 1, and "x" is a patch version placeholder. + +```bash +$ MAV_MIN_VER="v${MAJOR_VERSION}.${NEW_MINOR_VERSION}" +$ git checkout -b "${MAJ_MIN_VER}.x" tags/"v${MAJ_MIN_VER}.0" +$ git push git@github.com:operator-framework/operator-sdk.git "v${MAJ_MIN_VER}.x" +``` + +## Patch versions + +Patch versions changes are meant only for bug fixes, and will not break compatibility of the current minor version. A patch release will contain a collection of minor bug fixes, or individual major and security bug fixes, depending on severity. + +### Creating a patch version branch + +As more than one patch may be created per minor release, patch branch names of the form "${MAJOR_VERSION}.${MINOR_VERSION}.${PATCH_VERSION}" will be created after a bug fix has been pushed, and the bug fix branch merged into the patch branch only after testing. + +```bash +$ git checkout "v${MAJOR_VERSION}.${MINOR_VERSION}.x" +$ git checkout -b "cherry-picked-change" +$ git cherry-pick "$GIT_COMMIT_HASH" +$ git push origin "cherry-picked-change" +``` + +# Releases + +Making an Operator SDK release involves: +- Tagging and signing a git commit and pushing the tag to GitHub. +- Building a release binary and uploading the binary to GitHub. + +Releases can only be performed by [maintainers][doc-maintainers]. + +## Dependency and platform support + +### Kubernetes versions + +As the Operator SDK interacts directly with the Kubernetes API, certain API features are assumed to exist in the target cluster. The currently supported Kubernetes version will always be listed in the SDK [prerequisites section][doc-kube-version]. + +### Operating systems and architectures + +Release binaries will be built for the `x86_64` architecture for both GNU Linux and MacOS Darwin platforms. + +Support for the Windows platform or any architecture other than `x86_64` is not on the roadmap at this time. + +## Binaries + +Creating release binaries: +```bash +$ ./release.sh "v${VERSION}" +``` + +## Release tags + +Every release will have a corresponding git tag. + +Make sure you've [uploaded your GPG key][link-github-gpg-key-upload] and configured git to [use that signing key][link-git-config-gpg-key] either globally or for the Operator SDK repository. Note: the email the key is issued for must be the email you use for git. + +```bash +$ git config [--global] user.signingkey "$GPG_KEY_ID" +$ git config [--global] user.email "$GPG_EMAIL" +``` + +Tagging will be handled by `release.sh`. + +## Release Notes + +Release notes should be a thorough description of changes made to code, documentation, and design. Individual changes, such as bug fixes, should be given their own bullet point with a short description of what was changed. Issue links and handle of the developer who worked on the change should be included whenever possible. + +The following is the format for major and minor releases: + +```Markdown +[Short description of release (ex. reason, theme)] + +### Features +- [Short description of feature] (#issue1, #issue2, ..., @maintainer_handle) +... + +### Bug fixes +- [Short description of fix] (#issue1, #issue2, ..., @maintainer_handle) +... + +### Miscellaneous +- [Short description of change] (#issue1, #issue2, ..., @maintainer_handle) +... +``` + +Patch releases should have the following format: + +```Markdown +[Medium-length description of release (if not complex, short is fine); explanation required] + +### Bug fixes +- [Short description of fix] (#issue1, #issue2, ..., @maintainer_handle) +... +``` + +[link-semver]:https://semver.org/ +[link-github-milestones]: https://help.github.com/articles/about-milestones/ +[doc-maintainers]:../MAINTAINERS +[link-github-gpg-key-upload]:https://github.com/settings/keys +[link-git-config-gpg-key]:https://git-scm.com/book/en/v2/Git-Tools-Signing-Your-Work +[doc-kube-version]:https://github.com/operator-framework/operator-sdk#prerequisites \ No newline at end of file diff --git a/vendor/github.com/operator-framework/operator-sdk/doc/sdk-cli-reference.md b/vendor/github.com/operator-framework/operator-sdk/doc/sdk-cli-reference.md index 56c34ddd1c..c46e4c10db 100644 --- a/vendor/github.com/operator-framework/operator-sdk/doc/sdk-cli-reference.md +++ b/vendor/github.com/operator-framework/operator-sdk/doc/sdk-cli-reference.md @@ -9,16 +9,21 @@ Usage: ### Args -* image - is the container image to be built, e.g. "quay.io/example/operator:v0.0.1". This image will be automatically set in the deployment manifests. +* image - is the container image to be built, e.g. "quay.io/example/operator:v0.0.1". ### Flags - +* `--enable-tests` bool - enable in-cluster testing by adding test binary to the image +* `--namespaced-manifest` string - path of namespaced resources manifest for tests (default "deploy/operator.yaml") +* `--test-location` string - location of tests (default "./test/e2e") * `-h, --help` - help for build + ### Use -The operator-sdk build command compiles the code, builds the executables, -and generates Kubernetes manifests. After build completes, the image would be built locally in docker. Then it needs to be pushed to remote registry. +The operator-sdk build command compiles the code and builds the executables. After build completes, the image is built locally in docker. Then it needs to be pushed to a remote registry. + +If `--enable-tests` is set, the build command will also build the testing binary, add it to the docker image, and generate +a `deploy/test-pod.yaml` file that allows a user to run the tests as a pod on a cluster. ### Example: @@ -108,6 +113,29 @@ Run code-generation for custom resources Generating deepcopy funcs ``` +#### crd - Generates a custom resource definition (CRD) and the custom resource (CR) files + +##### Use + +crd generator generates custom resource definition and custom resource +files for the specified api-version and kind. + +##### Flags + +* `--api-version` **(required)** string - Kubernetes apiVersion and has a format of $GROUP_NAME/$VERSION (e.g app.example.com/v1alpha1) +* `-h, --help` - help for k8s +* `--kind` **(required)** string - Kubernetes CustomResourceDefinition kind. (e.g AppService) + +##### Example + +```bash +operator-sdk generate crd --api-version app.example.com/v1alpha1 --kind AppService + +# Output: +Generating custom resource definition (CRD) file +Create /deploy/appservice_cr.yaml +Create /deploy/appservice_crd.yaml +``` #### olm-catalog - Generates OLM Catalog manifests ##### Flags @@ -142,6 +170,8 @@ generates a default directory layout based on the input `project-name`. * `--api-version` **(required)** string - Kubernetes apiVersion and has a format of `$GROUP_NAME/$VERSION` (e.g app.example.com/v1alpha1) * `--kind` **(required)** string - Kubernetes CustomResourceDefintion kind. (e.g AppService) +* `--skip-git-init` Do not init the directory as a git repository +* `--type` Type of operator to initialize (e.g "ansible") (default "go") * `-h, --help` - help for new ### Example @@ -158,30 +188,62 @@ Create app-operator/.gitignore ## test -### Flags +### Available Commands -* `-t, --test-location` **(required)** string - location of e2e test files -* `-k, --kubeconfig` string - location of kubeconfig for kubernetes cluster -* `-g, --global-init` string - location of global resource manifest yaml file -* `-n, --namespaced-init` string - location of namespaced resource manifest yaml file -* `-f, --go-test-flags` string - extra arguments to pass to `go test` (e.g. -f "-v -parallel=2") -* `-h, --help` - help for test +#### local +Runs the tests locally -### Use +##### Args +* string - location of e2e test files (e.g. "./test/e2e/") -The operator-sdk test command runs go tests built using the Operator SDK's test framework. +##### Flags +* `--kubeconfig` string - location of kubeconfig for kubernetes cluster (default "~/.kube/config") +* `--global-manifest` string - path to manifest for global resources (default "deploy/crd.yaml) +* `--namespaced-manifest` string - path to manifest for per-test, namespaced resources (default: combines deploy/sa.yaml, deploy/rbac.yaml, and deploy/operator.yaml) +* `--namespace` string - if non-empty, single namespace to run tests in (e.g. "operator-test") (default: "") +* `--go-test-flags` string - extra arguments to pass to `go test` (e.g. -f "-v -parallel=2") +* `-h, --help` - help for local -### Example: +##### Use -#### Test +The operator-sdk test command runs go tests built using the Operator SDK's test framework. + +##### Example: ```bash -operator-sdk test --test-location ./test/e2e/ +$ operator-sdk test local ./test/e2e/ # Output: ok github.com/operator-framework/operator-sdk-samples/memcached-operator/test/e2e 20.410s ``` +#### cluster +Runs the e2e tests packaged in an operator image as a pod in the cluster + +##### Args +* string - the operator image that is used to run the tests in a pod (e.g. "quay.io/example/memcached-operator:v0.0.1") + +##### Flags +* `--kubeconfig` string - location of kubeconfig for kubernetes cluster (default "~/.kube/config") +* `--image-pull-policy` string - set test pod image pull policy. Allowed values: Always, Never (default "Always") +* `--namespace` string - namespace to run tests in (default "default") +* `--pending-timeout` int - timeout in seconds for testing pod to stay in pending state (default 60s) +* `--service-account` string - service account to run tests on (default "default") +* `--help` - help for cluster + +##### Use + +The operator-sdk test command runs go tests embedded in an operator image built using the Operator SDK. + +##### Example: + +```bash +$ operator-sdk test cluster quay.io/example/memcached-operator:v0.0.1 + +# Output: +Test Successfully Completed +``` + ## up ### Available Commands diff --git a/vendor/github.com/operator-framework/operator-sdk/doc/test-framework/writing-e2e-tests.md b/vendor/github.com/operator-framework/operator-sdk/doc/test-framework/writing-e2e-tests.md index d523f73057..187cdf197a 100644 --- a/vendor/github.com/operator-framework/operator-sdk/doc/test-framework/writing-e2e-tests.md +++ b/vendor/github.com/operator-framework/operator-sdk/doc/test-framework/writing-e2e-tests.md @@ -21,7 +21,7 @@ It is initialized by MainEntry and can be used anywhere in the tests. ### TestCtx [TestCtx][testctx-link] is a local context that stores important information for each test, such -as the namespace for that test and the finalizer (cleanup) functions. By handling +as the namespace for that test and the cleanup functions. By handling namespace and resource initialization through TestCtx, we can make sure that all resources are properly handled and removed after the test finishes. @@ -101,19 +101,27 @@ The next step is to create a TestCtx for the current test and defer its cleanup ```go ctx := framework.NewTestCtx(t) -defer ctx.Cleanup(t) +defer ctx.Cleanup() ``` -Now that there is a TestCtx, the test's kubernetes resources (specifically the test namespace, -RBAC, and Operator deployment) can be initialized: +Now that there is a `TestCtx`, the test's kubernetes resources (specifically the test namespace, +Service Account, RBAC, and Operator deployment in `local` testing; just the Operator deployment +in `cluster` testing) can be initialized: ```go -err := ctx.InitializeClusterResources() +err := ctx.InitializeClusterResources(&framework.CleanupOptions{TestContext: ctx, Timeout: cleanupTimeout, RetryInterval: cleanupRetryInterval}) if err != nil { t.Fatalf("failed to initialize cluster resources: %v", err) } ``` +The `InitializeClusterResources` function uses the custom `Create` function in the framework client to create the resources provided +in your namespaced manifest. The custom `Create` function use the controller-runtime's client to create resources and then +creates a cleanup function that is called by `ctx.Cleanup` which deletes the resource and then waits for the resource to be +fully deleted before returning. This is configurable with `CleanupOptions`. For info on how to use `CleanupOptions` see +[this section](#how-to-use-cleanup). + + If you want to make sure the operator's deployment is fully ready before moving onto the next part of the test, the `WaitForDeployment` function from [e2eutil][e2eutil-link] (in the sdk under `pkg/test/e2eutil`) can be used: @@ -134,8 +142,28 @@ if err != nil { #### 4. Write the test specific code -Now that the operator is ready, we can create a custom resource. Since the controller-runtime's dynamic client uses -go contexts, make sure to import the go context library. In this example, we imported it as `goctx`: +Since the controller-runtime's dynamic client uses go contexts, make sure to import the go context library. +In this example, we imported it as `goctx`: + +##### How to use the Framework Client `Create`'s `CleanupOptions` + +The test framework provides `Client`, which exposes most of the controller-runtime's client unmodified, but the `Create` +function has added functionality to create cleanup functions for these resources as well. To manage how cleanup +is handled, we use a `CleanupOptions` struct. Here are some examples of how to use it: + +```go +// Create with no cleanup +Create(goctx.TODO(), exampleMemcached, &framework.CleanupOptions{}) +Create(goctx.TODO(), exampleMemcached, nil) + +// Create with cleanup but no polling for resources to be deleted +Create(goctx.TODO(), exampleMemcached, &framework.CleanupOptions{TestContext: ctx}) + +// Create with cleanup and polling wait for resources to be deleted +Create(goctx.TODO(), exampleMemcached, &framework.CleanupOptions{TestContext: ctx, Timeout: timeout, RetryInterval: retryInterval}) +``` + +This is how we can create a custom memcached custom resource with a size of 3: ```go // create memcached custom resource @@ -152,7 +180,7 @@ exampleMemcached := &cachev1alpha1.Memcached{ Size: 3, }, } -err = f.DynamicClient.Create(goctx.TODO(), exampleMemcached) +err = f.Client.Create(goctx.TODO(), exampleMemcached, &framework.CleanupOptions{TestContext: ctx, Timeout: time.Second * 5, RetryInterval: time.Second * 1}) if err != nil { return err } @@ -172,12 +200,12 @@ if err != nil { We can also test that the deployment scales correctly when the CR is updated: ```go -err = f.DynamicClient.Get(goctx.TODO(), types.NamespacedName{Name: "example-memcached", Namespace: namespace}, exampleMemcached) +err = f.Client.Get(goctx.TODO(), types.NamespacedName{Name: "example-memcached", Namespace: namespace}, exampleMemcached) if err != nil { return err } exampleMemcached.Spec.Size = 4 -err = f.DynamicClient.Update(goctx.TODO(), exampleMemcached) +err = f.Client.Update(goctx.TODO(), exampleMemcached) if err != nil { return err } @@ -194,31 +222,81 @@ functions will automatically be run since they were deferred when the TestCtx wa ## Running the Tests -To make running the tests simpler, the `operator-sdk` CLI tool has a `test` subcommand that configures some -default test settings, such as locations of the manifest files for your global resource manifest file (by default `deploy/crd.yaml`) and your namespaced manifest file (by defualt `deploy/rbac.yaml` concatenated with `deploy/operator.yaml`), and allows the user to configure these runtime options. To use it, run the -`operator-sdk test` command in your project root and pass the location of the tests using the -`--test-location` flag. You can use `--help` to view the other configuration options and use -`--go-test-flags` to pass in arguments to `go test`. Here is an example command: +To make running the tests simpler, the `operator-sdk` CLI tool has a `test` subcommand that can configure +default test settings, such as locations of your global resource manifest file (by default +`deploy/crd.yaml`) and your namespaced resource manifest file (by default `deploy/sa.yaml` concatenated with +`deploy/rbac.yaml` and `deploy/operator.yaml`), and allows the user to configure runtime options. There are 2 ways to use the +subcommand: local and cluster. +### Local +To run the tests locally, run the `operator-sdk test local` command in your project root and pass the location of the tests +as an argument. You can use `--help` to view the other configuration options and use `--go-test-flags` to pass in arguments to `go test`. Here is an example command: + +```shell +$ operator-sdk test local ./test/e2e --go-test-flags "-v -parallel=2" +``` + +If you wish to run all the tests in 1 namespace (which also forces `-parallel=1`), you can use the `--namespace` flag: ```shell -$ operator-sdk test --test-location ./test/e2e --go-test-flags "-v -parallel=2" +$ kubectl create namespace operator-test +$ operator-sdk test local ./test/e2e --namespace operator-test ``` -For more documentation on the `operator-sdk test` command, see the [SDK CLI Reference][sdk-cli-ref] doc. +For more documentation on the `operator-sdk test local` command, see the [SDK CLI Reference][sdk-cli-ref] doc. For advanced use cases, it is possible to run the tests via `go test` directly. As long as all flags defined in [MainEntry][main-entry-link] are declared, the tests will run correctly. Running the tests directly with missing flags -will result in undefined behavior. This is an example `go test` equivalent to the `operator-sdk test` example above: +will result in undefined behavior. This is an example `go test` equivalent to the `operator-sdk test local` example above: ```shell -# Combine rbac and operator manifest into namespaced manifest -$ cp deploy/rbac.yaml deploy/namespace-init.yaml +# Combine sa, rbac, operator manifest into namespaced manifest +$ cp deploy/sa.yaml deploy/namespace-init.yaml +$ echo -e "\n---\n" >> deploy/namespace-init.yaml +$ cat deploy/rbac.yaml >> deploy/namespace-init.yaml $ echo -e "\n---\n" >> deploy/namespace-init.yaml $ cat deploy/operator.yaml >> deploy/namespace-init.yaml # Run tests $ go test ./test/e2e/... -root=$(pwd) -kubeconfig=$HOME/.kube/config -globalMan deploy/crd.yaml -namespacedMan deploy/namespace-init.yaml -v -parallel=2 ``` +### Cluster + +Another way to run the tests is from within a kubernetes cluster. To do this, you first need to build an image with +the testing binary embedded by using the `operator-sdk build` command and using the `--enable-tests` flag to enable tests: + +```shell +$ operator-sdk build quay.io/example/memcached-operator:v0.0.1 --enable-tests +``` + +Note that the namespaced yaml must be up to date before running this command. The `build` subcommand will warn you +if it finds a deployment in the namespaced manifest with an image that doesn't match the argument you provided. The +`operator-sdk build` command has other flags for configuring the tests that can be viewed with the `--help` flag +or at the [SDK CLI Reference][sdk-cli-ref]. + +Once the image is ready, the tests are ready to be run. To run the tests, make sure you have all global resources +and a namespace with proper rbac configured: + +```shell +$ kubectl create -f deploy/crd.yaml +$ kubectl create namespace memcached-test +$ kubectl create -f deploy/sa.yaml -n memcached-test +$ kubectl create -f deploy/rbac.yaml -n memcached-test +``` + +Once you have your environment properly configured, you can start the tests using the `operator-sdk test cluster` command: + +```shell +$ operator-sdk test cluster quay.io/example/memcached-operator:v0.0.1 --namespace memcached-test + +Example Output: +Test Successfully Completed +``` + +The `test cluster` command will deploy a test pod in the given namespace that will run the e2e tests packaged in the image. +The tests run sequentially in the namespace (`-parallel=1`), the same as running `operator-sdk test local --namespace `. +The command will wait until the tests succeed (pod phase=`Succeeded`) or fail (pod phase=`Failed`). +If the tests fail, the command will output the test pod logs which should be the standard go test error logs. + ## Manual Cleanup While the test framework provides utilities that allow the test to automatically be cleaned up when done, diff --git a/vendor/github.com/operator-framework/operator-sdk/doc/user-guide.md b/vendor/github.com/operator-framework/operator-sdk/doc/user-guide.md index 48dd93d9d1..0d6000616f 100644 --- a/vendor/github.com/operator-framework/operator-sdk/doc/user-guide.md +++ b/vendor/github.com/operator-framework/operator-sdk/doc/user-guide.md @@ -2,6 +2,10 @@ This guide walks through an example of building a simple memcached-operator using tools and libraries provided by the Operator SDK. +To learn how to use Ansible to create a Memcached operator, see [Ansible +Operator User Guide][ansible_user_guide]. The rest of this document will show +how to program an operator in Go. + ## Prerequisites - [dep][dep_tool] version v0.5.0+. @@ -59,15 +63,26 @@ By default, the memcached-operator watches `Memcached` resource events as shown ```Go func main() { - sdk.Watch("cache.example.com/v1alpha1", "Memcached", "default", 5) + sdk.Watch("cache.example.com/v1alpha1", "Memcached", "default", time.Duration(5)*time.Second) sdk.Handle(stub.NewHandler()) sdk.Run(context.TODO()) } ``` -**Note:** The number of concurrent informer workers can be configured with an additional Watch option. The default value is 1 if an argument is not given. +#### Options +**Worker Count** +The number of concurrent informer workers can be configured with an additional Watch option. The default value is 1 if an argument is not given. +```Go +sdk.Watch("cache.example.com/v1alpha1", "Memcached", "default", time.Duration(5)*time.Second, sdk.WithNumWorkers(n)) +``` + +**Label Selector** +Label selectors allow the watch to filter resources by kubernetes labels. It can be specified using the standard kubernetes label selector format: + +https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors + ```Go -sdk.Watch("cache.example.com/v1alpha1", "Memcached", "default", 5, sdk.WithNumWorkers(n)) +sdk.Watch("cache.example.com/v1alpha1", "Memcached", "default", time.Duration(5)*time.Second, sdk.WithLabelSelector("app=myapp")) ``` ### Define the Memcached spec and status @@ -120,6 +135,7 @@ Run as pod inside a Kubernetes cluster is preferred for production use. Build the memcached-operator image and push it to a registry: ``` $ operator-sdk build quay.io/example/memcached-operator:v0.0.1 +$ sed -i 's|REPLACE_IMAGE|quay.io/example/memcached-operator:v0.0.1|g' deploy/operator.yaml $ docker push quay.io/example/memcached-operator:v0.0.1 ``` @@ -128,6 +144,7 @@ Kubernetes deployment manifests are generated in `deploy/operator.yaml`. The dep Deploy the memcached-operator: ```sh +$ kubectl create -f deploy/sa.yaml $ kubectl create -f deploy/rbac.yaml $ kubectl create -f deploy/operator.yaml ``` @@ -144,6 +161,12 @@ memcached-operator 1 1 1 1 1m This method is preferred during development cycle to deploy and test faster. +Set the name of the operator in an environment variable: + +```sh +export OPERATOR_NAME=memcached-operator +``` + Run the operator locally with the default kubernetes config file present at `$HOME/.kube/config`: ```sh @@ -253,11 +276,55 @@ $ kubectl delete -f deploy/cr.yaml $ kubectl delete -f deploy/operator.yaml ``` + +## Advanced Topics +### Adding 3rd Party Resources To Your Operator +To add a resource to an operator, you must add it to a scheme. By creating an `AddToScheme` method or reusing one you can easily add a resource to your scheme. An [example][deployments_register] shows that you define a function and then use the [runtime][runtime_package] package to create a `SchemeBuilder` + +#### Current Operator-SDK +You then need to tell the operators to use these functions to add the resources to its scheme. In operator-sdk you use [AddToSDKScheme][osdk_add_to_scheme] to add this. +Example of you main.go: +```go +import ( + .... + appsv1 "k8s.io/api/apps/v1" +) + +func main() { + k8sutil.AddToSDKScheme(appsv1.AddToScheme)` + sdk.Watch(appsv1.SchemeGroupVersion.String(), "Deployments", , ) +} +``` + +#### Future with Controller Runtime +When using controller runtime, you will also need to tell its scheme about your resourece. In controller runtime to add to the scheme, you can get the managers [scheme][manager_scheme]. If you would like to see what kubebuilder generates to add the resoureces to the [scheme][simple_resource]. +Example: +```go +import ( + .... + appsv1 "k8s.io/api/apps/v1" +) + +func main() { + .... + if err := appsv1.AddToScheme(mgr.GetScheme()); err != nil { + log.Fatal(err) + } + .... +} +``` + [memcached_handler]: ../example/memcached-operator/handler.go.tmpl [layout_doc]:./project_layout.md +[ansible_user_guide]:./ansible/user-guide.md [dep_tool]:https://golang.github.io/dep/docs/installation.html [git_tool]:https://git-scm.com/downloads [go_tool]:https://golang.org/dl/ [docker_tool]:https://docs.docker.com/install/ [kubectl_tool]:https://kubernetes.io/docs/tasks/tools/install-kubectl/ [minikube_tool]:https://github.com/kubernetes/minikube#installation +[manager_scheme]: https://github.com/kubernetes-sigs/controller-runtime/blob/master/pkg/manager/manager.go#L61 +[simple_resource]: https://book.kubebuilder.io/basics/simple_resource.html +[deployments_register]: https://github.com/kubernetes/api/blob/master/apps/v1/register.go#L41 +[runtime_package]: https://godoc.org/k8s.io/apimachinery/pkg/runtime +[osdk_add_to_scheme]: https://github.com/operator-framework/operator-sdk/blob/4179b6ac459b2b0cb04ab3a1b438c280bd28d1a5/pkg/util/k8sutil/k8sutil.go#L67 diff --git a/vendor/github.com/operator-framework/operator-sdk/example/memcached-operator/handler.go.tmpl b/vendor/github.com/operator-framework/operator-sdk/example/memcached-operator/handler.go.tmpl index 2a689858e0..0468f0b3a7 100644 --- a/vendor/github.com/operator-framework/operator-sdk/example/memcached-operator/handler.go.tmpl +++ b/vendor/github.com/operator-framework/operator-sdk/example/memcached-operator/handler.go.tmpl @@ -1,13 +1,14 @@ package stub import ( + "context" "fmt" "reflect" - "context" v1alpha1 "github.com/example-inc/memcached-operator/pkg/apis/cache/v1alpha1" "github.com/operator-framework/operator-sdk/pkg/sdk" + "github.com/prometheus/client_golang/prometheus" appsv1 "k8s.io/api/apps/v1" "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" @@ -15,11 +16,19 @@ import ( "k8s.io/apimachinery/pkg/labels" ) -func NewHandler() sdk.Handler { - return &Handler{} +func NewHandler(m *Metrics) sdk.Handler { + return &Handler{ + metrics: m, + } +} + +type Metrics struct { + operatorErrors prometheus.Counter } type Handler struct { + // Metrics example + metrics *Metrics } func (h *Handler) Handle(ctx context.Context, event sdk.Event) error { @@ -156,3 +165,15 @@ func getPodNames(pods []v1.Pod) []string { } return podNames } + +func RegisterOperatorMetrics() (*Metrics, error) { + operatorErrors := prometheus.NewCounter(prometheus.CounterOpts{ + Name: "memcached_operator_reconcile_errors_total", + Help: "Number of errors that occurred while reconciling the memcached deployment", + }) + err := prometheus.Register(operatorErrors) + if err != nil { + return nil, err + } + return &Metrics{operatorErrors: operatorErrors}, nil +} diff --git a/vendor/github.com/operator-framework/operator-sdk/hack/ci/setup-minikube.sh b/vendor/github.com/operator-framework/operator-sdk/hack/ci/setup-minikube.sh new file mode 100755 index 0000000000..ec2ff1d8ab --- /dev/null +++ b/vendor/github.com/operator-framework/operator-sdk/hack/ci/setup-minikube.sh @@ -0,0 +1,11 @@ +# Download kubectl, which is a requirement for using minikube. +curl -Lo kubectl https://storage.googleapis.com/kubernetes-release/release/v1.11.3/bin/linux/amd64/kubectl && chmod +x kubectl && sudo mv kubectl /usr/local/bin/ +# Download minikube. +# We need to pin to an old version due to minikube requiring systemd starting with v0.26.0 and travis not providing it +# - https://github.com/kubernetes/minikube/issues/2704 +curl -Lo minikube https://storage.googleapis.com/minikube/releases/v0.25.2/minikube-linux-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/ +sudo minikube start --vm-driver=none --kubernetes-version=v1.10.0 +# Fix the kubectl context, as it's often stale. +minikube update-context +# Wait for Kubernetes to be up and ready. +JSONPATH='{range .items[*]}{@.metadata.name}:{range @.status.conditions[*]}{@.type}={@.status};{end}{end}'; until kubectl get nodes -o jsonpath="$JSONPATH" 2>&1 | grep -q "Ready=True"; do sleep 1; done diff --git a/vendor/github.com/operator-framework/operator-sdk/hack/ci/setup-openshift.sh b/vendor/github.com/operator-framework/operator-sdk/hack/ci/setup-openshift.sh new file mode 100755 index 0000000000..8e5ffe82d2 --- /dev/null +++ b/vendor/github.com/operator-framework/operator-sdk/hack/ci/setup-openshift.sh @@ -0,0 +1,15 @@ +# Configure insecure docker registry for openshift +sudo service docker stop +sudo sed -i 's/DOCKER_OPTS=\"/DOCKER_OPTS=\"--insecure-registry 172.30.0.0\/16 /' /etc/default/docker +sudo service docker start +# Download oc to spin up openshift on local docker instance +curl -Lo oc.tar.gz https://github.com/openshift/origin/releases/download/v3.10.0/openshift-origin-client-tools-v3.10.0-dd10d17-linux-64bit.tar.gz +# Put oc binary in path +tar xvzOf oc.tar.gz openshift-origin-client-tools-v3.10.0-dd10d17-linux-64bit/oc > oc && chmod +x oc && sudo mv oc /usr/local/bin/ +# Start oc cluster +oc cluster up +# Become cluster admin +oc login -u system:admin + +# kubectl is needed for the single namespace local test and the ansible tests +curl -Lo kubectl https://storage.googleapis.com/kubernetes-release/release/v1.11.3/bin/linux/amd64/kubectl && chmod +x kubectl && sudo mv kubectl /usr/local/bin/ diff --git a/vendor/github.com/operator-framework/operator-sdk/pkg/ansible/controller/controller.go b/vendor/github.com/operator-framework/operator-sdk/pkg/ansible/controller/controller.go new file mode 100644 index 0000000000..7116216ab4 --- /dev/null +++ b/vendor/github.com/operator-framework/operator-sdk/pkg/ansible/controller/controller.go @@ -0,0 +1,83 @@ +// Copyright 2018 The Operator-SDK 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 controller + +import ( + "fmt" + "log" + "strings" + "time" + + "github.com/operator-framework/operator-sdk/pkg/ansible/events" + "github.com/operator-framework/operator-sdk/pkg/ansible/runner" + + "github.com/sirupsen/logrus" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime/schema" + "sigs.k8s.io/controller-runtime/pkg/controller" + crthandler "sigs.k8s.io/controller-runtime/pkg/handler" + "sigs.k8s.io/controller-runtime/pkg/manager" + "sigs.k8s.io/controller-runtime/pkg/source" +) + +// Options - options for your controller +type Options struct { + EventHandlers []events.EventHandler + LoggingLevel events.LogLevel + Runner runner.Runner + GVK schema.GroupVersionKind + ReconcilePeriod time.Duration +} + +// Add - Creates a new ansible operator controller and adds it to the manager +func Add(mgr manager.Manager, options Options) { + logrus.Infof("Watching %s/%v, %s", options.GVK.Group, options.GVK.Version, options.GVK.Kind) + if options.EventHandlers == nil { + options.EventHandlers = []events.EventHandler{} + } + eventHandlers := append(options.EventHandlers, events.NewLoggingEventHandler(options.LoggingLevel)) + if options.ReconcilePeriod == time.Duration(0) { + options.ReconcilePeriod = time.Minute + } + + aor := &AnsibleOperatorReconciler{ + Client: mgr.GetClient(), + GVK: options.GVK, + Runner: options.Runner, + EventHandlers: eventHandlers, + ReconcilePeriod: options.ReconcilePeriod, + } + + // Register the GVK with the schema + mgr.GetScheme().AddKnownTypeWithName(options.GVK, &unstructured.Unstructured{}) + metav1.AddToGroupVersion(mgr.GetScheme(), schema.GroupVersion{ + Group: options.GVK.Group, + Version: options.GVK.Version, + }) + + //Create new controller runtime controller and set the controller to watch GVK. + c, err := controller.New(fmt.Sprintf("%v-controller", strings.ToLower(options.GVK.Kind)), mgr, controller.Options{ + Reconciler: aor, + }) + if err != nil { + log.Fatal(err) + } + u := &unstructured.Unstructured{} + u.SetGroupVersionKind(options.GVK) + if err := c.Watch(&source.Kind{Type: u}, &crthandler.EnqueueRequestForObject{}); err != nil { + log.Fatal(err) + } +} diff --git a/vendor/github.com/operator-framework/operator-sdk/pkg/ansible/controller/reconcile.go b/vendor/github.com/operator-framework/operator-sdk/pkg/ansible/controller/reconcile.go new file mode 100644 index 0000000000..3cbd969221 --- /dev/null +++ b/vendor/github.com/operator-framework/operator-sdk/pkg/ansible/controller/reconcile.go @@ -0,0 +1,222 @@ +// Copyright 2018 The Operator-SDK 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 controller + +import ( + "context" + "encoding/json" + "errors" + "os" + "time" + + "github.com/operator-framework/operator-sdk/pkg/ansible/events" + "github.com/operator-framework/operator-sdk/pkg/ansible/proxy/kubeconfig" + "github.com/operator-framework/operator-sdk/pkg/ansible/runner" + "github.com/operator-framework/operator-sdk/pkg/ansible/runner/eventapi" + + "github.com/sirupsen/logrus" + apierrors "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime/schema" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/reconcile" +) + +const ( + // ReconcilePeriodAnnotation - annotation used by a user to specify the reconcilation interval for the CR. + // To use create a CR with an annotation "ansible.operator-sdk/reconcile-period: 30s" or some other valid + // Duration. This will override the operators/or controllers reconcile period for that particular CR. + ReconcilePeriodAnnotation = "ansible.operator-sdk/reconcile-period" +) + +// AnsibleOperatorReconciler - object to reconcile runner requests +type AnsibleOperatorReconciler struct { + GVK schema.GroupVersionKind + Runner runner.Runner + Client client.Client + EventHandlers []events.EventHandler + ReconcilePeriod time.Duration +} + +// Reconcile - handle the event. +func (r *AnsibleOperatorReconciler) Reconcile(request reconcile.Request) (reconcile.Result, error) { + u := &unstructured.Unstructured{} + u.SetGroupVersionKind(r.GVK) + err := r.Client.Get(context.TODO(), request.NamespacedName, u) + if apierrors.IsNotFound(err) { + return reconcile.Result{}, nil + } + if err != nil { + return reconcile.Result{}, err + } + reconcileResult := reconcile.Result{RequeueAfter: r.ReconcilePeriod} + if ds, ok := u.GetAnnotations()[ReconcilePeriodAnnotation]; ok { + duration, err := time.ParseDuration(ds) + if err != nil { + return reconcileResult, err + } + reconcileResult.RequeueAfter = duration + } + + deleted := u.GetDeletionTimestamp() != nil + finalizer, finalizerExists := r.Runner.GetFinalizer() + pendingFinalizers := u.GetFinalizers() + // If the resource is being deleted we don't want to add the finalizer again + if finalizerExists && !deleted && !contains(pendingFinalizers, finalizer) { + logrus.Debugf("Adding finalizer %s to resource", finalizer) + finalizers := append(pendingFinalizers, finalizer) + u.SetFinalizers(finalizers) + err := r.Client.Update(context.TODO(), u) + return reconcileResult, err + } + if !contains(pendingFinalizers, finalizer) && deleted { + logrus.Info("Resource is terminated, skipping reconcilation") + return reconcileResult, nil + } + + spec := u.Object["spec"] + _, ok := spec.(map[string]interface{}) + if !ok { + logrus.Debugf("spec was not found") + u.Object["spec"] = map[string]interface{}{} + err = r.Client.Update(context.TODO(), u) + if err != nil { + return reconcileResult, err + } + reconcileResult.Requeue = true + return reconcileResult, nil + } + status := u.Object["status"] + _, ok = status.(map[string]interface{}) + if !ok { + logrus.Debugf("status was not found") + u.Object["status"] = map[string]interface{}{} + err = r.Client.Update(context.TODO(), u) + if err != nil { + return reconcileResult, err + } + reconcileResult.Requeue = true + return reconcileResult, nil + } + + // If status is an empty map we can assume CR was just created + if len(u.Object["status"].(map[string]interface{})) == 0 { + logrus.Debugf("Setting phase status to %v", StatusPhaseCreating) + u.Object["status"] = ResourceStatus{ + Phase: StatusPhaseCreating, + } + err = r.Client.Update(context.TODO(), u) + if err != nil { + return reconcileResult, err + } + reconcileResult.Requeue = true + return reconcileResult, nil + } + + ownerRef := metav1.OwnerReference{ + APIVersion: u.GetAPIVersion(), + Kind: u.GetKind(), + Name: u.GetName(), + UID: u.GetUID(), + } + + kc, err := kubeconfig.Create(ownerRef, "http://localhost:8888", u.GetNamespace()) + if err != nil { + return reconcileResult, err + } + defer os.Remove(kc.Name()) + eventChan, err := r.Runner.Run(u, kc.Name()) + if err != nil { + return reconcileResult, err + } + + // iterate events from ansible, looking for the final one + statusEvent := eventapi.StatusJobEvent{} + for event := range eventChan { + for _, eHandler := range r.EventHandlers { + go eHandler.Handle(u, event) + } + if event.Event == "playbook_on_stats" { + // convert to StatusJobEvent; would love a better way to do this + data, err := json.Marshal(event) + if err != nil { + return reconcile.Result{}, err + } + err = json.Unmarshal(data, &statusEvent) + if err != nil { + return reconcile.Result{}, err + } + } + } + if statusEvent.Event == "" { + err := errors.New("did not receive playbook_on_stats event") + logrus.Error(err.Error()) + return reconcileResult, err + } + + // We only want to update the CustomResource once, so we'll track changes and do it at the end + var needsUpdate bool + runSuccessful := true + for _, count := range statusEvent.EventData.Failures { + if count > 0 { + runSuccessful = false + break + } + } + // The finalizer has run successfully, time to remove it + if deleted && finalizerExists && runSuccessful { + finalizers := []string{} + for _, pendingFinalizer := range pendingFinalizers { + if pendingFinalizer != finalizer { + finalizers = append(finalizers, pendingFinalizer) + } + } + u.SetFinalizers(finalizers) + needsUpdate = true + } + + statusMap, ok := u.Object["status"].(map[string]interface{}) + if !ok { + u.Object["status"] = ResourceStatus{ + Status: NewStatusFromStatusJobEvent(statusEvent), + } + logrus.Infof("adding status for the first time") + needsUpdate = true + } else { + // Need to conver the map[string]interface into a resource status. + if update, status := UpdateResourceStatus(statusMap, statusEvent); update { + u.Object["status"] = status + needsUpdate = true + } + } + if needsUpdate { + err = r.Client.Update(context.TODO(), u) + } + if !runSuccessful { + reconcileResult.Requeue = true + return reconcileResult, err + } + return reconcileResult, err +} + +func contains(l []string, s string) bool { + for _, elem := range l { + if elem == s { + return true + } + } + return false +} diff --git a/vendor/github.com/operator-framework/operator-sdk/pkg/ansible/controller/types.go b/vendor/github.com/operator-framework/operator-sdk/pkg/ansible/controller/types.go new file mode 100644 index 0000000000..fbd5f730e5 --- /dev/null +++ b/vendor/github.com/operator-framework/operator-sdk/pkg/ansible/controller/types.go @@ -0,0 +1,136 @@ +// Copyright 2018 The Operator-SDK 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 controller + +import ( + "github.com/operator-framework/operator-sdk/pkg/ansible/runner/eventapi" +) + +const ( + host = "localhost" + StatusPhaseCreating = "Creating" + StatusPhaseRunning = "Running" + StatusPhaseFailed = "Failed" +) + +type Status struct { + Ok int `json:"ok"` + Changed int `json:"changed"` + Skipped int `json:"skipped"` + Failures int `json:"failures"` + TimeOfCompletion eventapi.EventTime `json:"completion"` +} + +func NewStatusFromStatusJobEvent(je eventapi.StatusJobEvent) Status { + // ok events. + o := 0 + changed := 0 + skipped := 0 + failures := 0 + if v, ok := je.EventData.Changed[host]; ok { + changed = v + } + if v, ok := je.EventData.Ok[host]; ok { + o = v + } + if v, ok := je.EventData.Skipped[host]; ok { + skipped = v + } + if v, ok := je.EventData.Failures[host]; ok { + failures = v + } + return Status{ + Ok: o, + Changed: changed, + Skipped: skipped, + Failures: failures, + TimeOfCompletion: je.Created, + } +} + +func IsStatusEqual(s1, s2 Status) bool { + return (s1.Ok == s2.Ok && s1.Changed == s2.Changed && s1.Skipped == s2.Skipped && s1.Failures == s2.Failures) +} + +func NewStatusFromMap(sm map[string]interface{}) Status { + //Create Old top level status + // ok events. + o := 0 + changed := 0 + skipped := 0 + failures := 0 + e := eventapi.EventTime{} + if v, ok := sm["changed"]; ok { + changed = int(v.(int64)) + } + if v, ok := sm["ok"]; ok { + o = int(v.(int64)) + } + if v, ok := sm["skipped"]; ok { + skipped = int(v.(int64)) + } + if v, ok := sm["failures"]; ok { + failures = int(v.(int64)) + } + if v, ok := sm["completion"]; ok { + s := v.(string) + e.UnmarshalJSON([]byte(s)) + } + return Status{ + Ok: o, + Changed: changed, + Skipped: skipped, + Failures: failures, + TimeOfCompletion: e, + } +} + +type ResourceStatus struct { + Status `json:",inline"` + Phase string `json:"phase"` + FailureMessage string `json:"reason,omitempty"` + History []Status `json:"history,omitempty"` +} + +func UpdateResourceStatus(sm map[string]interface{}, je eventapi.StatusJobEvent) (bool, ResourceStatus) { + newStatus := NewStatusFromStatusJobEvent(je) + oldStatus := NewStatusFromMap(sm) + phase := StatusPhaseRunning + // Don't update the status if new status and old status are equal. + if IsStatusEqual(newStatus, oldStatus) { + return false, ResourceStatus{} + } + + history := []Status{} + h, ok := sm["history"] + if ok { + hi := h.([]interface{}) + for _, m := range hi { + ma := m.(map[string]interface{}) + history = append(history, NewStatusFromMap(ma)) + } + } + + if newStatus.Failures > 0 { + phase = StatusPhaseFailed + } + + history = append(history, oldStatus) + return true, ResourceStatus{ + Status: newStatus, + Phase: phase, + History: history, + } +} diff --git a/vendor/github.com/operator-framework/operator-sdk/pkg/ansible/events/log_events.go b/vendor/github.com/operator-framework/operator-sdk/pkg/ansible/events/log_events.go new file mode 100644 index 0000000000..629dbb0b29 --- /dev/null +++ b/vendor/github.com/operator-framework/operator-sdk/pkg/ansible/events/log_events.go @@ -0,0 +1,97 @@ +// Copyright 2018 The Operator-SDK 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 events + +import ( + "github.com/operator-framework/operator-sdk/pkg/ansible/runner/eventapi" + "github.com/sirupsen/logrus" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" +) + +// LogLevel - Levelt for the logging to take place. +type LogLevel int + +const ( + // Tasks - only log the high level tasks. + Tasks LogLevel = iota + + // Everything - log every event. + Everything + + // Nothing - this will log nothing. + Nothing + + // Ansible Events + EventPlaybookOnTaskStart = "playbook_on_task_start" + EventRunnerOnOk = "runner_on_ok" + EventRunnerOnFailed = "runner_on_failed" + + // Ansible Task Actions + TaskActionSetFact = "set_fact" + TaskActionDebug = "debug" +) + +// EventHandler - knows how to handle job events. +type EventHandler interface { + Handle(*unstructured.Unstructured, eventapi.JobEvent) +} + +type loggingEventHandler struct { + LogLevel LogLevel +} + +func (l loggingEventHandler) Handle(u *unstructured.Unstructured, e eventapi.JobEvent) { + log := logrus.WithFields(logrus.Fields{ + "component": "logging_event_handler", + "name": u.GetName(), + "namespace": u.GetNamespace(), + "gvk": u.GroupVersionKind().String(), + "event_type": e.Event, + }) + if l.LogLevel == Nothing { + return + } + // log only the following for the 'Tasks' LogLevel + t, ok := e.EventData["task"] + if ok { + setFactAction := e.EventData["task_action"] == TaskActionSetFact + debugAction := e.EventData["task_action"] == TaskActionDebug + + if e.Event == EventPlaybookOnTaskStart && !setFactAction && !debugAction { + log.Infof("[playbook task]: %s", e.EventData["name"]) + return + } + if e.Event == EventRunnerOnOk && debugAction { + log.Infof("[playbook debug]: %v", e.EventData["task_args"]) + return + } + if e.Event == EventRunnerOnFailed { + log.Errorf("[failed]: [playbook task] '%s' failed with task_args - %v", + t, e.EventData["task_args"]) + return + } + } + // log everything else for the 'Everything' LogLevel + if l.LogLevel == Everything { + log.Infof("event: %#v", e.EventData) + } +} + +// NewLoggingEventHandler - Creates a Logging Event Handler to log events. +func NewLoggingEventHandler(l LogLevel) EventHandler { + return loggingEventHandler{ + LogLevel: l, + } +} diff --git a/vendor/github.com/operator-framework/operator-sdk/pkg/ansible/operator/operator.go b/vendor/github.com/operator-framework/operator-sdk/pkg/ansible/operator/operator.go new file mode 100644 index 0000000000..20f278299b --- /dev/null +++ b/vendor/github.com/operator-framework/operator-sdk/pkg/ansible/operator/operator.go @@ -0,0 +1,51 @@ +// Copyright 2018 The Operator-SDK 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 operator + +import ( + "log" + "math/rand" + "time" + + "github.com/operator-framework/operator-sdk/pkg/ansible/controller" + "github.com/operator-framework/operator-sdk/pkg/ansible/runner" + "sigs.k8s.io/controller-runtime/pkg/manager" + "sigs.k8s.io/controller-runtime/pkg/runtime/signals" + + "github.com/sirupsen/logrus" +) + +// Run - A blocking function which starts a controller-runtime manager +// It starts an Operator by reading in the values in `./watches.yaml`, adds a controller +// to the manager, and finally running the manager. +func Run(done chan error, mgr manager.Manager) { + watches, err := runner.NewFromWatches("./watches.yaml") + if err != nil { + logrus.Error("Failed to get watches") + done <- err + return + } + rand.Seed(time.Now().Unix()) + c := signals.SetupSignalHandler() + + for gvk, runner := range watches { + controller.Add(mgr, controller.Options{ + GVK: gvk, + Runner: runner, + }) + } + log.Fatal(mgr.Start(c)) + done <- nil +} diff --git a/vendor/github.com/operator-framework/operator-sdk/pkg/ansible/paramconv/paramconv.go b/vendor/github.com/operator-framework/operator-sdk/pkg/ansible/paramconv/paramconv.go new file mode 100644 index 0000000000..61e45839e8 --- /dev/null +++ b/vendor/github.com/operator-framework/operator-sdk/pkg/ansible/paramconv/paramconv.go @@ -0,0 +1,164 @@ +// Copyright 2018 The Operator-SDK 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. + +// Based on https://github.com/iancoleman/strcase + +package paramconv + +import ( + "regexp" + "strings" +) + +var ( + numberSequence = regexp.MustCompile(`([a-zA-Z])(\d+)([a-zA-Z]?)`) + numberReplacement = []byte(`$1 $2 $3`) + wordMapping = map[string]string{ + "http": "HTTP", + "url": "URL", + "ip": "IP", + } +) + +func addWordBoundariesToNumbers(s string) string { + b := []byte(s) + b = numberSequence.ReplaceAll(b, numberReplacement) + return string(b) +} + +func translateWord(word string, initCase bool) string { + if val, ok := wordMapping[word]; ok { + return val + } + if initCase { + return strings.Title(word) + } + return word +} + +// Converts a string to CamelCase +func ToCamel(s string) string { + s = addWordBoundariesToNumbers(s) + s = strings.Trim(s, " ") + n := "" + bits := []string{} + for _, v := range s { + if v == '_' || v == ' ' || v == '-' { + bits = append(bits, n) + n = "" + } else { + n += string(v) + } + } + bits = append(bits, n) + + ret := "" + for i, substr := range bits { + ret += translateWord(substr, i != 0) + } + return ret +} + +// Converts a string to snake_case +func ToSnake(s string) string { + s = addWordBoundariesToNumbers(s) + s = strings.Trim(s, " ") + var prefix string + char1 := []rune(s)[0] + if char1 >= 'A' && char1 <= 'Z' { + prefix = "_" + } else { + prefix = "" + } + bits := []string{} + n := "" + real_i := -1 + + for i, v := range s { + real_i += 1 + // treat acronyms as words, eg for JSONData -> JSON is a whole word + nextCaseIsChanged := false + if i+1 < len(s) { + next := s[i+1] + if (v >= 'A' && v <= 'Z' && next >= 'a' && next <= 'z') || (v >= 'a' && v <= 'z' && next >= 'A' && next <= 'Z') { + nextCaseIsChanged = true + } + } + + if real_i > 0 && n[len(n)-1] != '_' && nextCaseIsChanged { + // add underscore if next letter case type is changed + if v >= 'A' && v <= 'Z' { + bits = append(bits, strings.ToLower(n)) + n = string(v) + real_i = 0 + } else if v >= 'a' && v <= 'z' { + bits = append(bits, strings.ToLower(n+string(v))) + n = "" + real_i = -1 + } + } else if v == ' ' || v == '_' || v == '-' { + // replace spaces/underscores with delimiters + bits = append(bits, strings.ToLower(n)) + n = "" + real_i = -1 + } else { + n = n + string(v) + } + } + bits = append(bits, strings.ToLower(n)) + joined := strings.Join(bits, "_") + if _, ok := wordMapping[bits[0]]; !ok { + return prefix + joined + } + return joined +} + +func convertParameter(fn func(string) string, v interface{}) interface{} { + switch v := v.(type) { + case map[string]interface{}: + ret := map[string]interface{}{} + for key, val := range v { + ret[fn(key)] = convertParameter(fn, val) + } + return ret + case []interface{}: + return convertArray(fn, v) + default: + return v + } +} + +func convertArray(fn func(string) string, in []interface{}) []interface{} { + res := make([]interface{}, len(in)) + for i, v := range in { + res[i] = convertParameter(fn, v) + } + return res +} + +func convertMapKeys(fn func(string) string, in map[string]interface{}) map[string]interface{} { + converted := map[string]interface{}{} + for key, val := range in { + converted[fn(key)] = convertParameter(fn, val) + } + return converted +} + +func MapToSnake(in map[string]interface{}) map[string]interface{} { + return convertMapKeys(ToSnake, in) +} + +func MapToCamel(in map[string]interface{}) map[string]interface{} { + return convertMapKeys(ToCamel, in) +} diff --git a/vendor/github.com/operator-framework/operator-sdk/pkg/ansible/proxy/kubeconfig/kubeconfig.go b/vendor/github.com/operator-framework/operator-sdk/pkg/ansible/proxy/kubeconfig/kubeconfig.go new file mode 100644 index 0000000000..56913ac0f8 --- /dev/null +++ b/vendor/github.com/operator-framework/operator-sdk/pkg/ansible/proxy/kubeconfig/kubeconfig.go @@ -0,0 +1,101 @@ +// Copyright 2018 The Operator-SDK 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 kubeconfig + +import ( + "bytes" + "encoding/base64" + "encoding/json" + "html/template" + "io/ioutil" + "net/url" + "os" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// kubectl, as of 1.10.5, only does basic auth if the username is present in +// the URL. The python client used by ansible, as of 6.0.0, only does basic +// auth if the username and password are provided under the "user" key within +// "users". +const kubeConfigTemplate = `--- +apiVersion: v1 +kind: Config +clusters: +- cluster: + insecure-skip-tls-verify: true + server: {{.ProxyURL}} + name: proxy-server +contexts: +- context: + cluster: proxy-server + user: admin/proxy-server + name: {{.Namespace}}/proxy-server +current-context: {{.Namespace}}/proxy-server +preferences: {} +users: +- name: admin/proxy-server + user: + username: {{.Username}} + password: unused +` + +// values holds the data used to render the template +type values struct { + Username string + ProxyURL string + Namespace string +} + +// Create renders a kubeconfig template and writes it to disk +func Create(ownerRef metav1.OwnerReference, proxyURL string, namespace string) (*os.File, error) { + parsedURL, err := url.Parse(proxyURL) + if err != nil { + return nil, err + } + ownerRefJSON, err := json.Marshal(ownerRef) + if err != nil { + return nil, err + } + username := base64.URLEncoding.EncodeToString([]byte(ownerRefJSON)) + parsedURL.User = url.User(username) + v := values{ + Username: username, + ProxyURL: parsedURL.String(), + Namespace: namespace, + } + + var parsed bytes.Buffer + + t := template.Must(template.New("kubeconfig").Parse(kubeConfigTemplate)) + t.Execute(&parsed, v) + + file, err := ioutil.TempFile("", "kubeconfig") + if err != nil { + return nil, err + } + // multiple calls to close file will not hurt anything, + // but we don't want to lose the error because we are + // writing to the file, so we will call close twice. + defer file.Close() + + if _, err := file.WriteString(parsed.String()); err != nil { + return nil, err + } + if err := file.Close(); err != nil { + return nil, err + } + return file, nil +} diff --git a/vendor/github.com/operator-framework/operator-sdk/pkg/ansible/proxy/kubectl.go b/vendor/github.com/operator-framework/operator-sdk/pkg/ansible/proxy/kubectl.go new file mode 100644 index 0000000000..3c24243b7e --- /dev/null +++ b/vendor/github.com/operator-framework/operator-sdk/pkg/ansible/proxy/kubectl.go @@ -0,0 +1,265 @@ +/* +Copyright 2014 The Kubernetes 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. +*/ + +// This code was retrieved from +// https://github.com/kubernetes/kubernetes/blob/204d994/pkg/kubectl/proxy/proxy_server.go +// and modified for use in this project. + +package proxy + +import ( + "fmt" + "log" + "net" + "net/http" + "net/url" + "os" + "regexp" + "strings" + "syscall" + "time" + + utilnet "k8s.io/apimachinery/pkg/util/net" + k8sproxy "k8s.io/apimachinery/pkg/util/proxy" + "k8s.io/client-go/rest" + "k8s.io/client-go/transport" +) + +const ( + // DefaultHostAcceptRE is the default value for which hosts to accept. + DefaultHostAcceptRE = "^localhost$,^127\\.0\\.0\\.1$,^\\[::1\\]$" + // DefaultPathAcceptRE is the default path to accept. + DefaultPathAcceptRE = "^.*" + // DefaultPathRejectRE is the default set of paths to reject. + DefaultPathRejectRE = "^/api/.*/pods/.*/exec,^/api/.*/pods/.*/attach" + // DefaultMethodRejectRE is the set of HTTP methods to reject by default. + DefaultMethodRejectRE = "^$" +) + +var ( + // ReverseProxyFlushInterval is the frequency to flush the reverse proxy. + // Only matters for long poll connections like the one used to watch. With an + // interval of 0 the reverse proxy will buffer content sent on any connection + // with transfer-encoding=chunked. + // TODO: Flush after each chunk so the client doesn't suffer a 100ms latency per + // watch event. + ReverseProxyFlushInterval = 100 * time.Millisecond +) + +// FilterServer rejects requests which don't match one of the specified regular expressions +type FilterServer struct { + // Only paths that match this regexp will be accepted + AcceptPaths []*regexp.Regexp + // Paths that match this regexp will be rejected, even if they match the above + RejectPaths []*regexp.Regexp + // Hosts are required to match this list of regexp + AcceptHosts []*regexp.Regexp + // Methods that match this regexp are rejected + RejectMethods []*regexp.Regexp + // The delegate to call to handle accepted requests. + delegate http.Handler +} + +// MakeRegexpArray splits a comma separated list of regexps into an array of Regexp objects. +func MakeRegexpArray(str string) ([]*regexp.Regexp, error) { + parts := strings.Split(str, ",") + result := make([]*regexp.Regexp, len(parts)) + for ix := range parts { + re, err := regexp.Compile(parts[ix]) + if err != nil { + return nil, err + } + result[ix] = re + } + return result, nil +} + +// MakeRegexpArrayOrDie creates an array of regular expression objects from a string or exits. +func MakeRegexpArrayOrDie(str string) []*regexp.Regexp { + result, err := MakeRegexpArray(str) + if err != nil { + log.Fatalf("error compiling re: %v", err) + } + return result +} + +func matchesRegexp(str string, regexps []*regexp.Regexp) bool { + for _, re := range regexps { + if re.MatchString(str) { + log.Printf("%v matched %s", str, re) + return true + } + } + return false +} + +func (f *FilterServer) accept(method, path, host string) bool { + if matchesRegexp(path, f.RejectPaths) { + return false + } + if matchesRegexp(method, f.RejectMethods) { + return false + } + if matchesRegexp(path, f.AcceptPaths) && matchesRegexp(host, f.AcceptHosts) { + return true + } + return false +} + +// HandlerFor makes a shallow copy of f which passes its requests along to the +// new delegate. +func (f *FilterServer) HandlerFor(delegate http.Handler) *FilterServer { + f2 := *f + f2.delegate = delegate + return &f2 +} + +// Get host from a host header value like "localhost" or "localhost:8080" +func extractHost(header string) (host string) { + host, _, err := net.SplitHostPort(header) + if err != nil { + host = header + } + return host +} + +func (f *FilterServer) ServeHTTP(rw http.ResponseWriter, req *http.Request) { + host := extractHost(req.Host) + if f.accept(req.Method, req.URL.Path, host) { + log.Printf("Filter accepting %v %v %v", req.Method, req.URL.Path, host) + f.delegate.ServeHTTP(rw, req) + return + } + log.Printf("Filter rejecting %v %v %v", req.Method, req.URL.Path, host) + rw.WriteHeader(http.StatusForbidden) + rw.Write([]byte("

Unauthorized

")) +} + +// Server is a http.Handler which proxies Kubernetes APIs to remote API server. +type server struct { + Handler http.Handler +} + +type responder struct{} + +func (r *responder) Error(w http.ResponseWriter, req *http.Request, err error) { + log.Printf("Error while proxying request: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) +} + +// makeUpgradeTransport creates a transport that explicitly bypasses HTTP2 support +// for proxy connections that must upgrade. +func makeUpgradeTransport(config *rest.Config) (k8sproxy.UpgradeRequestRoundTripper, error) { + transportConfig, err := config.TransportConfig() + if err != nil { + return nil, err + } + tlsConfig, err := transport.TLSConfigFor(transportConfig) + if err != nil { + return nil, err + } + rt := utilnet.SetOldTransportDefaults(&http.Transport{ + TLSClientConfig: tlsConfig, + DialContext: (&net.Dialer{ + Timeout: 30 * time.Second, + }).DialContext, + }) + + upgrader, err := transport.HTTPWrappersForConfig(transportConfig, k8sproxy.MirrorRequest) + if err != nil { + return nil, err + } + return k8sproxy.NewUpgradeRequestRoundTripper(rt, upgrader), nil +} + +// NewServer creates and installs a new Server. +func newServer(apiProxyPrefix string, cfg *rest.Config) (*server, error) { + host := cfg.Host + if !strings.HasSuffix(host, "/") { + host = host + "/" + } + target, err := url.Parse(host) + if err != nil { + return nil, err + } + + responder := &responder{} + transport, err := rest.TransportFor(cfg) + if err != nil { + return nil, err + } + upgradeTransport, err := makeUpgradeTransport(cfg) + if err != nil { + return nil, err + } + proxy := k8sproxy.NewUpgradeAwareHandler(target, transport, false, false, responder) + proxy.UpgradeTransport = upgradeTransport + proxy.UseRequestLocation = true + + proxyServer := http.Handler(proxy) + + if !strings.HasPrefix(apiProxyPrefix, "/api") { + proxyServer = stripLeaveSlash(apiProxyPrefix, proxyServer) + } + + mux := http.NewServeMux() + mux.Handle(apiProxyPrefix, proxyServer) + return &server{Handler: mux}, nil +} + +// Listen is a simple wrapper around net.Listen. +func (s *server) Listen(address string, port int) (net.Listener, error) { + return net.Listen("tcp", fmt.Sprintf("%s:%d", address, port)) +} + +// ListenUnix does net.Listen for a unix socket +func (s *server) ListenUnix(path string) (net.Listener, error) { + // Remove any socket, stale or not, but fall through for other files + fi, err := os.Stat(path) + if err == nil && (fi.Mode()&os.ModeSocket) != 0 { + os.Remove(path) + } + // Default to only user accessible socket, caller can open up later if desired + oldmask := syscall.Umask(0077) + l, err := net.Listen("unix", path) + syscall.Umask(oldmask) + return l, err +} + +// ServeOnListener starts the server using given listener, loops forever. +func (s *server) ServeOnListener(l net.Listener) error { + server := http.Server{ + Handler: s.Handler, + } + return server.Serve(l) +} + +// like http.StripPrefix, but always leaves an initial slash. (so that our +// regexps will work.) +func stripLeaveSlash(prefix string, h http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + p := strings.TrimPrefix(req.URL.Path, prefix) + if len(p) >= len(req.URL.Path) { + http.NotFound(w, req) + return + } + if len(p) > 0 && p[:1] != "/" { + p = "/" + p + } + req.URL.Path = p + h.ServeHTTP(w, req) + }) +} diff --git a/vendor/github.com/operator-framework/operator-sdk/pkg/ansible/proxy/proxy.go b/vendor/github.com/operator-framework/operator-sdk/pkg/ansible/proxy/proxy.go new file mode 100644 index 0000000000..58596f22fb --- /dev/null +++ b/vendor/github.com/operator-framework/operator-sdk/pkg/ansible/proxy/proxy.go @@ -0,0 +1,135 @@ +// Copyright 2018 The Operator-SDK 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 proxy + +// This file contains this project's custom code, as opposed to kubectl.go +// which contains code retrieved from the kubernetes project. + +import ( + "bytes" + "encoding/base64" + "encoding/json" + "io/ioutil" + "net/http" + "net/http/httputil" + + "github.com/sirupsen/logrus" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/client-go/rest" +) + +// InjectOwnerReferenceHandler will handle proxied requests and inject the +// owner refernece found in the authorization header. The Authorization is +// then deleted so that the proxy can re-set with the correct authorization. +func InjectOwnerReferenceHandler(h http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + if req.Method == http.MethodPost { + logrus.Info("injecting owner reference") + dump, _ := httputil.DumpRequest(req, false) + logrus.Debugf(string(dump)) + + user, _, ok := req.BasicAuth() + if !ok { + logrus.Error("basic auth header not found") + w.Header().Set("WWW-Authenticate", "Basic realm=\"Operator Proxy\"") + http.Error(w, "", http.StatusUnauthorized) + return + } + authString, err := base64.StdEncoding.DecodeString(user) + if err != nil { + m := "could not base64 decode username" + logrus.Errorf("%s: %s", err.Error()) + http.Error(w, m, http.StatusBadRequest) + return + } + owner := metav1.OwnerReference{} + json.Unmarshal(authString, &owner) + + logrus.Debugf("%#+v", owner) + + body, err := ioutil.ReadAll(req.Body) + if err != nil { + m := "could not read request body" + logrus.Errorf("%s: %s", err.Error()) + http.Error(w, m, http.StatusInternalServerError) + return + } + data := &unstructured.Unstructured{} + err = json.Unmarshal(body, data) + if err != nil { + m := "could not deserialize request body" + logrus.Errorf("%s: %s", err.Error()) + http.Error(w, m, http.StatusBadRequest) + return + } + data.SetOwnerReferences(append(data.GetOwnerReferences(), owner)) + newBody, err := json.Marshal(data.Object) + if err != nil { + m := "could not serialize body" + logrus.Errorf("%s: %s", err.Error()) + http.Error(w, m, http.StatusInternalServerError) + return + } + logrus.Debugf(string(newBody)) + req.Body = ioutil.NopCloser(bytes.NewBuffer(newBody)) + req.ContentLength = int64(len(newBody)) + } + // Removing the authorization so that the proxy can set the correct authorization. + req.Header.Del("Authorization") + h.ServeHTTP(w, req) + }) +} + +// HandlerChain will be used for users to pass defined handlers to the proxy. +// The hander chain will be run after InjectingOwnerReference if it is added +// and before the proxy handler. +type HandlerChain func(http.Handler) http.Handler + +// Options will be used by the user to specify the desired details +// for the proxy. +type Options struct { + Address string + Port int + Handler HandlerChain + NoOwnerInjection bool + KubeConfig *rest.Config +} + +// RunProxy will start a proxy server in a go routine and return on the error +// channel if something is not correct on startup. +func RunProxy(done chan error, o Options) { + server, err := newServer("/", o.KubeConfig) + if err != nil { + done <- err + return + } + if o.Handler != nil { + server.Handler = o.Handler(server.Handler) + } + + if !o.NoOwnerInjection { + server.Handler = InjectOwnerReferenceHandler(server.Handler) + } + l, err := server.Listen(o.Address, o.Port) + if err != nil { + done <- err + return + } + go func() { + logrus.Infof("Starting to serve on %s\n", l.Addr().String()) + done <- server.ServeOnListener(l) + }() +} diff --git a/vendor/github.com/operator-framework/operator-sdk/pkg/ansible/runner/eventapi/eventapi.go b/vendor/github.com/operator-framework/operator-sdk/pkg/ansible/runner/eventapi/eventapi.go new file mode 100644 index 0000000000..a28e22f3ff --- /dev/null +++ b/vendor/github.com/operator-framework/operator-sdk/pkg/ansible/runner/eventapi/eventapi.go @@ -0,0 +1,184 @@ +// Copyright 2018 The Operator-SDK 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 eventapi + +import ( + "encoding/json" + "fmt" + "io" + "io/ioutil" + "net" + "net/http" + "strings" + "sync" + "time" + + "github.com/sirupsen/logrus" +) + +// EventReceiver serves the event API +type EventReceiver struct { + // Events is the channel used by the event API handler to send JobEvents + // back to the runner, or whatever code is using this receiver. + Events chan JobEvent + + // SocketPath is the path on the filesystem to a unix streaming socket + SocketPath string + + // URLPath is the path portion of the url at which events should be + // received. For example, "/events/" + URLPath string + + // server is the http.Server instance that serves the event API. It must be + // closed. + server io.Closer + + // stopped indicates if this receiver has permanently stopped receiving + // events. When true, requests to POST an event will receive a "410 Gone" + // response, and the body will be ignored. + stopped bool + + // mutex controls access to the "stopped" bool above, ensuring that writes + // are goroutine-safe. + mutex sync.RWMutex + + // ident is the unique identifier for a particular run of ansible-runner + ident string + + // logger holds a logger that has some fields already set + logger logrus.FieldLogger +} + +func New(ident string, errChan chan<- error) (*EventReceiver, error) { + sockPath := fmt.Sprintf("/tmp/ansibleoperator-%s", ident) + listener, err := net.Listen("unix", sockPath) + if err != nil { + return nil, err + } + + rec := EventReceiver{ + Events: make(chan JobEvent, 1000), + SocketPath: sockPath, + URLPath: "/events/", + ident: ident, + logger: logrus.WithFields(logrus.Fields{ + "component": "eventapi", + "job": ident, + }), + } + + mux := http.NewServeMux() + mux.HandleFunc(rec.URLPath, rec.handleEvents) + srv := http.Server{Handler: mux} + rec.server = &srv + + go func() { + errChan <- srv.Serve(listener) + }() + return &rec, nil +} + +// Close ensures that appropriate resources are cleaned up, such as any unix +// streaming socket that may be in use. Close must be called. +func (e *EventReceiver) Close() { + e.mutex.Lock() + e.stopped = true + e.mutex.Unlock() + e.logger.Debug("event API stopped") + e.server.Close() + close(e.Events) +} + +func (e *EventReceiver) handleEvents(w http.ResponseWriter, r *http.Request) { + if r.URL.Path != e.URLPath { + http.NotFound(w, r) + e.logger.WithFields(logrus.Fields{ + "code": "404", + }).Infof("path not found: %s\n", r.URL.Path) + return + } + + if r.Method != http.MethodPost { + e.logger.WithFields(logrus.Fields{ + "code": "405", + }).Infof("method %s not allowed", r.Method) + w.WriteHeader(http.StatusMethodNotAllowed) + return + } + + ct := r.Header.Get("content-type") + if strings.Split(ct, ";")[0] != "application/json" { + e.logger.WithFields(logrus.Fields{ + "code": "415", + }).Info("wrong content type: %s", ct) + w.WriteHeader(http.StatusUnsupportedMediaType) + w.Write([]byte("The content-type must be \"application/json\"")) + return + } + + body, err := ioutil.ReadAll(r.Body) + if err != nil { + e.logger.WithFields(logrus.Fields{ + "code": "500", + }).Errorf("%s", err.Error()) + w.WriteHeader(http.StatusInternalServerError) + return + } + + event := JobEvent{} + err = json.Unmarshal(body, &event) + if err != nil { + e.logger.WithFields(logrus.Fields{ + "code": "400", + }).Infof("could not deserialize body: %s", err.Error()) + w.WriteHeader(http.StatusBadRequest) + w.Write([]byte("Could not deserialize body as JSON")) + return + } + + // Guarantee that the Events channel will not be written to if stopped == + // true, because in that case the channel has been closed. + e.mutex.RLock() + defer e.mutex.RUnlock() + if e.stopped { + e.mutex.RUnlock() + w.WriteHeader(http.StatusGone) + e.logger.WithFields(logrus.Fields{ + "code": "410", + }).Info("stopped and not accepting additional events for this job") + return + } + // ansible-runner sends "status events" and "ansible events". The "status + // events" signify a change in the state of ansible-runner itself, which + // we're not currently interested in. + // https://ansible-runner.readthedocs.io/en/latest/external_interface.html#event-structure + if event.UUID == "" { + e.logger.Info("dropping event that is not a JobEvent") + } else { + // timeout if the channel blocks for too long + timeout := time.NewTimer(10 * time.Second) + select { + case e.Events <- event: + case <-timeout.C: + e.logger.WithFields(logrus.Fields{ + "code": "500", + }).Warn("timed out writing event to channel") + w.WriteHeader(http.StatusInternalServerError) + return + } + _ = timeout.Stop() + } + w.WriteHeader(http.StatusNoContent) +} diff --git a/vendor/github.com/operator-framework/operator-sdk/pkg/ansible/runner/eventapi/types.go b/vendor/github.com/operator-framework/operator-sdk/pkg/ansible/runner/eventapi/types.go new file mode 100644 index 0000000000..ffbf2ad743 --- /dev/null +++ b/vendor/github.com/operator-framework/operator-sdk/pkg/ansible/runner/eventapi/types.go @@ -0,0 +1,76 @@ +// Copyright 2018 The Operator-SDK 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 eventapi + +import ( + "fmt" + "strings" + "time" +) + +// EventTime - time to unmarshal nano time. +type EventTime struct { + time.Time +} + +// UnmarshalJSON - override unmarshal json. +func (e *EventTime) UnmarshalJSON(b []byte) (err error) { + e.Time, err = time.Parse("2006-01-02T15:04:05.999999999", strings.Trim(string(b[:]), "\"\\")) + if err != nil { + return err + } + return nil +} + +// MarshalJSON - override the marshal json. +func (e EventTime) MarshalJSON() ([]byte, error) { + return []byte(fmt.Sprintf("\"%s\"", e.Time.Format("2006-01-02T15:04:05.99999999"))), nil +} + +// JobEvent - event of an ansible run. +type JobEvent struct { + UUID string `json:"uuid"` + Counter int `json:"counter"` + StdOut string `json:"stdout"` + StartLine int `json:"start_line"` + EndLine int `json:"EndLine"` + Event string `json:"event"` + EventData map[string]interface{} `json:"event_data"` + PID int `json:"pid"` + Created EventTime `json:"created"` +} + +// StatusJobEvent - event of an ansible run. +type StatusJobEvent struct { + UUID string `json:"uuid"` + Counter int `json:"counter"` + StdOut string `json:"stdout"` + StartLine int `json:"start_line"` + EndLine int `json:"EndLine"` + Event string `json:"event"` + EventData StatsEventData `json:"event_data"` + PID int `json:"pid"` + Created EventTime `json:"created"` +} + +// StatsEventData - data for a the status event. +type StatsEventData struct { + Playbook string `json:"playbook"` + PlaybookUUID string `json:"playbook_uuid"` + Changed map[string]int `json:"changed"` + Ok map[string]int `json:"ok"` + Failures map[string]int `json:"failures"` + Skipped map[string]int `json:"skipped"` +} diff --git a/vendor/github.com/operator-framework/operator-sdk/pkg/ansible/runner/internal/inputdir/inputdir.go b/vendor/github.com/operator-framework/operator-sdk/pkg/ansible/runner/internal/inputdir/inputdir.go new file mode 100644 index 0000000000..dae6bed5ff --- /dev/null +++ b/vendor/github.com/operator-framework/operator-sdk/pkg/ansible/runner/internal/inputdir/inputdir.go @@ -0,0 +1,123 @@ +// Copyright 2018 The Operator-SDK 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 inputdir + +import ( + "encoding/json" + "fmt" + "io/ioutil" + "os" + "path/filepath" + + "github.com/sirupsen/logrus" +) + +// InputDir represents an input directory for ansible-runner. +type InputDir struct { + Path string + PlaybookPath string + Parameters map[string]interface{} + EnvVars map[string]string + Settings map[string]string +} + +// makeDirs creates the required directory structure. +func (i *InputDir) makeDirs() error { + for _, path := range []string{"env", "project", "inventory"} { + fullPath := filepath.Join(i.Path, path) + err := os.MkdirAll(fullPath, os.ModePerm) + if err != nil { + logrus.Errorf("unable to create directory %v", fullPath) + return err + } + } + return nil +} + +// addFile adds a file to the given relative path within the input directory. +func (i *InputDir) addFile(path string, content []byte) error { + fullPath := filepath.Join(i.Path, path) + err := ioutil.WriteFile(fullPath, content, 0644) + if err != nil { + logrus.Errorf("unable to write file %v", fullPath) + } + return err +} + +// Write commits the object's state to the filesystem at i.Path. +func (i *InputDir) Write() error { + paramBytes, err := json.Marshal(i.Parameters) + if err != nil { + return err + } + envVarBytes, err := json.Marshal(i.EnvVars) + if err != nil { + return err + } + settingsBytes, err := json.Marshal(i.Settings) + if err != nil { + return err + } + + err = i.makeDirs() + if err != nil { + return err + } + + err = i.addFile("env/envvars", envVarBytes) + if err != nil { + return err + } + err = i.addFile("env/extravars", paramBytes) + if err != nil { + return err + } + err = i.addFile("env/settings", settingsBytes) + if err != nil { + return err + } + + // If ansible-runner is running in a python virtual environment, propagate + // that to ansible. + venv := os.Getenv("VIRTUAL_ENV") + hosts := "localhost ansible_connection=local" + if venv != "" { + hosts = fmt.Sprintf("%s ansible_python_interpreter=%s", hosts, filepath.Join(venv, "bin/python")) + } + err = i.addFile("inventory/hosts", []byte(hosts)) + if err != nil { + return err + } + + if i.PlaybookPath != "" { + f, err := os.Open(i.PlaybookPath) + if err != nil { + logrus.Errorf("failed to open playbook file %v", i.PlaybookPath) + return err + } + defer f.Close() + + playbookBytes, err := ioutil.ReadAll(f) + if err != nil { + return err + } + + err = i.addFile("project/playbook.yaml", playbookBytes) + if err != nil { + return err + } + } + return nil +} diff --git a/vendor/github.com/operator-framework/operator-sdk/pkg/ansible/runner/runner.go b/vendor/github.com/operator-framework/operator-sdk/pkg/ansible/runner/runner.go new file mode 100644 index 0000000000..737050b547 --- /dev/null +++ b/vendor/github.com/operator-framework/operator-sdk/pkg/ansible/runner/runner.go @@ -0,0 +1,303 @@ +// Copyright 2018 The Operator-SDK 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 runner + +import ( + "errors" + "fmt" + "io/ioutil" + "math/rand" + "net/http" + "os" + "os/exec" + "path/filepath" + "strconv" + "strings" + + "github.com/operator-framework/operator-sdk/pkg/ansible/paramconv" + "github.com/operator-framework/operator-sdk/pkg/ansible/runner/eventapi" + "github.com/operator-framework/operator-sdk/pkg/ansible/runner/internal/inputdir" + "github.com/sirupsen/logrus" + yaml "gopkg.in/yaml.v2" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime/schema" +) + +// Runner - a runnable that should take the parameters and name and namespace +// and run the correct code. +type Runner interface { + Run(*unstructured.Unstructured, string) (chan eventapi.JobEvent, error) + GetFinalizer() (string, bool) +} + +// watch holds data used to create a mapping of GVK to ansible playbook or role. +// The mapping is used to compose an ansible operator. +type watch struct { + Version string `yaml:"version"` + Group string `yaml:"group"` + Kind string `yaml:"kind"` + Playbook string `yaml:"playbook"` + Role string `yaml:"role"` + Finalizer *Finalizer `yaml:"finalizer"` +} + +// Finalizer - Expose finalizer to be used by a user. +type Finalizer struct { + Name string `yaml:"name"` + Playbook string `yaml:"playbook"` + Role string `yaml:"role"` + Vars map[string]interface{} `yaml:"vars"` +} + +// NewFromWatches reads the operator's config file at the provided path. +func NewFromWatches(path string) (map[schema.GroupVersionKind]Runner, error) { + b, err := ioutil.ReadFile(path) + if err != nil { + logrus.Errorf("failed to get config file %v", err) + return nil, err + } + watches := []watch{} + err = yaml.Unmarshal(b, &watches) + if err != nil { + logrus.Errorf("failed to unmarshal config %v", err) + return nil, err + } + + m := map[schema.GroupVersionKind]Runner{} + for _, w := range watches { + s := schema.GroupVersionKind{ + Group: w.Group, + Version: w.Version, + Kind: w.Kind, + } + // Check if schema is a duplicate + if _, ok := m[s]; ok { + return nil, fmt.Errorf("duplicate GVK: %v", s.String()) + } + switch { + case w.Playbook != "": + r, err := NewForPlaybook(w.Playbook, s, w.Finalizer) + if err != nil { + return nil, err + } + m[s] = r + case w.Role != "": + r, err := NewForRole(w.Role, s, w.Finalizer) + if err != nil { + return nil, err + } + m[s] = r + default: + return nil, fmt.Errorf("either playbook or role must be defined for %v", s) + } + } + return m, nil +} + +// NewForPlaybook returns a new Runner based on the path to an ansible playbook. +func NewForPlaybook(path string, gvk schema.GroupVersionKind, finalizer *Finalizer) (Runner, error) { + if !filepath.IsAbs(path) { + return nil, fmt.Errorf("playbook path must be absolute for %v", gvk) + } + r := &runner{ + Path: path, + GVK: gvk, + cmdFunc: func(ident, inputDirPath string) *exec.Cmd { + return exec.Command("ansible-runner", "-vv", "-p", path, "-i", ident, "run", inputDirPath) + }, + } + err := r.addFinalizer(finalizer) + if err != nil { + return nil, err + } + return r, nil +} + +// NewForRole returns a new Runner based on the path to an ansible role. +func NewForRole(path string, gvk schema.GroupVersionKind, finalizer *Finalizer) (Runner, error) { + if !filepath.IsAbs(path) { + return nil, fmt.Errorf("role path must be absolute for %v", gvk) + } + path = strings.TrimRight(path, "/") + r := &runner{ + Path: path, + GVK: gvk, + cmdFunc: func(ident, inputDirPath string) *exec.Cmd { + rolePath, roleName := filepath.Split(path) + return exec.Command("ansible-runner", "-vv", "--role", roleName, "--roles-path", rolePath, "--hosts", "localhost", "-i", ident, "run", inputDirPath) + }, + } + err := r.addFinalizer(finalizer) + if err != nil { + return nil, err + } + return r, nil +} + +// runner - implements the Runner interface for a GVK that's being watched. +type runner struct { + Path string // path on disk to a playbook or role depending on what cmdFunc expects + GVK schema.GroupVersionKind // GVK being watched that corresponds to the Path + Finalizer *Finalizer + cmdFunc func(ident, inputDirPath string) *exec.Cmd // returns a Cmd that runs ansible-runner + finalizerCmdFunc func(ident, inputDirPath string) *exec.Cmd +} + +func (r *runner) Run(u *unstructured.Unstructured, kubeconfig string) (chan eventapi.JobEvent, error) { + if u.GetDeletionTimestamp() != nil && !r.isFinalizerRun(u) { + return nil, errors.New("resource has been deleted, but no finalizer was matched, skipping reconciliation") + } + ident := strconv.Itoa(rand.Int()) + logger := logrus.WithFields(logrus.Fields{ + "component": "runner", + "job": ident, + "name": u.GetName(), + "namespace": u.GetNamespace(), + }) + // start the event receiver. We'll check errChan for an error after + // ansible-runner exits. + errChan := make(chan error, 1) + receiver, err := eventapi.New(ident, errChan) + if err != nil { + return nil, err + } + inputDir := inputdir.InputDir{ + Path: filepath.Join("/tmp/ansible-operator/runner/", r.GVK.Group, r.GVK.Version, r.GVK.Kind, u.GetNamespace(), u.GetName()), + Parameters: r.makeParameters(u), + EnvVars: map[string]string{ + "K8S_AUTH_KUBECONFIG": kubeconfig, + }, + Settings: map[string]string{ + "runner_http_url": receiver.SocketPath, + "runner_http_path": receiver.URLPath, + }, + } + // If Path is a dir, assume it is a role path. Otherwise assume it's a + // playbook path + fi, err := os.Lstat(r.Path) + if err != nil { + return nil, err + } + if !fi.IsDir() { + inputDir.PlaybookPath = r.Path + } + err = inputDir.Write() + if err != nil { + return nil, err + } + + go func() { + var dc *exec.Cmd + if r.isFinalizerRun(u) { + logger.Debugf("Resource is marked for deletion, running finalizer %s", r.Finalizer.Name) + dc = r.finalizerCmdFunc(ident, inputDir.Path) + } else { + dc = r.cmdFunc(ident, inputDir.Path) + } + + err := dc.Run() + if err != nil { + logger.Errorf("error from ansible-runner: %s", err.Error()) + } else { + logger.Info("ansible-runner exited successfully") + } + + receiver.Close() + err = <-errChan + // http.Server returns this in the case of being closed cleanly + if err != nil && err != http.ErrServerClosed { + logger.Errorf("error from event api: %s", err.Error()) + } + }() + return receiver.Events, nil +} + +func (r *runner) GetFinalizer() (string, bool) { + if r.Finalizer != nil { + return r.Finalizer.Name, true + } + return "", false +} + +func (r *runner) isFinalizerRun(u *unstructured.Unstructured) bool { + finalizersSet := r.Finalizer != nil && u.GetFinalizers() != nil + // The resource is deleted and our finalizer is present, we need to run the finalizer + if finalizersSet && u.GetDeletionTimestamp() != nil { + for _, f := range u.GetFinalizers() { + if f == r.Finalizer.Name { + return true + } + } + } + return false +} + +func (r *runner) addFinalizer(finalizer *Finalizer) error { + r.Finalizer = finalizer + switch { + case finalizer == nil: + return nil + case finalizer.Playbook != "": + if !filepath.IsAbs(finalizer.Playbook) { + return fmt.Errorf("finalizer playbook path must be absolute for %v", r.GVK) + } + r.finalizerCmdFunc = func(ident, inputDirPath string) *exec.Cmd { + return exec.Command("ansible-runner", "-vv", "-p", finalizer.Playbook, "-i", ident, "run", inputDirPath) + } + case finalizer.Role != "": + if !filepath.IsAbs(finalizer.Role) { + return fmt.Errorf("finalizer role path must be absolute for %v", r.GVK) + } + r.finalizerCmdFunc = func(ident, inputDirPath string) *exec.Cmd { + path := strings.TrimRight(finalizer.Role, "/") + rolePath, roleName := filepath.Split(path) + return exec.Command("ansible-runner", "-vv", "--role", roleName, "--roles-path", rolePath, "--hosts", "localhost", "-i", ident, "run", inputDirPath) + } + case len(finalizer.Vars) != 0: + r.finalizerCmdFunc = r.cmdFunc + } + return nil +} + +// makeParameters - creates the extravars parameters for ansible +// The resulting structure in json is: +// { "meta": { +// "name": , +// "namespace": , +// }, +// , +// ... +// __: { +// +// │ ├── Dockerfile +// │ ├── roles +// │ │ └── +// │ ├── watches.yaml +// │ ├── deploy +// │ │ ├── -CRD.yaml +// │ │ ├── rbac.yaml +// │ │ ├── operator.yaml +// │ ├ └── cr.yaml + func (g *Generator) Render() error { - if err := g.generateDirStructure(); err != nil { + switch g.operatorType { + case ansibleOperatorType: + if err := g.renderAnsibleOperator(); err != nil { + return err + } + case goOperatorType: + if err := g.renderGoOperator(); err != nil { + return err + } + default: + return fmt.Errorf("unexpected operator type [%v]", g.operatorType) + } + return nil +} + +func (g *Generator) renderAnsibleOperator() error { + if err := g.generateAnsibleDirStructure(); err != nil { + return err + } + if err := g.renderTmp(); err != nil { + return err + } + if err := g.renderRole(); err != nil { + return err + } + if err := g.renderWatches(); err != nil { + return err + } + if err := g.renderPlaybook(); err != nil { + return err + } + return g.renderDeploy() +} + +func (g *Generator) renderRole() error { + fmt.Printf("Rendering Ansible Galaxy role [%v/%v/%v]...\n", g.projectName, rolesDir, g.kind) + agcmd := exec.Command(filepath.Join(g.projectName, galaxyInitCmd)) + output, err := agcmd.CombinedOutput() + if err != nil { + fmt.Printf("Rendering Ansible Galaxy role failed: [%v], Output: %s", err.Error(), string(output)) + return err + } + // Clean up tmp/init + fmt.Printf("Cleaning up %v\n", filepath.Join(g.projectName, initDir)) + err = os.RemoveAll(filepath.Join(g.projectName, initDir)) + if err != nil { + return err + } + return nil +} + +func (g *Generator) renderPlaybook() error { + if !g.generatePlaybook { + return nil + } + buf := &bytes.Buffer{} + bTd := tmplData{ + Kind: g.kind, + } + + if err := renderFile(buf, playbook, playbookTmpl, bTd); err != nil { + return err + } + if err := writeFileAndPrint(filepath.Join(g.projectName, playbook), buf.Bytes(), defaultFileMode); err != nil { + return err + } + return nil +} + +func (g *Generator) renderWatches() error { + buf := &bytes.Buffer{} + bTd := tmplData{ + GroupName: groupName(g.apiVersion), + Version: version(g.apiVersion), + Kind: g.kind, + GeneratePlaybook: g.generatePlaybook, + } + + if err := renderFile(buf, watches, watchesTmpl, bTd); err != nil { + return err + } + if err := writeFileAndPrint(filepath.Join(g.projectName, watches), buf.Bytes(), defaultFileMode); err != nil { + return err + } + return nil +} + +func (g *Generator) renderGoOperator() error { + if err := g.generateGoDirStructure(); err != nil { return err } @@ -197,7 +329,7 @@ func renderConfigFiles(configDir, apiVersion, kind, projectName string) error { func (g *Generator) renderDeploy() error { dp := filepath.Join(g.projectName, deployDir) - return renderDeployFiles(dp, g.projectName, g.apiVersion, g.kind) + return renderDeployFiles(dp, g.projectName, g.apiVersion, g.kind, g.operatorType) } func renderRBAC(deployDir, projectName, groupName string) error { @@ -209,10 +341,34 @@ func renderRBAC(deployDir, projectName, groupName string) error { return renderWriteFile(filepath.Join(deployDir, rbacYaml), rbacTmplName, rbacYamlTmpl, td) } -func renderDeployFiles(deployDir, projectName, apiVersion, kind string) error { +func RenderDeployCrdFiles(deployPath, apiVersion, kind string) error { + crTd := tmplData{ + APIVersion: apiVersion, + Kind: kind, + } + crFilePath := filepath.Join(deployPath, + groupName(apiVersion)+"_"+version(apiVersion)+"_"+strings.ToLower(kind)+"_cr.yaml") + if err := renderWriteFile(crFilePath, crFilePath, crYamlTmpl, crTd); err != nil { + return err + } + + crdTd := tmplData{ + Kind: kind, + KindSingular: strings.ToLower(kind), + KindPlural: toPlural(strings.ToLower(kind)), + GroupName: groupName(apiVersion), + Version: version(apiVersion), + } + crdFilePath := filepath.Join(deployPath, + groupName(apiVersion)+"_"+version(apiVersion)+"_"+strings.ToLower(kind)+"_crd.yaml") + return renderWriteFile(crdFilePath, crdFilePath, crdYamlTmpl, crdTd) +} + +func renderDeployFiles(deployDir, projectName, apiVersion, kind, operatorType string) error { rbacTd := tmplData{ - ProjectName: projectName, - GroupName: groupName(apiVersion), + ProjectName: projectName, + GroupName: groupName(apiVersion), + IsGoOperator: isGoOperator(operatorType), } if err := renderWriteFile(filepath.Join(deployDir, rbacYaml), rbacTmplName, rbacYamlTmpl, rbacTd); err != nil { return err @@ -233,19 +389,38 @@ func renderDeployFiles(deployDir, projectName, apiVersion, kind string) error { APIVersion: apiVersion, Kind: kind, } - return renderWriteFile(filepath.Join(deployDir, crYaml), crTmplName, crYamlTmpl, crTd) -} + if err := renderWriteFile(filepath.Join(deployDir, crYaml), crTmplName, crYamlTmpl, crTd); err != nil { + return err + } -// RenderOperatorYaml generates "deploy/operator.yaml" -func RenderOperatorYaml(c *Config, image string) error { - td := tmplData{ - ProjectName: c.ProjectName, - Image: image, + // Service account file is only needed for Go operator + if operatorType == goOperatorType { + saTd := tmplData{ + ProjectName: projectName, + } + if err := renderWriteFile(filepath.Join(deployDir, saYaml), saTmplName, saYamlTmpl, saTd); err != nil { + return err + } + } + + opTd := tmplData{ + ProjectName: projectName, + Image: "REPLACE_IMAGE", MetricsPort: k8sutil.PrometheusMetricsPort, MetricsPortName: k8sutil.PrometheusMetricsPortName, OperatorNameEnv: k8sutil.OperatorNameEnvVar, + IsGoOperator: isGoOperator(operatorType), } - return renderWriteFile(operatorYaml, operatorTmplName, operatorYamlTmpl, td) + return renderWriteFile(filepath.Join(deployDir, "operator.yaml"), operatorTmplName, operatorYamlTmpl, opTd) +} + +func RenderTestYaml(c *Config, image string) error { + opTd := tmplData{ + ProjectName: c.ProjectName, + Image: image, + TestNamespaceEnv: test.TestNamespaceEnv, + } + return renderWriteFile(filepath.Join(deployDir, "test-pod.yaml"), testYamlName, testYamlTmpl, opTd) } // RenderOlmCatalog generates catalog manifests "deploy/olm-catalog/*" @@ -303,13 +478,21 @@ func getCSVName(name, version string) string { } func (g *Generator) renderTmp() error { - bDir := filepath.Join(g.projectName, buildDir) - if err := renderBuildFiles(bDir, g.repoPath, g.projectName); err != nil { - return err + switch g.operatorType { + case goOperatorType: + cDir := filepath.Join(g.projectName, codegenDir) + if err := renderCodegenFiles(cDir, g.repoPath, apiDirName(g.apiVersion), version(g.apiVersion), g.projectName); err != nil { + return err + } + case ansibleOperatorType: + iDir := filepath.Join(g.projectName, initDir) + if err := renderInitFiles(iDir, g.repoPath, g.projectName, g.kind); err != nil { + return err + } } - cDir := filepath.Join(g.projectName, codegenDir) - return renderCodegenFiles(cDir, g.repoPath, apiDirName(g.apiVersion), version(g.apiVersion), g.projectName) + bDir := filepath.Join(g.projectName, buildDir) + return renderBuildFiles(bDir, g.repoPath, g.projectName, g.operatorType, g.generatePlaybook) } func (g *Generator) renderVersion() error { @@ -320,40 +503,51 @@ func (g *Generator) renderVersion() error { return renderWriteFile(filepath.Join(g.projectName, versionDir, versionfile), "version/version.go", versionTmpl, td) } -func renderBuildFiles(buildDir, repoPath, projectName string) error { - buf := &bytes.Buffer{} - bTd := tmplData{ - ProjectName: projectName, - RepoPath: repoPath, +func renderBuildFiles(buildDir, repoPath, projectName, operatorType string, generatePlaybook bool) error { + var dockerFileTmplName string + switch operatorType { + case goOperatorType: + dockerFileTmplName = dockerFileTmpl + case ansibleOperatorType: + dockerFileTmplName = dockerFileAnsibleTmpl } - if err := renderFile(buf, "tmp/build/build.sh", buildTmpl, bTd); err != nil { - return err - } - if err := writeFileAndPrint(filepath.Join(buildDir, build), buf.Bytes(), defaultExecFileMode); err != nil { - return err + dTd := tmplData{ + ProjectName: projectName, + GeneratePlaybook: generatePlaybook, } - buf = &bytes.Buffer{} - if err := renderDockerBuildFile(buf); err != nil { - return err - } - if err := writeFileAndPrint(filepath.Join(buildDir, dockerBuild), buf.Bytes(), defaultExecFileMode); err != nil { + if err := renderWriteFile(filepath.Join(buildDir, dockerfile), "tmp/build/Dockerfile", dockerFileTmplName, dTd); err != nil { return err } + return RenderTestingContainerFiles(buildDir, projectName) +} + +func RenderTestingContainerFiles(buildDir, projectName string) error { dTd := tmplData{ ProjectName: projectName, } - if err := renderFile(buf, "tmp/build/Dockerfile", dockerFileTmpl, dTd); err != nil { + if err := renderWriteFile(filepath.Join(buildDir, "test-framework", testingDockerfile), "tmp/build/test-framework/Dockerfile", testingDockerFileTmpl, dTd); err != nil { return err } - return renderWriteFile(filepath.Join(buildDir, dockerfile), "tmp/build/Dockerfile", dockerFileTmpl, dTd) + buf := &bytes.Buffer{} + if err := renderFile(buf, filepath.Join(buildDir, goTest), goTestScript, tmplData{}); err != nil { + return err + } + return writeFileAndPrint(filepath.Join(buildDir, goTest), buf.Bytes(), defaultExecFileMode) } -func renderDockerBuildFile(w io.Writer) error { - _, err := w.Write([]byte(dockerBuildTmpl)) - return err +func renderInitFiles(initDir, repoPath, projectName, kind string) error { + buf := &bytes.Buffer{} + iTd := tmplData{ + Kind: kind, + Name: projectName, + } + if err := renderFile(buf, galaxyInitCmd, galaxyInitTmpl, iTd); err != nil { + return err + } + return writeFileAndPrint(filepath.Join(initDir, galaxyInit), buf.Bytes(), defaultExecFileMode) } func renderCodegenFiles(codegenDir, repoPath, apiDirName, version, projectName string) error { @@ -461,10 +655,17 @@ type tmplData struct { CRDVersion string CSVName string CatalogVersion string + + // for test framework + TestNamespaceEnv string + + // Ansible Operator specific vars + GeneratePlaybook bool + IsGoOperator bool } -// Creates all the necesary directories for the generated files -func (g *Generator) generateDirStructure() error { +// Creates all the necesary directories for the generated files for Go Operator +func (g *Generator) generateGoDirStructure() error { dirsToCreate := []string{ g.projectName, filepath.Join(g.projectName, cmdDir, g.projectName), @@ -473,6 +674,7 @@ func (g *Generator) generateDirStructure() error { filepath.Join(g.projectName, olmCatalogDir), filepath.Join(g.projectName, buildDir), filepath.Join(g.projectName, codegenDir), + filepath.Join(g.projectName, dockerTestDir), filepath.Join(g.projectName, versionDir), filepath.Join(g.projectName, apisDir, apiDirName(g.apiVersion), version(g.apiVersion)), filepath.Join(g.projectName, stubDir), @@ -487,6 +689,25 @@ func (g *Generator) generateDirStructure() error { return nil } +// Creates all the necesary directories for the generated files for Ansible Operator +func (g *Generator) generateAnsibleDirStructure() error { + dirsToCreate := []string{ + g.projectName, + filepath.Join(g.projectName, deployDir), + filepath.Join(g.projectName, initDir), + filepath.Join(g.projectName, buildDir), + filepath.Join(g.projectName, rolesDir), + } + + for _, dir := range dirsToCreate { + if err := os.MkdirAll(dir, defaultDirFileMode); err != nil { + return err + } + } + + return nil +} + // Renders a file given a template, and fills in template fields according to values passed in the tmplData struct func renderFile(w io.Writer, fileLoc string, fileTmpl string, info tmplData) error { t := template.New(fileLoc) @@ -520,6 +741,9 @@ func apiDirName(apiVersion string) string { // Writes file to a given path and data buffer, as well as prints out a message confirming creation of a file func writeFileAndPrint(filePath string, data []byte, fileMode os.FileMode) error { + if err := os.MkdirAll(filepath.Dir(filePath), defaultDirFileMode); err != nil { + return err + } if err := ioutil.WriteFile(filePath, data, fileMode); err != nil { return err } @@ -541,3 +765,10 @@ func renderWriteFile(filePath string, fileLoc string, fileTmpl string, info tmpl return nil } + +func isGoOperator(operatorType string) bool { + if operatorType == "go" { + return true + } + return false +} diff --git a/vendor/github.com/operator-framework/operator-sdk/pkg/generator/generator_test.go b/vendor/github.com/operator-framework/operator-sdk/pkg/generator/generator_test.go index 92130ff094..083727417a 100644 --- a/vendor/github.com/operator-framework/operator-sdk/pkg/generator/generator_test.go +++ b/vendor/github.com/operator-framework/operator-sdk/pkg/generator/generator_test.go @@ -16,6 +16,8 @@ package generator import ( "bytes" + "io/ioutil" + "os" "path/filepath" "strings" "testing" @@ -89,13 +91,23 @@ import ( "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime/schema" + "github.com/prometheus/client_golang/prometheus" ) -func NewHandler() sdk.Handler { - return &Handler{} +func NewHandler(m *Metrics) sdk.Handler { + return &Handler{ + metrics: m, + } +} + +type Metrics struct { + operatorErrors prometheus.Counter } type Handler struct { + // Metrics example + metrics *Metrics + // Fill me } @@ -105,6 +117,8 @@ func (h *Handler) Handle(ctx context.Context, event sdk.Event) error { err := sdk.Create(newbusyBoxPod(o)) if err != nil && !errors.IsAlreadyExists(err) { logrus.Errorf("failed to create busybox pod : %v", err) + // increment error metric + h.metrics.operatorErrors.Inc() return err } } @@ -137,13 +151,25 @@ func newbusyBoxPod(cr *v1alpha1.AppService) *corev1.Pod { Containers: []corev1.Container{ { Name: "busybox", - Image: "busybox", + Image: "docker.io/busybox", Command: []string{"sleep", "3600"}, }, }, }, } } + +func RegisterOperatorMetrics() (*Metrics, error) { + operatorErrors := prometheus.NewCounter(prometheus.CounterOpts{ + Name: "memcached_operator_reconcile_errors_total", + Help: "Number of errors that occurred while reconciling the memcached deployment", + }) + err := prometheus.Register(operatorErrors) + if err != nil { + return nil, err + } + return &Metrics{operatorErrors: operatorErrors}, nil +} ` func TestGenHandler(t *testing.T) { @@ -197,6 +223,7 @@ spec: labels: name: app-operator spec: + serviceAccountName: app-operator containers: - name: app-operator image: quay.io/example-inc/app-operator:0.0.1 @@ -215,6 +242,36 @@ spec: value: "app-operator" ` +const ansibleOperatorYamlExp = `apiVersion: apps/v1 +kind: Deployment +metadata: + name: app-operator +spec: + replicas: 1 + selector: + matchLabels: + name: app-operator + template: + metadata: + labels: + name: app-operator + spec: + containers: + - name: app-operator + image: quay.io/example-inc/app-operator:0.0.1 + ports: + - containerPort: 60000 + name: metrics + imagePullPolicy: Always + env: + - name: WATCH_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: OPERATOR_NAME + value: "app-operator" +` + const rbacYamlExp = `kind: Role apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: @@ -253,16 +310,71 @@ rules: kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: - name: default-account-app-operator + name: app-operator subjects: - kind: ServiceAccount - name: default + name: app-operator roleRef: kind: Role name: app-operator apiGroup: rbac.authorization.k8s.io ` +const rbacYamlAnsibleExp = `kind: ClusterRole +apiVersion: rbac.authorization.k8s.io/v1beta1 +metadata: + name: app-operator +rules: +- apiGroups: + - app.example.com + resources: + - "*" + verbs: + - "*" +- apiGroups: + - "" + resources: + - pods + - services + - endpoints + - persistentvolumeclaims + - events + - configmaps + - secrets + verbs: + - "*" +- apiGroups: + - apps + resources: + - deployments + - daemonsets + - replicasets + - statefulsets + verbs: + - "*" + +--- + +kind: ClusterRoleBinding +apiVersion: rbac.authorization.k8s.io/v1beta1 +metadata: + name: app-operator +subjects: +- kind: ServiceAccount + name: default + namespace: default +roleRef: + kind: ClusterRole + name: app-operator + apiGroup: rbac.authorization.k8s.io +` + +const saYamlExp = `apiVersion: v1 +kind: ServiceAccount +metadata: + name: app-operator +` + func TestGenDeploy(t *testing.T) { buf := &bytes.Buffer{} crdTd := tmplData{ @@ -288,6 +400,7 @@ func TestGenDeploy(t *testing.T) { MetricsPort: k8sutil.PrometheusMetricsPort, MetricsPortName: k8sutil.PrometheusMetricsPortName, OperatorNameEnv: k8sutil.OperatorNameEnvVar, + IsGoOperator: true, } if err := renderFile(buf, operatorTmplName, operatorYamlTmpl, td); err != nil { t.Error(err) @@ -298,8 +411,27 @@ func TestGenDeploy(t *testing.T) { t.Errorf("\nTest failed. Below is the diff of the expected vs actual results.\nRed text is missing and green text is extra.\n\n" + dmp.DiffPrettyText(diffs)) } + // Test Ansible Operator operator.yaml + buf = &bytes.Buffer{} + td = tmplData{ + ProjectName: appProjectName, + Image: appImage, + MetricsPort: k8sutil.PrometheusMetricsPort, + MetricsPortName: k8sutil.PrometheusMetricsPortName, + OperatorNameEnv: k8sutil.OperatorNameEnvVar, + IsGoOperator: false, + } + if err := renderFile(buf, operatorTmplName, operatorYamlTmpl, td); err != nil { + t.Error(err) + } + if ansibleOperatorYamlExp != buf.String() { + dmp := diffmatchpatch.New() + diffs := dmp.DiffMain(ansibleOperatorYamlExp, buf.String(), false) + t.Errorf("\nTest failed. Below is the diff of the expected vs actual results.\nRed text is missing and green text is extra.\n\n" + dmp.DiffPrettyText(diffs)) + } + buf = &bytes.Buffer{} - if err := renderFile(buf, rbacTmplName, rbacYamlTmpl, tmplData{ProjectName: appProjectName, GroupName: appGroupName}); err != nil { + if err := renderFile(buf, rbacTmplName, rbacYamlTmpl, tmplData{ProjectName: appProjectName, GroupName: appGroupName, IsGoOperator: true}); err != nil { t.Error(err) } if rbacYamlExp != buf.String() { @@ -307,6 +439,26 @@ func TestGenDeploy(t *testing.T) { diffs := dmp.DiffMain(rbacYamlExp, buf.String(), false) t.Errorf("\nTest failed. Below is the diff of the expected vs actual results.\nRed text is missing and green text is extra.\n\n" + dmp.DiffPrettyText(diffs)) } + + // Test Ansible Operator rbac.yaml + buf = &bytes.Buffer{} + if err := renderFile(buf, rbacTmplName, rbacYamlTmpl, tmplData{ProjectName: appProjectName, GroupName: appGroupName, IsGoOperator: false}); err != nil { + t.Error(err) + } + if rbacYamlAnsibleExp != buf.String() { + dmp := diffmatchpatch.New() + diffs := dmp.DiffMain(rbacYamlAnsibleExp, buf.String(), false) + t.Errorf("\nTest failed. Below is the diff of the expected vs actual results.\nRed text is missing and green text is extra.\n\n" + dmp.DiffPrettyText(diffs)) + } + buf = &bytes.Buffer{} + if err := renderFile(buf, saTmplName, saYamlTmpl, tmplData{ProjectName: appProjectName}); err != nil { + t.Error(err) + } + if saYamlExp != buf.String() { + dmp := diffmatchpatch.New() + diffs := dmp.DiffMain(saYamlExp, buf.String(), false) + t.Errorf("\nTest failed. Below is the diff of the expected vs actual results.\nRed text is missing and green text is extra.\n\n" + dmp.DiffPrettyText(diffs)) + } } const registerExp = `package v1alpha1 @@ -439,6 +591,11 @@ func main() { printVersion() sdk.ExposeMetricsPort() + metrics, err := stub.RegisterOperatorMetrics() + if err != nil { + logrus.Errorf("failed to register operator specific metrics: %v", err) + } + h := stub.NewHandler(metrics) resource := "app.example.com/v1alpha1" kind := "AppService" @@ -449,7 +606,7 @@ func main() { resyncPeriod := time.Duration(5) * time.Second logrus.Infof("Watching %s, %s, %s, %d", resource, kind, namespace, resyncPeriod) sdk.Watch(resource, kind, namespace, resyncPeriod) - sdk.Handle(stub.NewHandler()) + sdk.Handle(h) sdk.Run(context.TODO()) } ` @@ -492,8 +649,13 @@ mkdir -p ${BIN_DIR} PROJECT_NAME="app-operator" REPO_PATH="github.com/example-inc/app-operator" BUILD_PATH="${REPO_PATH}/cmd/${PROJECT_NAME}" +TEST_PATH="${REPO_PATH}/${TEST_LOCATION}" echo "building "${PROJECT_NAME}"..." GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o ${BIN_DIR}/${PROJECT_NAME} $BUILD_PATH +if $ENABLE_TESTS ; then + echo "building "${PROJECT_NAME}-test"..." + GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go test -c -o ${BIN_DIR}/${PROJECT_NAME}-test $TEST_PATH +fi ` const dockerFileExp = `FROM alpine:3.6 @@ -504,44 +666,80 @@ USER app-operator ADD tmp/_output/bin/app-operator /usr/local/bin/app-operator ` +const dockerFileAnsibleNoPlaybookExp = `FROM quay.io/water-hole/ansible-operator + +COPY roles/ ${HOME}/roles/ +COPY watches.yaml ${HOME}/watches.yaml +` + +const dockerFileAnsiblePlaybookExp = `FROM quay.io/water-hole/ansible-operator + +COPY roles/ ${HOME}/roles/ +COPY playbook.yaml ${HOME}/playbook.yaml +COPY watches.yaml ${HOME}/watches.yaml +` + func TestGenBuild(t *testing.T) { buf := &bytes.Buffer{} - bTd := tmplData{ + dTd := tmplData{ ProjectName: appProjectName, - RepoPath: appRepoPath, } - if err := renderFile(buf, "tmp/build/build.sh", buildTmpl, bTd); err != nil { + if err := renderFile(buf, "tmp/build/Dockerfile", dockerFileTmpl, dTd); err != nil { t.Error(err) return } - if buildExp != buf.String() { + if dockerFileExp != buf.String() { dmp := diffmatchpatch.New() - diffs := dmp.DiffMain(buildExp, buf.String(), false) + diffs := dmp.DiffMain(dockerFileExp, buf.String(), false) t.Errorf("\nTest failed. Below is the diff of the expected vs actual results.\nRed text is missing and green text is extra.\n\n" + dmp.DiffPrettyText(diffs)) } + // Test Ansible Operator Dockerfile with no playbook buf = &bytes.Buffer{} - if err := renderDockerBuildFile(buf); err != nil { + dTd = tmplData{ + ProjectName: appProjectName, + GeneratePlaybook: false, + } + if err := renderFile(buf, "tmp/build/Dockerfile", dockerFileAnsibleTmpl, dTd); err != nil { t.Error(err) return } - if dockerBuildTmpl != buf.String() { + if dockerFileAnsibleNoPlaybookExp != buf.String() { dmp := diffmatchpatch.New() - diffs := dmp.DiffMain(dockerBuildTmpl, buf.String(), false) + diffs := dmp.DiffMain(dockerFileAnsibleNoPlaybookExp, buf.String(), false) t.Errorf("\nTest failed. Below is the diff of the expected vs actual results.\nRed text is missing and green text is extra.\n\n" + dmp.DiffPrettyText(diffs)) } + // Test Ansible Operator Dockerfile with playbook generation buf = &bytes.Buffer{} - dTd := tmplData{ - ProjectName: appProjectName, + dTd = tmplData{ + ProjectName: appProjectName, + GeneratePlaybook: true, } - if err := renderFile(buf, "tmp/build/Dockerfile", dockerFileTmpl, dTd); err != nil { + if err := renderFile(buf, "tmp/build/Dockerfile", dockerFileAnsibleTmpl, dTd); err != nil { t.Error(err) return } - if dockerFileExp != buf.String() { + if dockerFileAnsiblePlaybookExp != buf.String() { dmp := diffmatchpatch.New() - diffs := dmp.DiffMain(dockerFileExp, buf.String(), false) + diffs := dmp.DiffMain(dockerFileAnsiblePlaybookExp, buf.String(), false) t.Errorf("\nTest failed. Below is the diff of the expected vs actual results.\nRed text is missing and green text is extra.\n\n" + dmp.DiffPrettyText(diffs)) } } + +func TestWriteFileAndPrint(t *testing.T) { + deployDir, err := ioutil.TempDir("", "test-write-file-and-print") + if err != nil { + t.Fatal(err) + } + + defer os.RemoveAll(deployDir) + + olmCatalogPackagePath := filepath.Join(deployDir, olmCatalogDir, catalogPackageYaml) + if err = writeFileAndPrint(olmCatalogPackagePath, []byte("sometext"), defaultFileMode); err != nil { + t.Fatalf("\nTest failed. Failed to write file and print: %v", err) + } + if _, err := os.Stat(olmCatalogPackagePath); os.IsNotExist(err) { + t.Errorf("\nTest failed. Failed to create %s", olmCatalogPackagePath) + } +} diff --git a/vendor/github.com/operator-framework/operator-sdk/pkg/generator/templates.go b/vendor/github.com/operator-framework/operator-sdk/pkg/generator/templates.go index d85ad0dff3..0c91cabc12 100644 --- a/vendor/github.com/operator-framework/operator-sdk/pkg/generator/templates.go +++ b/vendor/github.com/operator-framework/operator-sdk/pkg/generator/templates.go @@ -42,8 +42,8 @@ spec: version: {{.Version}} ` -const catalogCSVTmpl = `apiVersion: app.coreos.com/v1alpha1 -kind: ClusterServiceVersion-v1 +const catalogCSVTmpl = `apiVersion: operators.coreos.com/v1alpha1 +kind: ClusterServiceVersion metadata: name: {{.CSVName}} namespace: placeholder @@ -153,6 +153,11 @@ func main() { printVersion() sdk.ExposeMetricsPort() + metrics, err := stub.RegisterOperatorMetrics() + if err != nil { + logrus.Errorf("failed to register operator specific metrics: %v", err) + } + h := stub.NewHandler(metrics) resource := "{{.APIVersion}}" kind := "{{.Kind}}" @@ -163,7 +168,7 @@ func main() { resyncPeriod := time.Duration(5) * time.Second logrus.Infof("Watching %s, %s, %s, %d", resource, kind, namespace, resyncPeriod) sdk.Watch(resource, kind, namespace, resyncPeriod) - sdk.Handle(stub.NewHandler()) + sdk.Handle(h) sdk.Run(context.TODO()) } ` @@ -182,13 +187,23 @@ import ( "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime/schema" + "github.com/prometheus/client_golang/prometheus" ) -func NewHandler() sdk.Handler { - return &Handler{} +func NewHandler(m *Metrics) sdk.Handler { + return &Handler{ + metrics: m, + } +} + +type Metrics struct { + operatorErrors prometheus.Counter } type Handler struct { + // Metrics example + metrics *Metrics + // Fill me } @@ -198,6 +213,8 @@ func (h *Handler) Handle(ctx context.Context, event sdk.Event) error { err := sdk.Create(newbusyBoxPod(o)) if err != nil && !errors.IsAlreadyExists(err) { logrus.Errorf("failed to create busybox pod : %v", err) + // increment error metric + h.metrics.operatorErrors.Inc() return err } } @@ -230,13 +247,25 @@ func newbusyBoxPod(cr *{{.Version}}.{{.Kind}}) *corev1.Pod { Containers: []corev1.Container{ { Name: "busybox", - Image: "busybox", + Image: "docker.io/busybox", Command: []string{"sleep", "3600"}, }, }, }, } } + +func RegisterOperatorMetrics() (*Metrics, error) { + operatorErrors := prometheus.NewCounter(prometheus.CounterOpts{ + Name: "memcached_operator_reconcile_errors_total", + Help: "Number of errors that occurred while reconciling the memcached deployment", + }) + err := prometheus.Register(operatorErrors) + if err != nil { + return nil, err + } + return &Metrics{operatorErrors: operatorErrors}, nil +} ` const gopkgTomlTmpl = ` @@ -255,32 +284,32 @@ required = [ [[override]] name = "k8s.io/code-generator" - # revision for tag "kubernetes-1.10.1" - revision = "7ead8f38b01cf8653249f5af80ce7b2c8aba12e2" + # revision for tag "kubernetes-1.11.2" + revision = "6702109cc68eb6fe6350b83e14407c8d7309fd1a" [[override]] name = "k8s.io/api" - # revision for tag "kubernetes-1.10.1" - revision = "73d903622b7391f3312dcbac6483fed484e185f8" + # revision for tag "kubernetes-1.11.2" + revision = "2d6f90ab1293a1fb871cf149423ebb72aa7423aa" [[override]] name = "k8s.io/apiextensions-apiserver" - # revision for tag "kubernetes-1.10.1" - revision = "4347b330d0ff094db860f2f75fa725b4f4b53618" + # revision for tag "kubernetes-1.11.2" + revision = "408db4a50408e2149acbd657bceb2480c13cb0a4" [[override]] name = "k8s.io/apimachinery" - # revision for tag "kubernetes-1.10.1" - revision = "302974c03f7e50f16561ba237db776ab93594ef6" + # revision for tag "kubernetes-1.11.2" + revision = "103fd098999dc9c0c88536f5c9ad2e5da39373ae" [[override]] name = "k8s.io/client-go" - # revision for tag "kubernetes-1.10.1" - revision = "989be4278f353e42f26c416c53757d16fcff77db" + # revision for tag "kubernetes-1.11.2" + revision = "1f13a808da65775f22cbf47862c4e5898d8f4ca1" [[override]] name = "sigs.k8s.io/controller-runtime" - revision = "60bb251ad86f9b313653618aad0c2c53f41a6625" + version = "v0.1.3" [prune] go-tests = true @@ -295,8 +324,8 @@ required = [ [[constraint]] name = "github.com/operator-framework/operator-sdk" # The version rule is used for a specific release and the master branch for in between releases. - branch = "master" - # version = "=v0.0.5" + # branch = "master" #osdk_branch_annotation + version = "=v0.0.7" #osdk_version_annotation ` const projectGitignoreTmpl = ` @@ -424,6 +453,24 @@ spec: version: {{.Version}} ` +const testYamlTmpl = `apiVersion: v1 +kind: Pod +metadata: + name: {{.ProjectName}}-test +spec: + restartPolicy: Never + containers: + - name: {{.ProjectName}}-test + image: {{.Image}} + imagePullPolicy: Always + command: ["/go-test.sh"] + env: + - name: {{.TestNamespaceEnv}} + valueFrom: + fieldRef: + fieldPath: metadata.namespace +` + const operatorYamlTmpl = `apiVersion: apps/v1 kind: Deployment metadata: @@ -438,15 +485,17 @@ spec: labels: name: {{.ProjectName}} spec: +{{- if .IsGoOperator }} + serviceAccountName: {{.ProjectName}}{{ end }} containers: - name: {{.ProjectName}} image: {{.Image}} ports: - containerPort: {{.MetricsPort}} name: {{.MetricsPortName}} - command: +{{ if .IsGoOperator }} command: - {{.ProjectName}} - imagePullPolicy: Always +{{ end }} imagePullPolicy: Always env: - name: WATCH_NAMESPACE valueFrom: @@ -456,7 +505,11 @@ spec: value: "{{.ProjectName}}" ` -const rbacYamlTmpl = `kind: Role +// For Ansible Operator we are assuming namespace: default on ClusterRoleBinding +// Documentation will tell user to update +const rbacYamlTmpl = `{{- if .IsGoOperator }}kind: Role +{{- else -}} +kind: ClusterRole{{ end }} apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: name: {{.ProjectName}} @@ -490,20 +543,35 @@ rules: - "*" --- - +{{ if .IsGoOperator }} kind: RoleBinding +{{- else }} +kind: ClusterRoleBinding{{ end }} apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: - name: default-account-{{.ProjectName}} + name: {{.ProjectName}} subjects: - kind: ServiceAccount +{{- if .IsGoOperator }} + name: {{.ProjectName}} +{{- else }} name: default + namespace: default{{ end }} roleRef: +{{- if .IsGoOperator }} kind: Role +{{- else }} + kind: ClusterRole{{ end }} name: {{.ProjectName}} apiGroup: rbac.authorization.k8s.io ` +const saYamlTmpl = `apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{.ProjectName}} +` + const crYamlTmpl = `apiVersion: "{{.APIVersion}}" kind: "{{.Kind}}" metadata: @@ -525,45 +593,62 @@ deepcopy \ {{.APIDirName}}:{{.Version}} \ --go-header-file "./tmp/codegen/boilerplate.go.txt" ` -const buildTmpl = `#!/usr/bin/env bash -set -o errexit -set -o nounset -set -o pipefail +const goTestScript = `#!/bin/sh -if ! which go > /dev/null; then - echo "golang needs to be installed" - exit 1 -fi +memcached-operator-test -test.parallel=1 -test.failfast -root=/ -kubeconfig=incluster -namespacedMan=namespaced.yaml -test.v +` + +const dockerFileTmpl = `FROM alpine:3.6 + +RUN adduser -D {{.ProjectName}} +USER {{.ProjectName}} -BIN_DIR="$(pwd)/tmp/_output/bin" -mkdir -p ${BIN_DIR} -PROJECT_NAME="{{.ProjectName}}" -REPO_PATH="{{.RepoPath}}" -BUILD_PATH="${REPO_PATH}/cmd/${PROJECT_NAME}" -echo "building "${PROJECT_NAME}"..." -GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o ${BIN_DIR}/${PROJECT_NAME} $BUILD_PATH +ADD tmp/_output/bin/{{.ProjectName}} /usr/local/bin/{{.ProjectName}} ` -const dockerBuildTmpl = `#!/usr/bin/env bash +const testingDockerFileTmpl = `ARG BASEIMAGE -if ! which docker > /dev/null; then - echo "docker needs to be installed" - exit 1 -fi +FROM ${BASEIMAGE} + +ADD tmp/_output/bin/memcached-operator-test /usr/local/bin/memcached-operator-test +ARG NAMESPACEDMAN +ADD $NAMESPACEDMAN /namespaced.yaml +ADD tmp/build/go-test.sh /go-test.sh +` -: ${IMAGE:?"Need to set IMAGE, e.g. gcr.io//-operator"} +// Ansible Operator files +const dockerFileAnsibleTmpl = `FROM quay.io/water-hole/ansible-operator -echo "building container ${IMAGE}..." -docker build -t "${IMAGE}" -f tmp/build/Dockerfile . +COPY roles/ ${HOME}/roles/ +{{- if .GeneratePlaybook }} +COPY playbook.yaml ${HOME}/playbook.yaml{{ end }} +COPY watches.yaml ${HOME}/watches.yaml ` -const dockerFileTmpl = `FROM alpine:3.6 +const watchesTmpl = `--- +- version: {{.Version}} + group: {{.GroupName}} + kind: {{.Kind}} +{{ if .GeneratePlaybook }} playbook: /opt/ansible/playbook.yaml{{ else }} role: /opt/ansible/roles/{{.Kind}}{{ end }} +` -RUN adduser -D {{.ProjectName}} -USER {{.ProjectName}} +const playbookTmpl = `- hosts: localhost + gather_facts: no + tasks: + - import_role: + name: "{{.Kind}}" +` -ADD tmp/_output/bin/{{.ProjectName}} /usr/local/bin/{{.ProjectName}} +const galaxyInitTmpl = `#!/usr/bin/env bash + +if ! which ansible-galaxy > /dev/null; then + echo "ansible needs to be installed" + exit 1 +fi + +echo "Initializing role skeleton..." +ansible-galaxy init --init-path={{.Name}}/roles/ {{.Kind}} ` // apiDocTmpl is the template for apis/../doc.go diff --git a/vendor/github.com/operator-framework/operator-sdk/pkg/k8sclient/client.go b/vendor/github.com/operator-framework/operator-sdk/pkg/k8sclient/client.go index fc78f67952..466bd3bdee 100644 --- a/vendor/github.com/operator-framework/operator-sdk/pkg/k8sclient/client.go +++ b/vendor/github.com/operator-framework/operator-sdk/pkg/k8sclient/client.go @@ -23,22 +23,20 @@ import ( "github.com/operator-framework/operator-sdk/pkg/util/k8sutil" - "k8s.io/apimachinery/pkg/api/meta" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/client-go/discovery" "k8s.io/client-go/discovery/cached" "k8s.io/client-go/dynamic" "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" + "k8s.io/client-go/restmapper" "k8s.io/client-go/tools/clientcmd" ) type resourceClientFactory struct { - restMapper *discovery.DeferredDiscoveryRESTMapper - clientPool dynamic.ClientPool - kubeClient kubernetes.Interface - kubeConfig *rest.Config + dynamicClient dynamic.Interface + restMapper *restmapper.DeferredDiscoveryRESTMapper + kubeClient kubernetes.Interface + kubeConfig *rest.Config } var ( @@ -51,16 +49,19 @@ var ( func newSingletonFactory() { kubeClient, kubeConfig := mustNewKubeClientAndConfig() cachedDiscoveryClient := cached.NewMemCacheClient(kubeClient.Discovery()) - restMapper := discovery.NewDeferredDiscoveryRESTMapper(cachedDiscoveryClient, meta.InterfacesForUnstructured) + restMapper := restmapper.NewDeferredDiscoveryRESTMapper(cachedDiscoveryClient) restMapper.Reset() - kubeConfig.ContentConfig = dynamic.ContentConfig() - clientPool := dynamic.NewClientPool(kubeConfig, restMapper, dynamic.LegacyAPIPathResolverFunc) + + dynamicClient, err := dynamic.NewForConfig(kubeConfig) + if err != nil { + panic(err) + } singletonFactory = &resourceClientFactory{ - kubeClient: kubeClient, - kubeConfig: kubeConfig, - restMapper: restMapper, - clientPool: clientPool, + kubeClient: kubeClient, + kubeConfig: kubeConfig, + dynamicClient: dynamicClient, + restMapper: restMapper, } singletonFactory.runBackgroundCacheReset(1 * time.Minute) } @@ -95,31 +96,23 @@ func (c *resourceClientFactory) GetResourceClient(apiVersion, kind, namespace st Kind: kind, } - client, err := c.clientPool.ClientForGroupVersionKind(gvk) - if err != nil { - return nil, "", fmt.Errorf("failed to get client for GroupVersionKind(%s): %v", gvk.String(), err) - } - resource, err := apiResource(gvk, c.restMapper) + gvr, err := gvkToGVR(gvk, c.restMapper) if err != nil { return nil, "", fmt.Errorf("failed to get resource type: %v", err) } - pluralName := resource.Name - resourceClient := client.Resource(resource, namespace) + pluralName := gvr.Resource + + resourceClient := c.dynamicClient.Resource(*gvr).Namespace(namespace) return resourceClient, pluralName, nil } -// apiResource consults the REST mapper to translate an tuple to a metav1.APIResource struct. -func apiResource(gvk schema.GroupVersionKind, restMapper *discovery.DeferredDiscoveryRESTMapper) (*metav1.APIResource, error) { +// apiResource consults the REST mapper to translate an tuple to a GroupVersionResource +func gvkToGVR(gvk schema.GroupVersionKind, restMapper *restmapper.DeferredDiscoveryRESTMapper) (*schema.GroupVersionResource, error) { mapping, err := restMapper.RESTMapping(gvk.GroupKind(), gvk.Version) if err != nil { return nil, fmt.Errorf("failed to get the resource REST mapping for GroupVersionKind(%s): %v", gvk.String(), err) } - resource := &metav1.APIResource{ - Name: mapping.Resource, - Namespaced: mapping.Scope == meta.RESTScopeNamespace, - Kind: gvk.Kind, - } - return resource, nil + return &mapping.Resource, nil } // mustNewKubeClientAndConfig returns the in-cluster config and kubernetes client diff --git a/vendor/github.com/operator-framework/operator-sdk/pkg/leader/doc.go b/vendor/github.com/operator-framework/operator-sdk/pkg/leader/doc.go new file mode 100644 index 0000000000..7c0771e9b3 --- /dev/null +++ b/vendor/github.com/operator-framework/operator-sdk/pkg/leader/doc.go @@ -0,0 +1,46 @@ +// Copyright 2018 The Operator-SDK 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 leader implements Leader For Life, a simple alternative to lease-based +leader election. + +Both the Leader For Life and lease-based approaches to leader election are +built on the concept that each candidate will attempt to create a resource with +the same GVK, namespace, and name. Whichever candidate succeeds becomes the +leader. The rest receive "already exists" errors and wait for a new +opportunity. + +Leases provide a way to indirectly observe whether the leader still exists. The +leader must periodically renew its lease, usually by updating a timestamp in +its lock record. If it fails to do so, it is presumed dead, and a new election +takes place. If the leader is in fact still alive but unreachable, it is +expected to gracefully step down. A variety of factors can cause a leader to +fail at updating its lease, but continue acting as the leader before succeeding +at stepping down. + +In the "leader for life" approach, a specific Pod is the leader. Once +established (by creating a lock record), the Pod is the leader until it is +destroyed. There is no possibility for multiple pods to think they are the +leader at the same time. The leader does not need to renew a lease, consider +stepping down, or do anything related to election activity once it becomes the +leader. + +The lock record in this case is a ConfigMap whose OwnerReference is set to the +Pod that is the leader. When the leader is destroyed, the ConfigMap gets +garbage-collected, enabling a different candidate Pod to become the leader. + +Leader for Life requires that all candidate Pods be in the same Namespace. +*/ +package leader diff --git a/vendor/github.com/operator-framework/operator-sdk/pkg/leader/leader.go b/vendor/github.com/operator-framework/operator-sdk/pkg/leader/leader.go new file mode 100644 index 0000000000..c589158fbe --- /dev/null +++ b/vendor/github.com/operator-framework/operator-sdk/pkg/leader/leader.go @@ -0,0 +1,187 @@ +// Copyright 2018 The Operator-SDK 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 leader + +import ( + "context" + "errors" + "io/ioutil" + "os" + "strings" + "time" + + "github.com/sirupsen/logrus" + corev1 "k8s.io/api/core/v1" + apierrors "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/wait" + "k8s.io/client-go/rest" + crclient "sigs.k8s.io/controller-runtime/pkg/client" +) + +// errNoNS indicates that a namespace could not be found for the current +// environment +var errNoNS = errors.New("namespace not found for current environment") + +// maxBackoffInterval defines the maximum amount of time to wait between +// attempts to become the leader. +const maxBackoffInterval = time.Second * 16 + +// Become ensures that the current pod is the leader within its namespace. If +// run outside a cluster, it will skip leader election and return nil. It +// continuously tries to create a ConfigMap with the provided name and the +// current pod set as the owner reference. Only one can exist at a time with +// the same name, so the pod that successfully creates the ConfigMap is the +// leader. Upon termination of that pod, the garbage collector will delete the +// ConfigMap, enabling a different pod to become the leader. +func Become(ctx context.Context, lockName string) error { + logrus.Info("trying to become the leader") + + ns, err := myNS() + if err != nil { + if err == errNoNS { + logrus.Info("Skipping leader election; not running in a cluster") + return nil + } + return err + } + + config, err := rest.InClusterConfig() + if err != nil { + return err + } + + client, err := crclient.New(config, crclient.Options{}) + if err != nil { + return err + } + + owner, err := myOwnerRef(ctx, client, ns) + if err != nil { + return err + } + + // check for existing lock from this pod, in case we got restarted + existing := &corev1.ConfigMap{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "v1", + Kind: "ConfigMap", + }, + } + key := crclient.ObjectKey{Namespace: ns, Name: lockName} + err = client.Get(ctx, key, existing) + + switch { + case err == nil: + for _, existingOwner := range existing.GetOwnerReferences() { + if existingOwner.Name == owner.Name { + logrus.Info("Found existing lock with my name. I was likely restarted.") + logrus.Info("Continuing as the leader.") + return nil + } else { + logrus.Infof("Found existing lock from %s", existingOwner.Name) + } + } + case apierrors.IsNotFound(err): + logrus.Info("No pre-existing lock was found.") + default: + logrus.Error("unknown error trying to get ConfigMap") + return err + } + + cm := &corev1.ConfigMap{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "v1", + Kind: "ConfigMap", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: lockName, + Namespace: ns, + OwnerReferences: []metav1.OwnerReference{*owner}, + }, + } + + // try to create a lock + backoff := time.Second + for { + err := client.Create(ctx, cm) + switch { + case err == nil: + logrus.Info("Became the leader.") + return nil + case apierrors.IsAlreadyExists(err): + logrus.Info("Not the leader. Waiting.") + select { + case <-time.After(wait.Jitter(backoff, .2)): + if backoff < maxBackoffInterval { + backoff *= 2 + } + continue + case <-ctx.Done(): + return ctx.Err() + } + default: + logrus.Errorf("unknown error creating configmap: %v", err) + return err + } + } +} + +// myNS returns the name of the namespace in which this code is currently running. +func myNS() (string, error) { + nsBytes, err := ioutil.ReadFile("/var/run/secrets/kubernetes.io/serviceaccount/namespace") + if err != nil { + if os.IsNotExist(err) { + logrus.Debug("current namespace not found") + return "", errNoNS + } + return "", err + } + ns := strings.TrimSpace(string(nsBytes)) + logrus.Debugf("found namespace: %s", ns) + return ns, nil +} + +// myOwnerRef returns an OwnerReference that corresponds to the pod in which +// this code is currently running. +func myOwnerRef(ctx context.Context, client crclient.Client, ns string) (*metav1.OwnerReference, error) { + hostname, err := os.Hostname() + if err != nil { + return nil, err + } + logrus.Debugf("found hostname: %s", hostname) + + myPod := &corev1.Pod{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "v1", + Kind: "Pod", + }, + } + + key := crclient.ObjectKey{Namespace: ns, Name: hostname} + err = client.Get(ctx, key, myPod) + if err != nil { + logrus.Errorf("failed to get pod: %v", err) + return nil, err + } + + owner := &metav1.OwnerReference{ + APIVersion: "v1", + Kind: "Pod", + Name: myPod.ObjectMeta.Name, + UID: myPod.ObjectMeta.UID, + } + return owner, nil +} diff --git a/vendor/github.com/operator-framework/operator-sdk/pkg/sdk/action.go b/vendor/github.com/operator-framework/operator-sdk/pkg/sdk/action.go index 5e20931a95..d62df2d671 100644 --- a/vendor/github.com/operator-framework/operator-sdk/pkg/sdk/action.go +++ b/vendor/github.com/operator-framework/operator-sdk/pkg/sdk/action.go @@ -41,7 +41,10 @@ func Create(object Object) (err error) { return fmt.Errorf("failed to get resource client: %v", err) } - unstructObj := k8sutil.UnstructuredFromRuntimeObject(object) + unstructObj, err := k8sutil.UnstructuredFromRuntimeObject(object) + if err != nil { + return err + } unstructObj, err = resourceClient.Create(unstructObj) if err != nil { return err @@ -105,7 +108,10 @@ func Update(object Object) (err error) { return fmt.Errorf("failed to get resource client: %v", err) } - unstructObj := k8sutil.UnstructuredFromRuntimeObject(object) + unstructObj, err := k8sutil.UnstructuredFromRuntimeObject(object) + if err != nil { + return err + } unstructObj, err = resourceClient.Update(unstructObj) if err != nil { return err diff --git a/vendor/github.com/operator-framework/operator-sdk/pkg/sdk/api.go b/vendor/github.com/operator-framework/operator-sdk/pkg/sdk/api.go index 954e8f4726..56ef2fcc9a 100644 --- a/vendor/github.com/operator-framework/operator-sdk/pkg/sdk/api.go +++ b/vendor/github.com/operator-framework/operator-sdk/pkg/sdk/api.go @@ -54,7 +54,7 @@ func Watch(apiVersion, kind, namespace string, resyncPeriod time.Duration, opts } o := newWatchOp() o.applyOpts(opts) - informer := NewInformer(resourcePluralName, namespace, resourceClient, resyncPeriod, collector, o.numWorkers) + informer := NewInformer(resourcePluralName, namespace, resourceClient, resyncPeriod, collector, o.numWorkers, o.labelSelector) informers = append(informers, informer) } diff --git a/vendor/github.com/operator-framework/operator-sdk/pkg/sdk/informer-sync.go b/vendor/github.com/operator-framework/operator-sdk/pkg/sdk/informer-sync.go index 069ab9806b..e615894958 100644 --- a/vendor/github.com/operator-framework/operator-sdk/pkg/sdk/informer-sync.go +++ b/vendor/github.com/operator-framework/operator-sdk/pkg/sdk/informer-sync.go @@ -74,7 +74,10 @@ func (i *informer) sync(key string) error { } unstructObj := obj.(*unstructured.Unstructured).DeepCopy() - object := k8sutil.RuntimeObjectFromUnstructured(unstructObj) + object, err := k8sutil.RuntimeObjectFromUnstructured(unstructObj) + if err != nil { + return err + } event := Event{ Object: object, diff --git a/vendor/github.com/operator-framework/operator-sdk/pkg/sdk/informer.go b/vendor/github.com/operator-framework/operator-sdk/pkg/sdk/informer.go index 3cd466bd34..6a76559e77 100644 --- a/vendor/github.com/operator-framework/operator-sdk/pkg/sdk/informer.go +++ b/vendor/github.com/operator-framework/operator-sdk/pkg/sdk/informer.go @@ -46,7 +46,7 @@ type informer struct { numWorkers int } -func NewInformer(resourcePluralName, namespace string, resourceClient dynamic.ResourceInterface, resyncPeriod time.Duration, c *metrics.Collector, n int) Informer { +func NewInformer(resourcePluralName, namespace string, resourceClient dynamic.ResourceInterface, resyncPeriod time.Duration, c *metrics.Collector, n int, labelSelector string) Informer { i := &informer{ resourcePluralName: resourcePluralName, queue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), resourcePluralName), @@ -57,7 +57,7 @@ func NewInformer(resourcePluralName, namespace string, resourceClient dynamic.Re } i.sharedIndexInformer = cache.NewSharedIndexInformer( - newListWatcherFromResourceClient(resourceClient), &unstructured.Unstructured{}, resyncPeriod, cache.Indexers{}, + newListWatcherFromResourceClient(resourceClient, labelSelector), &unstructured.Unstructured{}, resyncPeriod, cache.Indexers{}, ) i.sharedIndexInformer.AddEventHandler(cache.ResourceEventHandlerFuncs{ AddFunc: i.handleAddResourceEvent, @@ -67,11 +67,17 @@ func NewInformer(resourcePluralName, namespace string, resourceClient dynamic.Re return i } -func newListWatcherFromResourceClient(resourceClient dynamic.ResourceInterface) *cache.ListWatch { +func newListWatcherFromResourceClient(resourceClient dynamic.ResourceInterface, labelSelector string) *cache.ListWatch { listFunc := func(options metav1.ListOptions) (runtime.Object, error) { + if labelSelector != "" { + options.LabelSelector = labelSelector + } return resourceClient.List(options) } watchFunc := func(options metav1.ListOptions) (watch.Interface, error) { + if labelSelector != "" { + options.LabelSelector = labelSelector + } return resourceClient.Watch(options) } return &cache.ListWatch{ListFunc: listFunc, WatchFunc: watchFunc} diff --git a/vendor/github.com/operator-framework/operator-sdk/pkg/sdk/watch-opt.go b/vendor/github.com/operator-framework/operator-sdk/pkg/sdk/watch-opt.go index 8c889eac44..c7103ea384 100644 --- a/vendor/github.com/operator-framework/operator-sdk/pkg/sdk/watch-opt.go +++ b/vendor/github.com/operator-framework/operator-sdk/pkg/sdk/watch-opt.go @@ -16,7 +16,8 @@ package sdk // WatchOp wraps all the options for Watch(). type watchOp struct { - numWorkers int + numWorkers int + labelSelector string } // NewWatchOp create a new deafult WatchOp @@ -47,3 +48,9 @@ func WithNumWorkers(numWorkers int) watchOption { op.numWorkers = numWorkers } } + +func WithLabelSelector(labelSelector string) watchOption { + return func(op *watchOp) { + op.labelSelector = labelSelector + } +} diff --git a/vendor/github.com/operator-framework/operator-sdk/pkg/test/client.go b/vendor/github.com/operator-framework/operator-sdk/pkg/test/client.go new file mode 100644 index 0000000000..f9b5f6227f --- /dev/null +++ b/vendor/github.com/operator-framework/operator-sdk/pkg/test/client.go @@ -0,0 +1,106 @@ +// Copyright 2018 The Operator-SDK 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 test + +import ( + goctx "context" + "fmt" + + apierrors "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/util/wait" + dynclient "sigs.k8s.io/controller-runtime/pkg/client" +) + +type frameworkClient struct { + dynclient.Client +} + +var _ FrameworkClient = &frameworkClient{} + +type FrameworkClient interface { + Get(gCtx goctx.Context, key dynclient.ObjectKey, obj runtime.Object) error + List(gCtx goctx.Context, opts *dynclient.ListOptions, list runtime.Object) error + Create(gCtx goctx.Context, obj runtime.Object, cleanupOptions *CleanupOptions) error + Delete(gCtx goctx.Context, obj runtime.Object, opts ...dynclient.DeleteOptionFunc) error + Update(gCtx goctx.Context, obj runtime.Object) error +} + +// Create uses the dynamic client to create an object and then adds a +// cleanup function to delete it when Cleanup is called. In addition to +// the standard controller-runtime client options +func (f *frameworkClient) Create(gCtx goctx.Context, obj runtime.Object, cleanupOptions *CleanupOptions) error { + objCopy := obj.DeepCopyObject() + err := f.Client.Create(gCtx, obj) + if err != nil { + return err + } + // if no test context exists, cannot add finalizer function or print to testing log + if cleanupOptions == nil || cleanupOptions.TestContext == nil { + return nil + } + key, err := dynclient.ObjectKeyFromObject(objCopy) + // this function fails silently if t is nil + if cleanupOptions.TestContext.t != nil { + cleanupOptions.TestContext.t.Logf("resource type %+v with namespace/name (%+v) created\n", objCopy.GetObjectKind().GroupVersionKind().Kind, key) + } + cleanupOptions.TestContext.AddCleanupFn(func() error { + err = f.Client.Delete(gCtx, objCopy) + if err != nil { + return err + } + if cleanupOptions.Timeout == 0 && cleanupOptions.RetryInterval != 0 { + return fmt.Errorf("retry interval is set but timeout is not; cannot poll for cleanup") + } else if cleanupOptions.Timeout != 0 && cleanupOptions.RetryInterval == 0 { + return fmt.Errorf("timeout is set but retry interval is not; cannot poll for cleanup") + } + if cleanupOptions.Timeout != 0 && cleanupOptions.RetryInterval != 0 { + return wait.PollImmediate(cleanupOptions.RetryInterval, cleanupOptions.Timeout, func() (bool, error) { + err = f.Client.Get(gCtx, key, objCopy) + if err != nil { + if apierrors.IsNotFound(err) { + if cleanupOptions.TestContext.t != nil { + cleanupOptions.TestContext.t.Logf("resource type %+v with namespace/name (%+v) successfully deleted\n", objCopy.GetObjectKind().GroupVersionKind().Kind, key) + } + return true, nil + } + return false, fmt.Errorf("error encountered during deletion of resource type %v with namespace/name (%+v): %v", objCopy.GetObjectKind().GroupVersionKind().Kind, key, err) + } + if cleanupOptions.TestContext.t != nil { + cleanupOptions.TestContext.t.Logf("waiting for deletion of resource type %+v with namespace/name (%+v)\n", objCopy.GetObjectKind().GroupVersionKind().Kind, key) + } + return false, nil + }) + } + return nil + }) + return nil +} + +func (f *frameworkClient) Get(gCtx goctx.Context, key dynclient.ObjectKey, obj runtime.Object) error { + return f.Client.Get(gCtx, key, obj) +} + +func (f *frameworkClient) List(gCtx goctx.Context, opts *dynclient.ListOptions, list runtime.Object) error { + return f.Client.List(gCtx, opts, list) +} + +func (f *frameworkClient) Delete(gCtx goctx.Context, obj runtime.Object, opts ...dynclient.DeleteOptionFunc) error { + return f.Client.Delete(gCtx, obj, opts...) +} + +func (f *frameworkClient) Update(gCtx goctx.Context, obj runtime.Object) error { + return f.Client.Update(gCtx, obj) +} diff --git a/vendor/github.com/operator-framework/operator-sdk/pkg/test/context.go b/vendor/github.com/operator-framework/operator-sdk/pkg/test/context.go index 71584c54a3..51c3dd411c 100644 --- a/vendor/github.com/operator-framework/operator-sdk/pkg/test/context.go +++ b/vendor/github.com/operator-framework/operator-sdk/pkg/test/context.go @@ -23,14 +23,21 @@ import ( ) type TestCtx struct { - ID string - CleanUpFns []finalizerFn - Namespace string + id string + cleanupFns []cleanupFn + namespace string + t *testing.T } -type finalizerFn func() error +type CleanupOptions struct { + TestContext *TestCtx + Timeout time.Duration + RetryInterval time.Duration +} + +type cleanupFn func() error -func NewTestCtx(t *testing.T) TestCtx { +func NewTestCtx(t *testing.T) *TestCtx { var prefix string if t != nil { // TestCtx is used among others for namespace names where '/' is forbidden @@ -48,20 +55,21 @@ func NewTestCtx(t *testing.T) TestCtx { } id := prefix + "-" + strconv.FormatInt(time.Now().Unix(), 10) - return TestCtx{ - ID: id, + return &TestCtx{ + id: id, + t: t, } } func (ctx *TestCtx) GetID() string { - return ctx.ID + return ctx.id } -func (ctx *TestCtx) Cleanup(t *testing.T) { - for i := len(ctx.CleanUpFns) - 1; i >= 0; i-- { - err := ctx.CleanUpFns[i]() +func (ctx *TestCtx) Cleanup() { + for i := len(ctx.cleanupFns) - 1; i >= 0; i-- { + err := ctx.cleanupFns[i]() if err != nil { - t.Errorf("a cleanup function failed with error: %v\n", err) + ctx.t.Errorf("a cleanup function failed with error: %v\n", err) } } } @@ -70,8 +78,8 @@ func (ctx *TestCtx) Cleanup(t *testing.T) { // intended for use by MainEntry, which does not have a testing.T func (ctx *TestCtx) CleanupNoT() { failed := false - for i := len(ctx.CleanUpFns) - 1; i >= 0; i-- { - err := ctx.CleanUpFns[i]() + for i := len(ctx.cleanupFns) - 1; i >= 0; i-- { + err := ctx.cleanupFns[i]() if err != nil { failed = true log.Printf("a cleanup function failed with error: %v\n", err) @@ -82,6 +90,6 @@ func (ctx *TestCtx) CleanupNoT() { } } -func (ctx *TestCtx) AddFinalizerFn(fn finalizerFn) { - ctx.CleanUpFns = append(ctx.CleanUpFns, fn) +func (ctx *TestCtx) AddCleanupFn(fn cleanupFn) { + ctx.cleanupFns = append(ctx.cleanupFns, fn) } diff --git a/vendor/github.com/operator-framework/operator-sdk/pkg/test/framework.go b/vendor/github.com/operator-framework/operator-sdk/pkg/test/framework.go index 2edb1b806f..988b16d2e5 100644 --- a/vendor/github.com/operator-framework/operator-sdk/pkg/test/framework.go +++ b/vendor/github.com/operator-framework/operator-sdk/pkg/test/framework.go @@ -17,44 +17,64 @@ package test import ( goctx "context" "fmt" + "net" + "os" "sync" "time" - extensions "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset" extscheme "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/scheme" - "k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/serializer" "k8s.io/apimachinery/pkg/util/wait" - "k8s.io/client-go/discovery" "k8s.io/client-go/discovery/cached" "k8s.io/client-go/kubernetes" cgoscheme "k8s.io/client-go/kubernetes/scheme" "k8s.io/client-go/rest" + "k8s.io/client-go/restmapper" "k8s.io/client-go/tools/clientcmd" dynclient "sigs.k8s.io/controller-runtime/pkg/client" ) var ( - // mutex for AddToFrameworkScheme - mutex = sync.Mutex{} // Global framework struct Global *Framework + // mutex for AddToFrameworkScheme + mutex = sync.Mutex{} + // whether to run tests in a single namespace + singleNamespace *bool + // decoder used by createFromYaml + dynamicDecoder runtime.Decoder ) type Framework struct { + Client *frameworkClient KubeConfig *rest.Config KubeClient kubernetes.Interface - ExtensionsClient *extensions.Clientset Scheme *runtime.Scheme - RestMapper *discovery.DeferredDiscoveryRESTMapper - DynamicClient dynclient.Client - DynamicDecoder runtime.Decoder NamespacedManPath *string + Namespace string } func setup(kubeconfigPath, namespacedManPath *string) error { - kubeconfig, err := clientcmd.BuildConfigFromFlags("", *kubeconfigPath) + var err error + var kubeconfig *rest.Config + if *kubeconfigPath == "incluster" { + // Work around https://github.com/kubernetes/kubernetes/issues/40973 + if len(os.Getenv("KUBERNETES_SERVICE_HOST")) == 0 { + addrs, err := net.LookupHost("kubernetes.default.svc") + if err != nil { + return fmt.Errorf("failed to get service host: %v", err) + } + os.Setenv("KUBERNETES_SERVICE_HOST", addrs[0]) + } + if len(os.Getenv("KUBERNETES_SERVICE_PORT")) == 0 { + os.Setenv("KUBERNETES_SERVICE_PORT", "443") + } + kubeconfig, err = rest.InClusterConfig() + *singleNamespace = true + } else { + kubeconfig, err = clientcmd.BuildConfigFromFlags("", *kubeconfigPath) + } if err != nil { return fmt.Errorf("failed to build the kubeconfig: %v", err) } @@ -62,10 +82,6 @@ func setup(kubeconfigPath, namespacedManPath *string) error { if err != nil { return fmt.Errorf("failed to build the kubeclient: %v", err) } - extensionsClient, err := extensions.NewForConfig(kubeconfig) - if err != nil { - return fmt.Errorf("failed to build the extensionsClient: %v", err) - } scheme := runtime.NewScheme() cgoscheme.AddToScheme(scheme) extscheme.AddToScheme(scheme) @@ -73,15 +89,21 @@ func setup(kubeconfigPath, namespacedManPath *string) error { if err != nil { return fmt.Errorf("failed to build the dynamic client: %v", err) } - dynDec := serializer.NewCodecFactory(scheme).UniversalDeserializer() + dynamicDecoder = serializer.NewCodecFactory(scheme).UniversalDeserializer() + namespace := "" + if *singleNamespace { + namespace = os.Getenv(TestNamespaceEnv) + if len(namespace) == 0 { + return fmt.Errorf("namespace set in %s cannot be empty", TestNamespaceEnv) + } + } Global = &Framework{ + Client: &frameworkClient{Client: dynClient}, KubeConfig: kubeconfig, KubeClient: kubeclient, - ExtensionsClient: extensionsClient, Scheme: scheme, - DynamicClient: dynClient, - DynamicDecoder: dynDec, NamespacedManPath: namespacedManPath, + Namespace: namespace, } return nil } @@ -110,20 +132,25 @@ func AddToFrameworkScheme(addToScheme addToSchemeFunc, obj runtime.Object) error return err } cachedDiscoveryClient := cached.NewMemCacheClient(Global.KubeClient.Discovery()) - Global.RestMapper = discovery.NewDeferredDiscoveryRESTMapper(cachedDiscoveryClient, meta.InterfacesForUnstructured) - Global.RestMapper.Reset() - Global.DynamicClient, err = dynclient.New(Global.KubeConfig, dynclient.Options{Scheme: Global.Scheme, Mapper: Global.RestMapper}) + restMapper := restmapper.NewDeferredDiscoveryRESTMapper(cachedDiscoveryClient) + restMapper.Reset() + dynClient, err := dynclient.New(Global.KubeConfig, dynclient.Options{Scheme: Global.Scheme, Mapper: restMapper}) err = wait.PollImmediate(time.Second, time.Second*10, func() (done bool, err error) { - err = Global.DynamicClient.List(goctx.TODO(), &dynclient.ListOptions{Namespace: "default"}, obj) + if *singleNamespace { + err = dynClient.List(goctx.TODO(), &dynclient.ListOptions{Namespace: Global.Namespace}, obj) + } else { + err = dynClient.List(goctx.TODO(), &dynclient.ListOptions{Namespace: "default"}, obj) + } if err != nil { - Global.RestMapper.Reset() + restMapper.Reset() return false, nil } + Global.Client = &frameworkClient{Client: dynClient} return true, nil }) if err != nil { return fmt.Errorf("failed to build the dynamic client: %v", err) } - Global.DynamicDecoder = serializer.NewCodecFactory(Global.Scheme).UniversalDeserializer() + dynamicDecoder = serializer.NewCodecFactory(Global.Scheme).UniversalDeserializer() return nil } diff --git a/vendor/github.com/operator-framework/operator-sdk/pkg/test/main_entry.go b/vendor/github.com/operator-framework/operator-sdk/pkg/test/main_entry.go index 4c7a15fd40..25c75b5d63 100644 --- a/vendor/github.com/operator-framework/operator-sdk/pkg/test/main_entry.go +++ b/vendor/github.com/operator-framework/operator-sdk/pkg/test/main_entry.go @@ -27,6 +27,8 @@ const ( KubeConfigFlag = "kubeconfig" NamespacedManPathFlag = "namespacedMan" GlobalManPathFlag = "globalMan" + SingleNamespaceFlag = "singleNamespace" + TestNamespaceEnv = "TEST_NAMESPACE" ) func MainEntry(m *testing.M) { @@ -34,6 +36,7 @@ func MainEntry(m *testing.M) { kubeconfigPath := flag.String(KubeConfigFlag, "", "path to kubeconfig") globalManPath := flag.String(GlobalManPathFlag, "", "path to operator manifest") namespacedManPath := flag.String(NamespacedManPathFlag, "", "path to rbac manifest") + singleNamespace = flag.Bool(SingleNamespaceFlag, false, "enable single namespace mode") flag.Parse() // go test always runs from the test directory; change to project root err := os.Chdir(*projRoot) @@ -53,12 +56,14 @@ func MainEntry(m *testing.M) { os.Exit(exitCode) }() // create crd - globalYAML, err := ioutil.ReadFile(*globalManPath) - if err != nil { - log.Fatalf("failed to read global resource manifest: %v", err) - } - err = ctx.createFromYAML(globalYAML, true) - if err != nil { - log.Fatalf("failed to create resource(s) in global resource manifest: %v", err) + if *kubeconfigPath != "incluster" { + globalYAML, err := ioutil.ReadFile(*globalManPath) + if err != nil { + log.Fatalf("failed to read global resource manifest: %v", err) + } + err = ctx.createFromYAML(globalYAML, true, &CleanupOptions{TestContext: ctx}) + if err != nil { + log.Fatalf("failed to create resource(s) in global resource manifest: %v", err) + } } } diff --git a/vendor/github.com/operator-framework/operator-sdk/pkg/test/resource_creator.go b/vendor/github.com/operator-framework/operator-sdk/pkg/test/resource_creator.go index 5ed0cd24b9..a5756a96dc 100644 --- a/vendor/github.com/operator-framework/operator-sdk/pkg/test/resource_creator.go +++ b/vendor/github.com/operator-framework/operator-sdk/pkg/test/resource_creator.go @@ -27,22 +27,26 @@ import ( ) func (ctx *TestCtx) GetNamespace() (string, error) { - if ctx.Namespace != "" { - return ctx.Namespace, nil + if ctx.namespace != "" { + return ctx.namespace, nil + } + if *singleNamespace { + ctx.namespace = Global.Namespace + return ctx.namespace, nil } // create namespace - ctx.Namespace = ctx.GetID() - namespaceObj := &core.Namespace{ObjectMeta: metav1.ObjectMeta{Name: ctx.Namespace}} + ctx.namespace = ctx.GetID() + namespaceObj := &core.Namespace{ObjectMeta: metav1.ObjectMeta{Name: ctx.namespace}} _, err := Global.KubeClient.CoreV1().Namespaces().Create(namespaceObj) if apierrors.IsAlreadyExists(err) { - return "", fmt.Errorf("namespace %s already exists: %v", ctx.Namespace, err) + return "", fmt.Errorf("namespace %s already exists: %v", ctx.namespace, err) } else if err != nil { return "", err } - ctx.AddFinalizerFn(func() error { - return Global.KubeClient.CoreV1().Namespaces().Delete(ctx.Namespace, metav1.NewDeleteOptions(0)) + ctx.AddCleanupFn(func() error { + return Global.KubeClient.CoreV1().Namespaces().Delete(ctx.namespace, metav1.NewDeleteOptions(0)) }) - return ctx.Namespace, nil + return ctx.namespace, nil } func setNamespaceYAML(yamlFile []byte, namespace string) ([]byte, error) { @@ -55,7 +59,7 @@ func setNamespaceYAML(yamlFile []byte, namespace string) ([]byte, error) { return yaml.Marshal(yamlMap) } -func (ctx *TestCtx) createFromYAML(yamlFile []byte, skipIfExists bool) error { +func (ctx *TestCtx) createFromYAML(yamlFile []byte, skipIfExists bool, cleanupOptions *CleanupOptions) error { namespace, err := ctx.GetNamespace() if err != nil { return err @@ -67,28 +71,27 @@ func (ctx *TestCtx) createFromYAML(yamlFile []byte, skipIfExists bool) error { return err } - obj, _, err := Global.DynamicDecoder.Decode(yamlSpec, nil, nil) + obj, _, err := dynamicDecoder.Decode(yamlSpec, nil, nil) if err != nil { return err } - err = Global.DynamicClient.Create(goctx.TODO(), obj) + err = Global.Client.Create(goctx.TODO(), obj, cleanupOptions) if skipIfExists && apierrors.IsAlreadyExists(err) { continue } if err != nil { return err } - ctx.AddFinalizerFn(func() error { return Global.DynamicClient.Delete(goctx.TODO(), obj) }) } return nil } -func (ctx *TestCtx) InitializeClusterResources() error { +func (ctx *TestCtx) InitializeClusterResources(cleanupOptions *CleanupOptions) error { // create namespaced resources namespacedYAML, err := ioutil.ReadFile(*Global.NamespacedManPath) if err != nil { return fmt.Errorf("failed to read namespaced manifest: %v", err) } - return ctx.createFromYAML(namespacedYAML, false) + return ctx.createFromYAML(namespacedYAML, false, cleanupOptions) } diff --git a/vendor/github.com/operator-framework/operator-sdk/pkg/tlsutil/error.go b/vendor/github.com/operator-framework/operator-sdk/pkg/tlsutil/error.go new file mode 100644 index 0000000000..92d89592ad --- /dev/null +++ b/vendor/github.com/operator-framework/operator-sdk/pkg/tlsutil/error.go @@ -0,0 +1,24 @@ +// Copyright 2018 The Operator-SDK 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 tlsutil + +import "errors" + +var ( + ErrCANotFound = errors.New("ca secret and configMap are not found") + ErrCAKeyAndCACertReq = errors.New("ca key and ca cert need to be provided when requesting a custom CA.") + ErrInternal = errors.New("internal error while generating TLS assets.") + // TODO: add other tls util errors. +) diff --git a/vendor/github.com/operator-framework/operator-sdk/pkg/tlsutil/tls.go b/vendor/github.com/operator-framework/operator-sdk/pkg/tlsutil/tls.go index ff5f4cf50a..6f8204665a 100644 --- a/vendor/github.com/operator-framework/operator-sdk/pkg/tlsutil/tls.go +++ b/vendor/github.com/operator-framework/operator-sdk/pkg/tlsutil/tls.go @@ -19,15 +19,15 @@ import ( "crypto/x509" "errors" "fmt" + "io/ioutil" "strings" - "github.com/operator-framework/operator-sdk/pkg/sdk" - "k8s.io/api/core/v1" apiErrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" + "k8s.io/client-go/kubernetes" ) // CertType defines the type of the cert. @@ -130,14 +130,18 @@ const ( TLSCACertKey = "ca.crt" ) -type SDKCertGenerator struct { +// NewSDKCertGenerator constructs a new CertGenerator given the kubeClient. +func NewSDKCertGenerator(kubeClient kubernetes.Interface) CertGenerator { + return &SDKCertGenerator{KubeClient: kubeClient} } -type keyAndCert struct { - key *rsa.PrivateKey - cert *x509.Certificate +type SDKCertGenerator struct { + KubeClient kubernetes.Interface } +// GenerateCert returns a secret containing the TLS encryption key and cert, +// a ConfigMap containing the CA Certificate and a Secret containing the CA key or it +// returns a error incase something goes wrong. func (scg *SDKCertGenerator) GenerateCert(cr runtime.Object, service *v1.Service, config *CertConfig) (*v1.Secret, *v1.ConfigMap, *v1.Secret, error) { if err := verifyConfig(config); err != nil { return nil, nil, nil, err @@ -147,28 +151,121 @@ func (scg *SDKCertGenerator) GenerateCert(cr runtime.Object, service *v1.Service if err != nil { return nil, nil, nil, err } - appSecret, err := getAppSecretInCluster(toAppSecretName(k, n, config.CertName), ns) + appSecretName := ToAppSecretName(k, n, config.CertName) + appSecret, err := getAppSecretInCluster(scg.KubeClient, appSecretName, ns) if err != nil { return nil, nil, nil, err } - caSecret, caConfigMap, err := getCASecretAndConfigMapInCluster(toCASecretAndConfigMapName(k, n), ns) + caSecretAndConfigMapName := ToCASecretAndConfigMapName(k, n) + + var ( + caSecret *v1.Secret + caConfigMap *v1.ConfigMap + ) + + caSecret, caConfigMap, err = getCASecretAndConfigMapInCluster(scg.KubeClient, caSecretAndConfigMapName, ns) if err != nil { return nil, nil, nil, err } + if config.CAKey != "" && config.CACert != "" { + // custom CA provided by the user. + customCAKeyData, err := ioutil.ReadFile(config.CAKey) + if err != nil { + return nil, nil, nil, fmt.Errorf("error reading CA Key from the given file name: %v", err) + } + + customCACertData, err := ioutil.ReadFile(config.CACert) + if err != nil { + return nil, nil, nil, fmt.Errorf("error reading CA Cert from the given file name: %v", err) + } + + customCAKey, err := parsePEMEncodedPrivateKey(customCAKeyData) + if err != nil { + return nil, nil, nil, fmt.Errorf("error parsing CA Key from the given file name: %v", err) + } + + customCACert, err := parsePEMEncodedCert(customCACertData) + if err != nil { + return nil, nil, nil, fmt.Errorf("error parsing CA Cert from the given file name: %v", err) + } + caSecret, caConfigMap = toCASecretAndConfigmap(customCAKey, customCACert, caSecretAndConfigMapName) + } else if config.CAKey != "" || config.CACert != "" { + // if only one of the custom CA Key or Cert is provided + return nil, nil, nil, ErrCAKeyAndCACertReq + } + hasAppSecret := appSecret != nil hasCASecretAndConfigMap := caSecret != nil && caConfigMap != nil - // TODO: handle passed in CA - if hasAppSecret && hasCASecretAndConfigMap { + + switch { + case hasAppSecret && hasCASecretAndConfigMap: + return appSecret, caConfigMap, caSecret, nil + + case hasAppSecret && !hasCASecretAndConfigMap: + return nil, nil, nil, ErrCANotFound + + case !hasAppSecret && hasCASecretAndConfigMap: + // Note: if a custom CA is passed in my the user it takes preference over an already + // generated CA secret and CA configmap that might exist in the cluster + caKey, err := parsePEMEncodedPrivateKey(caSecret.Data[TLSPrivateCAKeyKey]) + if err != nil { + return nil, nil, nil, err + } + caCert, err := parsePEMEncodedCert([]byte(caConfigMap.Data[TLSCACertKey])) + if err != nil { + return nil, nil, nil, err + } + key, err := newPrivateKey() + if err != nil { + return nil, nil, nil, err + } + cert, err := newSignedCertificate(config, service, key, caCert, caKey) + if err != nil { + return nil, nil, nil, err + } + appSecret, err := scg.KubeClient.CoreV1().Secrets(ns).Create(toTLSSecret(key, cert, appSecretName)) + if err != nil { + return nil, nil, nil, err + } + return appSecret, caConfigMap, caSecret, nil + + case !hasAppSecret && !hasCASecretAndConfigMap: + // If no custom CAKey and CACert are provided we have to generate them + caKey, err := newPrivateKey() + if err != nil { + return nil, nil, nil, err + } + caCert, err := newSelfSignedCACertificate(caKey) + if err != nil { + return nil, nil, nil, err + } + + caSecret, caConfigMap := toCASecretAndConfigmap(caKey, caCert, caSecretAndConfigMapName) + caSecret, err = scg.KubeClient.CoreV1().Secrets(ns).Create(caSecret) + if err != nil { + return nil, nil, nil, err + } + caConfigMap, err = scg.KubeClient.CoreV1().ConfigMaps(ns).Create(caConfigMap) + if err != nil { + return nil, nil, nil, err + } + key, err := newPrivateKey() + if err != nil { + return nil, nil, nil, err + } + cert, err := newSignedCertificate(config, service, key, caCert, caKey) + if err != nil { + return nil, nil, nil, err + } + appSecret, err := scg.KubeClient.CoreV1().Secrets(ns).Create(toTLSSecret(key, cert, appSecretName)) + if err != nil { + return nil, nil, nil, err + } return appSecret, caConfigMap, caSecret, nil - } else if hasAppSecret && !hasCASecretAndConfigMap { - // TODO - } else if !hasAppSecret && hasCASecretAndConfigMap { - // TODO - } else { - // TODO + default: + return nil, nil, nil, ErrInternal } - return nil, nil, nil, nil } func verifyConfig(config *CertConfig) error { @@ -181,75 +278,49 @@ func verifyConfig(config *CertConfig) error { return nil } -func toAppSecretName(kind, name, certName string) string { +func ToAppSecretName(kind, name, certName string) string { return strings.ToLower(kind) + "-" + name + "-" + certName } -func toCASecretAndConfigMapName(kind, name string) string { +func ToCASecretAndConfigMapName(kind, name string) string { return strings.ToLower(kind) + "-" + name + "-ca" } -func getAppSecretInCluster(name, namespace string) (*v1.Secret, error) { - se := &v1.Secret{ - TypeMeta: metav1.TypeMeta{ - Kind: "Secret", - APIVersion: "v1", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: namespace, - }, +func getAppSecretInCluster(kubeClient kubernetes.Interface, name, namespace string) (*v1.Secret, error) { + se, err := kubeClient.CoreV1().Secrets(namespace).Get(name, metav1.GetOptions{}) + if err != nil && !apiErrors.IsNotFound(err) { + return nil, err } - err := sdk.Get(se) if apiErrors.IsNotFound(err) { return nil, nil } - if err != nil { - return nil, err - } return se, nil } // getCASecretAndConfigMapInCluster gets CA secret and configmap of the given name and namespace. -// it only returns both if they are found and nil if both are not found. In the case if only one of them is found, then we error out because we expect either both CA secret and configmap exit or not. -func getCASecretAndConfigMapInCluster(name, namespace string) (*v1.Secret, *v1.ConfigMap, error) { - cm := &v1.ConfigMap{ - TypeMeta: metav1.TypeMeta{ - Kind: "ConfigMap", - APIVersion: "v1", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: namespace, - }, - } +// it only returns both if they are found and nil if both are not found. In the case if only one of them is found, +// then we error out because we expect either both CA secret and configmap exit or not. +// +// NOTE: both the CA secret and configmap have the same name with template `--ca` which is what the +// input parameter `name` refers to. +func getCASecretAndConfigMapInCluster(kubeClient kubernetes.Interface, name, namespace string) (*v1.Secret, *v1.ConfigMap, error) { hasConfigMap := true - err := sdk.Get(cm) + cm, err := kubeClient.CoreV1().ConfigMaps(namespace).Get(name, metav1.GetOptions{}) + if err != nil && !apiErrors.IsNotFound(err) { + return nil, nil, err + } if apiErrors.IsNotFound(err) { hasConfigMap = false } - if err != nil { - return nil, nil, err - } - se := &v1.Secret{ - TypeMeta: metav1.TypeMeta{ - Kind: "Secret", - APIVersion: "v1", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: namespace, - }, - } hasSecret := true - err = sdk.Get(se) + se, err := kubeClient.CoreV1().Secrets(namespace).Get(name, metav1.GetOptions{}) + if err != nil && !apiErrors.IsNotFound(err) { + return nil, nil, err + } if apiErrors.IsNotFound(err) { hasSecret = false } - if err != nil { - return nil, nil, err - } if hasConfigMap != hasSecret { // TODO: this case can happen if creating CA configmap succeeds and creating CA secret failed. We need to handle this case properly. @@ -280,15 +351,10 @@ func toKindNameNamespace(cr runtime.Object) (string, string, string, error) { // toTLSSecret returns a client/server "kubernetes.io/tls" secret. // TODO: add owner ref. -func toTLSSecret(key *rsa.PrivateKey, cert *x509.Certificate, name, namespace string) *v1.Secret { +func toTLSSecret(key *rsa.PrivateKey, cert *x509.Certificate, name string) *v1.Secret { return &v1.Secret{ - TypeMeta: metav1.TypeMeta{ - Kind: "Secret", - APIVersion: "v1", - }, ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: namespace, + Name: name, }, Data: map[string][]byte{ v1.TLSPrivateKeyKey: encodePrivateKeyPEM(key), @@ -299,30 +365,20 @@ func toTLSSecret(key *rsa.PrivateKey, cert *x509.Certificate, name, namespace st } // TODO: add owner ref. -func toCASecretAndConfigmap(key *rsa.PrivateKey, cert *x509.Certificate, name, namespace string) (*v1.ConfigMap, *v1.Secret) { - return &v1.ConfigMap{ - TypeMeta: metav1.TypeMeta{ - Kind: "ConfigMap", - APIVersion: "v1", - }, +func toCASecretAndConfigmap(key *rsa.PrivateKey, cert *x509.Certificate, name string) (*v1.Secret, *v1.ConfigMap) { + return &v1.Secret{ ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: namespace, + Name: name, }, - Data: map[string]string{ - TLSCACertKey: string(encodeCertificatePEM(cert)), - }, - }, &v1.Secret{ - TypeMeta: metav1.TypeMeta{ - Kind: "Secret", - APIVersion: "v1", + Data: map[string][]byte{ + TLSPrivateCAKeyKey: encodePrivateKeyPEM(key), }, + }, &v1.ConfigMap{ ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: namespace, + Name: name, }, - Data: map[string][]byte{ - TLSPrivateCAKeyKey: encodePrivateKeyPEM(key), + Data: map[string]string{ + TLSCACertKey: string(encodeCertificatePEM(cert)), }, } } diff --git a/vendor/github.com/operator-framework/operator-sdk/pkg/util/k8sutil/k8sutil.go b/vendor/github.com/operator-framework/operator-sdk/pkg/util/k8sutil/k8sutil.go index 6e3eebc3f8..d2d23faa45 100644 --- a/vendor/github.com/operator-framework/operator-sdk/pkg/util/k8sutil/k8sutil.go +++ b/vendor/github.com/operator-framework/operator-sdk/pkg/util/k8sutil/k8sutil.go @@ -69,33 +69,32 @@ func AddToSDKScheme(addToScheme addToSchemeFunc) { } // RuntimeObjectFromUnstructured converts an unstructured to a runtime object -func RuntimeObjectFromUnstructured(u *unstructured.Unstructured) runtime.Object { +func RuntimeObjectFromUnstructured(u *unstructured.Unstructured) (runtime.Object, error) { gvk := u.GroupVersionKind() decoder := decoderFunc(gvk.GroupVersion(), codecs) b, err := u.MarshalJSON() if err != nil { - panic(err) + return nil, fmt.Errorf("error running MarshalJSON on unstructured object: %v", err) } ro, _, err := decoder.Decode(b, &gvk, nil) if err != nil { - err = fmt.Errorf("failed to decode json data with gvk(%v): %v", gvk.String(), err) - panic(err) + return nil, fmt.Errorf("failed to decode json data with gvk(%v): %v", gvk.String(), err) } - return ro + return ro, nil } // UnstructuredFromRuntimeObject converts a runtime object to an unstructured -func UnstructuredFromRuntimeObject(ro runtime.Object) *unstructured.Unstructured { +func UnstructuredFromRuntimeObject(ro runtime.Object) (*unstructured.Unstructured, error) { b, err := json.Marshal(ro) if err != nil { - panic(err) + return nil, fmt.Errorf("error running MarshalJSON on runtime object: %v", err) } var u unstructured.Unstructured if err := json.Unmarshal(b, &u.Object); err != nil { - panic(err) + return nil, fmt.Errorf("failed to unmarshal json into unstructured object: %v", err) } - return &u + return &u, nil } // UnstructuredIntoRuntimeObject unmarshalls an unstructured into a given runtime object diff --git a/vendor/github.com/operator-framework/operator-sdk/release.sh b/vendor/github.com/operator-framework/operator-sdk/release.sh new file mode 100755 index 0000000000..5f0c343fa9 --- /dev/null +++ b/vendor/github.com/operator-framework/operator-sdk/release.sh @@ -0,0 +1,42 @@ +#!/usr/bin/env bash + +set -e + +[ $# == 1 ] || { echo "usage: $0 version" && exit 1; } + +VER=$1 + +[[ "$VER" =~ ^v[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+$ ]] || { + echo "malformed version: \"$VER\"" + exit 2 +} + +if test -n "$(git ls-files --others | \ + grep --invert-match '\(vendor\|build/operator-sdk-v.\+\)')"; +then + echo "directory has untracked files" + exit 1 +fi + +if ! $(git diff-index --quiet HEAD --); then + echo "directory has uncommitted files" + exit 1 +fi + +# Detect whether versions in code were updated. +CURR_VER="$(git describe --dirty --tags)" +VER_FILE="version/version.go" +TOML_TMPL_FILE="pkg/generator/templates.go" +CURR_VER_VER_FILE="$(sed -nr 's/Version = "(.+)"/\1/p' "$VER_FILE" | tr -d '\s\t\n')" +CURR_VER_TMPL_FILE="$(sed -nr 's/.*".*v(.+)".*#osdk_version_annotation/v\1/p' "$TOML_TMPL_FILE" | tr -d '\s\t\n')" +if [ "$VER" != "$CURR_VER_VER_FILE" ] \ + || [ "$VER" != "$CURR_VER_TMPL_FILE" ]; then + echo "versions are not set correctly in $VER_FILE or $TOML_TMPL_FILE" + exit 1 +fi + +git tag --sign --message "Operator SDK $VER" "$VER" + +git verify-tag --verbose "$VER" + +make release diff --git a/vendor/github.com/operator-framework/operator-sdk/test/ansible-memcached/defaults.yml b/vendor/github.com/operator-framework/operator-sdk/test/ansible-memcached/defaults.yml new file mode 100644 index 0000000000..34ae51bf00 --- /dev/null +++ b/vendor/github.com/operator-framework/operator-sdk/test/ansible-memcached/defaults.yml @@ -0,0 +1 @@ +size: 1 diff --git a/vendor/github.com/operator-framework/operator-sdk/test/ansible-memcached/memfin/tasks/main.yml b/vendor/github.com/operator-framework/operator-sdk/test/ansible-memcached/memfin/tasks/main.yml new file mode 100644 index 0000000000..2b48c4d5b1 --- /dev/null +++ b/vendor/github.com/operator-framework/operator-sdk/test/ansible-memcached/memfin/tasks/main.yml @@ -0,0 +1,2 @@ +- debug: + msg: "this is a finalizer" diff --git a/vendor/github.com/operator-framework/operator-sdk/test/ansible-memcached/tasks.yml b/vendor/github.com/operator-framework/operator-sdk/test/ansible-memcached/tasks.yml new file mode 100644 index 0000000000..e5d40bb178 --- /dev/null +++ b/vendor/github.com/operator-framework/operator-sdk/test/ansible-memcached/tasks.yml @@ -0,0 +1,37 @@ +--- +- name: start memcached + k8s: + definition: + kind: Deployment + apiVersion: apps/v1 + metadata: + name: '{{ meta.name }}-memcached' + namespace: '{{ meta.namespace }}' + labels: + app: memcached + spec: + replicas: "{{size}}" + selector: + matchLabels: + app: memcached + template: + metadata: + labels: + app: memcached + spec: + containers: + - name: memcached + command: + - memcached + - -m=64 + - -o + - modern + - -v + image: "docker.io/memcached:1.4.36-alpine" + ports: + - containerPort: 11211 + readinessProbe: + tcpSocket: + port: 11211 + initialDelaySeconds: 3 + periodSeconds: 3 diff --git a/vendor/github.com/operator-framework/operator-sdk/test/ansible-memcached/watches-finalizer.yaml b/vendor/github.com/operator-framework/operator-sdk/test/ansible-memcached/watches-finalizer.yaml new file mode 100644 index 0000000000..a02443bb80 --- /dev/null +++ b/vendor/github.com/operator-framework/operator-sdk/test/ansible-memcached/watches-finalizer.yaml @@ -0,0 +1,3 @@ + finalizer: + name: finalizer.ansible.example.com + role: /opt/ansible/roles/memfin diff --git a/vendor/github.com/operator-framework/operator-sdk/test/ansible-operator/Dockerfile b/vendor/github.com/operator-framework/operator-sdk/test/ansible-operator/Dockerfile new file mode 100644 index 0000000000..b4a2c70ccc --- /dev/null +++ b/vendor/github.com/operator-framework/operator-sdk/test/ansible-operator/Dockerfile @@ -0,0 +1,24 @@ +FROM ansible/ansible-runner + +RUN pip install --upgrade setuptools +RUN pip install openshift ansible-runner-http + +RUN echo "localhost ansible_connection=local" > /etc/ansible/hosts \ + && echo '[defaults]' > /etc/ansible/ansible.cfg \ + && echo 'roles_path = /opt/ansible/roles' >> /etc/ansible/ansible.cfg \ + && echo 'library = /usr/share/ansible/openshift' >> /etc/ansible/ansible.cfg + +ENV OPERATOR=/usr/local/bin/ansible-operator \ + USER_UID=1001 \ + USER_NAME=ansible-operator\ + HOME=/opt/ansible + +# install operator binary +ADD ansible-operator ${OPERATOR} + +COPY bin /usr/local/bin +RUN /usr/local/bin/user_setup + +ENTRYPOINT ["/usr/local/bin/entrypoint"] + +USER ${USER_UID} diff --git a/vendor/github.com/operator-framework/operator-sdk/test/ansible-operator/README.md b/vendor/github.com/operator-framework/operator-sdk/test/ansible-operator/README.md new file mode 100644 index 0000000000..c336cd1aba --- /dev/null +++ b/vendor/github.com/operator-framework/operator-sdk/test/ansible-operator/README.md @@ -0,0 +1,2 @@ +This directory temporarily holds the artifacts that are required to build the +ansible operator base image, until they find a more permanent home. diff --git a/vendor/github.com/operator-framework/operator-sdk/test/ansible-operator/bin/entrypoint b/vendor/github.com/operator-framework/operator-sdk/test/ansible-operator/bin/entrypoint new file mode 100755 index 0000000000..0e98dfb43f --- /dev/null +++ b/vendor/github.com/operator-framework/operator-sdk/test/ansible-operator/bin/entrypoint @@ -0,0 +1,12 @@ +#!/bin/bash -e + +# This is documented here: +# https://docs.openshift.com/container-platform/3.10/creating_images/guidelines.html#openshift-specific-guidelines + +if ! whoami &>/dev/null; then + if [ -w /etc/passwd ]; then + echo "${USER_NAME:-runner}:x:$(id -u):$(id -g):${USER_NAME:-runner} user:${HOME}:/sbin/nologin" >> /etc/passwd + fi +fi + +exec "${OPERATOR:-/usr/local/bin/ansible-operator}" diff --git a/vendor/github.com/operator-framework/operator-sdk/test/ansible-operator/bin/user_setup b/vendor/github.com/operator-framework/operator-sdk/test/ansible-operator/bin/user_setup new file mode 100755 index 0000000000..1e36064cbf --- /dev/null +++ b/vendor/github.com/operator-framework/operator-sdk/test/ansible-operator/bin/user_setup @@ -0,0 +1,13 @@ +#!/bin/sh +set -x + +# ensure $HOME exists and is accessible by group 0 (we don't know what the runtime UID will be) +mkdir -p ${HOME} +chown ${USER_UID}:0 ${HOME} +chmod ug+rwx ${HOME} + +# runtime user will need to be able to self-insert in /etc/passwd +chmod g+rw /etc/passwd + +# no need for this script to remain in the image after running +rm $0 diff --git a/vendor/github.com/operator-framework/operator-sdk/test/ansible-operator/cmd/ansible-operator/main.go b/vendor/github.com/operator-framework/operator-sdk/test/ansible-operator/cmd/ansible-operator/main.go new file mode 100644 index 0000000000..b06b328b00 --- /dev/null +++ b/vendor/github.com/operator-framework/operator-sdk/test/ansible-operator/cmd/ansible-operator/main.go @@ -0,0 +1,91 @@ +// Copyright 2018 The Operator-SDK 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 main + +import ( + "flag" + "log" + "math/rand" + "runtime" + "time" + + "github.com/operator-framework/operator-sdk/pkg/ansible/controller" + proxy "github.com/operator-framework/operator-sdk/pkg/ansible/proxy" + "github.com/operator-framework/operator-sdk/pkg/ansible/runner" + sdkVersion "github.com/operator-framework/operator-sdk/version" + "sigs.k8s.io/controller-runtime/pkg/client/config" + "sigs.k8s.io/controller-runtime/pkg/manager" + logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" + "sigs.k8s.io/controller-runtime/pkg/runtime/signals" + + "github.com/sirupsen/logrus" +) + +func printVersion() { + logrus.Infof("Go Version: %s", runtime.Version()) + logrus.Infof("Go OS/Arch: %s/%s", runtime.GOOS, runtime.GOARCH) + logrus.Infof("operator-sdk Version: %v", sdkVersion.Version) +} + +func main() { + flag.Parse() + logf.SetLogger(logf.ZapLogger(false)) + + mgr, err := manager.New(config.GetConfigOrDie(), manager.Options{}) + if err != nil { + log.Fatal(err) + } + + printVersion() + done := make(chan error) + + // start the proxy + proxy.RunProxy(done, proxy.Options{ + Address: "localhost", + Port: 8888, + KubeConfig: mgr.GetConfig(), + }) + + // start the operator + go runSDK(done, mgr) + + // wait for either to finish + err = <-done + if err == nil { + logrus.Info("Exiting") + } else { + logrus.Fatal(err.Error()) + } +} + +func runSDK(done chan error, mgr manager.Manager) { + watches, err := runner.NewFromWatches("/opt/ansible/watches.yaml") + if err != nil { + logrus.Error("Failed to get watches") + done <- err + return + } + rand.Seed(time.Now().Unix()) + c := signals.SetupSignalHandler() + + for gvk, runner := range watches { + controller.Add(mgr, controller.Options{ + GVK: gvk, + Runner: runner, + }) + } + log.Fatal(mgr.Start(c)) + done <- nil +} diff --git a/vendor/github.com/operator-framework/operator-sdk/test/e2e/e2eutil/check_util.go b/vendor/github.com/operator-framework/operator-sdk/test/e2e/e2eutil/check_util.go index 98d844ca5f..11836d94d7 100644 --- a/vendor/github.com/operator-framework/operator-sdk/test/e2e/e2eutil/check_util.go +++ b/vendor/github.com/operator-framework/operator-sdk/test/e2e/e2eutil/check_util.go @@ -20,13 +20,14 @@ import ( apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/wait" "k8s.io/client-go/kubernetes" ) var retryInterval = time.Second * 5 func DeploymentReplicaCheck(t *testing.T, kubeclient kubernetes.Interface, namespace, name string, replicas, retries int) error { - err := Retry(retryInterval, retries, func() (done bool, err error) { + err := wait.Poll(retryInterval, time.Duration(retries)*retryInterval, func() (done bool, err error) { deployment, err := kubeclient.AppsV1().Deployments(namespace).Get(name, metav1.GetOptions{IncludeUninitialized: true}) if err != nil { if apierrors.IsNotFound(err) { diff --git a/vendor/github.com/operator-framework/operator-sdk/test/e2e/e2eutil/retry_util.go b/vendor/github.com/operator-framework/operator-sdk/test/e2e/e2eutil/retry_util.go deleted file mode 100644 index fafa371980..0000000000 --- a/vendor/github.com/operator-framework/operator-sdk/test/e2e/e2eutil/retry_util.go +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright 2018 The Operator-SDK 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 e2eutil - -import ( - "fmt" - "time" -) - -type RetryError struct { - n int -} - -func (e *RetryError) Error() string { - return fmt.Sprintf("still failing after %d retries", e.n) -} - -func IsRetryFailure(err error) bool { - _, ok := err.(*RetryError) - return ok -} - -type ConditionFunc func() (bool, error) - -// Retry retries f every interval until after maxRetries. -// The interval won't be affected by how long f takes. -// For example, if interval is 3s, f takes 1s, another f will be called 2s later. -// However, if f takes longer than interval, it will be delayed. -func Retry(interval time.Duration, maxRetries int, f ConditionFunc) error { - if maxRetries <= 0 { - return fmt.Errorf("maxRetries (%d) should be > 0", maxRetries) - } - tick := time.NewTicker(interval) - defer tick.Stop() - - for i := 0; ; i++ { - ok, err := f() - if err != nil { - return err - } - if ok { - return nil - } - if i == maxRetries { - break - } - <-tick.C - } - return &RetryError{maxRetries} -} diff --git a/vendor/github.com/operator-framework/operator-sdk/test/e2e/framework/framework.go b/vendor/github.com/operator-framework/operator-sdk/test/e2e/framework/framework.go index 1988b3cc08..77c6cfe7e1 100644 --- a/vendor/github.com/operator-framework/operator-sdk/test/e2e/framework/framework.go +++ b/vendor/github.com/operator-framework/operator-sdk/test/e2e/framework/framework.go @@ -15,23 +15,41 @@ package framework import ( + goctx "context" "flag" + "fmt" "log" "os" + "sync" + "time" - extensions "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset" + extscheme "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/scheme" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/serializer" + "k8s.io/apimachinery/pkg/util/wait" + "k8s.io/client-go/discovery/cached" "k8s.io/client-go/kubernetes" + cgoscheme "k8s.io/client-go/kubernetes/scheme" "k8s.io/client-go/rest" + "k8s.io/client-go/restmapper" "k8s.io/client-go/tools/clientcmd" + dynclient "sigs.k8s.io/controller-runtime/pkg/client" ) -var Global *Framework +var ( + // mutex for AddToFrameworkScheme + mutex = sync.Mutex{} + // Global framework struct + Global *Framework +) type Framework struct { - KubeConfig *rest.Config - KubeClient kubernetes.Interface - ExtensionsClient *extensions.Clientset - ImageName *string + KubeConfig *rest.Config + KubeClient kubernetes.Interface + Scheme *runtime.Scheme + DynamicClient dynclient.Client + DynamicDecoder runtime.Decoder + ImageName *string } func setup() error { @@ -54,15 +72,49 @@ func setup() error { if err != nil { return err } - extensionsClient, err := extensions.NewForConfig(kubeconfig) + scheme := runtime.NewScheme() + cgoscheme.AddToScheme(scheme) + extscheme.AddToScheme(scheme) + dynClient, err := dynclient.New(kubeconfig, dynclient.Options{Scheme: scheme}) if err != nil { - return err + return fmt.Errorf("failed to build the dynamic client: %v", err) } + dynDec := serializer.NewCodecFactory(scheme).UniversalDeserializer() Global = &Framework{ - KubeConfig: kubeconfig, - KubeClient: kubeclient, - ExtensionsClient: extensionsClient, - ImageName: imageName, + KubeConfig: kubeconfig, + KubeClient: kubeclient, + Scheme: scheme, + DynamicClient: dynClient, + DynamicDecoder: dynDec, + ImageName: imageName, + } + return nil +} + +type addToSchemeFunc func(*runtime.Scheme) error + +func AddToFrameworkScheme(addToScheme addToSchemeFunc, obj runtime.Object) error { + mutex.Lock() + defer mutex.Unlock() + err := addToScheme(Global.Scheme) + if err != nil { + return err + } + cachedDiscoveryClient := cached.NewMemCacheClient(Global.KubeClient.Discovery()) + restMapper := restmapper.NewDeferredDiscoveryRESTMapper(cachedDiscoveryClient) + restMapper.Reset() + Global.DynamicClient, err = dynclient.New(Global.KubeConfig, dynclient.Options{Scheme: Global.Scheme, Mapper: restMapper}) + err = wait.PollImmediate(time.Second, time.Second*10, func() (done bool, err error) { + err = Global.DynamicClient.List(goctx.TODO(), &dynclient.ListOptions{Namespace: "default"}, obj) + if err != nil { + restMapper.Reset() + return false, nil + } + return true, nil + }) + if err != nil { + return fmt.Errorf("failed to build the dynamic client: %v", err) } + Global.DynamicDecoder = serializer.NewCodecFactory(Global.Scheme).UniversalDeserializer() return nil } diff --git a/vendor/github.com/operator-framework/operator-sdk/test/e2e/framework/resource_creator.go b/vendor/github.com/operator-framework/operator-sdk/test/e2e/framework/resource_creator.go index 0c70af94d7..5545de3de0 100644 --- a/vendor/github.com/operator-framework/operator-sdk/test/e2e/framework/resource_creator.go +++ b/vendor/github.com/operator-framework/operator-sdk/test/e2e/framework/resource_creator.go @@ -15,17 +15,13 @@ package framework import ( - "errors" + "bytes" + goctx "context" "strings" y2j "github.com/ghodss/yaml" yaml "gopkg.in/yaml.v2" - apps "k8s.io/api/apps/v1" core "k8s.io/api/core/v1" - "k8s.io/api/rbac/v1beta1" - crd "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" - extensions_scheme "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/scheme" - apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/runtime/serializer" @@ -77,7 +73,7 @@ func (ctx *TestCtx) GetCRClient(yamlCR []byte) (*rest.RESTClient, error) { return ctx.CRClient, nil } -func (ctx *TestCtx) createCRFromYAML(yamlFile []byte, resourceName string) error { +func (ctx *TestCtx) createCRFromYAML(yamlFile []byte) error { client, err := ctx.GetCRClient(yamlFile) if err != nil { return err @@ -86,6 +82,13 @@ func (ctx *TestCtx) createCRFromYAML(yamlFile []byte, resourceName string) error if err != nil { return err } + yamlMap := make(map[interface{}]interface{}) + err = yaml.Unmarshal(yamlFile, &yamlMap) + if err != nil { + return err + } + kind := yamlMap["kind"].(string) + resourceName := kind + "s" jsonDat, err := y2j.YAMLToJSON(yamlFile) err = client.Post(). Namespace(namespace). @@ -104,80 +107,41 @@ func (ctx *TestCtx) createCRFromYAML(yamlFile []byte, resourceName string) error return err } -func (ctx *TestCtx) createCRDFromYAML(yamlFile []byte) error { - decode := extensions_scheme.Codecs.UniversalDeserializer().Decode - obj, _, err := decode(yamlFile, nil, nil) +func setNamespaceYAML(yamlFile []byte, namespace string) ([]byte, error) { + yamlMap := make(map[interface{}]interface{}) + err := yaml.Unmarshal(yamlFile, &yamlMap) if err != nil { - return err - } - switch o := obj.(type) { - case *crd.CustomResourceDefinition: - _, err = Global.ExtensionsClient.ApiextensionsV1beta1().CustomResourceDefinitions().Create(o) - ctx.AddFinalizerFn(func() error { - err = Global.ExtensionsClient.ApiextensionsV1beta1().CustomResourceDefinitions().Delete(o.Name, metav1.NewDeleteOptions(0)) - if err != nil && !apierrors.IsNotFound(err) { - return err - } - return nil - }) - if apierrors.IsAlreadyExists(err) { - return nil - } - return err - default: - return errors.New("non-CRD resource in createCRDFromYAML function") + return nil, err } + yamlMap["metadata"].(map[interface{}]interface{})["namespace"] = namespace + return yaml.Marshal(yamlMap) } func (ctx *TestCtx) CreateFromYAML(yamlFile []byte) error { - yamlMap := make(map[interface{}]interface{}) - err := yaml.Unmarshal(yamlFile, &yamlMap) + namespace, err := ctx.GetNamespace() if err != nil { return err } - kind := yamlMap["kind"].(string) - switch kind { - case "Role": - case "RoleBinding": - case "Deployment": - case "CustomResourceDefinition": - return ctx.createCRDFromYAML(yamlFile) - // we assume that all custom resources are from operator-sdk and thus follow - // a common naming convention - default: - return ctx.createCRFromYAML(yamlFile, strings.ToLower(kind)+"s") - } + yamlSplit := bytes.Split(yamlFile, []byte("\n---\n")) + for _, yamlSpec := range yamlSplit { + yamlSpec, err = setNamespaceYAML(yamlSpec, namespace) + if err != nil { + return err + } - decode := scheme.Codecs.UniversalDeserializer().Decode - obj, _, err := decode(yamlFile, nil, nil) - if err != nil { - return err - } + obj, _, err := Global.DynamicDecoder.Decode(yamlSpec, nil, nil) + if err != nil { + // DynamicClient/DynamicDecoder can only handle standard and extensions kubernetes resources. + // If a resource is not recognized by the decoder, assume it's a custom resource and fall back + // to createCRFromYAML. + return ctx.createCRFromYAML(yamlFile) + } - namespace, err := ctx.GetNamespace() - if err != nil { - return err - } - switch o := obj.(type) { - case *v1beta1.Role: - _, err = Global.KubeClient.RbacV1beta1().Roles(namespace).Create(o) - ctx.AddFinalizerFn(func() error { - return Global.KubeClient.RbacV1beta1().Roles(namespace).Delete(o.Name, metav1.NewDeleteOptions(0)) - }) - return err - case *v1beta1.RoleBinding: - _, err = Global.KubeClient.RbacV1beta1().RoleBindings(namespace).Create(o) - ctx.AddFinalizerFn(func() error { - return Global.KubeClient.RbacV1beta1().RoleBindings(namespace).Delete(o.Name, metav1.NewDeleteOptions(0)) - }) - return err - case *apps.Deployment: - _, err = Global.KubeClient.AppsV1().Deployments(namespace).Create(o) - ctx.AddFinalizerFn(func() error { - return Global.KubeClient.AppsV1().Deployments(namespace).Delete(o.Name, metav1.NewDeleteOptions(0)) - }) - return err - default: - return errors.New("unhandled resource type") + err = Global.DynamicClient.Create(goctx.TODO(), obj) + if err != nil { + return err + } + ctx.AddFinalizerFn(func() error { return Global.DynamicClient.Delete(goctx.TODO(), obj) }) } + return nil } diff --git a/vendor/github.com/operator-framework/operator-sdk/test/e2e/incluster-test-code/main_test.go.tmpl b/vendor/github.com/operator-framework/operator-sdk/test/e2e/incluster-test-code/main_test.go.tmpl new file mode 100644 index 0000000000..210d906294 --- /dev/null +++ b/vendor/github.com/operator-framework/operator-sdk/test/e2e/incluster-test-code/main_test.go.tmpl @@ -0,0 +1,25 @@ +// Copyright 2018 The Operator-SDK 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 e2e + +import ( + "testing" + + f "github.com/operator-framework/operator-sdk/pkg/test" +) + +func TestMain(m *testing.M) { + f.MainEntry(m) +} diff --git a/vendor/github.com/operator-framework/operator-sdk/test/e2e/incluster-test-code/memcached_test.go.tmpl b/vendor/github.com/operator-framework/operator-sdk/test/e2e/incluster-test-code/memcached_test.go.tmpl new file mode 100644 index 0000000000..527371fc7e --- /dev/null +++ b/vendor/github.com/operator-framework/operator-sdk/test/e2e/incluster-test-code/memcached_test.go.tmpl @@ -0,0 +1,124 @@ +// Copyright 2018 The Operator-SDK 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 e2e + +import ( + goctx "context" + "fmt" + "testing" + "time" + + operator "github.com/example-inc/memcached-operator/pkg/apis/cache/v1alpha1" + framework "github.com/operator-framework/operator-sdk/pkg/test" + "github.com/operator-framework/operator-sdk/pkg/test/e2eutil" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" +) + +var ( + retryInterval = time.Second * 5 + timeout = time.Second * 30 + cleanupRetryInterval = time.Second * 1 + cleanupTimeout = time.Second * 5 +) + +func TestMemcached(t *testing.T) { + memcachedList := &operator.MemcachedList{ + TypeMeta: metav1.TypeMeta{ + Kind: "Memcached", + APIVersion: "cache.example.com/v1alpha1", + }, + } + err := framework.AddToFrameworkScheme(operator.AddToScheme, memcachedList) + if err != nil { + t.Fatalf("failed to add custom resource scheme to framework: %v", err) + } + // run subtests + t.Run("memcached-group", func(t *testing.T) { + t.Run("Cluster", MemcachedCluster) + t.Run("Cluster2", MemcachedCluster) + }) +} + +func memcachedScaleTest(t *testing.T, f *framework.Framework, ctx *framework.TestCtx) error { + namespace, err := ctx.GetNamespace() + if err != nil { + return fmt.Errorf("could not get namespace: %v", err) + } + // create memcached custom resource + exampleMemcached := &operator.Memcached{ + TypeMeta: metav1.TypeMeta{ + Kind: "Memcached", + APIVersion: "cache.example.com/v1alpha1", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "example-memcached", + Namespace: namespace, + }, + Spec: operator.MemcachedSpec{ + Size: 3, + }, + } + // use TestCtx's create helper to create the object and add a cleanup function for the new object + err = f.Client.Create(goctx.TODO(), exampleMemcached, &framework.CleanupOptions{TestContext: ctx, Timeout: cleanupTimeout, RetryInterval: cleanupRetryInterval}) + if err != nil { + return err + } + // wait for example-memcached to reach 3 replicas + err = e2eutil.WaitForDeployment(t, f.KubeClient, namespace, "example-memcached", 3, retryInterval, timeout) + if err != nil { + return err + } + + err = f.Client.Get(goctx.TODO(), types.NamespacedName{Name: "example-memcached", Namespace: namespace}, exampleMemcached) + if err != nil { + return err + } + exampleMemcached.Spec.Size = 4 + err = f.Client.Update(goctx.TODO(), exampleMemcached) + if err != nil { + return err + } + + // wait for example-memcached to reach 4 replicas + return e2eutil.WaitForDeployment(t, f.KubeClient, namespace, "example-memcached", 4, retryInterval, timeout) +} + +func MemcachedCluster(t *testing.T) { + t.Parallel() + ctx := framework.NewTestCtx(t) + defer ctx.Cleanup() + err := ctx.InitializeClusterResources(&framework.CleanupOptions{TestContext: ctx, Timeout: cleanupTimeout, RetryInterval: cleanupRetryInterval}) + if err != nil { + t.Fatalf("failed to initialize cluster resources: %v", err) + } + t.Log("Initialized cluster resources") + namespace, err := ctx.GetNamespace() + if err != nil { + t.Fatal(err) + } + // get global framework variables + f := framework.Global + // wait for memcached-operator to be ready + err = e2eutil.WaitForDeployment(t, f.KubeClient, namespace, "memcached-operator", 1, retryInterval, timeout) + if err != nil { + t.Fatal(err) + } + + if err = memcachedScaleTest(t, f, ctx); err != nil { + t.Fatal(err) + } +} diff --git a/vendor/github.com/operator-framework/operator-sdk/test/e2e/memcached_test.go b/vendor/github.com/operator-framework/operator-sdk/test/e2e/memcached_test.go index 062e23a0e8..638bafdbea 100644 --- a/vendor/github.com/operator-framework/operator-sdk/test/e2e/memcached_test.go +++ b/vendor/github.com/operator-framework/operator-sdk/test/e2e/memcached_test.go @@ -16,12 +16,11 @@ package e2e import ( "bytes" - "io" "io/ioutil" - "net/http" "os" "os/exec" "path" + "strings" "testing" "time" @@ -29,6 +28,7 @@ import ( framework "github.com/operator-framework/operator-sdk/test/e2e/framework" "k8s.io/apimachinery/pkg/types" + "k8s.io/apimachinery/pkg/util/wait" ) const ( @@ -47,6 +47,13 @@ func TestMemcached(t *testing.T) { if !ok { t.Fatalf("$GOPATH not set") } + cd, err := os.Getwd() + if err != nil { + t.Fatal(err) + } + defer func() { + os.Chdir(cd) + }() os.Chdir(path.Join(gopath, "/src/github.com/example-inc")) t.Log("Creating new operator project") cmdOut, err := exec.Command("operator-sdk", @@ -60,22 +67,9 @@ func TestMemcached(t *testing.T) { ctx.AddFinalizerFn(func() error { return os.RemoveAll(path.Join(gopath, "/src/github.com/example-inc/memcached-operator")) }) os.Chdir("memcached-operator") - os.RemoveAll("vendor/github.com/operator-framework/operator-sdk/pkg") - os.Symlink(path.Join(gopath, "/src/github.com/operator-framework/operator-sdk/pkg"), - "vendor/github.com/operator-framework/operator-sdk/pkg") - handlerFile, err := os.Create("pkg/stub/handler.go") - if err != nil { - t.Fatal(err) - } - ctx.AddFinalizerFn(func() error { return handlerFile.Close() }) - handlerTemplate, err := http.Get("https://raw.githubusercontent.com/operator-framework/operator-sdk/master/example/memcached-operator/handler.go.tmpl") + cmdOut, err = exec.Command("cp", "-a", path.Join(gopath, "/src/github.com/operator-framework/operator-sdk/example/memcached-operator/handler.go.tmpl"), "pkg/stub/handler.go").CombinedOutput() if err != nil { - t.Fatal(err) - } - ctx.AddFinalizerFn(func() error { return handlerTemplate.Body.Close() }) - _, err = io.Copy(handlerFile, handlerTemplate.Body) - if err != nil { - t.Fatal(err) + t.Fatalf("could not copy memcached example to to pkg/stub/handler.go: %v\nCommand Output:\n%v", err, string(cmdOut)) } memcachedTypesFile, err := ioutil.ReadFile("pkg/apis/cache/v1alpha1/types.go") if err != nil { @@ -97,6 +91,57 @@ func TestMemcached(t *testing.T) { t.Fatalf("error: %v\nCommand Output: %s\n", err, string(cmdOut)) } + t.Log("Copying test files to ./test") + if err = os.MkdirAll("./test", os.FileMode(int(0755))); err != nil { + t.Fatalf("could not create test/e2e dir: %v", err) + } + cmdOut, err = exec.Command("cp", "-a", path.Join(gopath, "/src/github.com/operator-framework/operator-sdk/test/e2e/incluster-test-code"), "./test/e2e").CombinedOutput() + if err != nil { + t.Fatalf("could not copy tests to test/e2e: %v\nCommand Output:\n%v", err, string(cmdOut)) + } + // fix naming of files + cmdOut, err = exec.Command("mv", "test/e2e/main_test.go.tmpl", "test/e2e/main_test.go").CombinedOutput() + if err != nil { + t.Fatalf("could not rename test/e2e/main_test.go.tmpl: %v\nCommand Output:\n%v", err, string(cmdOut)) + } + cmdOut, err = exec.Command("mv", "test/e2e/memcached_test.go.tmpl", "test/e2e/memcached_test.go").CombinedOutput() + if err != nil { + t.Fatalf("could not rename test/e2e/memcached_test.go.tmpl: %v\nCommand Output:\n%v", err, string(cmdOut)) + } + t.Log("Pulling new dependencies with dep ensure") + prSlug, ok := os.LookupEnv("TRAVIS_PULL_REQUEST_SLUG") + if ok && prSlug != "" { + prSha, ok := os.LookupEnv("TRAVIS_PULL_REQUEST_SHA") + if ok && prSha != "" { + gopkg, err := ioutil.ReadFile("Gopkg.toml") + if err != nil { + t.Fatal(err) + } + // TODO: make this match more complete in case we add another repo tracking master + gopkg = bytes.Replace(gopkg, []byte("branch = \"master\""), []byte("# branch = \"master\""), -1) + gopkgString := string(gopkg) + gopkgLoc := strings.LastIndex(gopkgString, "\n name = \"github.com/operator-framework/operator-sdk\"\n") + gopkgString = gopkgString[:gopkgLoc] + "\n source = \"https://github.com/" + prSlug + "\"\n revision = \"" + prSha + "\"\n" + gopkgString[gopkgLoc+1:] + err = ioutil.WriteFile("Gopkg.toml", []byte(gopkgString), os.FileMode(filemode)) + if err != nil { + t.Fatalf("failed to write updated Gopkg.toml: %v", err) + } + t.Logf("Gopkg.toml: %v", gopkgString) + } else { + t.Fatal("could not find sha of PR") + } + } + cmdOut, err = exec.Command("dep", "ensure").CombinedOutput() + if err != nil { + t.Fatalf("dep ensure failed: %v\nCommand Output:\n%v", err, string(cmdOut)) + } + // link local sdk to vendor if not in travis + if prSlug == "" { + os.RemoveAll("vendor/github.com/operator-framework/operator-sdk/pkg") + os.Symlink(path.Join(gopath, "/src/github.com/operator-framework/operator-sdk/pkg"), + "vendor/github.com/operator-framework/operator-sdk/pkg") + } + // create crd crdYAML, err := ioutil.ReadFile("deploy/crd.yaml") err = ctx.CreateFromYAML(crdYAML) @@ -105,9 +150,10 @@ func TestMemcached(t *testing.T) { } t.Log("Created crd") - // run both subtests + // run subtests t.Run("memcached-group", func(t *testing.T) { t.Run("Cluster", MemcachedCluster) + t.Run("ClusterTest", MemcachedClusterTest) t.Run("Local", MemcachedLocal) }) } @@ -161,7 +207,6 @@ func memcachedScaleTest(t *testing.T, f *framework.Framework, ctx framework.Test } func MemcachedLocal(t *testing.T) { - t.Parallel() // get global framework variables f := framework.Global ctx := f.NewTestCtx(t) @@ -185,7 +230,7 @@ func MemcachedLocal(t *testing.T) { ctx.AddFinalizerFn(func() error { return cmd.Process.Signal(os.Interrupt) }) // wait for operator to start (may take a minute to compile the command...) - err = e2eutil.Retry(time.Second*5, 16, func() (done bool, err error) { + err = wait.Poll(time.Second*5, time.Second*100, func() (done bool, err error) { file, err := ioutil.ReadFile("stderr.txt") if err != nil { return false, err @@ -196,7 +241,7 @@ func MemcachedLocal(t *testing.T) { return true, nil }) if err != nil { - t.Fatalf("local operator not ready after 60 seconds: %v\n", err) + t.Fatalf("local operator not ready after 100 seconds: %v\n", err) } if err = memcachedScaleTest(t, f, ctx); err != nil { @@ -205,22 +250,17 @@ func MemcachedLocal(t *testing.T) { } func MemcachedCluster(t *testing.T) { - t.Parallel() // get global framework variables f := framework.Global ctx := f.NewTestCtx(t) defer ctx.Cleanup(t) - local := *f.ImageName == "" - if local { - *f.ImageName = "quay.io/example/memcached-operator:v0.0.1" - } - t.Log("Building operator docker image") - cmdOut, err := exec.Command("operator-sdk", "build", *f.ImageName).CombinedOutput() + operatorYAML, err := ioutil.ReadFile("deploy/operator.yaml") if err != nil { - t.Fatalf("error: %v\nCommand Output: %s\n", err, string(cmdOut)) + t.Fatalf("could not read deploy/operator.yaml: %v", err) } + local := *f.ImageName == "" if local { - operatorYAML, err := ioutil.ReadFile("deploy/operator.yaml") + *f.ImageName = "quay.io/example/memcached-operator:v0.0.1" if err != nil { t.Fatal(err) } @@ -229,7 +269,22 @@ func MemcachedCluster(t *testing.T) { if err != nil { t.Fatal(err) } - } else { + } + operatorYAML = bytes.Replace(operatorYAML, []byte("REPLACE_IMAGE"), []byte(*f.ImageName), 1) + err = ioutil.WriteFile("deploy/operator.yaml", operatorYAML, os.FileMode(0644)) + if err != nil { + t.Fatalf("failed to write deploy/operator.yaml: %v", err) + } + t.Log("Building operator docker image") + cmdOut, err := exec.Command("operator-sdk", "build", *f.ImageName, + "--enable-tests", + "--test-location", "./test/e2e", + "--namespaced-manifest", "deploy/operator.yaml").CombinedOutput() + if err != nil { + t.Fatalf("error: %v\nCommand Output: %s\n", err, string(cmdOut)) + } + + if !local { t.Log("Pushing docker image to repo") cmdOut, err = exec.Command("docker", "push", *f.ImageName).CombinedOutput() if err != nil { @@ -237,6 +292,17 @@ func MemcachedCluster(t *testing.T) { } } + // create sa + saYAML, err := ioutil.ReadFile("deploy/sa.yaml") + if err != nil { + t.Fatal(err) + } + err = ctx.CreateFromYAML(saYAML) + if err != nil { + t.Fatal(err) + } + t.Log("Created sa") + // create rbac rbacYAML, err := ioutil.ReadFile("deploy/rbac.yaml") rbacYAMLSplit := bytes.Split(rbacYAML, []byte("\n---\n")) @@ -249,7 +315,7 @@ func MemcachedCluster(t *testing.T) { t.Log("Created rbac") // create operator - operatorYAML, err := ioutil.ReadFile("deploy/operator.yaml") + operatorYAML, err = ioutil.ReadFile("deploy/operator.yaml") if err != nil { t.Fatal(err) } @@ -273,3 +339,42 @@ func MemcachedCluster(t *testing.T) { t.Fatal(err) } } + +func MemcachedClusterTest(t *testing.T) { + // get global framework variables + f := framework.Global + ctx := f.NewTestCtx(t) + defer ctx.Cleanup(t) + + // create sa + saYAML, err := ioutil.ReadFile("deploy/sa.yaml") + if err != nil { + t.Fatal(err) + } + err = ctx.CreateFromYAML(saYAML) + if err != nil { + t.Fatal(err) + } + t.Log("Created sa") + + // create rbac + rbacYAML, err := ioutil.ReadFile("deploy/rbac.yaml") + err = ctx.CreateFromYAML(rbacYAML) + if err != nil { + t.Fatalf("failed to create rbac: %v", err) + } + t.Log("Created rbac") + + namespace, err := ctx.GetNamespace() + if err != nil { + t.Fatalf("could not get namespace: %v", err) + } + cmdOut, err := exec.Command("operator-sdk", "test", "cluster", *f.ImageName, + "--namespace", namespace, + "--image-pull-policy", "Never", + "--service-account", "memcached-operator").CombinedOutput() + if err != nil { + t.Fatalf("in-cluster test failed: %v\nCommand Output:\n%s", err, string(cmdOut)) + } + +} diff --git a/vendor/github.com/operator-framework/operator-sdk/test/e2e/testdata/ca-csr.json b/vendor/github.com/operator-framework/operator-sdk/test/e2e/testdata/ca-csr.json new file mode 100644 index 0000000000..6f13ed8d33 --- /dev/null +++ b/vendor/github.com/operator-framework/operator-sdk/test/e2e/testdata/ca-csr.json @@ -0,0 +1,17 @@ +{ + "key": { + "algo": "rsa", + "size": 2048 + }, + "names": [ + { + "L": "San Francisco", + "ST": "California", + "C": "USA" + } + ], + "CN": "ca", + "ca": { + "expiry": "87600h" + } + } diff --git a/vendor/github.com/operator-framework/operator-sdk/test/e2e/testdata/ca.crt b/vendor/github.com/operator-framework/operator-sdk/test/e2e/testdata/ca.crt new file mode 100644 index 0000000000..015172df5d --- /dev/null +++ b/vendor/github.com/operator-framework/operator-sdk/test/e2e/testdata/ca.crt @@ -0,0 +1,21 @@ +-----BEGIN CERTIFICATE----- +MIIDhDCCAmygAwIBAgIUJCpEclRVqfgYKUIyrk6m46BqH0EwDQYJKoZIhvcNAQEL +BQAwSDEMMAoGA1UEBhMDVVNBMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQH +Ew1TYW4gRnJhbmNpc2NvMQswCQYDVQQDEwJjYTAeFw0xODA4MzAyMDEyMDBaFw0y +ODA4MjcyMDEyMDBaMEgxDDAKBgNVBAYTA1VTQTETMBEGA1UECBMKQ2FsaWZvcm5p +YTEWMBQGA1UEBxMNU2FuIEZyYW5jaXNjbzELMAkGA1UEAxMCY2EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDwSnTyS56xvTRBNbkNNoYBfOJNGzSNCtF/ +u2NrYUQW9YOCCceuhl8q4g8H6/+HTV9RlRiTAY7DSFSZUK/C3x4uFhY1emXjzgqT +Z19FKEKwkVhqo7XSkGrqb37U0vgdO2eyGWqVt2gS50wNimo4Z3HcfsziDtqFZpxb +9ZuCiWmGpnkx+NuH9Qq2LBHSdOHI+HWw7E/91ZAaTmW/QA9W9HvxKNC9pmFFBRtd +WDjGvHsTmpgPZ2Pce/jcJ6SAaO82KXM0ksW4LmaK4OTUPN+c3KODA/gSau77DNNG +bnjQ6CkyKKOfInGDVhpG57p+LuIbt724bCxmNRkvjYwrr+dEL4SpAgMBAAGjZjBk +MA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgECMB0GA1UdDgQWBBSN +6FinnI4qg4IeK9PGzzufD6usjDAfBgNVHSMEGDAWgBSN6FinnI4qg4IeK9PGzzuf +D6usjDANBgkqhkiG9w0BAQsFAAOCAQEAy6sn3xyNcQ/HzD1Ii7p4toc5qbgDONnq +9YkbIoNFxFj8DTQ86r6jcj94PnylIhBe1I1k70tVVal7nM+4wnNaTktAfiQN/mYJ +RyvMTXN6+Vsl93AeBMo7DIGElz2sL2EkOTct1QmTr7hr/3u4SfBvppFnxYqJKiI3 +GX3V0kV1iuAllyHR787hkWq28LQ3WXtqnybAR23SMVtQNrHw1t1ia5eStK4Gbfl/ +FN/BNwkV6i8Q/5B2obCUJWpzt4UqB4hXv3TmhYCeA8ddq7LYjjil11Ed21o95QyK +FooF2jEmda+zivmB/XKC+5+DfL00x0G1QqbME6ilGkpRx2gDFg03cg== +-----END CERTIFICATE----- diff --git a/vendor/github.com/operator-framework/operator-sdk/test/e2e/testdata/ca.csr b/vendor/github.com/operator-framework/operator-sdk/test/e2e/testdata/ca.csr new file mode 100644 index 0000000000..0a1c4abe60 --- /dev/null +++ b/vendor/github.com/operator-framework/operator-sdk/test/e2e/testdata/ca.csr @@ -0,0 +1,16 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIICjTCCAXUCAQAwSDEMMAoGA1UEBhMDVVNBMRMwEQYDVQQIEwpDYWxpZm9ybmlh +MRYwFAYDVQQHEw1TYW4gRnJhbmNpc2NvMQswCQYDVQQDEwJjYTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAPBKdPJLnrG9NEE1uQ02hgF84k0bNI0K0X+7 +Y2thRBb1g4IJx66GXyriDwfr/4dNX1GVGJMBjsNIVJlQr8LfHi4WFjV6ZePOCpNn +X0UoQrCRWGqjtdKQaupvftTS+B07Z7IZapW3aBLnTA2Kajhncdx+zOIO2oVmnFv1 +m4KJaYameTH424f1CrYsEdJ04cj4dbDsT/3VkBpOZb9AD1b0e/Eo0L2mYUUFG11Y +OMa8exOamA9nY9x7+NwnpIBo7zYpczSSxbguZorg5NQ835zco4MD+BJq7vsM00Zu +eNDoKTIoo58icYNWGkbnun4u4hu3vbhsLGY1GS+NjCuv50QvhKkCAwEAAaAAMA0G +CSqGSIb3DQEBCwUAA4IBAQDDqdtWrOmptqpQNDG6nt1EW6KLwSPhZBx+wwGVpPtb +cXVSvjQkmIzK0G22XtDnIIix+D65hvFIPyVvKYVhDm5LhRvcguyRAV2SkrDlhBka +tZG03yvvUE4hbdWjJtk7CAUoKOZ1Sl47zdf0Rn1b/LZd9gQ6Ew08YRfdZ9VLQdOm +j/o6owGqIpU/dCaMZZ/8jzccmqt6QkiTSlyrA2ws38S0wcEsILp8vppLQc056Qiw +AcqwwUw1jp8omqozPCKir12gNjkWxLnZ56ka1PwUJr0cj8QYUqHC0q/xl2eNw2lU +W8qZn+2N43F3KvJ5BPUbuu+69G8EQhhMKHq69G6WSGhQ +-----END CERTIFICATE REQUEST----- diff --git a/vendor/github.com/operator-framework/operator-sdk/test/e2e/testdata/ca.key b/vendor/github.com/operator-framework/operator-sdk/test/e2e/testdata/ca.key new file mode 100644 index 0000000000..d170af1699 --- /dev/null +++ b/vendor/github.com/operator-framework/operator-sdk/test/e2e/testdata/ca.key @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEpAIBAAKCAQEA8Ep08kuesb00QTW5DTaGAXziTRs0jQrRf7tja2FEFvWDggnH +roZfKuIPB+v/h01fUZUYkwGOw0hUmVCvwt8eLhYWNXpl484Kk2dfRShCsJFYaqO1 +0pBq6m9+1NL4HTtnshlqlbdoEudMDYpqOGdx3H7M4g7ahWacW/WbgolphqZ5Mfjb +h/UKtiwR0nThyPh1sOxP/dWQGk5lv0APVvR78SjQvaZhRQUbXVg4xrx7E5qYD2dj +3Hv43CekgGjvNilzNJLFuC5miuDk1DzfnNyjgwP4Emru+wzTRm540OgpMiijnyJx +g1YaRue6fi7iG7e9uGwsZjUZL42MK6/nRC+EqQIDAQABAoIBAAbaSL2ENJFjEPNv +IcjjriyqsBV82iHPlivrXyl3y6ZP+CEkQEKU6G/jpIQYUeA876P2+Y1vtO+Sx37b +0zdef5DW5mk+BVvay2hqwUfKnyRD8N6RrqTDo5jt9xMAtTy4LfvhR63fXiNz3zJf +qSnUoWWlZBhqTgcR5xGkTnwJiS3i0Vk9/xU1zNL7OZpSSSuefXuq2qQtG+Gayrps +KAp1essnKnNRyiQH2yOn3pXs5Mj+ytWCV7C9eL1TAg0ZSIjuV+S/CNpCHsVLv5p6 +yj/CWjzV7NOhsdHoo5t1FsALhQaov0bb6hv96ZbTwkPoegr1SLQnYx63kOo//AmK +uCgZgxECgYEA/qmFoBlRNm2AJ/vRp0t6JoERF9LhsUWSYRmcSho2xG5fLwzSxCjR +YOxFEdZl3hzkH/rhY7+Vg6rOH5rhjL4hBKnrCkZcC88J7WCTI4mJDwTP/iViahAg +RVEvJ6T51qI8N1wojumuQIhbUmVcWiZA49QRC/5DqIgZ1lRDWycqTeUCgYEA8Y2b +mCI5zvjPci/1WBbPqA9ZDdbi4MmvO/RG+ik4RZnN7poxg2JU/Ta5RAFB1UY21bo8 +JTiL2pRqLaGLi0HPEJEaS6K5a+9oK5tUtmJp6CgpnNiNmALUyaoXbg3lrv5ajo74 +G94AZEIha0r9ReECvtk/sdsK1IgZaBtCIJ2Lj3UCgYEAjo+4DngdzqpeJAQEyfKm +3wdB2mRjlCmuWE1OAO3L2wsundg/5TA0hl2+DM5JGJ5z1rNLmduWh68G1QqPWYrW +URYOTiI1RScSF6EIvcwwvgejqFKlVVrRtfxMuZTRiCYqL5OX4OlQcy/ib63ulUj0 +6pW9NUmR9ra6QBHL4yt5s0ECgYEAsAJpX/+AdAnkzuWXNqrYgTM9xtHP28/aOiuT +FHG4qS6bWcNNVNjv6NpZQO5RlCBnkHD1poF/lrQSclGGJuC7Cu1QZdCan8WA+FVk +8sjfNuUc/UbmVd+qQZAJJo5F0K9SORKAQ34Odv+g7ldkGekNYRdYTDa5u4e4S52h +H7bsnIkCgYAJZRkDWjhPhWX7hv9HcLcyW/yOe9tEys/2UoYBr+j3X0eraKR1+EUr +Xli+yuPBbRo5+bEzAXI/gbZGu3J6vZm0J9qHc1ybqLvcTcOweTBU7xs4aeJsSK5O +w0BnNOc/05hLf2Ow02ZlZBELMXpp1Y187+FKEmkwxTrgaGB3rZanVA== +-----END RSA PRIVATE KEY----- diff --git a/vendor/github.com/operator-framework/operator-sdk/test/e2e/testdata/gencert.json b/vendor/github.com/operator-framework/operator-sdk/test/e2e/testdata/gencert.json new file mode 100644 index 0000000000..dcf3105481 --- /dev/null +++ b/vendor/github.com/operator-framework/operator-sdk/test/e2e/testdata/gencert.json @@ -0,0 +1,13 @@ +{ + "signing": { + "default": { + "usages": [ + "signing", + "key encipherment", + "server auth", + "client auth" + ], + "expiry": "87600h" + } + } +} diff --git a/vendor/github.com/operator-framework/operator-sdk/test/e2e/testdata/gencert.sh b/vendor/github.com/operator-framework/operator-sdk/test/e2e/testdata/gencert.sh new file mode 100755 index 0000000000..c81225618d --- /dev/null +++ b/vendor/github.com/operator-framework/operator-sdk/test/e2e/testdata/gencert.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +if ! [[ "$0" =~ "./gencert.sh" ]]; then + echo "must be run from 'testdata'" + exit 255 +fi + +if ! which cfssl; then + echo "cfssl is not installed" + exit 255 +fi + +cfssl gencert --initca=true ./ca-csr.json | cfssljson --bare ca - +mv ca.pem ca.crt +mv ca-key.pem ca.key +if which openssl >/dev/null; then + openssl x509 -in ca.crt -noout -text +fi diff --git a/vendor/github.com/operator-framework/operator-sdk/test/e2e/tls_util_test.go b/vendor/github.com/operator-framework/operator-sdk/test/e2e/tls_util_test.go new file mode 100644 index 0000000000..f87a60f3df --- /dev/null +++ b/vendor/github.com/operator-framework/operator-sdk/test/e2e/tls_util_test.go @@ -0,0 +1,337 @@ +// Copyright 2018 The Operator-SDK 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 e2e + +import ( + "io/ioutil" + "reflect" + "testing" + + "github.com/operator-framework/operator-sdk/pkg/tlsutil" + framework "github.com/operator-framework/operator-sdk/test/e2e/framework" + + "k8s.io/api/core/v1" + apiErrors "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" +) + +var ( + // TLS test variables. + crKind = "Pod" + crName = "example-pod" + certName = "app-cert" + caConfigMapAndSecretName = tlsutil.ToCASecretAndConfigMapName(crKind, crName) + appSecretName = tlsutil.ToAppSecretName(crKind, crName, certName) + + caConfigMap *v1.ConfigMap + caSecret *v1.Secret + appSecret *v1.Secret + + ccfg *tlsutil.CertConfig +) + +// setup test variables. +func init() { + caCertBytes, err := ioutil.ReadFile("./testdata/ca.crt") + if err != nil { + panic(err) + } + caConfigMap = &v1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Name: caConfigMapAndSecretName, + }, + Data: map[string]string{tlsutil.TLSCACertKey: string(caCertBytes)}, + } + + caKeyBytes, err := ioutil.ReadFile("./testdata/ca.key") + if err != nil { + panic(err) + } + caSecret = &v1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Name: caConfigMapAndSecretName, + }, + Data: map[string][]byte{tlsutil.TLSPrivateCAKeyKey: caKeyBytes}, + } + + appSecret = &v1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Name: appSecretName, + }, + } + + ccfg = &tlsutil.CertConfig{ + CertName: certName, + } +} + +// TestBothAppAndCATLSAssetsExist ensures that when both application +// and CA TLS assets exist in the k8s cluster for a given cr, +// the GenerateCert() simply returns those to the caller. +func TestBothAppAndCATLSAssetsExist(t *testing.T) { + f := framework.Global + ctx := f.NewTestCtx(t) + defer ctx.Cleanup(t) + namespace, err := ctx.GetNamespace() + if err != nil { + t.Fatal(err) + } + + appSecret, err := f.KubeClient.CoreV1().Secrets(namespace).Create(appSecret) + if err != nil { + t.Fatal(err) + } + + caConfigMap, err := f.KubeClient.CoreV1().ConfigMaps(namespace).Create(caConfigMap) + if err != nil { + t.Fatal(err) + } + + caSecret, err := f.KubeClient.CoreV1().Secrets(namespace).Create(caSecret) + if err != nil { + t.Fatal(err) + } + + cg := tlsutil.NewSDKCertGenerator(f.KubeClient) + actualAppSecret, actualCaConfigMap, actualCaSecret, err := cg.GenerateCert(newDummyCR(namespace), nil, ccfg) + if err != nil { + t.Fatal(err) + } + + if !reflect.DeepEqual(appSecret, actualAppSecret) { + t.Fatalf("expect %+v, but got %+v", appSecret, actualAppSecret) + } + if !reflect.DeepEqual(caConfigMap, actualCaConfigMap) { + t.Fatalf("expect %+v, but got %+v", caConfigMap, actualCaConfigMap) + } + if !reflect.DeepEqual(caSecret, actualCaSecret) { + t.Fatalf("expect %+v, but got %+v", caSecret, actualCaSecret) + } +} + +// TestOnlyAppSecretExist tests a case where the application TLS asset exists but its +// correspoding CA asset doesn't. In this case, CertGenerator can't genereate a new CA because +// it won't verify the existing application TLS cert. Therefore, CertGenerator can't proceed +// and returns an error to the caller. +func TestOnlyAppSecretExist(t *testing.T) { + f := framework.Global + ctx := f.NewTestCtx(t) + defer ctx.Cleanup(t) + namespace, err := ctx.GetNamespace() + if err != nil { + t.Fatal(err) + } + + _, err = f.KubeClient.CoreV1().Secrets(namespace).Create(appSecret) + if err != nil { + t.Fatal(err) + } + + cg := tlsutil.NewSDKCertGenerator(f.KubeClient) + _, _, _, err = cg.GenerateCert(newDummyCR(namespace), nil, ccfg) + if err == nil { + t.Fatal("expect error, but got none") + } + if err != tlsutil.ErrCANotFound { + t.Fatalf("expect %v, but got %v", tlsutil.ErrCANotFound.Error(), err.Error()) + } +} + +// TestOnlyCAExist tests the case where only the CA exists in the cluster; +// GenerateCert can retrieve the CA and uses it to create a new application secret. +func TestOnlyCAExist(t *testing.T) { + f := framework.Global + ctx := f.NewTestCtx(t) + defer ctx.Cleanup(t) + namespace, err := ctx.GetNamespace() + if err != nil { + t.Fatal(err) + } + + _, err = f.KubeClient.CoreV1().ConfigMaps(namespace).Create(caConfigMap) + if err != nil { + t.Fatal(err) + } + _, err = f.KubeClient.CoreV1().Secrets(namespace).Create(caSecret) + if err != nil { + t.Fatal(err) + } + + cg := tlsutil.NewSDKCertGenerator(f.KubeClient) + appSecret, _, _, err := cg.GenerateCert(newDummyCR(namespace), newAppSvc(namespace), ccfg) + if err != nil { + t.Fatal(err) + } + + verifyAppSecret(t, appSecret, namespace) +} + +// TestNoneOfCaAndAppSecretExist ensures that when none of the CA and Application TLS assets +// exist, GenerateCert() creates both and put them into the k8s cluster. +func TestNoneOfCaAndAppSecretExist(t *testing.T) { + f := framework.Global + ctx := f.NewTestCtx(t) + defer ctx.Cleanup(t) + namespace, err := ctx.GetNamespace() + if err != nil { + t.Fatal(err) + } + + cg := tlsutil.NewSDKCertGenerator(f.KubeClient) + appSecret, caConfigMap, caSecret, err := cg.GenerateCert(newDummyCR(namespace), newAppSvc(namespace), ccfg) + if err != nil { + t.Fatal(err) + } + + verifyAppSecret(t, appSecret, namespace) + verifyCaConfigMap(t, caConfigMap, namespace) + verifyCASecret(t, caSecret, namespace) +} + +// TestCustomCA ensures that if a user provides a custom Key and Cert and the CA and Application TLS assets +// do not exist, the GenerateCert method can use the custom CA to generate the TLS assest. +func TestCustomCA(t *testing.T) { + f := framework.Global + ctx := f.NewTestCtx(t) + defer ctx.Cleanup(t) + namespace, err := ctx.GetNamespace() + if err != nil { + t.Fatal(err) + } + + cg := tlsutil.NewSDKCertGenerator(f.KubeClient) + + customConfig := &tlsutil.CertConfig{ + CertName: certName, + CAKey: "testdata/ca.key", + CACert: "testdata/ca.crt", + } + appSecret, _, _, err := cg.GenerateCert(newDummyCR(namespace), newAppSvc(namespace), customConfig) + if err != nil { + t.Fatal(err) + } + + verifyAppSecret(t, appSecret, namespace) + + // ensure caConfigMap does not exist in k8s cluster. + _, err = framework.Global.KubeClient.CoreV1().Secrets(namespace).Get(caConfigMapAndSecretName, metav1.GetOptions{}) + if !apiErrors.IsNotFound(err) { + t.Fatal(err) + } + + // ensure caConfigMap does not exist in k8s cluster. + _, err = framework.Global.KubeClient.CoreV1().Secrets(namespace).Get(caConfigMapAndSecretName, metav1.GetOptions{}) + if !apiErrors.IsNotFound(err) { + t.Fatal(err) + } +} + +func verifyCASecret(t *testing.T, caSecret *v1.Secret, namespace string) { + // check if caConfigMap has the correct fields. + if caConfigMapAndSecretName != caSecret.Name { + t.Fatalf("expect the ca config name %v, but got %v", caConfigMapAndSecretName, caConfigMap.Name) + } + if namespace != caSecret.Namespace { + t.Fatalf("expect the ca config namespace %v, but got %v", namespace, appSecret.Namespace) + } + if _, ok := caSecret.Data[tlsutil.TLSPrivateCAKeyKey]; !ok { + t.Fatalf("expect the ca config to have the data field %v, but got none", tlsutil.TLSPrivateCAKeyKey) + } + + // check if caConfigMap exists in k8s cluster. + caSecretFromCluster, err := framework.Global.KubeClient.CoreV1().Secrets(namespace).Get(caConfigMapAndSecretName, metav1.GetOptions{}) + if err != nil { + t.Fatal(err) + } + // check if caSecret returned from GenerateCert is the same as the one that exists in the k8s. + if !reflect.DeepEqual(caSecret, caSecretFromCluster) { + t.Fatalf("expect %+v, but got %+v", caSecret, caSecretFromCluster) + } +} + +func verifyCaConfigMap(t *testing.T, caConfigMap *v1.ConfigMap, namespace string) { + // check if caConfigMap has the correct fields. + if caConfigMapAndSecretName != caConfigMap.Name { + t.Fatalf("expect the ca config name %v, but got %v", caConfigMapAndSecretName, caConfigMap.Name) + } + if namespace != caConfigMap.Namespace { + t.Fatalf("expect the ca config namespace %v, but got %v", namespace, appSecret.Namespace) + } + if _, ok := caConfigMap.Data[tlsutil.TLSCACertKey]; !ok { + t.Fatalf("expect the ca config to have the data field %v, but got none", tlsutil.TLSCACertKey) + } + + // check if caConfigMap exists in k8s cluster. + caConfigMapFromCluster, err := framework.Global.KubeClient.CoreV1().ConfigMaps(namespace).Get(caConfigMapAndSecretName, metav1.GetOptions{}) + if err != nil { + t.Fatal(err) + } + // check if caConfigMap returned from GenerateCert is the same as the one that exists in the k8s. + if !reflect.DeepEqual(caConfigMap, caConfigMapFromCluster) { + t.Fatalf("expect %+v, but got %+v", caConfigMap, caConfigMapFromCluster) + } +} + +func verifyAppSecret(t *testing.T, appSecret *v1.Secret, namespace string) { + // check if appSecret has the correct fields. + if appSecretName != appSecret.Name { + t.Fatalf("expect the secret name %v, but got %v", appSecretName, appSecret.Name) + } + if namespace != appSecret.Namespace { + t.Fatalf("expect the secret namespace %v, but got %v", namespace, appSecret.Namespace) + } + if v1.SecretTypeTLS != appSecret.Type { + t.Fatalf("expect the secret type %v, but got %v", v1.SecretTypeTLS, appSecret.Type) + } + if _, ok := appSecret.Data[v1.TLSCertKey]; !ok { + t.Fatalf("expect the secret to have the data field %v, but got none", v1.TLSCertKey) + } + if _, ok := appSecret.Data[v1.TLSPrivateKeyKey]; !ok { + t.Fatalf("expect the secret to have the data field %v, but got none", v1.TLSPrivateKeyKey) + } + + // check if appSecret exists in k8s cluster. + appSecretFromCluster, err := framework.Global.KubeClient.CoreV1().Secrets(namespace).Get(appSecretName, metav1.GetOptions{}) + if err != nil { + t.Fatal(err) + } + // check if appSecret returned from GenerateCert is the same as the one that exists in the k8s. + if !reflect.DeepEqual(appSecret, appSecretFromCluster) { + t.Fatalf("expect %+v, but got %+v", appSecret, appSecretFromCluster) + } +} + +// newDummyCR returns a dummy runtime object for the CR input of GenerateCert(). +func newDummyCR(namespace string) runtime.Object { + return &v1.Pod{ + TypeMeta: metav1.TypeMeta{ + Kind: crKind, + }, + ObjectMeta: metav1.ObjectMeta{ + Name: crName, + Namespace: namespace, + }, + } +} + +func newAppSvc(namespace string) *v1.Service { + return &v1.Service{ + ObjectMeta: metav1.ObjectMeta{ + Name: "app-service", + Namespace: namespace, + }, + } +} diff --git a/vendor/github.com/operator-framework/operator-sdk/test/test-ansible.sh b/vendor/github.com/operator-framework/operator-sdk/test/test-ansible.sh new file mode 100755 index 0000000000..4077f590e4 --- /dev/null +++ b/vendor/github.com/operator-framework/operator-sdk/test/test-ansible.sh @@ -0,0 +1,48 @@ +#!/usr/bin/env bash + +set -ev + +# switch to the "default" namespace if on openshift, to match the minikube test +if which oc 2>/dev/null; then oc project default; fi + +# build operator binary and base image +go build -o test/ansible-operator/ansible-operator test/ansible-operator/cmd/ansible-operator/main.go +pushd test +pushd ansible-operator +docker build -t quay.io/water-hole/ansible-operator . +popd + +# create and build the operator +operator-sdk new memcached-operator --api-version=ansible.example.com/v1alpha1 --kind=Memcached --type=ansible +cp ansible-memcached/tasks.yml memcached-operator/roles/Memcached/tasks/main.yml +cp ansible-memcached/defaults.yml memcached-operator/roles/Memcached/defaults/main.yml +cp -a ansible-memcached/memfin memcached-operator/roles/ +cat ansible-memcached/watches-finalizer.yaml >> memcached-operator/watches.yaml + +pushd memcached-operator +operator-sdk build quay.io/example/memcached-operator:v0.0.2 +sed -i 's|REPLACE_IMAGE|quay.io/example/memcached-operator:v0.0.2|g' deploy/operator.yaml +sed -i 's|Always|Never|g' deploy/operator.yaml + +# deploy the operator +kubectl create -f deploy/rbac.yaml +kubectl create -f deploy/crd.yaml +kubectl create -f deploy/operator.yaml + +# wait for operator pod to run +kubectl rollout status deployment/memcached-operator +kubectl logs deployment/memcached-operator + +# create CR +kubectl create -f deploy/cr.yaml +until kubectl get deployment -l app=memcached | grep memcached; do sleep 1; done +memcached_deployment=$(kubectl get deployment -l app=memcached -o jsonpath="{..metadata.name}") +kubectl rollout status deployment/${memcached_deployment} +kubectl logs deployment/${memcached_deployment} + +# Test finalizer +kubectl delete -f deploy/cr.yaml --wait=true +kubectl logs deployment/memcached-operator | grep "this is a finalizer" + +popd +popd diff --git a/vendor/github.com/operator-framework/operator-sdk/test/test-framework/deploy/namespace-init.yaml b/vendor/github.com/operator-framework/operator-sdk/test/test-framework/deploy/namespace-init.yaml new file mode 100644 index 0000000000..616ffcdca5 --- /dev/null +++ b/vendor/github.com/operator-framework/operator-sdk/test/test-framework/deploy/namespace-init.yaml @@ -0,0 +1,87 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: memcached-operator + +--- + +kind: Role +apiVersion: rbac.authorization.k8s.io/v1beta1 +metadata: + name: memcached-operator +rules: +- apiGroups: + - cache.example.com + resources: + - "*" + verbs: + - "*" +- apiGroups: + - "" + resources: + - pods + - services + - endpoints + - persistentvolumeclaims + - events + - configmaps + - secrets + verbs: + - "*" +- apiGroups: + - apps + resources: + - deployments + - daemonsets + - replicasets + - statefulsets + verbs: + - "*" + +--- + +kind: RoleBinding +apiVersion: rbac.authorization.k8s.io/v1beta1 +metadata: + name: memcached-operator +subjects: +- kind: ServiceAccount + name: memcached-operator +roleRef: + kind: Role + name: memcached-operator + apiGroup: rbac.authorization.k8s.io + +--- + +apiVersion: apps/v1 +kind: Deployment +metadata: + name: memcached-operator +spec: + replicas: 1 + selector: + matchLabels: + name: memcached-operator + template: + metadata: + labels: + name: memcached-operator + spec: + serviceAccountName: memcached-operator + containers: + - name: memcached-operator + image: quay.io/coreos/operator-sdk-dev:test-framework-operator + ports: + - containerPort: 60000 + name: metrics + command: + - memcached-operator + imagePullPolicy: Always + env: + - name: WATCH_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: OPERATOR_NAME + value: "memcached-operator" diff --git a/vendor/github.com/operator-framework/operator-sdk/test/test-framework/deploy/operator.yaml b/vendor/github.com/operator-framework/operator-sdk/test/test-framework/deploy/operator.yaml index 9401f37728..c6d41c356c 100644 --- a/vendor/github.com/operator-framework/operator-sdk/test/test-framework/deploy/operator.yaml +++ b/vendor/github.com/operator-framework/operator-sdk/test/test-framework/deploy/operator.yaml @@ -12,6 +12,7 @@ spec: labels: name: memcached-operator spec: + serviceAccountName: memcached-operator containers: - name: memcached-operator image: quay.io/coreos/operator-sdk-dev:test-framework-operator diff --git a/vendor/github.com/operator-framework/operator-sdk/test/test-framework/deploy/rbac.yaml b/vendor/github.com/operator-framework/operator-sdk/test/test-framework/deploy/rbac.yaml index 38ab6d074d..6b5c50692c 100644 --- a/vendor/github.com/operator-framework/operator-sdk/test/test-framework/deploy/rbac.yaml +++ b/vendor/github.com/operator-framework/operator-sdk/test/test-framework/deploy/rbac.yaml @@ -36,10 +36,10 @@ rules: kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: - name: default-account-memcached-operator + name: memcached-operator subjects: - kind: ServiceAccount - name: default + name: memcached-operator roleRef: kind: Role name: memcached-operator diff --git a/vendor/github.com/operator-framework/operator-sdk/test/test-framework/deploy/sa.yaml b/vendor/github.com/operator-framework/operator-sdk/test/test-framework/deploy/sa.yaml new file mode 100644 index 0000000000..3d20ca24c0 --- /dev/null +++ b/vendor/github.com/operator-framework/operator-sdk/test/test-framework/deploy/sa.yaml @@ -0,0 +1,4 @@ +kind: ServiceAccount +apiVersion: v1 +metadata: + name: memcached-operator diff --git a/vendor/github.com/operator-framework/operator-sdk/test/test-framework/memcached_test.go b/vendor/github.com/operator-framework/operator-sdk/test/test-framework/memcached_test.go index b138784a8e..1325a0e5ab 100644 --- a/vendor/github.com/operator-framework/operator-sdk/test/test-framework/memcached_test.go +++ b/vendor/github.com/operator-framework/operator-sdk/test/test-framework/memcached_test.go @@ -29,8 +29,10 @@ import ( ) var ( - retryInterval = time.Second * 5 - timeout = time.Second * 30 + retryInterval = time.Second * 5 + timeout = time.Second * 30 + cleanupRetryInterval = time.Second * 1 + cleanupTimeout = time.Second * 5 ) func TestMemcached(t *testing.T) { @@ -51,7 +53,7 @@ func TestMemcached(t *testing.T) { }) } -func memcachedScaleTest(t *testing.T, f *framework.Framework, ctx framework.TestCtx) error { +func memcachedScaleTest(t *testing.T, f *framework.Framework, ctx *framework.TestCtx) error { namespace, err := ctx.GetNamespace() if err != nil { return fmt.Errorf("could not get namespace: %v", err) @@ -70,7 +72,8 @@ func memcachedScaleTest(t *testing.T, f *framework.Framework, ctx framework.Test Size: 3, }, } - err = f.DynamicClient.Create(goctx.TODO(), exampleMemcached) + // use TestCtx's create helper to create the object and add a cleanup function for the new object + err = f.Client.Create(goctx.TODO(), exampleMemcached, &framework.CleanupOptions{TestContext: ctx, Timeout: cleanupTimeout, RetryInterval: cleanupRetryInterval}) if err != nil { return err } @@ -80,12 +83,12 @@ func memcachedScaleTest(t *testing.T, f *framework.Framework, ctx framework.Test return err } - err = f.DynamicClient.Get(goctx.TODO(), types.NamespacedName{Name: "example-memcached", Namespace: namespace}, exampleMemcached) + err = f.Client.Get(goctx.TODO(), types.NamespacedName{Name: "example-memcached", Namespace: namespace}, exampleMemcached) if err != nil { return err } exampleMemcached.Spec.Size = 4 - err = f.DynamicClient.Update(goctx.TODO(), exampleMemcached) + err = f.Client.Update(goctx.TODO(), exampleMemcached) if err != nil { return err } @@ -97,8 +100,8 @@ func memcachedScaleTest(t *testing.T, f *framework.Framework, ctx framework.Test func MemcachedCluster(t *testing.T) { t.Parallel() ctx := framework.NewTestCtx(t) - defer ctx.Cleanup(t) - err := ctx.InitializeClusterResources() + defer ctx.Cleanup() + err := ctx.InitializeClusterResources(&framework.CleanupOptions{TestContext: ctx, Timeout: cleanupTimeout, RetryInterval: cleanupRetryInterval}) if err != nil { t.Fatalf("failed to initialize cluster resources: %v", err) } diff --git a/vendor/github.com/operator-framework/operator-sdk/test/test-go.sh b/vendor/github.com/operator-framework/operator-sdk/test/test-go.sh new file mode 100755 index 0000000000..176cec659e --- /dev/null +++ b/vendor/github.com/operator-framework/operator-sdk/test/test-go.sh @@ -0,0 +1,28 @@ +#!/usr/bin/env bash + +set -e + +go test ./commands/... +go test ./pkg/... +go test ./test/e2e/... +cd test/test-framework + +# test framework with defaults +operator-sdk test local . + +# test operator-sdk test flags +operator-sdk test local . --global-manifest deploy/crd.yaml --namespaced-manifest deploy/namespace-init.yaml --go-test-flags "-parallel 1" --kubeconfig $HOME/.kube/config + +# test operator-sdk test local single namespace mode +kubectl create namespace test-memcached +operator-sdk test local . --namespace=test-memcached +kubectl delete namespace test-memcached + +# go back to project root +cd ../.. +go vet ./... +./hack/check_license.sh +./hack/check_error_case.sh + +# Make sure repo is in clean state +git diff --exit-code diff --git a/vendor/github.com/operator-framework/operator-sdk/version/version.go b/vendor/github.com/operator-framework/operator-sdk/version/version.go index 41a20db131..617efb3928 100644 --- a/vendor/github.com/operator-framework/operator-sdk/version/version.go +++ b/vendor/github.com/operator-framework/operator-sdk/version/version.go @@ -15,5 +15,5 @@ package version var ( - Version = "0.0.5+git" + Version = "0.0.7" ) diff --git a/vendor/github.com/petar/GoLLRB/.gitignore b/vendor/github.com/petar/GoLLRB/.gitignore new file mode 100644 index 0000000000..e333b2dbf7 --- /dev/null +++ b/vendor/github.com/petar/GoLLRB/.gitignore @@ -0,0 +1,23 @@ +syntax:glob +*.[568ao] +*.ao +*.so +*.pyc +*.swp +*.swo +._* +.nfs.* +[568a].out +*~ +*.orig +*.pb.go +core +_obj +_test +src/pkg/Make.deps +_testmain.go + +syntax:regexp +^pkg/ +^src/cmd/(.*)/6?\1$ +^.*/core.[0-9]*$ diff --git a/vendor/github.com/petar/GoLLRB/AUTHORS b/vendor/github.com/petar/GoLLRB/AUTHORS new file mode 100644 index 0000000000..78d1de4956 --- /dev/null +++ b/vendor/github.com/petar/GoLLRB/AUTHORS @@ -0,0 +1,4 @@ +Petar Maymounkov +Vadim Vygonets +Ian Smith +Martin Bruse diff --git a/vendor/github.com/petar/GoLLRB/LICENSE b/vendor/github.com/petar/GoLLRB/LICENSE new file mode 100644 index 0000000000..b75312c787 --- /dev/null +++ b/vendor/github.com/petar/GoLLRB/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2010, Petar Maymounkov +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +(*) Redistributions of source code must retain the above copyright notice, this list +of conditions and the following disclaimer. + +(*) Redistributions in binary form must reproduce the above copyright notice, this +list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +(*) Neither the name of Petar Maymounkov 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. diff --git a/vendor/github.com/petar/GoLLRB/README.md b/vendor/github.com/petar/GoLLRB/README.md new file mode 100644 index 0000000000..742ca0bd56 --- /dev/null +++ b/vendor/github.com/petar/GoLLRB/README.md @@ -0,0 +1,66 @@ +# GoLLRB + +GoLLRB is a Left-Leaning Red-Black (LLRB) implementation of 2-3 balanced binary +search trees in Go Language. + +## Overview + +As of this writing and to the best of the author's knowledge, +Go still does not have a balanced binary search tree (BBST) data structure. +These data structures are quite useful in a variety of cases. A BBST maintains +elements in sorted order under dynamic updates (inserts and deletes) and can +support various order-specific queries. Furthermore, in practice one often +implements other common data structures like Priority Queues, using BBST's. + +2-3 trees (a type of BBST's), as well as the runtime-similar 2-3-4 trees, are +the de facto standard BBST algoritms found in implementations of Python, Java, +and other libraries. The LLRB method of implementing 2-3 trees is a recent +improvement over the traditional implementation. The LLRB approach was +discovered relatively recently (in 2008) by Robert Sedgewick of Princeton +University. + +GoLLRB is a Go implementation of LLRB 2-3 trees. + +## Maturity + +GoLLRB has been used in some pretty heavy-weight machine learning tasks over many gigabytes of data. +I consider it to be in stable, perhaps even production, shape. There are no known bugs. + +## Installation + +With a healthy Go Language installed, simply run `go get github.com/petar/GoLLRB/llrb` + +## Example + + package main + + import ( + "fmt" + "github.com/petar/GoLLRB/llrb" + ) + + func lessInt(a, b interface{}) bool { return a.(int) < b.(int) } + + func main() { + tree := llrb.New(lessInt) + tree.ReplaceOrInsert(1) + tree.ReplaceOrInsert(2) + tree.ReplaceOrInsert(3) + tree.ReplaceOrInsert(4) + tree.DeleteMin() + tree.Delete(4) + c := tree.IterAscend() + for { + u := <-c + if u == nil { + break + } + fmt.Printf("%d\n", int(u.(int))) + } + } + +## About + +GoLLRB was written by [Petar Maymounkov](http://pdos.csail.mit.edu/~petar/). + +Follow me on [Twitter @maymounkov](http://www.twitter.com/maymounkov)! diff --git a/vendor/github.com/petar/GoLLRB/doc/Sedgewick-LLRB.pdf b/vendor/github.com/petar/GoLLRB/doc/Sedgewick-LLRB.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a399b06ae09a1fe32d8235ac569f38128248637a GIT binary patch literal 819932 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%0D^Ic|NC(e$eDBkGAUe**%qajtxI{`0740$&iu2 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%0D99DAMZ=9jL17%tEs^VCvICaF}Cf)CZ~LCs_- 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%0ArHe5XHr^F%jmTxj=wjYcL>TzNJ;- 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 literal 0 HcmV?d00001 diff --git a/vendor/github.com/petar/GoLLRB/doc/Sedgewick-RedBlackBST.java b/vendor/github.com/petar/GoLLRB/doc/Sedgewick-RedBlackBST.java new file mode 100644 index 0000000000..55ac177f8c --- /dev/null +++ b/vendor/github.com/petar/GoLLRB/doc/Sedgewick-RedBlackBST.java @@ -0,0 +1,475 @@ +public class RedBlackBST, Value> +{ + private static final int BST = 0; + private static final int TD234 = 1; + private static final int BU23 = 2; + private static final boolean RED = true; + private static final boolean BLACK = false; + + private Node root; // root of the BST + private int k; // ordinal for drawing + private final int species; // species kind of tree for insert + private int heightBLACK; // black height of tree + + RedBlackBST(int species) + { this.species = species; } + + private class Node + { + Key key; // key + Value value; // associated data + Node left, right; // left and right subtrees + boolean color; // color of parent link + private int N; // number of nodes in tree rooted here + private int height; // height of tree rooted here + private double xc, yc; // for drawing + + Node(Key key, Value value) + { + this.key = key; + this.value = value; + this.color = RED; + this.N = 1; + this.height = 1; + } + } + + public int size() + { return size(root); } + + private int size(Node x) + { + if (x == null) return 0; + else return x.N; + } + + public int rootRank() + { + if (root == null) return 0; + else return size(root.left); + } + + public int height() + { return height(root); } + + public int heightB() + { return heightBLACK; } + + private int height(Node x) + { + if (x == null) return 0; + else return x.height; + } + + public boolean contains(Key key) + { return (get(key) != null); } + + public Value get(Key key) + { return get(root, key); } + + private Value get(Node x, Key key) + { + if (x == null) return null; + if (eq (key, x.key)) return x.value; + if (less(key, x.key)) return get(x.left, key); + else return get(x.right, key); + } + + public Key min() + { + if (root == null) return null; + else return min(root); + } + + private Key min(Node x) + { + if (x.left == null) return x.key; + else return min(x.left); + } + + public Key max() + { + if (root == null) return null; + else return max(root); + } + + private Key max(Node x) + { + if (x.right == null) return x.key; + else return max(x.right); + } + + public void put(Key key, Value value) + { + root = insert(root, key, value); + if (isRed(root)) heightBLACK++; + root.color = BLACK; + } + + private Node insert(Node h, Key key, Value value) + { + if (h == null) + return new Node(key, value); + + if (species == TD234) + if (isRed(h.left) && isRed(h.right)) + colorFlip(h); + + if (eq(key, h.key)) + h.value = value; + else if (less(key, h.key)) + h.left = insert(h.left, key, value); + else + h.right = insert(h.right, key, value); + + if (species == BST) return setN(h); + + if (isRed(h.right)) + h = rotateLeft(h); + + if (isRed(h.left) && isRed(h.left.left)) + h = rotateRight(h); + + if (species == BU23) + if (isRed(h.left) && isRed(h.right)) + colorFlip(h); + + return setN(h); + } + + public void deleteMin() + { + root = deleteMin(root); + root.color = BLACK; + } + + private Node deleteMin(Node h) + { + if (h.left == null) + return null; + + if (!isRed(h.left) && !isRed(h.left.left)) + h = moveRedLeft(h); + + h.left = deleteMin(h.left); + + return fixUp(h); + } + + public void deleteMax() + { + root = deleteMax(root); + root.color = BLACK; + } + + private Node deleteMax(Node h) + { + // if (h.right == null) + // { + // if (h.left != null) + // h.left.color = BLACK; + // return h.left; + // } + + if (isRed(h.left)) + h = rotateRight(h); + + if (h.right == null) + return null; + + if (!isRed(h.right) && !isRed(h.right.left)) + h = moveRedRight(h); + + h.right = deleteMax(h.right); + + return fixUp(h); + } + + public void delete(Key key) + { + root = delete(root, key); + root.color = BLACK; + } + + private Node delete(Node h, Key key) + { + if (less(key, h.key)) + { + if (!isRed(h.left) && !isRed(h.left.left)) + h = moveRedLeft(h); + h.left = delete(h.left, key); + } + else + { + if (isRed(h.left)) + h = rotateRight(h); + if (eq(key, h.key) && (h.right == null)) + return null; + if (!isRed(h.right) && !isRed(h.right.left)) + h = moveRedRight(h); + if (eq(key, h.key)) + { + h.value = get(h.right, min(h.right)); + h.key = min(h.right); + h.right = deleteMin(h.right); + } + else h.right = delete(h.right, key); + } + + return fixUp(h); + } + +// Helper methods + + private boolean less(Key a, Key b) { return a.compareTo(b) < 0; } + private boolean eq (Key a, Key b) { return a.compareTo(b) == 0; } + + private boolean isRed(Node x) + { + if (x == null) return false; + return (x.color == RED); + } + + private void colorFlip(Node h) + { + h.color = !h.color; + h.left.color = !h.left.color; + h.right.color = !h.right.color; + } + + private Node rotateLeft(Node h) + { // Make a right-leaning 3-node lean to the left. + Node x = h.right; + h.right = x.left; + x.left = setN(h); + x.color = x.left.color; + x.left.color = RED; + return setN(x); + } + + private Node rotateRight(Node h) + { // Make a left-leaning 3-node lean to the right. + Node x = h.left; + h.left = x.right; + x.right = setN(h); + x.color = x.right.color; + x.right.color = RED; + return setN(x); + } + + private Node moveRedLeft(Node h) + { // Assuming that h is red and both h.left and h.left.left + // are black, make h.left or one of its children red. + colorFlip(h); + if (isRed(h.right.left)) + { + h.right = rotateRight(h.right); + h = rotateLeft(h); + colorFlip(h); + } + return h; + } + + private Node moveRedRight(Node h) + { // Assuming that h is red and both h.right and h.right.left + // are black, make h.right or one of its children red. + colorFlip(h); + if (isRed(h.left.left)) + { + h = rotateRight(h); + colorFlip(h); + } + return h; + } + + private Node fixUp(Node h) + { + if (isRed(h.right)) + h = rotateLeft(h); + + if (isRed(h.left) && isRed(h.left.left)) + h = rotateRight(h); + + if (isRed(h.left) && isRed(h.right)) + colorFlip(h); + + return setN(h); + } + + private Node setN(Node h) + { + h.N = size(h.left) + size(h.right) + 1; + if (height(h.left) > height(h.right)) h.height = height(h.left) + 1; + else h.height = height(h.right) + 1; + return h; + } + + public String toString() + { + if (root == null) return ""; + else return heightB() + " " + toString(root); + } + + public String toString(Node x) + { + String s = "("; + if (x.left == null) s += "("; else s += toString(x.left); + if (isRed(x)) s += "*"; + if (x.right == null) s += ")"; else s += toString(x.right); + return s + ")"; + } + +// Methods for tree drawing + + public void draw(double y, double lineWidth, double nodeSize) + { + k = 0; + setcoords(root, y); + StdDraw.setPenColor(StdDraw.BLACK); + StdDraw.setPenRadius(lineWidth); + drawlines(root); + StdDraw.setPenColor(StdDraw.WHITE); + drawnodes(root, nodeSize); + } + + public void setcoords(Node x, double d) + { + if (x == null) return; + setcoords(x.left, d-.04); + x.xc = (0.5 + k++)/size(); x.yc = d - .04; + setcoords(x.right, d-.04); + } + + public void drawlines(Node x) + { + if (x == null) return; + drawlines(x.left); + if (x.left != null) + { + if (x.left.color == RED) StdDraw.setPenColor(StdDraw.RED); + else StdDraw.setPenColor(StdDraw.BLACK); + StdDraw.line(x.xc, x.yc, x.left.xc, x.left.yc); + } + if (x.right != null) + { + if (x.right.color == RED) StdDraw.setPenColor(StdDraw.RED); + else StdDraw.setPenColor(StdDraw.BLACK); + StdDraw.line(x.xc, x.yc, x.right.xc, x.right.yc); + } + drawlines(x.right); + } + + public void drawnodes(Node x, double nodeSize) + { + if (x == null) return; + drawnodes(x.left, nodeSize); + StdDraw.filledCircle(x.xc, x.yc, nodeSize); + drawnodes(x.right, nodeSize); + } + + public void mark(Key key) + { + StdDraw.setPenColor(StdDraw.BLACK); + marknodes(key, root); + } + + public void marknodes(Key key, Node x) + { + if (x == null) return; + marknodes(key, x.left); + if (eq(key, x.key)) + StdDraw.filledCircle(x.xc, x.yc, .004); + marknodes(key, x.right); + } + + public int ipl() + { return ipl(root); } + + public int ipl(Node x) + { + if (x == null) return 0; + return size(x) - 1 + ipl(x.left) + ipl(x.right); + } + + public int sizeRed() + { return sizeRed(root); } + + public int sizeRed(Node x) + { + if (x == null) return 0; + if (isRed(x)) return 1 + sizeRed(x.left) + sizeRed(x.right); + else return sizeRed(x.left) + sizeRed(x.right); + } + +// Integrity checks + + public boolean check() + { // Is this tree a red-black tree? + return isBST() && is234() && isBalanced(); + } + + private boolean isBST() + { // Is this tree a BST? + return isBST(root, min(), max()); + } + + private boolean isBST(Node x, Key min, Key max) + { // Are all the values in the BST rooted at x between min and max, + // and does the same property hold for both subtrees? + if (x == null) return true; + if (less(x.key, min) || less(max, x.key)) return false; + return isBST(x.left, min, x.key) && isBST(x.right, x.key, max); + } + + private boolean is234() { return is234(root); } + private boolean is234(Node x) + { // Does the tree have no red right links, and at most two (left) + // red links in a row on any path? + if (x == null) return true; + if (isRed(x.right)) return false; + if (isRed(x)) + if (isRed(x.left)) + if (isRed(x.left.left)) return false; + return is234(x.left) && is234(x.right); + } + + private boolean isBalanced() + { // Do all paths from root to leaf have same number of black edges? + int black = 0; // number of black links on path from root to min + Node x = root; + while (x != null) + { + if (!isRed(x)) black++; + x = x.left; + } + return isBalanced(root, black); + } + + private boolean isBalanced(Node x, int black) + { // Does every path from the root to a leaf have the given number + // of black links? + if (x == null && black == 0) return true; + else if (x == null && black != 0) return false; + if (!isRed(x)) black--; + return isBalanced(x.left, black) && isBalanced(x.right, black); + } + + + public static void main(String[] args) + { + StdDraw.setPenRadius(.0025); + int species = Integer.parseInt(args[0]); + RedBlackBST st; + st = new RedBlackBST(species); + int[] a = { 3, 1, 4, 2, 5, 9, 6, 8, 7 }; + for (int i = 0; i < a.length; i++) + st.put(a[i], i); + StdOut.println(st); + StdDraw.clear(StdDraw.LIGHT_GRAY); + st.draw(.95, .0025, .008); + StdOut.println(st.min() + " " + st.max() + " " + st.check()); + StdOut.println(st.ipl()); + StdOut.println(st.heightB()); + } + +} diff --git a/vendor/github.com/petar/GoLLRB/doc/Sedgewick-Talk-Penn2008.pdf b/vendor/github.com/petar/GoLLRB/doc/Sedgewick-Talk-Penn2008.pdf new file mode 100644 index 0000000000000000000000000000000000000000..07861abedacbb8a39b6f8aedad0d95ea8c343ed3 GIT binary patch literal 11636171 zcmeFabzD{3yFN-PAq@(Gu;`LliwN)54+n00yxqI)=-mJl#Ys@j;^5KBTwL4AMGda_k90? zvB_J=t*V3oUR+&UDk9^5tKp7-5CKQs2|tCWDE$MIr}I&mNQPfP*gM)vA?s*W7Rhxd zp}W&cMsIwExRY3}=H-=XAH+#NE>cEYxYp6WHyvymYn5chU9Wd%kd0AGVpD0Y3BMgF z@<(HnCW`%MgiQGL27kKyKUs)^!V$WXvITU9A4D5yG39q`-}Q}gxUBQ&{t`JxCmCzQ z6~yLki-sVUbv#P`X@4u6@##;ps>@eix{EZ*2C|{O%cl)NUH8Ud&Rd&H#2t1;ycC7F z)cHhTnfRd56Fr`>da#U<=(AK^a^o)6k8%mgcckE`N#h9&YiW|kSTfs!*yPE5JJ#yh zjb(m}7nd~^-Z~j5%ai+sCRn1?H|;vD^cKGly^KjPZI3D9{GCayON#h|;-&lRo&C&p zR?9E*!|-aAMXcW@87@%Ow8@pkW;S~u)dM4U?_(4tAh>`t-}6|hgr)e>$Lq$u2xJ@< z_qlW}9aH$LBiYw`JQa%X@p6RPu0$tdTk;pHc=|qV{5Y>{Tg)F?m5j;8ZZJA2P zUdtS>wbSL~@5R|#Gvne{i($X%rqD8y%Yi_osQn|tcqJ69s;YualV-yZ`*r(LV@IQA zfOKiA>cfyFS|pRLIO5lP@V`@IJPQaL4* zgr+*dOqmR*1e;avH?{A1N67alUU`}-ARtLgeMtY5xZm9wKA9Dxgu>X~%mXKRvcIzC z2!z-!M&Q=9!sl|UTY(m_y^UMWX5RXpA>HDg*84*|mwFR>qn%}SE#cg6Y;>`@tF)#L zmPA=-&!u+LFi0y_v~h-ltf__^Y$HWU%Z%?NPl=5rwM#vEnf+XjQf<%a3zSt zDaK+Wgb4H1^$y+OucCRASs&9qr}}%RtLh=|c$MHQ?9Gg@m%Q>H7gjTeTi?H@YP@0a z4f7kJx?CH6vVDBU$bN7^B^heg7j;O_pp0h&Dv6Q9z0mJRDmtArtvrVY4&ZDu_Q)J; z6`ZEZknItHP2QgCc%&FVzmy70Q17A|%{+G$aqo3&k$Cj9Ni;;gB-vQdvtyd^`j*Y3 zOYoODA>kh0K0avy4Tg7bxBFNJS2E2V>=!9_MTQLQFD`!ewiO|i$I|ITnW?j%uGZ6e z^h)#EtBzqMk>239*1?|si8BnL5``#r*Zq-N+KO@A%9!F z!$K8lC5Juk;LwFs&a*1EMoXW!?HBa0BPup<&7)z&oq&0^glqIUc+p!i@Hg&Rd zaWpn{0&yPyLe$RI8My8Qf@)4cP0E>?SQv`fxr4M>fnR`GA?zS7Zf;#P7GYakJK#1j zH|#z@bDlgG+Rv%RRdlp7Rxx!3X#)=zlK`=(nz}oKSfp%#fry;^6g~MV1=0nvh}v1( zIjYzj8k>Tk3R~0(0s_MZiUxcJgSbu}1!56*cfPIS3@C2ceYb&Yz__5}6%YV4I`9gx z-%Eg*fgzu~hy)w70eed{772Es0XdO@1O$5Jcv*mcUsJ)z($x643n?2g==cp;B!G`# zs1S~y0=%2OsiU)nsS|8*QM3leaMs7UIAHRD%0n9j=7D_~a@+?5eB6TKqzuwM6(8&g zr}8^lvB1Z-{&mS>ImY&M%q%J{M$Ry_CF~q+pt5kZf!=`z2C<01U<3oBWM}0Daq|EI z1+xKCKc55OS`hlx-H0L{_R*2&%wm^H>8046GE$B+QHft(#(fEgtNGBdPx zg07zbv4GxE5XNi*U3tAjaM(cT5BJrB<%vu^1z0#1!~A=T-wqb3k?qtuSrXS zo)Vf8?2}f_p|6#$1#uO=l6Z*`s4h(IFWQ{_B0ub7ud=tRFn0h&wMfph7|dm_qL?_o zG4jUy7D!sC*#nncbP@{Q7t)PmZxr)qE@$%H8J6`FkL_Ml>OX)wSUllwSQK6!SHZ!aE;Hl6l~B0Lxc<){NNEUT_I#O`1ixVLil$k z{L6xWS@16l{$;_xEcllN|FYm;7W~VC|NpRHnuE2J4G#WKClcz|L47?oHcpOHClcm_ z{pJ8dPGSoGmGl08>;bZfnYvmSo8ERb1bp+8D7H2*2rx99@~2z)Ups<8Oys`^gs&v8 zD8!qSJrIA!Ql8l<{WW0vCM7B-bE<&118LNmiwiJ-El49|s58QD~gqOfH zNV6bv%9>qHv~S3l9xmv6ts*dlmF^1&EI8?qRib9gbk8lv=DGFV;N!;jYv4rMoJ>h2 zL6O9D|8~7+Tq3B#?$ak8q)je)_{#`!NP2G?Q?GeVR?2e=aE}IvJnC54cIVf_M503F zX0d%W{)yqHz253Lcgbf_|BjW7-Tgx$hZsb7Erb^M`l*GjD%~i2GDiwGLHrti@x$5a zLPZM;tw88?)6C3t-M2=*v8`&4os5>|#8w07>^;2w4d_Vdizc)QK5BIN`_cK|>&tzU z_$k(&j&R*0#mi`kqr^uTA6eS<_O_~8D`qp+5UD&>lsyO}35w;`@nZD>sq0qImcFJ^ z{GMh-K^xeyg#Lhnpih%u$*p|mN9enESy^V7Nb@M{92}f!+>`d@%sA2Fj1=k5dX_wQ zQv07^AI8~xlz&##y*Jl3)Nek<*X`;`!-E||**oe{`Qo7S>ri~;mP@eZ^G`FlM^A8* z)2LGz8$WINs;XBD>J9g9inl(}y~eD!SUu6g|aqAJY-k06dx$uV%YJMEHmqt5E zTYJ{}Fp1@FYdUE!{9I+6I2ZH*QpKbto?0(O1xD&3Pb}57C)*;(N+% zQ)_qUHAO&X6!y~!n)+SW>4ljRzPWg}?5r%{eW+MDT-+S@yGPc05T|?+tq(etp0ihd zy%+B!?v9YYc~G(S^y$*70>)I@<0naP+yqm78ldmvynFa&G$|)^yea2!)#>T*@G1)y zGJg?s=mde1DsD~~8DHY^YCR7`;8wEFcN1o|df;1h{y#e>;%|Q){kjpGeDJYNrFB*< zHtx9w*09IVptOe7uqO)1BkZoPC7-o~W1Q;+?o#h)r{BSPM^Cn9R%ax_@Fpr@CX&s2>Z?@S&YxfcC9Dc;R-y8o~mpiiPQ(95%Sd~-nTCde{@`Lw&eEop-s7ZVJM-YSmU}9!= zv^njAB9~WOG`W<*Yh(At^y)fZGjnJXpXfc^g4}Iz)G#G9kMV60NL|jtVprUiN;8vfHg~9ylK_`XX6V+j8 zpLs0T*ml;UuIN|_DiJd=ZsT+Nj`V;j2uIzjO6E4VrhF87jGNW1y~Q8;88>_H?o1Wx zuioXaWx<_bHCkyJ&MJGul@k5r>eZhaQm#H>Hq3=tuf(as*-t?|5sUXdL?0 z5G;qerCg+;NXa)=&8>sC@5FUS=X(ri@bbSA5He^AVQhOyIY?ITF&v0PHr?`Q5Y-@X zxAA)!j(ZV~xbP|pvBU=m(j@2ey9Z@75iz5WDAW-M4XGvclHnxouF3E*!bcS2QWnX< zQI_vyrY6EkXokiP)A-?x?S1H$hNH}Hes6`>fUP1^hCR(8C6SF#Qe7N6qjW?qCwxTjPQ2Lb@s^8 zw*8RNABzwtN8m%s{sT9;qxNXO>;4#&byA#UIZ;UZ^;UPdjA9m0D&BnkW(O?Dgx=9O za;a|!H|&1=s3Y-To^8DUwdCz&cb3~~h*aUehSBmaf?ww|-ixKS)c{_paWZnd)`}Jrg(B`ZW8ieepftcXyGVIeaMXZaq7z zu* z4?frV2)d8NMS}NcTJ>Aak31_o?+1REcOHExy+{m$MCh zLxpwed~DHAnKwWsOrmx4V!%j0^xtN4d$3z`Cz|vn%1_-Tx4;uSFy-6j@V& zZ8@b({>z(2?|#0dclk8YR-^fodFla9(4;{IZ{Nt|JsWqUp=v7kxRHkxQwik7HKpIb zZ!9;jSFCQotH9DnA6^Uj(|T=u5!m?!|0k>ea=Ty;o3H#7=_22hI@uAG&N7oGn~{0l zIN6wr%5dB=5h3YQ5AGvx3!Y?Mm+s&reecT%M;-r#t(;oVwxiYG?X96CMdkT2yTU}Wg{}`mMpEf@go!PtA`@&1$>yk zBe`k}c#lmSx*T=&wIzL@>zwM*yZN~r7i!rL>5Z|Z9i)1sq$QEO89j3G`j*W>@ES3# zqBUgrk(k>4NRElyQCIB7*U|4UXq}RNB4Z+np>~>oPUDyEk&lj^SYDG)0WJ}tFH&$ zH2r(GLwSqU`82B9w;$RyXUm4>HKs84`T1SVy*F0}2H2sVL{`?SeAE;X@uA1`cu`!z zQ);8cOyRY6Dq`}e3vu>)(v4BL7}>lvp1Xya4}7XQAiTWqpzc*)U#xchmCVAeEoYY$ zOZz~SM?WTtib5h~8jqB;O#hEvMorVv+lO5m%{0{8txMPM)P4C;y42VrbL){8)bq2i zUii?0uB-3r-SNVCE_3t{Np7AU|ETA#tXJ!3cQ+MO;=Fu4uH{d8 zK6;jx)U7JYmGkSwy(ZVYrM{3xImC>58&#hbKPTkfY-r63j8+A9PEHOEClKiNvz(lg zjpmI9FI+<1Z{EQ{MZRYx!Yx=h>73G&yos(W?jQFt_LkaU3F5~6ieS7@N)i+lTuCa- zVbTb)5H*dJ&}C*+{A#pR;#nK=6zxWb=MA4WkOR`~Gin{})SUG>E+afg+7{2-R)2WA zG2NhH!GY%~yu0nFfcKN1AzgVXZhvq<&2ukESt4E0h+#h39o5V zyc+)!sz}|NIk?tLL%WHNrpx?ld~U-XDz53;s*kph@_PFW`N$mAxp$i77qT=3kzw(Y zEi^a1gt1ydPXhplR$MEUs=FHh+ezU|}d|XbOl$ zoX4wvt(iOyP@R|Cum}q)%JK>epOt)^MY&FEkf4P-$KN`sknxbUa004+RGdAmkIQwA zuO7G0>s3_l8k*R-fmjsG%$#5)L+s2Db_gds8q>)KXhcid(8R(8C^};OwG0AuS_T0t z9|DSvpanL-zsy`5tk8deFCLesoK{AiM(KVj3S~Pk%3+ZQ3Zqzrp_QSw&|->{@S5^% zpj_#HDi{q)kdwqWBy2q@i$p59)b|LbrS~nBDh;|aLjM+{N~P(bEUHoJJ-1X6^X#OL zOyU%QUmm+eFsq9Nhse*Qi)QnRAtkwlK6@dKjjTsedBhk0+E}%Ym95?*?P$;YO%t42 zv~rZOIJ-f6_v^OF$F82vvg7;L)m}>A>(Dnj@#2QUKg~((*|OSV!ne?}Oeh)JfclIvJ`+gj$W6(W^^;;HvsJm_Opn+HPUqz3)rVK$wJq!Wm)!)n%B z91Yz#1{;bk+qb^<+#cO(?;x?=Vo7v*>HQDe| zH>URAF;SUL-W!;3xp|aqZWC)x7=#Ru$GOJIPSqDqczvcp9FxdXmO=JTrhczwW7E8T z;#J&Fx>pI_XwIY&`1W|G{V3TJ}TJ~-j1NxuvcWAaa>1EU&L>2UEtPPGTDqzw8ypi)puR8+*! z$DWoMBd^M$tYKJyvANN(sp!lOjZf zOZnXq&5A68It$fL$8O)Ar3Y|oSSm1%jsP4jeChgS-LKLeLG7h5N0st}g>qWly?a^e z0t-c7UnypomP)+~+q&`iN4d?`flRc~+EUu~ZraaX4?7NKJcKZbr7-ITZECDbwHljk zwei`XLrje65^4D6C0@~v3fBqiJ;B&82M+ ztVfrFRdQeCe-+L7?sTj8$8}bx3e{bgJk=-FT_pK)Nv8M{&x=eA+ZjPGxkkEvwDH^t zfsxie-f3AMp_v(OSP+4j6s`jx?e%BomnjxTZS6m`(03z$dC!xr%f^>5%(=AdT9A61 zvD|k2uI+&G!_1$|3Qj?^6VD~Nj7J#kyASWY^QtKJ!rE**q*w@i<@GQz);Tx6OpI-O zH|}cc>$b>wFCr%eu4?~b)psBJiHl47I^A}VNWPX8aQBE?Qn+jz?87B(5Dd26{=`oe z?cQ=9l4U3OaO@FixIc|QEnG^DX{R!kXmN%}NDgMsuQ6QT!Wu3D@SO;KU%R|Ct3M}X5ZUs^y(AR3YKnxoVFySjW0L>uYostte?P)P2H<cizHy`b$YG8??^$ zcix^<<;nw@sz2A;<8;>lNM~gQNqi-e!!AzTz!2de_YgNU)I|FH{AXjXE?S8;+KC^Y z6Pi!eyeMPqPafrHiAU0X&hLWt+}L@!H$C~$^M-txVNebTh2Q1NUf1#>U7(!@-_+j0 zfzOnem`!Td8Xvu|s*`9UV`jFkyj=KwGJ5eF1M-?#1V6qSIYg8!Rmau89v(9PFj6|% zTH(64eXAnT)PQ`Esqz)}E_tjO99hy+I#a*0h8quyMg-vbH8JzAuTwrp#ClTA+TWMr zoLR~gtMd6d9Yc{3pH$)A&+2z|;T56x4|Sr=hN9k-E#~&g4wUbRrPpE=iV^kbt8QC! z;AdmZrAUfir{63boMM!1#ffFamcFFSVN(6nQa;sX+J*47ZcY5$k8SKsfi{Dep%q_C zlWqjvgL7r*SjJvQ{<2YOgtg%BWq72m)D+)9Yba@ie8wtcNoW!fw77RPiqeqqbT zSQwce6TIk-D&^e>C%NYSVIHT9kTviC(c>Kno-A~*+rwNuE(LWxw zLIR^lX?e2V_NQxUT8+5QV?F7VExtn6?29b$Xg3Z|ZDMeBrAi#PQ&HfiHFb@QsxAG% z;;sAA`6P@ZaIW@o%{T9mRH<0i@VL8;Pl+!3(dT_YA?YTF$Nov#nlAaE)t4z!+ zp+x(|{73ik1G8A1r`)`C3va^iv>i%`V+#iH++o7yfj*X;Avmcmlrs7SDdAK8l9BLUP!GMTaeG%>5n<0?s*vanny2hui%;QC`6QH@BIwXAL&gd-)|C_eMMHq<^APhE7~?0 z{{q+Nk)7{4Zzt*wW-in zrkpcrxN+O%dsA;#d<=1NR{R~jisBU8#L(QAkrp{dq~R)ACGJ@yuM&Fm@=E9U?F1=5 zYWb1M8hV@EJM_Le<-FOxKdSR(Pro#A0SD6KNyv+$cs>phEEC&b9LgX`gdc_tGmJtiI+|I2*S$F}Yu1e&M4)qabOqsn)xeRfLO&Zu*`V+>nc4f-Q9eQd&r29l;*nPsuGE zW60Zr$oL`oyEE?_5U!|6@5n8!$M$WyQQjKO3dAWAQBS3_shuO9222%c6RxLfk_wa1 zA;;t_&ohR^cOuQ>RT%S@k$l&ZMPU1CDXg#ft*v!V@D&mb6*Ki`Mn=hGPSWqb)ax%& zWf1%28SndNE|@15A}bp*WCe+~K1QK(sQgMmpkzDYJk)DoU}~Tk?$DIZHW#%EC;X+O zxEQmX6CCoj_?xWdb$Qb~e@h=%M<&V-!b;ZzCCc$X1?ih_=Dxg^dackoOHXIFOVWYa zYb9tcX7>9BM=6@f7-DiKINvagt5WWq31)eE#4K5~5*8}Fu6u(Tg5Eoic6yEuzBkzV z{%9UeE}D8^lKq3sPEb%lkYAvTYbyI_tEuVHUa+s=(Z-C*&L>Jz1eJ_^X|zjIO*7== z560~j0`46U^*lGNlTvw9R_|tbcbG&o%hgocJ?S&ku6UymY7C@pkba$*ijv+(*xqou zNWjo2LW1uaQR8gWKi zlAVLl%-BNU{Zp@A)@P_aI`}p_2#aCQQ(uOQ+JWvM;6ES4=!;6sbMv?>UOtLH#9piQ z9QWm2A%~Hx2o9c{T{!5HI~<~ z#OUMiEZ6Yy#Rti6x9dUN)eM>km+C=*m_NadFXkK9W#>C5-!?^>d*YM>T5mrLq3)%mg5j2DH@ro}3_VpQ!?|sHUC^;;E~#`DfiHG|?Swu~&@wPIH)(+Krj+VRoaaMhLXBwaUQV74oU zxZAGTBoVr)I$wF!71_*v^@gZsI9v!bbyNk!WHKnR0y2jivNiC7S7`bw@-^f>1=<=> zlToh;>s0aQ1T`vEzE1pFTKS63Xvoxg9uX!Q4ERW5FTp{Q>}tsm8S#go@dZVc!WrEr z?dl(){3=hr|Ef`XW(wuhZQ1k#%Z@7VZm_L4M3l^29VUk}5NFS1ecP^#CaR%ThMy(k_N^pa{zcWGykRAhMnNh0 zKuAIg2_Zu%Xk-hYMkXR4Z)<|@Me)N%_I^CQMx@z2-wdkEVaeFl>tO`teSt1>9 z&3Rq?X8{-P&wul!zK`nN5cQMVS z^$?9XuQrO~nQOP{%Y#&GbhK;w+GL|%XSO21DE9-}Oc~4-Sx29=CzTlB`rJT8axO$Nx-B1R!l2ocF66fz+uqW^(I@bv zl`Grv(i_u9IVpY4`hj5$4@NHCXdk8cGMp|njrOWI7Fqd^#-@+pau0{UkmeDO4p18yC-D<&G0HHP==Q`F1r)sKpb~X? zk)r^reGbRvt6uohFnoQf)VDJ|-QDVlQ16YD^);UxZLUKq#8dBG`IIf^XRVkI7=#Sm z$}l0dqUF{1tpy%V3ZoH8-oz&z7nVqUrcz6#ZQ*#8$lH_D%Vc_SS~}!ydsto*$8yA5 zh7DXjf*OP3?wOBq1qVg$gAVTuFf~BtS1KL*f}=(|4mCdacIbZfeWU!=Wf{SNj$YoP zW+FCgp(NNSTziD5a-BQ5B(r@_%g$-Re&-dDwtJk++WePK@ujakFtq1Yuf6H&9L;sB z;jOF+qc8p#`}0LanMBxVbV18(7jA_9mxGL*E3dYF02`TiXJN~yrfgCHDOT8EQ2pp8 zgra53TA+X7iG6Ztl>V2)?|d~th184H9zx!XZB!jYr5)M|s(d|BC7p$9HG&6Gs|xkK z2VakBR}~0vX~~Bzt>^B!+M5#uq^1&)Url~f%$oR(o7ovzgdT)a{B_ z54e283sxj~95TJ$a%qf?sYYIPZ$nu_GRs+!Z0t4jY968y%CUGAGZsaHu;STjiy^1@ zX~4laptbjYmLZcF& zh^X>P$*rwl@>ovHzBT=DOvH(8!G_I4L!ZW{q&{^X-@Y~-)X(x-xAJ}r zB2=Pk!Hvnj_N~l&XT9TFmm3xtsi44NyN@TEenB$Q>rbjATiU^P!6-{hXKppyU$RyI?e2KClY;HD z?eT0UTW?SI$D{q{{&?t4=#z94?5n5YuirKi|L^UHhk)2lHmkGTc47k>Cws{MvR59q zfBirA%Kx%G{?8rpKzt9(eG#tv+qKktPb$oHMKctBid-vYMUgHQI@1K;9c z2l_a>kBtoteB2}Sya6EZ2|n)wh?PK2PYD1<3ABEBA7ETSPq3p9fU^MDK*gX`=PFjvk$1LHd%I~z9|t&V>l%c);iVvw@DM1oSO|BL;pMA8-i6`I~To&gBktbq*fzOz`=OK%j?0z{U&h z5BNRgd=$WQAm?{-0NtODf*p|W`I`ZUKY-6CDmU8cbda#&1aY38w_pQIuM?h2*gz*U zaApE*DoDV@4ov8i79dXUvj#gLG_JE2j4fxKz-HH33s54EQ(^)SfQt9*8U%FQJ+Lvu z20F7(&WiwAFu|YS2MCAb{Ao}gonM2_o3j>-n`bQ;|IS)~l7gH+0RZXzO@YoKz!?N5 zZwj4!#{qumz<~LCb_FW!b0I+I@7X0NZ_XP~-kh~y_`zDR{@4K)oxKbgI;YO=1ZL6M zXXqR_mp(g`q-WRISzMdPk>Bk&w{GE6DdHo`T5Buup>TzlS|M59RYFP9p*Ha6rpD&QGH`Ih*A|P9o8b7RGF3y@Iq> zYb5AblFD7uQ~QjTRMEc~KI6lYOh%>}gExtX`3fo`O-hRac4fr%sGb{KwQp73Z}2-* zcLz8;Fd$90R<*>Jr28}sEI;aRe8QLKEy+=!Z|K$ zQt}&*#rx8-Oe(aTP**2fZ4a!KYs{vCE^KD)gDZ+tZAa#mq=a=%)O-|w+AA;-L&Xl} z;5s!SIDgHc{boV{V*BIRoWGt!0@Gx_;mP&iqzV47@q_^JJQ$wb07HJmlk3EOx>!8# zwfMjp^U1HIcnB--KSKybl*~MOB&noA0mBm+?`jGar6@OXEz%^H&IUsN`>D5x3mpuP zHBg3#u1l=)iiE{wD)KWD(~B9$G$!O`z)NyF7_Jz_hO%+S#?e;P0C>uHkgMb^re0Z; zr?(!rpzlfOEN3IjNF+;lHDnqe+!CSu_FnfOdf%6GF6t}d$PAy#pMb(-d<-b}DWEWM zoMQ1$0X<%gPJ1~$D~RVJDay?WRWWS9k_}z_{*$6$o{QwDY0R%2jpugguJyyidMN~g z$NheU%WR{J%@eiUR``^AI<$ZezwwD;?u<(#4i>BFA-_(^cyxeapaF?NQYg>m5TYdY zmN#W`=C8UzYA-WPa_4mT4u%Q#kQx29qLWv6gRWj+_b148Z4z$v**fYjPhAj zPgE2?)mchWW}^2VWm1kJEjC?`LQnGS(fU|XoMUV?Ff#1&S*3k*X51~@n8Dd5M#I>qXrA`XGAd8fUcAP!W?oh)#FInnU{n#3Fcs!(f~ z6Ig}-YvezaGKBpi5!a2;#cTv&2Tpl~Rr@h^^dR)4JyRg{yUT7NSH7b#F@_My?{lT8 zvlcuXiFX;P7?l)E>up;#i!5s7b6FvU1^vZMgPX|Yd`4!MJCfp@FrAD=ja7_`hm_gX z6OcBUJ*oX8>e$I6I+F>QJ*#y`Jo{&V|;ZJ@a%l{bfGY9in zRHsP&Q@mk|`)Ma9aC2WI+7O;&ezURu$!~!6Fq`ki59Cf``-(*F_aRCal~h zO-D+1bN{W2?j_hG~OjR2#?Q9iMq_vCL7!71$$(Mi3&@bu=Zv1Za%><;HcT9+So~8!kNtwv zUQP+jb&-%leKM%a3I@z?2=rGc?1oNsYqR4P`BiO#r*(qn*G)%f!9*SEFt1>RUT*D6cZJ~BI( zzTaNgJEA;#8d+uh1FprK@8+MNLSSM(M)mB3Hwa83r-1xZSfR51qr?dem_f%*(?#fI zZm1IsU5Nn~;*XV>`y#EY|5%AbVJk7rS{8Z^wXWA6br_=eHCRyN{l&d zhu~W6G+p&t6Jqwa<}b9YS)_}UJdgM_6IH_u?k@L^l!5IH+rhc9V&q{qS5@x5mq7bD zy}Tpc$r3fP;C#1J2lsu+u#LPp9ZFBe7;#Ru*)U`)-YOZ7foC^W7ctWS-s;j)Rb2H> z+@KC)GT)Fy;!2^)ito;%!>g`OVcMneT+U>LD@u5OLVgSZ407%>V;T&T*8f|`0c!mT zIfU~fA?E?2K@cFy!~;0y5D3?QF2$S|3At{x4Aemq+qu=E0~plZtyc2A1eZgEjNp~O z9#G?gG8;SkI+Hg7h|n={amYz9M$yx*rEI{d%uE>Y{J^kvV}zCrdpoAK9O%9!vR{$Y<&q0u#vpYgA#5_h~Pu`uX%& z%nR~*0W<*v3-;gd1{SOi8aQ?JV%FSKlN#zK;qh54p14W=0~EqXEHk}S1@9edwbphc zaqLp6ZezLLYly*rN?hpvR>`?On6~>-BDlaHACDW1EC=5hI^Y$ZSyEV14GuxUkbjP& z&|WE#K}*X^7>W<1WobfGW;4b(2CefR>!?n;G^Tl@CE@R+4(NPVQ*G5r9A#AwtG>;# zAk?S*IIe+)_pT ze#uX31m>y5D$Tx=n!A`{X-@q{iE}EyCEmhvxWgAY(;i(*>6PnvvUP4h-QYG-W#Xk; z`DAPQ*Qg5L1rM|2<^BTq*{M0eq6fVUg$HuBUkSQ%=bys;Hy`RkT_`Xs5VHf8YG~~8 z_oez`J*a3ffHgMK9uU`RaJV+kqu+(Dyy1sJg%%@n$Wrob1f-)yxwh=t5fv|a zYMazneZz>{mCp%Zc;-oqs1aHgnUTrf#*Td1&55?4Hh4_r;ff`5XWSde)KdNYkvV$d zWBnpQzH5JC3KKGn!RIIJ!sKyEy?=`6acumwmlFbmff(_{nO_{NKuim83pk)LS048N zSc}1@2T5NDfz@JuS&Q)&%+0${Yi8jHP^iLGJ$*w1Ii)r>+kCF~1mK{{lVCT{xJxQS zyacTEbPT zy@D4RX~C6=x}0&B9;sByB!^HFD6d2g=(JSW9DG{zN>l!Rx%y6+ymr9;%%#$o$RB$Z z5A&u5%Je#!R}Jhe8|QjE(wrVUwEjS@1t|>viT1JlVQ_Pwxy8q#Iz{Rq^y>u`uepj7A$??vopW?bWfZG} zLe#lOHm{i)Zt6LRn`!M7+dLYWp$gxD8zRPVCt)s4OtHUxguF8$Kl~T8&!e2&=exQt zCd>&-YMjoQQ+5Nnm5XCHC-4X;+MIyz{0G`VhUWs~Ag9Z-7j${9w0d&7JmZQ6eAK5f z*5>=Npt3yXlirGc`Dx5FkIQ@Ujk@Uw+Q)(QSZ*W=@vW?Hjjw~+R7_CUpGX-;5HdO? z-eS1VBAaxdFq8`XxKwQR*=UHO(Oy07w`pHHhiPqJfR;Gg0 zW4gD+Yf`H(b!2n+bLceac%s*UxOT?JtV=mNEhidk2KqmkzbYfDFr@))fNYZ~1? zo$}&+HyU{J`aN?0kxWfV8q@Gd{G)~hlGei9Fb&1h302$(P1(9y#!(d}`MgD1wSFSg zZ-aOEld^WbEM5gO14#RPCIbxpkPmf5b5xHG>$9#3%VDtjA)8!Fq0xf&aU5rT^nxBLtSJ z{|#0MQ2cOlB<2JncTf^@0$JogTq^d9CGme)WOE}{@(p2#s-PG;Xmmtb8W+@&yiK($H_5n642PeC$-IYnN_HG&S z(1Z@INm@reCvxfMN__N(pF`xn^{TdXAn+)y@|K9bot4h@qU0D}tjO_kbV-eo+J`Ji z;+9j>VQ>{cEEMKq&p)tC_8bcSN$9q&W!YRYaj?QATQ&UyVbMwPFX6Cb0FHV5%W)4E z!sD}@puZfd0KQNknggg2gYg)cMt|`5LVajhy?`PLEF2~jh=qR$Gs&*Y>D*QJI%?MM zAChpDeazJq2#+T}Ymf4p+;a9_69EhB*8UBC`?^k8y}*oF!Yq7FkZjrXXnER)J$Z(B z&UZDUkPya4_vuqdN(|7%-O=T#KeuEg=0{)BOYG)&FMX3MStgZT6l-30wA8JCs3@r5 zi+b;Sit#3|eTAP#R?Rn>F58Ln;rxZi=f3hUJiZWL`M4(NcOGA;XT=5_&;jK!8{kF# z!Q%_{taM}EVgR8L@wL=h7Qd3YW~m<8hERA0Y)SkaXJ6E7V@T^8Z9dyOfs{1MROG_k z;`4RW9`8`GSc&S?IGcRCBrs zZD;}$*Q^hi!QV;a^~9&Vd^_Dm>8tT9Zq(yyws%H*)CziDzS11TZ7UyGNn1sH*f1VT zHo!DmNj0wN)t+l(aPYw|ujk;Pkl5kv26C2$T+g3iLtw%`<}es~8Tt_dlhY|o|8y;e zl`5Tfa$vuEzLW>D>|HH~=*BZZf5(GOjyM|88F0jEnVP0qK z)hi_m?z;Bx@MQf3p;mUdfeuJh;^ht%1)5ZBT&_`Wr`q<*D<9azx5@D+`|l>vl_-GY zCELk4;|@5KHc52VOj+>I?y2Mul_34xEX>Ggm*?A)8g!PpS8SQek1V&fGhvHpHG}IY zYP+KTB%zG6-FCd8?n8)n-QIY&T$PbK;y(7@Vqm}25u90FFfpBC^iP34F6TS#<#`+ewyPuoZ?Q-4 zb4>VIxaZ($7GSvxjF*fELukXY^r52saqn(cHAT{2rjK_ALT93Wnl#KeUq9w4Nxz?> zjBi6q{Wt(Ts!&B*g80SN@p5vA+;F&_GIz zgo>Vefh6mlta0=^P?FT>I}v`5>^kh**6~-L&vRSSwg}QlKOAIN+fYt_{F>nBG?eB`WeC=VAO)4#O%*e*+tEXD<$G@Cnvn&Ofo{xKQ&tnh-%8K) zj9C0Ul1F-6yHJ%Kj-%MCEU} z%7V`?P`uTUA!gO=WX2G2myn+H2_xK#u$pf%Xap;k1{MsBvo4dCnH`JI)HYJ6)j#yA zPB@N^It_)fZS~g0s~L10+)VyCIh2+vRIgy$$4VMC0p>ja3z`>F^7FUSkPBUE*;tSLA~tBb{BQA%|Gkyg zxYgmmDZ6b3%BZif`0qdi)$E&Y>kU6k(LNIdxIB=~!gd01v;JD@xlsd@jKN}t{%nW}Or zp?U5*3PV0d4R~HBl|I8nwERG&Pfrs@@LVUMIqPQ}VUm(S1a;~}ipST-Ie@^1&SS?2 z%Vw3ElQc3^+2q7HXj=DZKlg-sKP)#Y(TS#D1Wm*AkFRd&g$n5E1Y0j^Y*k7*7Bwo4=$oJ=KJ_&_O|X4do$@JU{(q zbeL0Q*~z|bc_l81Vq8%&}Xn)dN6Ovn~DFaLnnzsTP}v!)__Sj!1kr~ULxnG0*o?Zu3{FB*@s7m+e+S3B=HaruVz1J`?T3F^~4pjMki-{D&HMiowJS&WbBaLf9`B{S| zJI?K1yUt>0e3cEe1yxacjG0}AIb9(yv}`jxqYeL~z{r#N%-h9b1PMbNIY|r*$bv4{ zcWY$Xjy_s84hjsR+vb?*u-3s9&MLP2$?#(Yjv0QogW_0Nr&#?{#Edu8t}o3i)H&P;@? z$Ozd9$;!^mmc5C{_w{-?QgY7cD5vu~zqkL~xZR%hxE_z|{$>jOh#SH~_%C=M z55MN3=d2n@aNElk@j=X0MLllyjl%VFM)V<^*fcKd~%I&w2E0Hcmot>Uw|N6;w0S4Ah$%By(w*b7>95n>_ya zj8eLH))espk%`FA(_YrF=r)UWRKZd35ySN7cdSgZROuJ6Wc zjNqp1gB;kgmiLK(0NoW_l??)P@vf#?(M~q#^vh8B`Xo>3IM zc-%};vSSwR4F;e;4Bc^MdRD+oONBuNs~$j1bUD~Bc>OZiyEU{PG-%G`VI&SxV-0&N z14GY_%4Y^aQ*hNix0GhU#um6MnTqrLDg8WOfK+;0@{N=ma)S8e22VTdf;OeHBDUdu zL{N(!8*k5k(v*!A>NXTpHPNe>Zm)~WiC*B@fn`xRlmy$a``a(&1RP7@-)`6Uf$at! zD-Fg3>4#$=UVGC?%V1XCsBx-dRX;Y zU+pV#F&!4_U$Dq+>$vNIvTw2E?V_G=QP`QztK#dQ>xl93=*UgvAaS3Qejca4lUXqP z0y;PE3?)#wzv@M%);4iRFK20sTkR0h=Ld9iIF8K|qK|%b;r)KN{Q})%X@}bt**LJ* zz+=^pUMPk>(06`>pV z3WsbI;M!m+frPA2u^Po0ancC~<}2rJB)Q@`zXiIQAWP``2HbxAU7 zP%6WU?1fkEx8F}qUQG{eu;3pEy;J7C`6?frU!;>q`T)rcW>y(@Gvj;3>e7)ULus1!u4=)MN|@NUiS2c?Cah_5 zLTL}-__e6#UcpjKFJg()gwx#Ky>F+Sl=HDM?e4zqKK$fT1B-mUa2`^gv?Bbh0Mq5tY5pIAm!D0 z%B_2x*CE|cXqViI5$lmYAk2Mo65QBXs9Al1=yA$L%V|7-hnOQ+;xwVEeggv|BYfSh znmfn<)7U;l#PVWNPh7=|R;Mn#5b7jI%*?+dTJ$3{@7f=--}~4M zI2JDkLKKw_>^JaO84xhkgTWar%=H5}A1?zE$axwD0J@4nvH}$kpXjwcW2?+yt%x7w zQj7WQdLdt{;@R6PJKLI-Zm0O`-e5Gro1EJf7Fd`V0tpM8YoLUiMzJKcrUs$2)VV-a z?=)SurxZyKETF>p`sAzuX2X6MVSI7z>ZE6v!ztWvQMa?3zf%uQGok~f9JLAY##;qx z@E?~A$*f7&dMqwRS+BZoDKn0EOrmD=+}QqcUw7>c+1GFKjK@NA01o3h0LMynF#b`$ z#dt{l7T{Q!j;{q=;JW#DdGgT?e_FuhY`>z~g&chK4yYs9E%D<`Z~+&xhEjzbAJ4pC zJ6wi0y_-{N&a)hTE!DfBF@ceYS0_x~!(7k08p0#Ni(B`l(n~~AR=Qi5wdiS|g@l_+ zosf?`35o1lPq)~!CD&tdE;WLrUt57qNgh6eq2IZ~EG5Km%Bk-VHMc-2Yhx`3* zlpajI+~Uwb?)R?!5Bl-(P#uRgpaYJz0iEfO{bo9BzmK;8{o8^)@P6;%_8)CA29%IK ziTi4=kr6J_I&BmD(H6r>vU9I+#6|(94Wn zvLVbmghoCf$+_9rTN;GdqLd{gBjA<7lBtBEL6=RjR=%CMYrsB`N&5ecXTTma-4lA+V-GJQ<|4MBEj;A;M zu*5U)SToNM;07sNf`JgfG4W>+o^q%|rLKIzyqYxW zR7p}2SEHiS-NRPqphqsBnIj;vX z)}awFcv04$37L9*L1Z+{$0z^Nm2rkKQPS~PlwrP$FXmQ4A4D;zF?|kPSz>FaQL1OO zET#GRbF^l@9M6d4+8hG7tVyWrAXx)2Lwy~@ zx*cSwfybJJQU+-bxNv~>H3oDc--wL_&i0(mUV`FD^nOUNE=Kjnsb@_1^O7UK1&*1j zvy-bPmSo8_<`HiWBRO~wZl6tjRPoRbht8VC}k z`GkarYV>*6OFqV=V(1M|Hz#;LbEcpkukLn~V7|$dWb>}K_tj_Zxn#_@atsm}y+asW znUw03HbXj;DWfUD(ji%?OFJs7g&X}#6>ObOlrNb`6~(oFMDE=UIN->;w%XgOpG`>Y zYC`UPmW%5nOf;!wP zk>LgeLCrDKE_89Gp?wqJ4mW!gI@WRMsZgGCoPMAkmua5`?Ks!zPz|Z4)|!O!gj}N6 z&%b(d(~Zw3=8Be1-)w5a@GW%-1<~#|56|D8Wl7D%?uyz>?J)PIs$I~E5b)L_H1J#+ z;`1?>R#3vFEL{tvFldw7*pY!Xwv3W7cztdgmrh08`jGAZrr7#xQ33E+s;zfLKM!m- zxb^V(QjUy&w74-I*5Y=|B=z?#ZaUvd4h*>w@3y#IZqazX+u}CUV!k)88|G2BWR)#q7K1mHKyat(mZ$Ez4i4SW^KGvRO zaL@pzGr=m42kFdXZb|;8y-lNQgZXQzHSx!7lD^<%uM9p=TJb#%ip>zgnKQ2d1m~+h zgIriusN`~=8EYe?--)p9P3SrGZdZ!rnwK?~{W(udj^E_WdGH!5hTP1gTW|q`&G7X$ z_Er5lWsNytVue=uiyIw^OzW7~*U`&JW=K(iSMM4k13U~rJ_$xNL<^ZPd9K17F+2F zH^NZUJN{aTJk04WN1G8l#Zx1vD{pYIJ+P(sS|3gGDauaHPNfyloGL=~W-hXr%zFAd zbNwATR^Jx!6~8dzmrNuKB-mcA^^tT|t-82%vt-vxUOZ!yw!cKRfm^LAT~vV8?#n4O zLvTr%$GY8c{ZiMc6hp%uCFhcMFWG$IHA8Jyz!ub0hWH_3A^^w+KwNvj=5N9D0)y%6tdxm6xRceSp@12?*GXtZlO#Wo&VK#?##?$hZa`qQH6wQ0X0-^EtjID|6S@=S%-C0< z@Y2Wl4Y+spWhZ(rf_1iv{%eu-FLS%C6mPJ^#(s2fz&H9&U#q}&O|`dEKfT|FJ*)u7 z`mkaK{S%M?92A!w48Q@$`mp-09ZG}jYdrRcHgd02>Vny5cfO9_L$fpPTykf9aLds9 z7NI4_jTT;k2+(8@0qT-_`&t~~WpZ9*8(EpBUcCfOSO#yP31qxts|4vtWHLB|%vYqW zi2x=t`HAfx`QYy+4(80!*Rx8BBe4~Q$P6TnyvjEWe0H8xsCq>TEOvc14##l`mgU|d zySiVw`^^P?JkKhK@crJ|*o(4{S6Kig1_W+hWdPkXKeVnMud=`%KLXK_c(SkRbp#y= z4%1si!|}mauTRi|dRIXWjcGzb9j7Ihu5EI`JWrMrAgIO0z4~Q<{3=*SBBEKdD3wcG z9RO-*)D)ABVO$GIoAk@s(5H@TNcz8ZB*qj(ul~5(K#29hTLQv9@Snjy0*^&-U{?qK zz;1&P_V|KqCeQ;K{6!|PFCWM+gMIt>E@_AyBL@oiI-5HU2aYvqh~};almHb6sFd?H zR!iWUr8=t_uwMOBaauiR_YrVvia2%B-e%At(%TFk5GWGjUX6$1vo6GnEBV--A00sR z9Ohj*7Tsl~J5NTZ$wa3`;B}}PtG5VcJfV{X`19s|X7vTUCA>#w;M}-w(4Ft7 zXcs*wz5KXR^h*~+SC!a>_1%xVx@%>~u72ag5QFUP$Il}3?mUCNuk88ov4+`9;1@C| zSHT4O>JPb!BWhhF`t(6~th0IE z6|h5sHMkF6w#Uj^ALySc1kIJ$)vO0KsY3c^I6pDx@E2b;d*#K342MUY_;A>=@`4!L z)GHm++977ZCX!z&zb0vmx~lYTK;^sl&z|#ZsA^DLPY>b2W+~6R#VKjl8f5N=YvxEH z<&vb_Yc7jM9L}ay+z>>S6e$G~28k$^Sqm}fJ)09e5}|z7QZOdtLdl5G_<*pCb*AB* z9Io`*YOMawXW77Lm1`<}!Kj79EAZ8i4->72YyiZE_l0tgg|*%tJaWK=0moYS!}LeL z6cgmN{C$Z%;8-hvKpSohNjHMn&G=`rub=16A<3;mCCU(-BYyZ<*yf=id^^>nnTVZx zRcDwSytoK6PIcm~<2#I;PJY|$Nq4hcyON%pR*Y6l{Tb4*=ra+s3p2FuKd3$+)l9N^ zz*D4a_=0Pu+l4%-VbPv!s6Z$<<1##Q1cSO@S#u<^R+ziRX970aLdLalgGZA3GOfP- zbRBrm_8uP#gOb*x7?f}oZ>;gfmMW$6?(`eHy2{u^Iahb>Q}rVBv+YC0k-w?``C2Km zYp=cS`dQrG9S^qmmAw}f^X`zDKNWBiG=hv^lhxC-&?Nxj4~>A9o{p{sNEzhY5hthj zMkEOuTWFb^ni#5CXc1VLTWS%|NQ$W4H2{q|`{UN<(zCcLu4T?`Vq|J!tYvILzzmu~ z^P?8`Y0#*)yB6kJYDTARpl9C!prN3kUd6A98J%YL;!vw_f`)}h!J$>%|DnP_^{f-r zVc9;&3c<^!|0eeXo*s746rg7xBwUcPH3j{@<;2wWwKOb13$RqTfc)k=Q-EOXr%mz4 z=(3+Pg)_(!P*w38lK7+U;s-5Jf{ubgaHtg^i-TBUzm*m;YU_X%fS|PE@3F!klaPL= z6?PZ*y%lz6;T^C70L0n;eJlKmTl`Tz^>bGE6}Nz_5Mqk2Zm~NE@PH|Rkg<%Q!o7dm zEkHxeASVAgQ~aD;>@M!Wfq+cYJ75LCAH%r*o)y60_>(vZQ4#`K`*^KTQC|Ut0(B@b zKo$mGE#23yuHB)J2P^;t)!P4km-q#E+#6<;)mXaSHk*x$FnFF@m-dfd;QgI|C~AY_G*!>|vHkWrKe zO#v!u|NEx+g~I@%v>^Y^&za)Spz$vb17u;}9|lnM$qykDNO9=*tpAsS$D^+wvaau! zzdOYCzySd4-C6(i-MBYr_IMA#Ut{9#;=n5g4e#9J1tIfa4_E;#7Wns%!7tnlds97I$es`z{S=jey;4nly5+MEx9Q+a>{sJ6)4Vk}T zmLTKi5BLJ$cRigzoa-+D&%CzkI-9fC%_qfVel%{dZl8y9+yD0Z`T04_5*JaFiqP z3z70(dFk<5;Qs&u$l}0O*aw2cj=|AR!Ozp|d+zpgHrT%wki@>vI5;444lIkB*dh`h^G?)V%y#Z-cMtrv2~`Jlf_* zEI1Oc{woIf&EX*cvakba2s{i8_h_wunmyU8FZi8q0Dvs+dp7`r^w)nl2f)48>_2UV zz1R8gw8HM<4p@QtFf077gxg+`!_Qe^|5iA19vVE=eRuQsUkf0;j33U!UJU<_ABTSg z7ymj$fUND{X*dKMfxqi=fJlq}#%$Z}!oJ5wrb7+^^HJi&U$`6gv`v4`8~!Xn`17X{ zWL@7c|1eBE5+s6zkbXAVx@YE}TmC*6{QVFSvNDJPzJ`c^!`_M@#d8oe{D!RiUN!E| znc&Y(z+c0_?&1#M07$R#2P_2suKWrlKs|OG_-iZdF7AL84y!!?9;x==7ha7JRs7#> z1u!f0y%hk5?`@P|F8fk%2y|3c8X*BbY8?(kg5x^sP#Lr(4^n2-z zb2VE6(9aqsnpy;kpgRaa0Fvtau^;ZwO>vrr58OBR$0xpRfGZ81mAoj6Rnwn6KZBe> zMKyQ&SqT#KDb9rOP#n%w;^*45%u;muO{ye};s%nJ1T#A6W&ERh9x_*c$t*3N8Rptd z#ozp#le<2k6Gyimw`^g#-OO>L;KsWy_ACS#G7$<>geju;?(tUV;G8evZ~{=OywOZi zxX<9s6r>U$%0WS^C6jw>qeKDE781eUp{5i+=Qm7Tt?<&em;g}})@5+eNG6=rS?GBy zPsJ%dB%iSv(K-_Qk~@!@vxb&!*~}jaTUaQPV@mQw@dZ5y4VyQ!M|kD>e8`3fkPsyB zT7x_2feQ8|yhJbhE2^%T^b@AG+%2Q$RYY%T=fDHk+frL>Ue84IVy^Uqs>I0d*0-BAzO$S4xKk{O(arV3?n)F>XN&bpUhm)LFck68oK@DUZO2 z^C>1)j$g_`#ZXsq^<4oyq^E|@24Z*JPs7KHi;0VkWxCG7a?gInZardkjLV9?Pe-Q` z_G)0-0K>!zPff~YnoJp$nUbE~-mdQ6-b@oCsc_#73)XiAiHhsmT!P{As3PDsfDE8Xy2nSKnuvH9)4I7I2EdOoAG7I%6q; zq`IxyD=RkcxbY(PGY$I=R9?gA>W^LdyEp;{m+Q1&TXyLV6Lba-13eB>|2H5`e(0=h zt13=Sqz10N8m=oqm0Xm={k09in+vJ!32{ExRpdDs(OV@X(KJPGQ6X@RJgTqRzrs&`L>x^TILQ4sKSXnnNnU`Qf)6P-24F9kRQ z^=lpwle3wGj%s@jTX5!IMJpBoE}`(M#(PcGLQ8U(^VL1evv-Ktt`sN7T2YysvM6{P zT*0;0hutaooK(@Em9!36EKMpsqkwSp>r^{Yz0G89nB%yk!ye8_C5;{*ay zNLwfCyxVQeKk*R{N@Tdiy-t6Dm`0-O%DcF>LRNz>s-tsv!{H{=XV#F*xB(ulXx=GE zdFsCLIH^nw)^MMV#TrWF>V>}1EZ_#_e{uVEFWGMcUGWs8P2PmT3RPdF|VIrM=K96iztsM!<)+}kGjW< zIcuD|Aa#l2&77)(;Y;zpn_DtBw=LJE^R{MH)0rbK_-`o7!1jB243E$)r}y$Fg*?*H z(Me$!^6agK;ed5aV3Z|b+#DU7ZWMbYJQflXVm@gzUnO*(qI<$x0mbr^cnR;Kve+%{ z^FFx6pZRMa1qQBJ-z>SxDvZkS;3Kszk5lJE9m~cvck?ZFxX(0hbaXWCbahgZ&Sa3> z(?oeq8Z=>HT9?L2WOTn2HP#^cCG@3BvK?uexs%O=V86 zo2g%ww*6`$A+uw47Hw_ijz164&_JA1^N6_|Z$N6KOR~GN05FE2j@l=^G_h@D(ZZ@Q zR>;>7n_0nACGQ11Jbae~6gG*kNcgN(F;y>>b_f(EH%AUOPFQt2mN_1c)a$#3B%Y{G z_*|VdoFY%vC6oIk>zSU~sNvj!tw$DPP^bNXfsh+dbPL&&|DOk|Cx~%^7$=DFUq+0* zEa^9hLI2%|fjY<;C&AY0{9l>E>7=QaI2lAOn z_4D0W@^68su-sCIpE|js`4Ewd22r>Ootnj;jtI>gUKsS9An7$}DlJ-%F#v9>5PIla zTo5~t;sd4H={`mAp{t$XjS8&`l&3ngC}#k)zY%>N^5k9_KFA zyth-t8t3~~b1?P2^YUGv@x3A>A?WBZr%&AoH>$)UyD&gf_gLW8?4$^>WU407K%!M1 z<0)2AT%$@9#n*mk@)}7_Dc%^FtQ>mYFxuX(scm6HV9RzfycCAN5^JSzpNWusQK#4@~@YcDwpDH(vdE1$Z3{YBo@EO(5#PxgB2KCL|U zV(bEec4+*iJ4vP1%+ZSWMWxXnXt36nixqJxeI>cOuH-})$cX!Cp1Rs@OLy0CtYhv= zgh_4n@Ol=4JqvE&yg%s;tVgb-D6)Q|F<%z)ohSP?djmbI+a4vgHiyh3Y;>jjMp|SD zV&WjD&BIVRIp37~Fu+a`7cP{fl2WU(WYURE)*AbmU84Qf=~dbGvbv=FM)XGk0gf>- zSb^xs^C~xE@rC(t@8#306((ROcXquG!iiM8_)dO=c@?W=L-f zCDZxbV86M6^@mUWp6N7<1uv|vUKHG6Q>kn8PktG-osgL$mz{+*5qh!LZj&z;xrkp( zhC?j;?sA)TYkyF@tg0IF+aZ^ooOdN3P4uTl(fl=&b93+B&FxNYFx^3AND#Qjax1?? zk@Pjni;SxN_&lECk-F$@SXbBW?MWUbBXpH;o;YXSSQ2b5r!y5kWlpVldV$qa(z8Ci zy$al%<+XLW3JOhJx)iw>axIGZ4_t-L3Lw3Oe)EFccN)Kik@FNFCNJmR`R7d|i!Q9j zEhGzg+(FDTf{dfMKAB;@d95fqxyvtS@M_)1Uyo20o;$= zVQn{jA%}5ED#Z-ddi&WaLYH`)fU|BLLi%z@Ftq?IPO5Rz=ht2%1?RM&)HA5+MG+z4 z8DJX-;gK0p)v}z5csinQ`Qp8N6p<;`b2-0?cpe5q8n58K$<;}lV$C}0g&6<#JU;lw zkSDV)ifa_ks!!QbRy;RhgbMmd-|H#&W}lL55MogvF=^iLx`8D|?CBZeP06iKjP=pj zdNH2Cu+fyY8tJkMEs);9$N@+f+bF7I92khI5&+-)Cetd4BZv=%4zD>+piGs@>>fpg z3ON;wyZhFyalYGZjx{5isEW+^x0IEgb=9{9T&u%YZ(ktKWOrPmWeW0Jwem*m)q{C} zN&jIS8CAKwSe&Y~|JjUGI!oAWW2+FMHQnVkVQM}Yk+;mf&3wTj8!1Vdf%!D6+uNI6 zJx#?C&Es@eV4>wzGySu*k@dCUuG2nvnY*whlC(Da@zdz&r>AA>Y8sgjMAA!RVT9E; z?_Owq|8XU;!~gA_?T>KGJs&=QT9fK|%OGr@a7A*tTDG^NbhC13h;w^6Wp?Rp6-%nz zT__u>I{bjZX4X5@b5%G5^NQ z%trqu-{FzZl8LVO`i%$p;y1B$=fgDJtw=1cT2336W#=iug-4v;=o|f*be|WS`R%8i z1vR9ep($}LeImA?x^eA^aqYX^4Vlkh54y*R2Bl>BpH~G=zCfXQ`(==qAxM;)Q{8)QiHcXXMpN$vZI53+ zQpoJ;M%ZPJ#m^;|E=!owmQ#qR`l^bOBcXR!5vTZL? zeyqLIA|t$9Mw_P)@L^-)L%H%j1TTfiz8}$H*XJSV0Q_28LH9MI_Dx=$jvjCX+Tw&L zJt0a@h|&|H^bo{>;K)Iu6jF2w{^hrb!~7p2N>AdElX&DL9{Kfn1mg1tDZqKy3NldD)=#k20;Rlb-IAbgpv6ClG=7dbGh-<0 z^DI>m;|UC0wP}L3-I!_CIo?b@xwTu;qd59OQ1}z)s?ytgN)sywpLRWyX5}7|g@F^y zP0)^bwZ_T%vIMUhVK#e(_pH2~1R-aOIIu5MduPV(Mzl!Q@W4QLbQnRYfKw|si7aAb zh)Ub%l$6ht%^^<}-dr`6hk9jOy=2XjGSWM-v9)34@Unbb@${o%C<>Y9o&Js=O1EOm z`}{}HYFbc3kcl^w@#oO9bON)o0&~-c*55IGnC9+&gYW^3hLi~%ohbz0GqZwjv|x*# zY)W*@K!^FF*cU$<_*lE{7T#;6_@~@Z>(Qh7M?P(_-kf7BK<@O&o)RO~D>pvx%GW-- zUMz8C!RQjY>UEBGf$qz#1yno9f;Ka3tsm0qtFU`5828h{2(22)+?F4h$OMD#GPpASV z3R;kMdac^_ofW|c8dryuSZwD4WE1fmt@LsOF{xHXX@mC@k9MHEX*q5l5~+VJC1zmU z=LQa|xu-i)(fz;d8OnECIj~5GyET^uVUV0vbrmqkAK%7-b93%F4U8v8<7UtEkv0>r z+1z|Di-IIwp4_uHT*!Ytw|+aM~mo?#uu-C#xouP%!b>IjT4JJUnkB0;qiD z;R&ONtBU<-4fzn4UC8SaDm1VqG?`0`V0y6PZ}W6mDEp@6I4OHm&sA~}Yd@5^VU&a! zMP&BO#RT)k6)K9w&{%3L-`b)p_2MLcPeou|o?IYIP?Voo(My!i3OCo|cE=uUkzRNq ztUzIZdtPZpW$k67c~h$v+6J0Zj4VoTDm#8ztmp^-Yf)mrWQy$e9zxFB85kmCY5grL zRSx%A?C;&7l#6nkL>1K#%ng_>t()x{GhZ~jp&K?+hyvfaEqJm1rLrC4!^Vj6Imi1& z7cJjL^1z{dVt!@bcP$@2!kT@~F{@0u+}w<$f>VXvG-`V?Wj?)QX?ZOBp1JPKOp3fj z?o$5p;;O^*!s5u4i%rg#SI{N>;z{YoWOf>7#FK65K850_dFN|QYJcp!e-p!F) z@>JJDnb|N;sh}eR`)=|xfh{3|_W^=0#0{)zu6>>t>$j_8G}ROt9Lb66Nq^Ct<(b&> zuGrMTR#=wDSdb$(<_U35(s(M}axsy`%$j90F+%>92^bpUKi4VTDSp!IeJ;-REQB$VY z_}d=&R&U*R=uf?_Z5X0LVpU{$voNwro88!>)QUuB@Ev}Yw@}~PE|!Q#qy+^bLmhPz zS3|_RU{5#U3ztzav9OuYF4*;tz}B|ET9&k+{gNkn)0{;|N4Y@0y8sjSJQOS@kv`EZ z7W%Y5U+HGgbHwoK)vc=-gVl%u(eh*}r(*7-SC;yF76fLii;As^+!;k@48 zc)|gNDj@MZdHSMEnAgWDwfh{<#BgT_FP!GwB2dPq<)wygK;~R5UR<@@>VmFR>EyHO zy6gn=){(Q4XsfgoN|@%^i^q-*+t5#8IHZ4ciQR(^_5+6fVMBC>WvA(ml$}1Il254Q z6Ds+HO8yaXc5wuZINv_qAhQ#|zx^a254r?IO!A;h zTtAXa{Hdzv@2D>c=>?ONHFZWIB8*hTaHp@PUgf;TK>e0i0^_tOXN!z(td)2SnuTFz z{^kz5Z7`R>tUex}>xN>D8&sS>)@1rMzv>E~2cTb{H7Dt9=;s*~ z@W=?xXvhZvu!9EA5W=(Va?P^tyl>}*A`9ku@&03=PDJ@m-xgH-8q_;RE9Bj;$HViRw0c zY`oifdAVH|MUy9%mnT0BuFhHAxU7%)LNG*eOhM<<#^}nZ?xzPhn~O$T=jx_5{=G@y?@Dc;P%w*~=tdmckok7hEyV zpc$M)+$ls7F?<+q)EgeznhJ9%V|fsP?{)&9Um%Hq1|W^iZ3cCTfFM}Txj`ZgQ*O@F zd@P&T#*GI_gUTB*0Ry;joxKaM85v`k!%=a?W=>;%n}lju9*!chDmk|4Y>532lEu+y63c4>|D=-`J<^cO^Ct_y#@gQErQW znQ=JbC{H-b6OQs9;V5@;01OV_a+F`?@4iifGo5ghC;iD?zvykZ_(`AuH^?nHAI<; zY|e*cqkKm2Q(HhJ69`Vwh4%&te-WGZ8J3}F;NV~qS7+ntoU@R(ZGxeBaIufxLu`b& z(cGo++Vz-gBBH4xST@Mqm~Y;zR-PrhAc}D*&Z>GEnPB6dvd>Jgp$xJJj6uAYrfoF$ z9E#hf=c_AeX#q+|=xeK=uwx&LoeaMFlz)GKp>nk)+InP*ocTifF|<${(n( zeFGUg=gyC(j08bH;vdz0#bM@iw*O1z$M(LZ&5&7@`%+aLj$f9N z?%UnAFIrxyR8psZk9KNM!DLk-Y(T(#ZlHOr)V09zayk2bYm372&kl(XA`uZ-8#VF= z>2)Gthve)QITtrX#{#Fm+_y9-D9JCQk1pw)w@kQ9ulR0iX690?z>b_;ze9;MMc9it zEXS9Rnv)Z%`g3A+niN&J{Kt3;3dHI58>|XwK&@{Yjs=UDX)OsW18m@IDJb zSzWc!@_fUsNCS_Zf*u%{fLNVR#(Zas$COCQ2@J2-pIGzojjyQvJIL9|M|4fl97 zVf)$S%IwpoFyYXckEx+Qt(9BBOQFyQm&rJBy0H6a-zmFjpJrRSwdMHX9xOd&+6%#3v4KZD_9SLFPMHwk!r)8FloI(d_vNL!vrTmJu1+LHe3yyI`*Bww}JzkQQ1 z9_3B)=hK^hL)4LZ!g-%?-apNGL(Vz)x@2JZ%6adO$T)b10*>Snz(1Q#@jE<1Qu(AD z_oN*6C(Ci^AqRceCH9304;vCsccekU|8iJ)Qe1aZTz67j_v^)V5T6I5!?(qCkfDPI zE=)Se^t-?N=sc+;I;kZ3uT~O$9rO5Y{|Y^LQ1L;RfDC^7yDsrBH(2jTwyNUQj@2_V zGQzu7s@`Sj=Xh#K?iPGOXxJ<&+~aZh`Ab@YSaLf28zj^;qK!}KD3L!a+B2$&&ZOM` zxLWnXe$Mv8=VjK<4g*F;JGk7i8pw^SxvMxRe2Ie9eXkbNT6Ae+WT4&aG(A*tIH`1z zvEiK65Xr^TrB3;QBz}9}&|wsw%dg1phAW|`wst)s#3esmoJl_zq~DfjjgW#LTTsOK_y14R(j^K zvsJJfbm+oi1&ST9{ec&YSvuAY>Z_HsiSJ7+JizH|CveMU!w?Z2_X)G^&EIx4xlwk% zJN+3Adt|X0HI?0^&g2?HLfxC~(Qij1I@9u9t5jAKNmnv#Cw zVt06cXWPM4j(xL#^y!yr&jed5K39xqYtP=VrXnOUDHf}smEp%NjP%|&vR{@S8sJG# zT$yyhh*3|Pd;O_zq(>&=Y{Gi zL32mu=^2?iDQJ8*x)&>T&x=jZU(9cbVefnN@_LA(oP!KSSiSJ+G4rC8lER0N9$gk* zdwc25X_Kus#&;};a|;X3rVivF$={~_=q@wsYb=%;#AiZy17w6GcLIA5$vFWf#QekF zniR2@FSX%_q)2kh+81-j#`Fd}qJIIr`Ox1y*M%J`Kq+9g+H$2jfz4d}#zf+5VP}GV zt#f3RAX(MYr37{i6c2hAW$1G9g^XyT$|sEc(0NyJZXogjT%PE9EI!BUdRF;7BXH4a zs0ILs#}{p6O2mLc1rn%#;;LUM8m#a2afBlhfrQuTyh}W}hy1E4j)ww=T%=;Ikn~kx z?gbb^>x+mmpPh%FT(c|*L-2Y(@=luZql9c2ROgE+_Ncn8h=TjQ?Duw{MYKi_V|O7~ z0l8?I0ekE&9TV^nRAD+w#mT>nDzlP3a#%II0$c-xn25yjs!lLT?p#+bo@V$6`6gy^ zC+S=E-slKVdev#g&p(}D$zL0xUfa=mb?!rty|Ze?c8<#0Itk7C&AV}ZG2lsQA9SNE ztm8|%l<1zcIAtn$J#*a@rk0zrj$>{4>6kzz( zbxt7h4cE1c+wt()*_aOAry7lz)ed+Sq)jLeUwxrze5JpL{ow`2;OHiHgP>;iMiK2c z*yr)RYK#vml>1}&(yIj$-%a?k;@EE)s+mn1Jzj|BdYoOdvSe%Qz-%UrErMbSnxw#N z6wLZqle8eaWJ%3PW4Y~I^t59M&9x>`ln=V|L_>^6gYi(-N zKD?mnSdeq)PE=j;E90O%m=6O4|cUK$xUelb(YQJj%A2m*p;-ispG1;B^WPkDAyHmYUnzk)t=>5WI z$#jwY-PnPbwfQ`6d+WY~C8jr=siAF;4pp~R%$h;=NPKR?#mkEA>jrZtLURa*i-E&5 z+bnpjA)%^!er;f3BWuByEhk+T>lS=eMW_T69h?qsHKNbhE$vEDpI}Yd2gDM2rybCR zT>lK zfJhesF#&d{6I;rM6X*GAyZf~MMF|v{u-Mry8G4m+y$_#0Jh~49t1~)#SQcro4x0J; z{(v;dwDN<|3*89=cA}W{KcJXI2RZ2A)BkNi&wSX`%Y2lp_k;mE8O?Drn&Uq|nginV zkidMubc_D5iK6r;6GcxZik?gq{hyyGx{Cu4#Q0{SDCi;nBSFY;lz8HVGe6|l!*BpuOOr-;1QoNI6Ofg587@P;5RF_`!qoFE^`g8`R#vq5wUqDs9eHMxM1 z>j7HoE7-j5gv|IFp9;wZbBKLlYG2b5lf&A2oFhJ!M6WDND32wVv2Y5?X(T7=MUGWd zQ5p`v5b&quxi`7SavahEv=icwn zfAD6LL{}81a=LP5X>I+3XNP&KNnx+P9F&`3YWJg3yp_$jD{Ovsu%W2!wuKE_>#hx6>9++Zt)|tpbQ4rX&fI{2Pgt4 z=X6>;d{2x|{v_N`;vDB@dM%w&o@;T(Rgb@(hiCV)begy_>94t5*opp*$zl|?iR~^u zkUaf3KCj7HTgkni&|hm#@Azgh#7Fav{#d3JxO{bg2ONj)}=3n1K_&L!W$@ z!=Jav1iu?PtHFHnia^wm!8A`weP%t$4Y;^`2{>mzRBW_bM4zEkDYZ1GT!5{Ss)?g_ zePMKRUChEd1Us+U;cAlfCBNY3oahi>#tQ92i+lXQq#FAclFvD%U_6~JaNy5JuQOnFb4$_Vb24UMoV%$h}`ENqU zUvECJOHFYc9cXW;B6>>87Fpikbq`=(Lz%5=@2Bo2vH*8Q!ERxoVJ7#yaD9AIbxQST z>&;?~A$T(Mj;Zr>inNr|Ph}Hi5tiKDWesqnds$d|qjA$|CQ|N}#-`1jF_gwiVSY~7 zXGYDkt!b-azcXEMdvdUTpmVcz=C$gQ%kX)eR@3UM1LwSm?dESfl&uX(PJZMs+8S9< zo!^d5Y3sHqDH^DJ@ZJnsdZlG}b8VtkqDbkB?TV4(T`lOx)WNRXsADnynF`t#+G=Cl za}llURaLE(DY4dB>>iAU zQab#V3zd|Qgq4~_vCiMQmh~(%D=V|?P7IA7>Z(NyYN5d-#cArn*xPqk%(clK%NK0s zkaS;sQUzL5#)?O8p#|J9b`~_r7(~j;BfEXi^@{b9#>j}qhLROQTV|@yXqr2Fd@D7F zgwAw{zmOtTOW4csqL$w1x+fvZ3iPeSMR1+E;dOA_P9YU9r(K28FZ$Oqh)jFc_B6Y5 zLqC!ne3yrZ{~AJ4i+Kc4 zM9$b)=BSksz9&}-Mdgw+IB(Hy8>gk4emPVB4hHgSf?=X&TOKM;8`h~sc>af>`lnal zf21A6L92&Css+5sAERM`y`FeVBLheE!CD~-^oxP>& z!Gf8d_A6L09`fv>V?4^U>tD`noXA+5$XJ}nSo|Y07P~mGix~UE#uyHZycv!XdH>6Z z0SYf9aBAF3RaCXk$jSG~@m3%UJPUS9hQ2{SXH$zDY}JxL^%6x3sBt@rL@$Z&`ckb` z6O6}N5)B)^m6eX;M88h6?W2OnLpwr}VKUOQg3Igt3>P!8CEU}}`dp=D<)MfWebkvb zF^Es`V!{Pzkjp(Tf=eerBk<^$Eb>{Q5|)GuAoO~H=0WTs=@&2(eG8j2tlAKGkvW{y z3@i06v_MR}r3Wcz=uD;&+EW?%9Qj7p+S}Qtjj-gWh0OUL^IBQiIds{d`o(CNn>LtL3ej1!Ev{| zZlCGfaxk~j2Hs=@4&GHhYZLxD4UHa=FUKLbZx%m5gyvbFieqS<=H+Mo!enO?E2pp3 zy>7|Rxi}a~CpcF&WMj?{(r9Enw!Beba>qD>TFk$HC4g??VqCU={4?nY@<$RnMxr49MX&zyu2@;>NxTF!~nE!eV-Ht_NIfuhY# z^yBx4A+nL3N1eWwGJ+w>RZ)-0b^sKfeqE*-le9 z7CL4q6YYbzgW2|mj9R&k&C2S>`icJ8zL2mjSVTjEExUGYAiOpF+{Y#T;LrtzBM&{Q5ZXGv=*)%!iiqzd*293p4TiG-WJ;Ixlcl)_StIfN<;dOl!TwoDl%l@ zIB~u#JuIu!0U+7J3Kr(uzE#ba?)v7Anc<9NIx zG`-r5;RX|u0(2pOlEUQ=E0E1Pe|KtloMJJnxg1)#BJ$l~5eFC*Ao#(sUtYv?*z<(x zD9@9BIrm}kRa8!tK#xoJG(Fba#IqHZd}p2-rRJSGm#V&4`Ch^E0%%$xyDh9+*GH!2 z2t)HGwsqq*L*k`!j*JB+VWO8XoQ9N$E^y*>6+|yn3B1S!TS4OrwL#+w^(CP@iQVNI zkQ1o9VFJ&1$KSK4V+mwoCdrcQL0ze6$3524(SWKuFf7*=66RNng9} z{1HqXH`YcU0LwHRd+{7Pyh-t_9l$8f;k^@-eYe25DH?nHa=+R{&I0-C*&6Ru%U}nu zSNE{%TbPuw-6FM4wANX5Nfe$@hZ?kH7_!Tp7F%ztRS8)fd_|Llg4DJQjqQ-My17=n zvOc2eu>6)L1;y5XLaKf>O15e~WO8MqYdv;^+L0=HGUvmjW0`#+KDs@b*ix~XS;wQA z;JHzQ%=#~;7N3V2H*&9ZwRVoD;Be*wlkC#(c1$bBF{WMTk0|Q+qUM?tXCcf`-fhef zP+FCjiZr9XC1C215sy=Mt87L({mvvon3te<*{5=6C^gQOv!XSP+Wi)-a8Zw|mVJ3# zR#fkFTF|NWc8V&UWBOR(#DhX6kdvmDM#bfzi})U>LI>@S)36AIg5+*NJ#y}iHgqyU zCG^M4PfZRkD4tF|w9y7^F4O0f9uF36mK4DZKk7>cI(&w0d(9zth(kb*Ipn?0u>W4a zei+Sr{U|i=zkH#dwAY=q*PXQ2{d#*H#OEQ`<$iGy9m8ST^$ZN4i}mmJ68+oP<;m3R zld0FgIQ1HG-XZtqH&d^HhXsDJYKyKh~`e7Ik!x_e- z;LJ&Uep38@QvCm)FaC%4{K5GA`eAhV^`p??pmInW0WCcpT?+zmsLpL-XkspDs-~fJ z`ZwrBm4b9zd$e(C1d(j75M!Xgz4BFk5FvDiGX~Z`k(c6G>}9ri89SL~kF&kroo#j$ zmQ#7rG}2wqEQ|}wEv=nY2Upr|&a9J=iN#GTt>2v}qVXT!L69iyaL)PS9*prmEz{LX zT*WO5v6YY;u!+zalKDAzhPY+G7U0s6qkuXi zwMDcCh!7bWTvW%3Z&8Uj-(r-M8gx|$X}V$;SB*^u5kJZ*aBiLmv12t((PeN&iIDaY z=oE)POY<^`<3p@26?PyxqgU<7b6sM*6-!^4fX5ZW&tb0k(VNOdVEK>+Th9mjr%3y; zH*&VwrvuD{#O4MPUSVBo1!%J;j1!q&8o$6oRmdm{<|AeW#WN2umAp}3pr0l+= ztv$Dv&gU^-bv4Ei9|0o%5#14SFYM~cYo6>@^NZ?cBaH(sCS)l()S`hOF3prEQ8)OJ za9xWdj9#q_67aD0EQ@-mc;~}))}pOXscFN3^|^^}wE^srDE1jtc?knZ@~;(Ghek&o z%nar~<=CxS&ni5YDNei3%x0skU`LO+c$$w{%2QWO%V2(VeM)+E6W@KhM}=Th%RY1A zqwy1d>i@^yd&V`jv}@yZLJtrk0z&8^bO=qQB-Df!LI_PdK|=2$7CO?UcQlmHkzN&~ z2-2ksC~ixJ3{DsILIxdkvUQB%O*tL~A!}XeH z8Xm3sfbK_PzvgI!BxbvZ(s?Po5hXM)U3f{KHN0H|hG)}AT2PmCcay@YI zIKB#-6FN*h`?%aAl#lJP=qYyC;O^1Kqx)P*E-Jc7;c$VRbDeT|F< z);<(sT?ev$x}qsqy*{KEK_gM25?2&~%!nBEd`@2sJuP5He@z$kI%Z@_5pFB=c)2?^ z_w1dZTM7+x_d=cBPa1)Z#6tB379Tz{GE*3nPoA$YqqryLJGm_AlFVApv9#OF9#SI^ z@%l6Q9!sUa==JSWUVHUHs?uj3-9&puZm#z4-@WsVMUiW3^DmT!zrf@t>}V*$|G`w? z3V)#%fGhkvYJvY@Qu4PI?r$sH-&VN)3s$(_QQ;SD`I8k+{jY=?_5Vde&EM|k|8_V3 zx4ZfOTkht6A;T{W`LnzEzc5_F75+9{{=K2i-y7QezqFyv?|uHiDn``)0v(jq{vCAq zA2wY6?MQq4Z%5kyhmN#=Z|Fa}#Gl;=!T+jD!2j+Nf3I==e_)NX@~?*eU%CWb;V;zZ zaD{(MeNNGt|4*vV|8{Emw^Pf%om&3?$EoG-=<$n<{>g~1{1^IiW##`}`f|#m*q&FV z4tQ`+Pw#}d4o=J(m7GPz(mJ>pbD;DDD{4A*QXqT0xy8gpS!FR(yR$8&9_#dF{ypKh z(r)8~1c3CJz7`4T1^0Mya!k z4B5FS>;%m6#jZJc`X~g;n4%k=QYRx(%bq*}eolrPVfoNx2kOY;hf7n%Y!PVJdP1~b zV3EpxSd$ZL{MYi9@U!5w$9MVfybflo_*0Shon(lp~;I%Pc@sFxjXLB#uB{nY!~;VFUnA%B?pUVGqY`*T|0HL zsBq@_!At&lg^*GQKD99t+oXU(0&rH5BDqxK&h3 zs-7*CzPzffrP+j&o0+^ucKtrRqqE}QwOnrc#QCzj2e~;oAn2+^EpBE~+t~hdL)>Yq z5ji%9GigrL;96DQvUWbZ`NaA2)!P-{nuM%hC@0-M6*iexSCH-vp0PLb2<%G&B9 z?N5R4u3WgJ{39#~3O;0#_(rzoIhIN8Xm6)?i**a0{G2xZbQ!;I>GJJL*q*+UK)}91 zQO$Q59g8f*gIhD0v$=(rOC9WHwu2^9SQaXV$NS$bdl;{$iRvhvDv7?`rj})t=5BCb zLSpp3W7SQzdqd?9{GJuOjExTyCeDaF_Bx@HkDl#UDTFJs_6E` z*GFDv4zgZ1e|%l{Hx(+J`U_LrFF^PO9V-7cwJB4?(0_H-McMZ3f6WZszXjR91=-vG zr-JOShW=kzyRzb+Sv&4x00APeA0A?88R8N`IdyZP^bIYof7q&(|GBBu&rJsZDz@UE zV#AgGv1sg1TN1*Re)d7igm(j?PY5B1^6x`=lODm%-<|OD+2D{Mf{QP6I5inR?)S_9 z*!Ny~4|+=PXp|hxh%XIW8537t2qM#}X|FG0 zsVRV?X+TF|!vqRA2G-H_BdI5?riE`s>z=yV-$MQT%hWL<`D0Pw>)_`bw z;iq@U=n#CCH*dEAE8{cF zEaRA^Su0~vw;m4k$#pO?cXPZH$P>~$afbRO+mzM`Q!A~m!0fycf#t}dYaPU8s!ye! zO6tiU&P?4y%7GeQkW{AX#A;u>V{C~0TG;Fu&iCQNhs`fP^w|zA7FSKP#D9=|T;J5B zSnKD!ehEr>eMTJ{Hjq|!vw%rFSX1PD_jbfqWRBQ*E=(g*36rXKyX8<}%jOFZ%7oUa zC}<2~-4@$PijWl9It(2%N~i&{`rboH=>*+hl!%CjRCA2Ke=3#o^zAGzSf`{-)REX* zBdv99mSf-}jk4p6y5m&pLvi>Dk6!}K+(tMbJbYW=WoM&-dOD}fP*MaClM^{u<&$#W zGi-ghb^XmmXLM^LMDBflXHw!bXl(lm&SD)`bJSUMrYe=?X{DW<@Y5-NNa4vKAlF`L zaKe?(w=cpb->T%$>#cS+%zNZJ@kM`Z1vm-qE8I4{Sy!_*T+=cL%{afQcuJ(P26g}i zV~07QYT}_)3dGjsTX?MWK+d&zYA{~%O4qYfK5OOgnfQqJ)%D-rOxResTzXI9vmVLe z!2)y_)gNu|&U8?-GHm?dMQ8HCS=r7EkU#N9^H_Gd#?H%GmKWD91tzo6SJQ;Zw~p05 zeKV1-nu5Xj8mzU5DlE<1y)dYe6~^0*tuQouADYMdn@1@3>oQ`>*5^mZasG@io*91D zvagUobFFmwQz$!^3qLYB$b3(~cv`<#C`AI^X3r zOt7AZn-{^-d}m$Weumv6UmnkW74W4GHFJ*Y%gun$R8@efJwP^mYt62wKZi0WDu4kj z8G7MjXy}EnlWuJfxNM#fXm0uAM~@`68z#yJPe#3zUpIHtx*x*Wp|3U3@=!pf5xIIn zOhEa{PQO+p{7d3`u*pZq&2MV=w@#@Hfm3e9%ph~Z?GpQOzSNM|=#jA;=}M5gwU%E6 ziFU8;yJisDlGRb1z1F=qC7!>Uc88d6d`mXceH3k>u*AsyVI&r%Sx@_@AHgViBS-N;5<$>=^5ue-qn=0jj=H=^xX6!ZUhu0F!n%IrAA6=Dy zhxWZ^iULDJuNOl03N5zv3IlDZ!oSg7gn(w*Q%^qJk0}qNc9y@Sh;> z=fgiU@e}eeLH=%*gb;{5a0nd!Q$+d|P=ru2`SbkeV+NEj`js&Q zxSRsyAKz)9N(sP~{?J_-sQe23k$`~`C8YSfZ1pn*8*^7Lf?LS1?4f)qdu_shE#08J ziV{+Xz<+Hx@GC^wjux)`N17;K%Kn^is-paF!S5F(|TewDA!&&dDG-G7Wz@V_E@@P81!zZ!Y|7|j0hee#x} zt|7k$Lj(UH-=8HH;{v$gQR5hzkcha^?iG? zMIpK|de1--XQrlz8z zru?XWJfhO2Vq#zfFfuR!7y-=8Oe}0*4mMU+HhvHf5DYmbA_6%jBqRof%ZN!RN(u?d zYRW3AsGUB2T2xwFPg`9Vu5nuJXCl>)zFvC!25I7Z}{bTElu;G#(UAQ)h2sg$7g;T z-3fsWxuXfUYj~|3I+B+R{hVM4RTRGfQkM3&V=2|W^3wVk3KoB=(Y&<_y zFfF&P=`~z~($;g)5euX3U;uw+SIq}zcIZXF4IKMHbr+@#esVnaMmCClh+)2ghkGsI zaigWM+M)ruNM>e((q_B(J zF$(G>Aq}6ou`6tT@SRgaqSg+$>JrPqj0l+ee*K2 zd*M}H&rXe<1yP;lhn$-zJEDm$_) ziH)oU|_=TT;Q=@Ka-y$)3a7_^2QP&8# zZNLvONjR{#c)8{IzW&tCgh0H%V1_K8DN7geYlOR2X8hT&{H*j5)?f!Y;JZup6SsCyJ?Dq^la1{QevAMM=>q|6yUyp8SboeoRT`w(4hqYMF&A*bMc0BP!yZu~EIm z(NK5VVPZZ8@G(36+*Mp=a6#>RfvielW=EwQc3N7{Zmp|%q@{yH^3&DyM9*{a^so2% z?t@}exd&$b`Asglo=#Ds!wg;6s`mI+YM@;5{{6Fwwx_w$^`BYC8kdq&YW9fqtxu1s zHoUcV0%AyK$2N;nTz^niE@x|08(ko&Anq##V*77}VoGGS`Q`>J%(gFC^_h3^*aTGg z8KQNw`;4U>gDyTVl%4vjYtcPfz1wX#lk`Pr0o9?j@cIf*fXYpg#i)-w@a^H%3k9v; z>%IA}1uiFfqf)1OY6Cm-9*9W!rR=_R%a?9fJ%>C#QHnxhnJ?c$z*@c?={omhV1B= zHRtTorbV$N9&C*DGQ}I-?B68>d~_|+%fTjOBcrzZMC;~*B{epS^d_iGJ=j5 z(vWOa6zkS6_Rq@p{YJ39%c)tXR`R$5NQ2N=(_p?9{#K76b?bcY7{|2LLk5HfwRTa8 zwe*AVhZd_>gtiX*Ib&~sJ5a9Oekn)VH(Dc+TGB~#eGavc?%3J+xCM-Q-l%9Te+%-J z(#!inl~+MQyr)EJ{AbRsJonD3#TzcV-=Fthk+f+W_PYvw7FsIs<>JHrPfE)-I$Fes z4(Dm18lrt(oPPV~7o;M$}7>$cz6Yspcxc(>&c-^B^G4Ae3*~X3_Er^g@j^KiSet?DI8a5_8i(ZkK zloA_!B>8PoD{SM?N%!LcIh1=`z$|=uXJP)nzyWk?GuNuhuQGsm_p`qKckt~WRIR@q zm$&o1>AoR*v-Jm6q~wL6(^ubq9NX(TcgtF4uY`2EM|bI2XGE^h!pDlm+l^RD_A|qK z4VB-XX@6;alGa2_E4U(hbsEMn+|~VzIZ#ye}zy62IjpIcPh8NM3YnsBTU=A@_nDG;_hI<*xW|~8efyRqR!TG z%s195zkVf88{}a0AQOVKyiI}RN6R%1XCJtF*S&gnRyz0D_V^oX#viMH!TkTZW>!f} z^`A~{ey8mJ5NS;ae&<6xDLnq)nd+jdp!83Au0|0%|4h%}zjoODDKh>GKmU1!!ph|- z9Nmo&5EAO*LlM6ITh7k>-)a(Hl`rPmUMq zGvdbNXxmU_f*~Q5j2K{sTxsGVU&LE6>a63t%KjhMZ?6Vj+CE_vR6KqBU&kXc3~__Y95=(UmW&kR!5nhlQ9nZSHRB?m})xcBHeRi(FXArSY6Ju*x1wYGVMzwHHBB*?$-mRt$#a9 z6Q3SM0=|JjuVlrw-wWbmJWEV++x52)=J3EQ`Kv};hil@ml=q>&zweY zTJfCIruDiGJDnQ?CqwU*RYE@goke9UAg$=40A^)I{y{o*5|!qL&!G(-TQK+F4TFq3Zp~Z$5p>7f;_d4 zI2jfguY)OCYyVJY5d$>sTVm~AOh)&S;2U$usrgL8XP$xM>Q^3Mc(!w17JjB7!^(NA zwxDgyk_@P=p^XPSs*E{H+Zxy8o5Y`DtG2(EYHC4#%{(_|x3-3rc55icO`&dwyvor6 z!#gMytS3laBiVF@RF-Ab47Jr~SUt_;S#Ri@YhGi==XE=j8I0OP=X&D&a!AVMdjY~R z@*PsoJ+cKtCZe3}G-lOc{88p@%aJfP3kh3%tihn6gFDKqHf98fMwoviGO(_n7Pu`v z*?@Jor<5+uJ)M*82$$>x*%iM$g>zW+eqan&ANB(VOPK*5BO9t_+w!@doZ1q6YW=QJ@mje`cq09 z@zj~l6f+PkHZGQ}vMgeTQ|9jC6fD?1s=x{+;4`mq#l*)e|Bk4$25;8b79wH1XIt7` zG##FvkbzSRd@^6lRi{ti9P@)pj_m<6I?Ipt9&U<3u-VYE1&@doJ81Q+88ha=mf_Da z%`^nE4({wRK~`$7NZzH@tHv?ZlD+moi!KnGE?f0_%ik(Dv(%obIR$>WutJ4=LZ;cwEI6uBP_=;(T3BUW9GX7v8x=)$0RKFVWSBlim$I zHE)4Jw<;ZBb6$9^U|6LcvW7eC^HMBXDNiOXljVLs(7+B}Qw#CpXgq}uB;=}0qWH>N z>|vjzTRH4usVLV)vnQz&$37^_L(Ij5oz9ynymT+w%e-yA!&mKXJ?WKppQb-rU{|;KtuKw}Q6WMFcT`fMC-6IC z^a;d|@>Y8;B{?IsUjpuUJ})+OZaG5}7PfdV0d262MFGQd4q9?1Is^#kmNU{xPhm2>LZOd%cBCr^m=KzN@p^mQ% z`k%9S2}bV#cmZIo*TZrtX6dbe>q>e@2J5-JhV8)6Ob1TM? zj{RD@&EFSdCe)>)G>Y~8)IT*0i=E@EN6iC0%4F=1xSSYviou|&O50QQLNS@w^v)Kb zhm)aksmPY6QtaQ}-V?@fzR6IeAjVCE^|!3X_@p1-_01 ziTU)`h<^a&=+17RO~Oj(KWhs~7ev_+hzGU#R$hJd?RDDq;X}Ez7*hBxB%^o z;&@y$EXKxjex<+&6J29fN*ZN5p@R)rbtZm>(OtOo6yyTr9<@#B6bXW{)fTvC3<1i- zA)en}jOo9tRzRhhKGF|@_YYE}i=!a(?8u`1Gxv(NzUl4Tq_ z&1dP}#+IRcJaW1IjXx(%)f)7>40Bt}iJe#<_Q_^_70)Qt_7M#cEZ6?WeW~ zec_1_e3i6ijF}r4H#N zf>yTfhvZDS<$?%2ud^A>rHwravUgj}KU_w_aUh13R(BAy-7IDg!z-JcRHge(R8lY9 zt3LRFX`p40hU`_(LsH-oy#TM+A+JUS<=XtS|tE+OxNS1nl<25s~Lg5pb0haOBC zo(VB25dw9gN|Gd?;>851h#_50a9ecC=OFN;X!9c0n7+xF$umAGWP3Ho@*1z$W^UbF zfdxAIdSP?Noxsa>tps&I8(kABTm}COh$XU}_pulk)pa@IQUqWB>`5cvvRb-b5^@2;$#hNHTI!p80mZxB+?jZjlU7?6Ik8W45cA<7kZ{j|bwL4?^>l-Z1$ifpcT@wwX%+wFP#w3_LReswlYg+9R-vWr~ z-d#N5NEZplp4K4dMmK=!O)>uDaE!fg1}Tm!vdFhvhqXqFM=m$+PPbycoaY1#d6P|! z<=&XdtC8aF+`XQwt@dNkTBBhT5JlG-ca4<7_Oj9iT+LVSFY_wviBF;-(f8AW9r$u> z&|dQbjxyK|ou!#o5K83Yfr$GC*Vs{cM8VAl(F|SP(o{Fn$s@sno(@l&|ORjB!(SloT~# zEs>!ENoYX%#>!)`9xlu%535Dbk1#vC*g8PXX!2QUx=(HTrhFc3Gp64jUZrD3V#arB z2a9+>gcsZv?Rq}Y2CEW{m9eV&6o^zK4;cxe|f!c zFa^lv10|`m zFbqX|tWU0u@$d2M>^Cf0>))xs-_o9ee%(vBuysZ7x zuhd=vZ1`YTu=EPij!_~EcyQW)T*v8&I!t1V&pdkA(j~jQqgmIjO=U6$S$d)|JutU{ zM+h(|K_|?1Sd@EI9ZVUIdcfLsr61qs$OSifjzJ| zmDz6fJA8gj-L9k2$V>i(Kw^t+O_O%h7&k&9Ty$0Q!nkSpb03W;X~)X3HX5;sa!0nY z$;~3Nut#!P1l>02O0QnJ?nohXUKAco>wL{Q^Mt#v1%#2sFcw?qv z|6PwzyfZ~on}~+!kGPzdC0exQT^ZTN-C7zpB)e!raeKQO2x<2~%&K*<^SBj;Azmg| z3UE*SqKRMshxp5MpqQ98i1*3-5yYImvGhY7U85;8eFw<}uInW=iJesGJg*z6C7-$1 z-^8aKI8)=~@*z9<6MAf}ZcLur2YVeaWEh1>exK>u$;=&fbY(7qALt8MU{zTycI4S+ zK@iRD2HBI#ORQS8fTP9OF?tQCM-Tkfdj1j|V#v@W7- zuQ}t+pxR=JAeSw#MQceHSC)0)u3AY0ire$bnbRh0 zk$9>^twsQQ*wJl;IkNG=#^cMcSvCQlR0YXH1^RPN(V4K6+36?YRf&Ba#GaED##YhJ z#sL`TB2(Qyau@`6?Mz6W1V@bOI?WW%IP7Z{ z4eJCJommAKymiQQNZ)4H=OIi}-t!45g>R(V$g*m!$zNo7oBSX#f+J?AHAFb|+O$O8 zlqfJ@b~I|@45!SQhADOb&0O*PD4UHhh*Hipx<`(aV|fYfvl-#dQ>e?szQeqOLf7q? z)uFa-HYPa8UTIhG%iPTe_mk?9JoGvulJG1R*miOHvSQ6uNxlx57;W$DxKhs?TX!pi zW?N}Xy3TvpPXuo(X?vRF^Y!Cdwy4U{a(=!wyli^^FW=IhTOJy`Q)xpTH88>NxL6aAuQ)|IqT?^;OF~b zn0dO3ubk~r3Ae%@SG)T>;(R3iyRTIsP< zJ*2TMJt51&pvlaWIQ>3Bb}U|ewqrDwhv;d+m0{dwyEr-L?H~&ncTkX$rQibG{i(6gLztT3R7N}9ZLH_yiH#r->sr~*nmI~pcI)qt!b8D+B`JD z3pk;^qIgHPc*A6!A%q33s4F^Jn+LTQOw@o^j+Hf|hQZXsSub#_)krSia?V8eT!t@R znfZj@GM1E>5pnU?k>s*?O_D^^Q z8RgrFz4o%u(V2#QlKJXGtjMUodauWWGY4U!H$w^fjIJ!AVyxg{+u*)YgS=gbW$QyR-gly zODQahT7(YtOpI}fX&t!A#g;Z*H8F077V40vL39w+*_M=%!v>>O72r(bSZs^EZ3hV37Bvx_S!>qKn5oz9K`_hN z1Z?}n#kq184;gCO0+=|hrmen79f<+v?6JLQw*+f@cVg#JAq#ExhVc?z!Q?pet9v?I zIu$#%W1m=xSak4;-oiWX!6)N~j7vN_%OUU_oT8y@COHC&pB!c4!2p0f@qo~@)aeQ1 z6;2FI9qCG#d?iB%DE ziHru}#y1&|rVhK}T+t*3`oU|32gdX{e5~a-YZBT=Z+3AnQzfOv-Etv*^o-5(N7y}- zYERJU?rvR(3Db)54N)Fb2UM z9V{8MZ+nqdG;F!1DlEx8I>41$ds&_|{j#w~?o>{x=t z&=WG4^AP1GUW>eCb~J0futySmInlU0#?2FCeI5Mu>4!5~r-9EH5KNx*Dv4}YLTo2^ zQI6>rATFNZXlH53)%-SDRzUUyqsqpJuTJL)KQB>9m-H>0{CpN>8&eUkcmhW4e*b#;;kN4o(pzy|P3o z<^XM2+d}H`m6JMb_C@Hvt@iVEg;sVqMa~b_+w}!tu=WpwOb_u3Iz7B}-gg>36XQ@uHZ3k)DyC+Gsmb^9Id#|!wO~8L^4Z=`Wv&YJOVc?qWyZ>sl7p2`Dhwzl16*I*M9S{V)vnAvWR#8RL1#k*K53$zh!dau-Uy3$=xopm>! zBPek#GGPUSHs9TURb!T6S7!WBKN#Zwq1VMwhp7gc6<8O|Ifi7;>@cF+EQQfddJ$`u z_~oEef54Qt6%~cG&9&|4E4MzTM<(7;_eUf& z*pr$H;{8?t-^C8NR=q$muFh=*wXM;}Ebk5?1lL*)lU=OKwN#A5eiLJBt+l2ptR+80 zREl0dlM=z_idPzYO4<tVnhrP8%keDj5+i1UDxYP=OPoiA2 z)5-AQ>zc_Q?_A2jr&5n-d$1l=W?0wh0n$$lKqDHc48>Bivl!(xry2>Gl@rNrIz}o6 zwd!ri;tz!!LME=ax(#@*X~uDBkOXa6njqdO$zu^$^dKQqSM&OU>PWy6@S@B*H;1h! zx2Ec6hMYQ6jV$bnb$v8LY&6Mwn$ZTtmzP7z*tuTH4gixSU7UG?6_90d*BpA$ox*ND z3*+TMbWxCdQZYk$q%y1uPsI^Q;jUjProK9Yf!RWu?L7v%6z{is>s(T^Nfh)$CGpV3 z3r^tXz`0b|%!6*b)=|Y2P1pGfdu~5XmG&bt)l_mL+Q7lJXzvVpMqv9Y$rbTId>RxP zP0IV+Y&pMOj3PER*N;t8#f_H|9eK&k4an$Mi&E5q#813YPjg(Zk~8Xz@3n zF-{;KEVscqMNF;&elw{SGikjB)*p3LBX(^PHPxlD*5)jAEwSils%7?h+J>4x;#geL zigGI?PiyZ~8;GvBB&AgXX3Pb6>RKP8<|sYas@YNIYgSO;D8Y6}X;l$pOCL@#mQj~s zbE8dlThX@?Sa?oW%hri^x3qfLv&J_oC23cqZV04)#TfJf!U9aqSiHPePgu$)GM@rJ z>-$xHYR3R01<#AsRIM>189SvCTKomqd!CXzN3hbJuMH-3CVFumDtZ}AsF&!AIY2-k z%rGX&j(mPvGG!JjElZd!_951?K73f8U6Q=LlveHP3Zt{C)yn#0X$oHVT9$r@114wc z&*IRu{M)4k#7>Kt1E|$39&2n-hk!um4(J1my|^o?UEQtkBEW15nvZ7XQ@?`ZMebEf zH%joN71bh?RgV+g8v5Vx#5r@Jz&0a_*0b1Bd*qU+J(uid4N_UFgz#b_@)+95rB#YF z&Q)r`Fbvx4#voRAG(uM^jp#cXY%%Z1%-vRd1g22z1ElF(6}qMj$T_fD9wntJJxY;m zOGdh%e!*q%SkGhX_K|un9zF$2jAR$4cyyPJLUT56^GW_?!(9E=uo0tKB=Dpl3KlaV z3*ujny(zV57VQ{F`ibwKD>%EB(#bxGLXh@^2<%6QDj^M`t)=iN&kq286mx~>`E4C zJ7CKKwik(nP7?ECkS{7jLxiaA1$`ae%KF3tr!WtILN%F^FZ|$n`uKcth*AV<31S6= zk-1Ag$#%RfsH{|#OvLOQD&Z;960xz`4eeVc-sM`BNi{QhI*e(L_1cG@tB&`372tz1uDZs6JN4CD#saRTJ`ADd+4>PiknR`jR1HWPl&tXF1^kgO-LKM z2`>ZUgd=1E9>y=#m-S(Is%q8VKNwgYvR@{)|XGE4~n>O3ehL&U>) z<~Kn6{_sWaJl{2%hQ&0ks=fEQ$#-#xJ%$bAX*-It-JVaR+Ao8Xk9pmWJu=*EUDoRT z;E5at0hySgd0N~3*eM5Y3-Y8pAFZTq%%jo_Z=i|a7GQ0Lu8JKr z*iudCm$DntxtFpksA{%QdNx9Sa01M-*O?u+}?rGnYRF$*9ZJ;6jl zGmw53Adh`HCx4=+tn3i;1nz_}Pu!XE_B-5tOIwpXw8H~sck}I}b|!=Tm}-J#p*gz? z?T|TFb`XP$Gfd!wzK)E>6+B49=Fq06%1`IA(cDFJ}Ir%KL%TryWU0 zf$9mhK!;oPYSsD1HWJL1L6&7Mx02-BCEwC`^MX8mmgSe@LI&laA!yZoouZcZD!?}L zDwJA(Oqf*4XByKai1s2`b3LU96#DYEd@*+!kQf)Q7OQF*IBN;uZXH@UT?8c!1IHVd zcje_-Ld?VJW#o#NH=S1x3UHFi+B_T1fgtdv9ak8&KsJMCokkk~>J}MR(v@6>rF7&S+BB1E;IrDii>B`M@#hROuhv=Yp8!Z16J&%; zck($p7O_@!Bq%F9ML-n1&Mr?0cfLm~gT;}^>SiEoYv&kZLKf&C5oJBnpw2W!gLZxP z?b0!BY9ha=Rf7l+@o+TRfHHK*S-8y6_a*J#OoLLDynd{B{8$YD#zJUP8fV zJ2|e(u70sz&01R5+~P)&JJP0=$q~ixtnsUrUHG*u!%6eU;CVDYTYlIuKi$z$Z0)lNoGgO%?CRekyW-GfqBf z;RE1Ck~n{@)R(9PlmzpQSy7`pzG5E2KD^55liE9yf)^>{y0(-RAA{{K1NsA%rfd$I z`cB(v`MQUudIGG@`8UbKa;heTb9q`z>h`uGqzgu>9U7;u6%SGDbgdXbLKYlUlmqmr z6dOzSL??=~riofKu0TQPE_(Oq68)}(;90lI!6YR)tBf(Zp=AHnak6RV@c7^X&4THE zYB{dSPm1cMo71SoR%zMD$GC-IEjs)Rs9xVMAU(q?1IG=|g#{{sE@fq;VQo z+9L+}G?1lm4La#ryXI(QrshRRMqdcBQ7Qgl?}=d}N=Ns!53ykY&C}`$c>7ed?nPUA zEarhlv+pC`96tna;Gzd*-*+G26`&f;RC>C-IuXIhr zA(IbI$Wp4L&_`JFHS=4&cfpl>Jf}f>H}r?Oj!0SS+`y@AzUazVNuQTouZrPJg2Iww z=G5MepwHG!*(N{(R>`YZ)Qw#9M#=dMm44X}&H#W`dpVC+6bWxZF)s2Iv+YRC&=S7c zI>3fcX(`XmlV~V2zMT1!2E~Cmkci%;qQG-f-=$RpZ%y2N-tKH`+T(H4@sn(BRC!Jc zUxsjDbuqx=&I|aC?T3>s=F^Y$PyT-Z^FR#05+=)0ax8AwPHrG0KokZkm=sBMB2WEP zE99^&C`w%^gOdAeE4-3|f=|3*phAwZLPywSvn?mnA9ZeIp&JrJv-q2f&8eJF>%>eP)uhv6=VoXx8j0ac_H2!%f6&HNQY8*r=|7d&w5Z4 zB7D6xRJui&iT)@DU0|p-flyv0u367ysX<{dFUp6_Ur6X-mYoO+=?Y!tfJ-WZ$}a16 zXA$phpk5ch2BT+>9s~OJ8`!V^&_RP4S0R+*PpBtZOD;=8cwvj`l!ZPmmvWQsB-d1< z>`Mx2BZ7cWWdRdeDk`Lk2rQT>ViwzgxoG~Awqm98;Cq4)8Ay?agk^D`jR94z3W&xy zCR)aMMq^nH&@yfc1TkpRaN*My6f)*_?%cU&kM6yC_F(VXv%BAW_UhHEPoF-62M=Cu zx#flp8%8o}J%6i@gS*ng{FnJ5>4Dt9PcGfCru-N z+4hb;;z@;c$2r;!O!z`ni%Q28@jWB19WJXwbj`1N}Z=Q2zn3JaFicp<_mj z96M^%*ioa$j~+8=<%z4VwDRf`CvLRf`nznq{SI4iyWd_vKmN$0fBT!`eslCO{rdKk z*ibo`gkurj0fi!FNgKgXJ*h;6Ne@DZ6GhKfm6R@87kMRf6^MOPg%$O~wwnt+C4 z7AULD283#ftc9KRZ}nDAqDgAWyr}hnOvNHJ)MG`Jr2kA!j6w)lqG1fUyuaQaT18W! z?b*kzv=oJH(h_- zKW1Ei$F2W*?EVKIzVAQJ{_ly`XT9?JYp*@_*ki+n4#h3~Q3zUKNsuV17}!!P3yiF$ zpq!*wRT`Zj4QeT~iU`y#Vx}Y#W6c&6^t!@=_T{GqT|5Z#q^<}70d2NK!)j1vIhB+H zkR=TQO+dOJE5?Cx31pMLWSF9IiwfWV_P2)&8S?wz{`QdvAAI?x7hjt->(y7-UwQS_ zS4dxf{q+w&_~6q|KmFvBPd@wX^Dn>rYC-BYe*xwPA9OHm1%+TMhi*}jSRNrJ??U6k zK<}#I5ESa^xUE99fUC+rfJ=*JE%IbCP&AHEZWr8vrjnG&DJjS`#4X2=Pbu#d53K3h zr3X#A6%c7FV^nXkO` z@|&-{_QtEPk$T}((zoAw`{R#4=JU+<`RAYe&+_~Q3uG^SvggmA|HuOmGFgge2@DJJ zE8i@wW-Dm2@foD@Z)N`aTO zNFOqqmWfaz#E65KDfKuNsImz0=|WEGmCa11XX~CdO?MkN9gt45y}Na1*Q^yWaV5eC)B0KK^*#e1?bx3=3}KZ)vDVmtKAK z)k6+E=sVy34jjyCuUkx#CQR)TG>9A-l4I>Wvl5zk+IK87< zsRR$DOok+_NFj}ayuLkquDa4nTWz-4K6~x;%RTn|pR3= z{TV>d;WX!2G}M4GRft&VXH9{^YOAbzc0H)OZOp8|KvKY z`;427>~)v_owJ9`yC!K>n7q6{1=xrz&(eQ_)p-$_QQLlgC5=_az;B#J^BVvs?l zLih{na(kJsuzhR>&pKG4*mZ zLEVbk#*Y7skhkxB?|TGUvOz1djqN-rlnu8Cu!(Oai(&fr>$l3piM#B)^Kr)?ch*^F z-F4SpAAInE8!P;7MvD~j<(FRCcb|QsAuCTA9u;k=LX5+7Gc9eRFyLKSX_wBO`}OWKbl{+g<5%2f%PkK% z@W8+R<PI0&E8EIxs3=4Tkf%j~J}X;* zO-0E_7-(B5=$R^MmM%6__6hiGY-msj6V281IW#PQGe{R8EQftTQBbi+wy_9URJ?(w z<(FT6yY04{GG+U%x87>iRafOpBtWb`LX0Sw_D7uaQ@>NEPF=fo8$4+6W}9wy(n%+A z0%h*pxn)0{6JyG}dGnrl;t4S7Y3OD+Qz2-TiaZslrCa?RbTLc3AupUw)`)6b72wtA zVx10E#}+hRhCl+r5QSPLM+m&}GP`!^y7?xXUUu;%vtE8_&Yaot?7lV;zvtBLkC2&WpPmSsUe{#2@EARlm(^Oi&y?I$=R)Q=N{d= zvyf)()mGnc?|rVj`kIeE{4kj62vEqUo6qwV(=Tc`4Fm8cvx=vJf(r@DH!9**staz^ zm8Fl$l&YLBq+zHi`%>%DT&liWrE(C#f)82tC@NII*o_pqrCmv@7%lPr*i4*H=B@KW&WvLW$H?{<=Syas7-& zOKDPa{(>*Q_~OYYpWJ1~od^fiqd$8Xbb(VC!dF1!#Ejx#vMcyd{~{LK?+Z5h2MzM@17AD%y(kPOD@I)pDw$y@0Hu znKiIgEC&M=me7{NIK^TH@&rt&T&qoKNtbngP&nA6A-sb`8*H$_efQnxznGl6oBzx+ z&;0ynKjUl8lxb~1jQLjjTY{gFghnVLEcqfvysb9h;-0(j$&U@8;lmF-w9S@V#WZve zo~RfhmfC7C2}5^+Le(l6(WqR%5M8{Mq)V-u>S*YfeNsg><&GDEcrdd=<+bv1JXvG8 zAwy3&>Hj|d;KKz3g68wVhn9^WOZ*ps({^|L`;HYxjcyOG*ETneKGe7`7P&r>boi(j?W%K!xNABP2XOEEN&H%=m^w={Mh&C!rL17LPGf)Wc@@be=8t7BA zq6|{Y!K7T<;J@hBVy=?F@VCGHEi;qxq|*Xcb6#=z<)cT9V)19emnPT~;}QbBWat-( z!UzSE2rl*I3@7WYv(BwI-)u%Z8x%&er{TkfhQ4y8`BG_1AytnMu*|yBB9tmOT*w4W z9R;a0bf*I2E!B5iX#YwW7zKufYgrFvG9Fkm%7qMf-u`cgLZP99pZh#Sh;d7=+$JB9 zPe1u|$L*)EZ~{jPseBG8|lhd8}SqL<=q$?tqXlQ~#Dhds2Ltaj;d^Tm3fY7FC;t2R)G1RL zzzGkFoI11wggBCo_>}l#!GSF0{-OrAw37$stv+cImu1DHn(bOiX7qUIp@+8KVoQk) zrBTx4?5JqCo&td_XualaKHV6-^9^b!m3h%>9zK{#p<0w>WHM8of!<`@G-^WelPtRV`Mhvd-ZvZ|m4)ivgWNXYq zcX5QYAetJ&a$Nis`t!W$fnj{EOXo|K`%rUqGSwLlBk;NprYXu}I-1 zmShoBSzHhlRzpKUA!#NJ0|IKcEGjJLATUa$m{k_BvG$c@S}ZjxG=y;$iz)}~Q@sk- zVDZ3Q!B@dLnSlcb{^c)!VOmMQp(1?v!H3f?xM2C=!wa503~1=6ld)lG0i;$k$w?N2 zk;9k2;?hflE(O^yzxd+5d+*(7!wu=7kW^d+G{mj!fHsnC^L5BsIKyRDQJwnure4mC zf+h(aEouoNpjYd5j(UDCD@isD2R#kT%!+6D4bZ1Y&tL7m4|iQ~fgziZ1m#mv0*!Fe z7tNhB=Yq4(>EF8#ol(YF!2(WYHIS)JE?T5W!oXM)nW)kW5f250%=QZqd4Z0Gha66z z>bqQu4W;LrGE=(uuDkc_)}4xtiVbxdQf)MJ3jUJ|5!Z=^rHAM z{%|-TI&Dck_w(5&9Qzv>>ZX5luA?^(Udyd*xLNzH)25WOEC(K z+n!{(73#^77^s)EM`$yQv;0z7{AgC7W;vxGQ$b3#iVDfP>L;kHXj6k!LCtc6#USX* zc?k+K1b{Vl>eR;{f1IzOd>?}p{iBaQ`lBEH2uoWL@X>^#upsyZMp?$S(eTFWXRI_~ zLUi8H6k-r$ZZXCJ4$4xQsL-+xIj&MF4KxL_dXXS+ zMDJd`5B$~s+yKpAT<9+`6dLMh*RuxDeDdK(+!T~0n)F1t7Emvl1w(qjHK{^6XwZPI zw%l^hz4qGRM?dV_r#F4ZhPuURNFNSA;E>Ng{#5a&g7zALuiJjRxbucNG*qSK@7{W;g+eet7*v8};ZOCJgCZB4DV_cK=Pow%G;|1zV^eLqg@gcAjm<{uWMZc+ z$G+4F(o|*4wNwt4kf&W$#>EvQMUYjqih|M*OYp>#Ah_GitQTMU%H8@bCC&mX@4oZy z^;cfC+NzTn)umRFeO3d2$R^ju^y=Aj_n+?e!2S2X_x^j+&OU2}F=LsNmgO-44Fw;` zz>N;~=-y+mpX~nOdmom4#}XN#A@^LZhlYZrf@#1(myOqp@^T8&O+bUO3L?WA(FAEK zgBF64Ze+D0@t~y9EU1!B04G_cTS5tFEX6b=v;fMXo0^Fe^`=6ZbKecEk|hY^vP#kC zKv0VoC*)p>R6Lq(yoEK9H?%CZrC9W<+ zL>@D8)M1AndjEg^!;NZLtI4O74=vH+=bwH4{yXn7-EsCAe_LbH+n9Q1TJMrzd z*ygP_-wwWLLAFS2n1wm%Nmgm9UZ+MQA$|gsH4Z?QnpOLt)Y4Eel*6MePPM4sLQv$C z7*IK=0x(hzT~H^Ugb`oN@}!)h$TFB!Dcc0y&97G_}Nr{xXeZ)AeW;Dh1=lD$y?uSC#5i zRZd65K3*v*;3KWfL8TZT8bw3=Kr{z6eFz24+q4l^{ShIhM6c7_9+An_ykW`L{qLQp;9daW#Cil!Y_4_6q0naHp$Y8nk8oyO%NEm zAJu*fzMGomhc{;r*IjpA#z|or5h9ccxF%VpPqI{sRG-R0Q5L76KX15_#D?OZPHG?O z6k+kTs?G=M62e zYLJuhV3re$Ke4fzg0hB$VqctwppeT3Wk)VvG0QRlUyx0i9hFE>(|iIdE{$1$!T@=3 zwrowQMObW5x<|KY#71yt?GI5; zwG_So{`;q%dMeB6lx0>BOo+zH)&|*K5@;CO2pYPX(v>DS8j5FWy-{fmm@866A&8Jf zmEa^Gmt=A7ucRoBPFFA4gm{a%B{#AzW10&CFWEGtJZd8TBOr@&)%|s6 z^r+#dJ^3sAatgncmv@|l0*_& z$w|yvASO$z(kzw`lov%z2RJ%+?!3=F`*0^x{XVJ?d_6VG_mp!nKls597;`N37=Hrf z>}42a)pJbp*wF_oPg1=X+lUeqEsi6Ri!H~yvg`n*gPF=RF7#>_Ls4m z4V9#}j8WQU(<=H(zLbhFA7O;3q%@gIE0G=yx!cG@snk`s$+|fjff@z~_#t%~vx&wb zOh_FU2~3q-s8zNC^a;)qmX*fKK^-M2@J?J6Ha|fM;MV#6TGwB5?I+w7+-!VDF1hf6 z6~~R`uyB6R#)B${lcXj#oU+xAEe(z1k|;FfdP5w_CZ2`4f+REurp4&SXnp}q{A`Js zbSNVa9b7HIBu;E9w9-;bLs6pPVnbe?DFqA(xK| zOPbhHszkLs;NttLMVHT0S8Td>_6vC21E4#*xUWlB)+SjdIwuK40>s{6F21UwjE^Dy zVsv^v7t#0XN-I3lw@Xw@&iavd?MARq3h5%+imT2M2T=+HX;*BNi4<{JeY|(YiTF{2 zs<>v21(&3%3;?PIiysZ`c|+uh6IZ_Ks;k`dk`lj8OW(|d#I=Wi``h1m?h>>T2qsY| zM9ZgMR;kpLv_)ws$OAVjsEkG_W=mC>6l|4bX{2e@n%jxnkWgjEuXtm4N2H1fq81dy zCgERzx7+{-X3GafXt0QoN}KLCxYq z*B}h?9CT5e+kDvP`hqBki_aB0X?p2!w+ zPz7husWU~SqC|s`x(fuONDwpsSYB7lIgijuR=r{0r6c(3>eI+4jKhEpOAJ7a;0d?D z#SvC$+r{0D%>ofip_Q|jT8=(t)Dr_u1zsi#*StLhjPEehr;FntJ2(c5E{(w|dbJck z;*+#b*X|C@9;Q_66`wa$eqn)2zAXnt}<^th0w%yvx@w92!Cj#hktnl)9m03@23$0vg?{9$CEw z`XHoGz5M zg8m4DTw5^*J#AcqCUwJD&=!bf_go-Gu?5@)O+r{i#Z4TjZoRol)CeVB@ikRy#P2wA%di} z(Gcj+ZDF4yUAy*ZoZvU)E`E1raUY~e2q-8dg+8KjrOwzrc*60^?4lu6!Qn(gLXT7; zEEJSF7{%2k>--RiG2bNNn28E0Qg~5cLNhcjSo277Jn}n&>}2I!p`>KHc7k`ZJDV;Y zy`@jR+(l3b*Jw`YCNB+R_yTK0NtSkdaoaRcI#Ei%==#&i?Y-FjebuPtDt3imWi%A@ zDE_Pv6-fZ-X$ZoUbi{Wq>uIRelPWf)NV0-LAt`eOE-LKSJxMx@1&GO_sx%r2iqNlH z583;6T@3HcCO~vtTxzM+S6lt&oBlE1Usb`^T)*i>u=w%EA9HIOzEzf7NjaZ-S*6ww z{cNF`Qh=fmq(!A30;9Lh1~}6qs~2Tzk(f!5@Fge3SV~n8f@l@ZVi3vkyrqls;`5I{ z)Kkwju63;tG19AqgQT+S${7l^IjKull_FaRwr&Sj+qP-n&I)9q1~6iWSt>XfIf_M_ zLt7jMiV&B$zZ43vypz(RPyw7nWEA{4H?rxuLK;G*B7$zN^%#y;X8asCdd$(kKJwY8 zp5}(V!IwgR7hZbd1rx@(HKnOnQp8Y-{z}wFhKm!sb?Q=WYzS-E9l<(8v$CQgg^6}o zy|ef8nE?>hz$4PZQAx@Rmr@}JvJ-sMG!bPDH^od+&n8DzK^OuWQL3PpqLI|u`)9#} zA(+G2nr>xjP*1c zq0mDa0QK%1O`;-~VmJC`;y6KAoDxMwfuv}lk_h0>*NP`aJrG?t3{@3>z>cQXgE&Fs zrbf}HEr7B3gIt0|iRBy=Gm zUw^qXn||w41sNh%i%#b~dx3R%3%*GqMA*g`af5#pazH%E?mlfj>qAG%yo z(yw2?p?>2w1!KmH;hGfE5hF$n8#ZjnkRkp1_3zn(a|K-(Y-0zRf7NqRpbjIy>cs_F z1X3vyS+fYj7lw3(EPiwH&T^AIo}_Xi464JYt1+TsaM4ub5E4uRBdq+XyQttFkIP%JTK%qJw=Y~xMt zzT-}AYRdOQw}6Rcg@zn?Y6(>>l>(XfMa?`7x2<-j)HQ(PjoGGQoA8uh^)OBZm$d!Y8(O_ntjEclRiC5bW8hYj=Ry85DAd0#?^BN9u7L0}lVL zMIY-amMAQvpeJ0)N;;Z1Zs@S(1`Qe3Z@{45ec@DJ9~CCq*FXsRR$M%&5L7|&v3Ll~ zXYxYe3*-OVYp;FVZMX4#R}>;V_uO+2Km2g&9cgrAP=RHrS6p!g;|cJ>At{VYZu#I# zEfpu?vxR7=1QbEIqoCo7&%g^l7=*Xqe)}VjJo3yl&%E=_JMX#Y9_~?~7iPZr;)@SF z@W36n-9GK?bB;LlFfMIdZSv&d%MEAb;dw*+l2;Hw2R5>#1QfzAn>r$uZ@xw;k-D14 ziR_G%jNx2Lz&Cp14L1DQ9($g0^2yg;do5k1Z?C`px;&BOz4zYx-^~9$_@Db(6Y|$n zPup+reK!2zkGNR@6?^yU#Z;IhRP0?kLQVxKA*&OT${m4@o5ShWovmB9Zrw%b+7-_O z2Mlz3ybT&SsDHnH4#eKIgo?CF>jYW6kP*v|*m$FjjymGkoX+MYaD@4JCLht4Uw-+7 z6HeekD*QO$Q^(=v@cgDHR5dp1pu6@50c5gN6)XAINyS+~6S$kJ@cK zu+c6W27KzSveL@j*5>WE-sZ-q^1YCcy0lKJS%k|ja_0@{zW^mQ1z6~njL5uM{A8+j z6^%Hjw+@JLn8wRws9bUMm<`umk7qxfaMaN^U32Y2_ulu=f9`+d%{RXEw;^7vF!qr{hK(AEFqDzpVKISA91{KY>)vD7puxo8>#z3xJ*VvS zr{jKi)795Lc=tU|%>3{B@4e5@^Vzd!zx2{ek3ID89sj)L+&`aw*gpGhwZX=#jGr)K z=yD9#%y7D}F7BT86G2*}Y1x4hu^1n@aid1BHEFe-xB2mJe|^-9E3f{~J@?L>IWzj@ zKW{!?jYsc);DNjEIs5d#9=-1YQ#RQGN{$9Zz55cE5zx^hu7HkGQnRA8dW!5$5fmHT zr|;-t!&eB9}7<3@W=C3IQb4on~WuGb;?NKr|_UY4yh;NH6w%`WlPdxEN zu)c^_J@2b|>|cG!AAji?{a~1MySpeGgXf=nj^6IG_dfjI0H(=pg|XvS95-I}3FB9g zeTDHZ{E>|gF!X^7>6MU3d4vE58N(UC`OUxjq{)XKbnuNg+`!zm>q|Uni%ciyeMNWK z=ecJ+$c~ZkEhEouxBTnyLk{I4f)UFNXMkn6hRZY|txKv+^Gkm8h>_A^e#5W0!iplV zzUri1r|$66op%1|4m;_-%l1y!{!6V~8 zubN2Vr@Q{-sVAT0ZI!lyrjywlufKMS%{L=xU15*D^KL-0qLZPs}Q+Bhc#B6wC$#w^PH()?!4RH zJGmXcXU%MleUyUO?9oVn`_z|PF z-gwhLpZv$i9({~4N4sZVfqbFd_sQ+eE4w)ScQoiiV6ft z`K&Uw1EBR*o_xSwzxdCccgcY%9Vq{8Eo)RVbZGv3Zhm{oIp=|`Nn=(R*t<{i8A%F3 zzlb!%Uj#?`(4!Z@zk;Ook*pPw$hd*5J&O7hW zHy?q+PVBSch8yzR{?J1Y{q$4!{I!Z3QPR~{U(MJet7wv>6Rsuo`5H?@V%Z@BTb70} zkzs1UfB_RHP9*wx_uY5(11SP2Lo_e;-FM#MYx4Xv&pz|yQ!l>o;+t>234{2ax)I4> zsN!+UGJsti`G5ZNpZuT|2H6x!u|p6BaDG?sy3@{trEX5oY;=`ike}8cee@C2;4eJ? z0_VS;d-@r={ow~6@QlCc#%0*~%~hShfJd?4_3u0O{`oH${rdIo%Nr^{^gwo90FeyH zYp?nJJ8r#=7C9Pp)ij$Tmi+rdvhMHv1?QhTjiB3yhHmvIq~M3{FLvMKk%u3afn9uw zeN;)z$SgUd29iyPk%8mBDZ z_z*H@%bWvqt?XcTaNmA}HV6D-Z=$d-X3ud>d?i;mtS#Qn3-JRKT8z2d-i7B*TYHT) zc{Y~oc9&>I6o|6}Uyd*V-I(FaufNW^)6O{a!%seTO?a9l`zb!P?-;ng_%4ZX-|ct& za+jZuTYdzjkcdw>Xre#DMt41h$6|DrkonaCJ$sEGy8M>wZ+O~?|M%k4&z4?HeDtJI zj<7pFHFxfpbLNur4Rxs>QtVeuIu?vF^X7hW>dB|@N(o)_!IvzxD73PrA+e!m5f)Jb z5>F+2E+|CL=`R+*d{X}OZANuK(6wt<3|3!#bq3_*C&y~yPtE*SUU`LU4_ToK!h~@= zR-TIpkaa`Dt^`zlmLMUUq@ISApKq9q4RNlaAF>S(RmOnB!UWw9*IoC5Y3K1dwBHMn z=gyh?=4-FtcJnQ#{prsK?Dwl5Z@tZWKls7AYpuQIW}E+fk3Iiz{0Y}xbv1D00NTM^ z{S*;6nA9cqd2QA!Gp@akN4hgEDF@xU6u)r*`Nhis{;PfVed+lZlFb1rCi)({=ice( zoO|q%NA0oOPdC|kll9mA0apqTN*s6OQP*5{#nVqb!COyV8kNoV@ReD!PC4oS)|k8+ z$E3Z3pgVQQ=5W}q?a(2Eezx0BF1m2~eRto(jk5V+FJD{ySSMMsm`ywDY))UoBis_< zju|#TOZizWVA5zjIWgkUw}uCW|xIOCoJLkhgvL)tj?k{rzu_V=j>i zS#aheLw}#rA~eJ^KmK{U!6<}c^7;F#PCEI7-+la%n*rchv6sC@{}xC;rNDPIwu%4R zD)j%~x8AzNMjI3R@OUaYDM?$r^;5Un=F;;oxcj!-ndsnhsyVag0ADw~;9Dtg*}8PH zG{x^LrV*HfCGdnzlU7{mu>B8w{>i7fxq4IqI{_j>BumxUq0>8!`zyNWkITI9%(MIM zwkMOcyp;}rvhveMivxT2-Eg(Fh*f!Cr5>qy2UQme*q9bdrJsNH8FLyxSatP*J$uX9 zK+Ys00AD#XNaW~FFUD6-pdZ?=|CZ~lfBv6NXR=yfMdZ=9!RKuDoH^Xm;pJzZn|bHG zcV2hX9oOD?$8|T{dHs$5zIMi4x7_md%$fXx{p{1v_)>q#jFf)`E}iGzdN;|lV8J_Y zzjN&VhYlSugcji)@ap6HkYrz=5&WT)piikMStX$8eYR)cu04}X`Q~eqC=?D#$`G{U zjypc~*kkUkkKcTRTW`H}{q@&ptN`6iqG`IJ9C{nS$ot-7f&!S!FP}r+^^J(JX0}cecjE#Qc)Q5^3y=9mA&Ue4ly;CPv zXn@zF4?Fyl=@-s?8JeZoj2YROMmFyYjS(E zl}1C}i+|sK`!T;hlHlmZYp!KH{1mMF1MUZy)YhDmQfTa5knE2=@ZeMahfV1ShhA~!-o;No{D9vT4?pzK%!eO&JZ=B)Bahzt&ztxD z+0VI-iT9Cr1R&zQ>)Ez!_*iU~v^_i!ial?CjXqePxoRnx{&TK~3IWDXq zW{=-idExHJxc_d`H`)rESY)cXPtTs5w-5Ls!c97Isr(lAyosx(aU8cs3tOUgRE%P+s2vCF>W%&HxK{PB9TH7r+KZM7LQ zW<(!`_~6?r`i`I^Jmef1pb&(CJc$hvWK$YO`NSV(Us9-wh7Hh2O}CT+X@tNY7f{2C$?Mz zzOm<@fBx{p4qtxw^6p-H-UBaLorut?t^271z6bX0_shM0cHe#XF+%umM*S?w^B3@= zl-IJ(+Us=g)P;)^-DBR}P0rf8$xV*yQcL59joB&!NrqFN9!TFxuQnmc%O^emoO9jz zJO31TmUg`J=35dYFjUYF>54P<6{4PbZ=Zbd(RpW{#mY$*Y_Wi3;~#Bs#36^?cgLN~ z7e&<)jfw(K^zDiNKF%*64uy-*91U49(q*kR)>?b=nrpAV#=2{`ly!YOZa?+@d+%e+ z^zBC;ktHiB+S_ivd57(`+U0XnFgE1*h8Ry6 zH~zfS&iKO5htoQggc{7)Kg4axulW1LXPy0jzd7#6gAO|8po7o&!%5d&bn)Z&-uKbl z?*JM%bjIIYE67XI7s8=?^r45h+j6T;T+#>){el_dME9G4_nQy9pON4+=uf8XaK=f0 ze0|m{;vqkEG#oKw_}4Wvp8emGpM3nW1G*1>>7?tY{SbI3-kJO0KmYVId+oFfEC9QNX6vlB`Xzrm zhmL^^SLv&HQ17$PKb`r=!~eMA@8_TL=MxS-^w@(BIrmS0{>NokJbdqce8FdbF;~2~ zm*Znq*J5%*H*fwG(=X!uX}8Xudw1+&FNly^#IUdjP)-~@_S6$k;#E+?c3pp85f9#a z)pa{=zBS8WI{OQb`1t|Hh2}bC-K~A+j?1>|-oDeg)^mXxy+y_`bZ=Cdb|NXso--87n z%Y4r*!PUAVa3tX?OEMf~Te~=pCn^%qO`bIQl1nZjX2Fkc&a>Y{kd)IOmtS%z5f&jB zxRKuy&TULFaZ5^Af!WhfJn7atddlKKHykr-N>ItE88;mrUxdiJ8DBgYEe$2_COo+$ zaoJ@VqBr{CkN$DP4SdDim)5^(NyRfVKVzSM;;G$t+_`t}KFcn%wEyDLJ2%4#%h(V& zGQ8NbDO=_c}BxdKj3EHL4a^YUPjxJKemHDu=;)SqE^QIX$ z@R62olpm9*1(X*}n>K3raDIE}6QzUCw)4DfD?TBhkQUu48b4Q>Ps6A=-sLa8+I^cT z8?CqgqxaoUyyx`H6m!q~haUd@QO8W(X4~&inml^B5rg{-VAyQEOzXDGwC>Zj=g1+$ z*P67(c3W@DL#$q#HH*1TcU1i=aYMcN9C~f^u_Qpd{_1OZ;mkxZEVC|!`@QgWW@!pv z6UJwLH}XOtBWpo_xyPOyOsSrd`p+jV5&nFCl}RTb^&3u}3Y(Z4WS0AetFQU>-urL! zqm3tzUvbQ!VYJ03mTwuWH&-4pX4AFTJ9M94-Tu#;xfPxRzZ?$S$*YJu?fy`LZtmxw z-!bDKYpl3Z_YR%5`q4)Gj1i(?|HYSIJoo%_=bv)w9@|dcaJBERILxg!;Z^V@MHn}H z1l^mm>6RCrb|$|_wVkL1=iN1FQ+$3tckciF_Qa8chek_Gxpcx`is-U_-Ofs*$Dei5 zpIj8|tCw}#yZ-Ql56?T}%oRtD2H%c=eufk1xK%gt>QH1*B`M79-o7KC+;@jvUw`Rk zj-fl4{%9b)@c0wEY`%5>?!B3dj_f_-6oQt3R)&TEj&@~NAm(T&S|r#PbQ0=`#sknL z`aR|PottmIS>AC?-+BA(!wx%)4?mWS3}TEhdGchYK%+x1A3u2;v}XKi;bY56{_VEg zjv<}Tws;T%5+t$(G<2%MTa`47?%IuedZMWaXhg{@8DDCC8M>FkC?Nwy{JMC_Y@C~8 z40ApABm@K0brYEWzH0Kdav^YBDhAlBx!UU2U42ckDg%eHd*9}~dHi5LX#WG2bwQRp zXbx2|2cx!tS?kvHfuAK@A0gGnPn3EUOR}d8D z@$u%Cn{LMKR`ffITOEO--p*e@EO5-BhxO>u{d?d0E>2pxD-${4*PgSP?yrj#-NuJ! zgY|zH)k^!LM}XK6Dy_N38cZd*ru~p7O%pCVGZOdL95IJVX!z0eY3Gd@?P$oEI9@VB z-#&f0EP|hHX>FEt#Clg;dKt*(*vd>PC(5F|Ef)+jjp?%7cY)Qa+>(ORUfKcI6*}W~ z=TNej_`7!Ft)p8m8oMeJAfTHah5NL~`^c{v$e2&VQjfoyck#LBz4H7EE^_flgX!x- zez^~454nhipRIhj`C-HHm({AyIoDMBHM)E(xqe~$O}1cRryLn~Jn>`tFAcfZ<+nFp zef8KQe(gH!@y9^Tj*MGqNT0bd#Dy&#I*u4I;-yzJ!$W_d+)o#X$<+bxza2fQ1CHNt z?RC3P*>S>%Q7o!y*UHWO^J|1?)GZD5p514uRco@}UwM@?{&33Mue>IQTzr;}Ow{#= z3U9pr`YFeqz%?dMK04Et@Pg*e=jZ5IC;xfl@2@+o|3HogCy9A~nF{FMr8_%<<2x&< zTDMtl(BPf6+UDt}pPI`|r1z}H#5s$PPvm+20+w`cxAiu>kMS8px0)20L$}<3!6zSe z!Y3c_%r808F7=fJc^Pcr4PUe+zMi_o^(LFmbQv9K0hm07ogD{FXCWE^4 zoPPE>JVk{rad>@C7tDI<={>fc!r4svAeN+hO`^r0%6P*7wB^uH;b?6ZQ5u3mMhS(W z3J`%O*UMEE`Yt0d|2BEjB)->L3rl3q9ui1K-zNL1Nc+q%+Hipwmz(kHn!36{6F!Za zMZkGgTVWc0e#3Rw>oY890y;=T2zKL(u+5fRy%&E^qtCfqVite?d1e7iOzAmM8(v7+ z#HYGKgUt8WVT@9rqTw1eR;~Q&mRs~7%SSgznM%6lmRnfG$`OMm)FyQf;}i{}=&{Eh z%l9;>tJ%-z&e>t=4h&luyOGexYj|K2hayXs?mDd}qp*zigg@Kur(EQP!<62-FSGmq z_Umu__Nb$nNMCBH@6rlB*zien2r>fm1z&58HML_o0yG>mauippvN(Z8{fOaOfBB`C zuDbk+la4*^==~2qe4qVKI_`vPulW1RFTL#g=JxrY`q+?PbdUfP(ju)h>wC=MM|}ML z`#CLA#OL#}=@)XgM1h>gc^SVgpy}16$t9b3ar+l2i6K%1%Cb(XoSP>=nH|x}y%Ud3K z`ED=uN53q84sDAR*n*xrq-Ys+6GDEG!0 zGi>-tM<2)aBd(LuhVQ%+z3`=1^IDiU{^-5;=Y0C9FapgRZ@lr#DLaqsJ%IO`7t+0} z3&9`@$lx@e+~N$S%XaPNI@7V!CTp(CiF<@4$)KToe2>VO4C9;xkQ)l2@p{t$WE}&+7)(6 zd1u!cyP{kCY*r>b`Ow2#{BQ#tQcEgAJ+Nij7rE*lDFY6Y6^#-w)j-UGunS6yWlCX3vcLbv(z`Me!*_~Cw_TS{tyE}8scWM<^ys&o7PO4X!>Z}DrdzP3H# z;kUlUkfI%Mb9XGQsbecl!`b>oCwi_M112)rb-Bzn0w)#8Kh*vwwMf zzt&h|4ZcdQiUXqC0zazpg&vkz_>I@zr%#`wjy%%c=cjzL#|@eFW?bOOut4{uE{G9_ zq`aH^?YAG$EcfBQq-aRlSisM9?E*U&rFlq^l?|V<=rPEv0EK>&=E!pOJtyy25GxL) zEo9Ruxp_p0M;>wr-&|fDxTm_qig)JlPo&nS?TA4`Osz7}I{fQjPUTVcFTC&q7EV8Z z!7Vr3#D(FUAmdUCZlu$rcds5jdlK}qdSr#M<2c3n=z|Yo1`RKob{@Cy;Pc6#N(bl$ zSI+W~-;Y1|u&ljAh7;vXzL8QWc!f1brKl%IA?@#!IPPW`4D1Y)1yzKf9GPPd zJe2e7Q77jwc=)cn*Pb+)SBEi^p8`QbKV;#TrZP1uv7SxUzzSkuH6nkL@n`#{97JGf zB~>1Yz<71`S!eUna&MB~{Ks|v)qlTo)m2udiZ>%=6lUdMRGoo(x7~Jo_0?CC9}ucL z4>F+nV#e)DFS@u_&z=$-f$&^DIumNatP0{Q-%- zTz*Q58@af^&|{QT{15}mrg{W6rmG+sMJ`A*HmgjWc;(;!?hi~UDK+YKEM&d$#v4~& zd1cmoiZ@bVg*V=gO*h>%n#(OY@c4+coJm}Jt+g2U6mTMtO1x%M=h^KJi_XkXoI*oF zn|0S&XU6q2+}m0HhDLec9P?~1KKtCRQ+9Aa55z;+l&tf~;2C!<@9$05&tT1uoO|L_ z;8BMk!7aH63^Od90%wbVDA}Artk>?V;Tl`EZZsdT7KRFtXP+rf|ekZu6 z{pQAo8WMUk5*fMm5?#7Z$#{l^^XwaQ?aJUkZ~nh-yoobG&)#$TBRYw;FvXf<3 zSu~QR7K{ISEpXO7l>pw!5<^_`?;g_*<*VjYeJ8Yg{Yzfq-bY z9d>&1vH!Xr`%h;4Mz~{B>be(Q`MmkBz543ZjkjRvc7dD6oI{}x35g03+l;9fvDh9 zS0Zp&R1jGhCn-fXn<`u4d;?{LAmf9`9%`j&QpqydZoKivk21gE-zopWapGIAy?*53 zNA&91iv2cf-G*dmKAT1H>@Uw zDQx`2(iDNitFJXj;P^Wf66<~P>At_*n_E!wYZ*uGRG{B*D;qf{FyGa=%a$8&@~7Yb z;pe;U&b{3T*Zsm!cjG(Yvg?jJzwxr0P|ev`D01cb7jdsP{4p|1q~;J~o((~kPd+rf z^`?Jt`Kt34&mNRK$DjVoFPy&exN&p`v{m(B;}oE}P?e&Tu7%B)sQ?erUN*%W(%DI;2lOJ}rO`KN2(v5R)lnMCqm| zJG&{<{@r^Xyyq{9teEAtX+Pd#D-IF09CJH$9zJmJQ3oD8>xCEPiz6M4`s)Tv_m9g+ z?z!#X8~#6a?*V2-ku~l=&+qx%T~|dM7$(6mGYmt{QG!GPL84?(vScJ9iU9!;QG$SC z0Ffj}5+q6x#0Ur?pa_yBNmkTd75KlWPIukDaV}xM{r*K!bGo{^s=B&wy?rWHslmq> ziDJ2yW?Q&}0PIw=^Fk0=PoYH;l0(vJU9Zuh{Ri~j`0)K@l}nXjiU-$Yyd;AAu3d9Kmf6ZkBhxN#iD)KXw-UandqB zX=L&so#8A?c<9ih9Xluu^>X-&x;J;u97Tra*0!G6c$nh%V6EEp4UttfTuz2Xn~KgT zakvWguy(Z?tCxKszh8{`F*^x4S(OvycQ zE=BbRJGUpZVrntTM{u5Golqc?G3m zA#}s=G_(zvq{ZBD#>6^{zd0xbh<-FgH#F8+RuqJ(RT{Fc+QiXg&YMq4emXJ|=&Fx~ z9Aiibm)?!7pMO!cL>cD&DdvQRhIipyFAWn-UtZM`Wxw0CJ8~&;Hh_j;v1Gx*uZ^F` z5EuOg*<5MfBtmje>&o~0+c#|)nHInvQ)M!b_EI`T_QEC#o1l>f9JT{Tl z1&)gsEiO^C7&@9}PqPY=^iUxcAggD9OBj+yX&N>BIWps?lu6^4_GNmD-L>R~+i=>%BFIG3SK)eYW`m{DLwrtGm$sq!6G`gWY=_^+uI7>8p z7>;hapS z(n$8NTv;^tUDk_mGsBQnzqU{~E2wqx7c6iu)ck{b_c?Olfcw@^FwQR`;Enp}^y$&h z3}*%(`k+{&8#;l7S*=`8KTI$aF|IxzK-uX;`j!iMemj(D^KqG0CQr zPoi*sJJ+tUG~&#uZxqjykFtedNSd=E$zyF<=wp-^eENtj|z@c9g@kOKgaOJ8(g$myGKQbAgYLklk z1|VoJiJFF?N6~2NxYX4hJ9Z5C5e47JhP4|gF=}|_i@F^88#oBOGNB=xJ+WH^l}vCd z=0`1PJbU`|xY46|&p{HLVg>}GVi@7?n<=Ij8!T%1>n#lKKY+R&MUaefA+F4xaFw+H z8Lnd)sVh9)}f-%va<}x0TMhlV+boNs*^8q(>jhS!o!c8(MOqm|w4M z=%rPFtkJ5cr6KKjky}d1t$7GnKi;&7@&8=z0>w`URL_93_E4HSX?yb9$jK$~;;Xq+=FcQCB~Ko)r;OI#aZ zgW2cxp@`&=3^4q=VWXW}49BHdq+m1wDJ6^?i_Z`H_t&dZT}F^9`{*|`&5Y<@;dDcb zLQ6xYNGyGSSwPoe@SO(GkbG7uU3Ssjd72w1yk<-CC)v}iGLYuSgNGmQ-X}e0G6;iE zib6#m*{~2q#;QNAu*~ezf(ydZawImYRI_8l=5;Gp&B&Eon_InTBfLGd9Q1nHv)3j3 zU!bAQgGC{T2{6hX^;C`^BhX_wYSbu(9Ge$MAC$aQ`}cm=vs*WsQ?$o0KsU69qTGpw zcn8Z$yft+yy%@pohSx_@xq6KOitXC8zWpE47YR)?Cz`7WE+MV4!SG@BWJaD;*2eTE z6fD!x6LL(c#z};Xhh$rd;0ptMX1_Cwk%z(+7l>ZLc#B7-G~{8i=^<;r$qqs0=ir|Z zMJ2i+-?Y$>->jAupXHr9cMfq0efTtOn<%)F2hrrg`VfMwKq7I?eh`tV7xpaobNfH} zG@3JWCha+18tQAKuI8U?u-tj|#88`f9$63~m;q*Wy|f zA~^6fDyIa{=1s6Evci+O^D=$j(G3qB@+IakX^NMB`Gt)PEDcpRgt?Z3DnP>u(e)eJ zmQrf_=q;(lXU`FVhPI%nIoaok#$hgro`xEd&l0L=84@ausIjQfRm+!O^T7xH1rvA# z4Vh$7p_I@Nm=c2^%nY7UmWfYHHW@`TV`kvR?y=^dBUVCd-LMI43gDnU^y1GeORt~V zunB=dM-M$%|7-J+M%BXSqtMUaaLlLvr<*>mQnDg2exYjQN96mAla+O5XnWe^3p2I}JIcX%s7!v#~_W zy)%HVQ^!vG_w5gSGlGw0IpZsv*RLyHtO%MZQQfdnkQo}LG1)mdDX)*xuv}T0eXkdK zUGk7KXU>pIk$WRSX0;RcwIgmkITL;6#0%(Gzj3M+owBy3$_ejf7MIdS~> zut9?)63YC}J9FjCIcMf9=`r;G+3SToKJjO2-jO4$BnBolX@LqcnAsCvAN9}Fg-WE( zcCjq$edgpT^F^acImv0F)@91-gcrxs<;Q4z@<9B!7-pr(1!0Wm-mkGzF0~f5uGc6H zRV&0_nJ0qL6Y*Dg(O8O+1zzy5x?#kALy~4^5UU$XRAyLd017$$@6ym)M9^?ZmmW-g zvg%$)CI+7cH_YQx8tUlKtaoR*uUt9l7mjFtzx=D0hQLV3Wm`&(stC67rKFC2d{~5- z^e$-TWj{f(LAEm`prxUr&}r>d8rE;H^UEzHC$FXNtu$;g#KG^<#f$UanN>PpVbW6k z324GMklIrOb3z(==1oqSIO;`4<3zYSPALt!HN706c%dRwCr4AItR(f}G-4mvc{p2^#9FI2G5^r^4g!M%}Qm@70){nD>z4{9wU`Cp>p@4vI4 zRsKt@#`N!462k?h5_v(0-he_Zw@Ke+ z=SSMH)-=@%KU~d&*VUx);lqPD2*sH9cgG#1i{U}zM$iqt@i3;8Rc)1eN<-+6SHN_$`%`6LqivQQa+jnu9nrcYs@xfFTzs!3c+qj2SJo~ zPOE7cEGFd;<1t#=>iChPW#Qb21{$_(+RRJCjMOyNi#WFbfaJ}2gyvUdawwTs zZ&hy14~f;=*sgKro73vvSG{!J0(oQ$MKc-1%rR81!9k@V5JU!EDXszt^5`oR*PU7j z?-ZcPaZFKk<{Mfj+F;i!Fx1xC{}v6s`k*CUNWrqkp2Y{53ike*_p|La>$W@3);yHU zzyCIE+O#4?ig0Vpp^#}5?g&z^peRIT5akZGq8?_wr*r!b^d3fhQ_M+-``49iTemXL zJ$e>WAzPz2rH9e#hT&_2Gm2EyI@4vy5wqqA5EtDj8d^$~hLF@t zLn7qR+W&-ZNaVID6*+QCsTLgNPXo)q&fTfsP-FFSFYm(1z$N(94bspMP<2B~Mwf=Y z0w1t@Y(L@XePi?;%ZEZkFY+w=5b(E4&^RdcCl@rNN5Hg{${XaohQ7B`Qss!XZr+VM2#LqcH}vt&KW0Hsc2VvugAnp2=bkX?1r#^;ZbJWMEr?bRHKk;@97`)J zX*H@@XT$Q9boUGE^ateTlVgfSGEc>*IW`gF#bSd8_U&h%wLa}SS1VeI{gH`~{#i1k zXfy4iGOZqpSuGFV<&M)y`abGO0BLt6m>&%z;7>8<21p`KS9YT1(4r9Gf0KqfTE=Y- zmhZ! z3hI(>MxM-DN}1fs7b;$UKb`}nVce{ zXkL5mH)cyYMvBIh)>U@9cz5pH0(mpEh!W%CUYj_P0ZyJUAw(jZGWJF0GlE?OqUKQZ z9Le=E(?y}i01$b^#flbXhbHa*@Xu;sHhwyJiV6W3SsH>fn$rWr1s#)lHgM!KN!vfU zDnLoZUy$dq5X7{LI@oe)Cs2mZx^POmU_Hjcq9z2Jw87JhNadIM zU%w^@{(xWz4k`rG;*;{^$Z73=j)t&L@#jrKQHX0W6`F&V9agYR!v~qmiIb%`zy9hg zcJksu*hfI~#nh=&^XJb`()KEb$*=}~DC_hdiVCT{hgt7or@w<{z_Z5bb-iz?`tRSr zzjTR`d~a*UG{Zz?b8fK};A1ISQ=?diun%FTrTZrzfky**Jgh+_R5Ak(iK3frwIP z#=uZ$!6CgqTI{oB_lJVg+UX7)rTSGH072Mct)Ai#GO9swK!%RA-ZWRq-BIR7Ae7Q9rEDJ6cug~w! zm{Lo_fU%%DcV21O$9rK&85$NVT!hqv3F!6lq0r#Z=`l28S~$fhnx^y{ZjpY&2*#yh zQD|t9hY)N*UO)hR)DwUD4Wpr9kb2w&q9p?z``r zH*cUo7!^aS*V zq#A74p#H{>Hu^>G{!GXQGvH(pY^l=p-U?H)WTByQ%jV6NhJF{C1Dp8?qed|3MU%T# zG^B`F7H0TUPfJS?DQT-ta3+ioeSb4vf0J2?lJn?jXfw~M-9kgIiUNX`hC&vjFd_ud zkQo*?KtpfLR_4o1bi-RmLtcKnTB*qFVlQJ#|Kl|Ds)~FyTt5x{lug!Bb61iP8uDEc z=DqNF2hb3-sk&!J$b=RQo4^x+ub+m66Ji1zKP~B$i~)yAM)kzKVH$!$E@wJPqdIk0 zEm$Hti0`x4DHD1B-Jid&m_kYHethcWNftF-w_@dpAy2Z_T#eG@89qw0GpPVUs{=Bw zMww`R1b^|qcFr54p+zCW{|*fe^a7m#{CN+($UxRp2#P{+jVEA5Wq7nxXZC-wBVM#3 z`t#4fX3d&irc7B{L1JU$qOfKyLBi3(&ypWz&3Wdyb$F!RA$kuZK3QA!F>r<5V5zYs ztFBSm>*JmY@i$5uqV}3mH02mcOPz*QLv^hJbwZOSO+vkWfqraW%shQ+YsF0n*BvTD zQHM0-IXNk5_*279o;a?tYk^o7ff-UP@`FyKdqR=DW{n^EVGm1TxVmIuzI?}z_wLD{ z7m~g)6mpeUF+>JTloF~_-yS`W95^Vy<)ELlFZpY-7clE!=mtrahLPtRa=G5V(vYh} zO*1W}2nst(rEr1(QTh#qh*meubiN@;2kV9*6XmsGhQ%$Rp)M;L(0s~$2@RXGGTSZC z4ZX;VAm0!Tb*4NnHb;VohN-!dBaEW4F9|d(TBNAe4gJ{XuLe@X`_A434H-p4zoEqD zS_?bt;}rt<$f+Bnp=xco5Iiksa7rs6Fg4r`s_~&o*C*berJF@iyUdW8JVa;=v z$62}f{b%|QZc(Q`3*)nm2w7DK8V%8DKJ@`HJ^~G;!_l=)Fpy`V>E$3}R+-1~pQd3T z0!_Q9dV29^WvGF%hgPtjpiqo)(TrF+Y5CG+{QR{@eP#XEpPy{}XyVH+jUG8-%&1Xn zUl=)Z%%~A#Gqoe1Bg~5*rrA6Bm4GcN<-p#tV<`*a|1NA z5Dac&B{l}+w`Sky70IK>dZ%?reV&6MDM7W2*`_Y ziqgAI-7u@Weww2a#%E)r2WO$t)LfCql-l=%<|AmRV^bZ)&`Uk-B6P9kg_O!SrW-Q; z#4^stsXhTNXKhF;+%OGAU(-cnV&n28<*HG!G7IBCF@8a`cvB|69~5jlae&K=v|9KgkZys z7#gOYQLeE zh7oudd`cM#jIcLPL$7XVT1qqd5ph4zkQo-FE_$DGFqnOM%Ht21EDb5B>+ClytTa^8 zd0oppjo-TJZ`};$8;;C;Old&BAzGo*Fc)(Joi$_uaza^(C z2=TbpOMiD7T&~heLu-z!*Z%z1zt5ifX~*YZvXSw_jhZq7HYvL-XafYj`dwyBRNYV% zLw^+JOo{i|G|%7}s~+B}zQT|w^s&ufqB>RM^>+Q_uh$>h`mk1Z@nXe3+OUD~oD{DV zrpMR=ufJFJgmuKoX9*N80RDPP1$LL9_9mZH`|2WS&g~&SA;8AEVz< zZ?o#!oY`~8cks=6eW;5zZQ8^n0?m@f;B_q!o!H%Tgr|d&+2vcl{Lgq}aL}v(6S#^RsVEj*8akW8d*3>*985zl_fjw5(0fW{0stfA zo2Mabs}c{3yrDCiF{PRJ8wS$QA}=$o(4m-_xxgMA*E5R7M?*zwuxr8R6~LJuX5>!2 zK^mI5el{MKN=uH7%a<#qTIupVAL;no%j5Tb`yCILpOsVr;VT~rV9uIA?yu1F;5(VffR}u&$S_c|>pv)&ADJXRU0{1`C;nu>n*FK17vZ8BF?mEbqv$ zl_Lu`Ktn~93n;(8O0syHZ#K)#q#CLD^{#Xag$rWSj>T@LX)FC#f{Lu%9`7s zeDVqXCZr(mu(9$JF#E4f7(c#j*|M<1n@PG3Jv0n@U_n`(@chV-G}Lh^KGM1Dvk)jr?2Da1?Tp9h8jEu1q~bwji~cq+Z*xEkb?ghbX6y|-xb4$WJ>@bvHvtJbh=j^SaX-#9-Lr`|ARbSn}0Q975& zT;)G$savsNF|F<_8UTN-dYBTI$RzztndqWWTSt9bAsV7p1_Okf)D4w=xFGBsZYt8+DGi=?-NjngLkAD}YTH+eLT_o%7y0#$ulqmNm*ykbL15vL z+hWO`(h=6C1-ju6PBtW4Vr(QLOGd>ko;R;pp+fd@jSAAC;3?W933sRr*tHO}0%uhv z^n{nIAFT7hwog8_47aJPAbG%Cz4pt`KTn_ZDjS+}Bf>&yERD9`(50d1hQS21$O|Wk zR>%xKQ4fWN3`*%31r3?f^?0}5tZGHHjBl}#0~(cOChV1Ah8Zo_rt_>id9$J=ZT0+AXt)iK4IH*gH8*V8zs+{PC>@pvdB`Y+{bcO}% zN10W-nPCA9bxf&_qLBr()rSFfX~`)=qZm`Fx}lGT5t-;kp;s2&umLkHz6>gUKM!|? zh3JM{4xYS`sE_sZVlhC5hBCt_vsS+@-6y~J^5-9I{_WS_-5-C@Pak(7XZ6i&O%LNV7Vtu`bH%vq2U}nUN zcs>;Sf@vrdD{hyiL|F%nxeqc~%ws4~7Aa+5=hqR<&g(bCw`b3uXjXS2JDQDt{rXYi zSQ=VEsTa7_rYuK`3+O%nn8a85WPw1n0 z@VZ1u)!wLngS}sW<6P)J!NL48Oe>1XCDnDgQl-5ykRPQXo{BjH%RVdEOEiqvB?fBs z*3Db&*}gp_4SjjIcJ0FX^UOC)PE4W@M9(!{hnebzdTY>-mQwUPrJ)0(=!Vk}7{h2% zXsBaKp<$;snd^qUsEmZ9a!`F!!Gx@W0t?78vg^V7Yw0H?xea(Fyw8;RhK!=&-a`^F zoF@q-#KyI2(K^%JerYMSG<4bIASud2@&LtXsrl_B!92NBp6C&6 zODPvd>Nm8_r(pzW*ep64E_{0yU3Hd*0hkLo1XcJbu)L=X4M#^u!{*$VUaRpa6IE7M zI};U-ym)wmq>O}IW%3tpSnI*Zd-Z>3^6Ptd?qX45UNe4NeC*2mCV$-bPW(KF-uKVQ zgygH^(+wYWY2KQKS<)hjG}cn{08y00_yj!708t;>0`$Hp4wJ5zh6=%3fI`E`VD@=^ zm}5vN8H@6d+xb9m*0kw?0|&1D=~TtGNH=cW*tKidx^?SPpR0MmHF(~zA&zFvn$4Hl z;$le7rl>vvE@v6f$)aaUy(m#g;G3YKu#5k}hG?lPs#d8oY0@Mbmf@FV-n@g}yFk`M zHf{Xuv(M(vnfv&VAX+@7}#9PoBJTN_^G&I!6y<{Yb=xNBR z-KraU!4#dW-F!DoLrXwvewCqH-rU!r8%Ay>4bb3%4{wZy47T(#EQmU9o7%wvC!TGjPbgsBT`fq(w3PZLO~`1OI7K1u_0o{=)?VMrY+e*1 z8=&2k<7Hn+8O0EPbVHUMTeWi4?+l(Xl`%!Czhe}`zJ2>9COS6~ki(liq#A74upy)f zUuOhXC1b{nVUS7mD7S%w7MZ2 zbf*nouWqOibTFD8mxPT{H&m=>V2hY=AcO^K!UeGYAqi+bWoW5cg@zjGv0lBI?-@{$ z@-zPEqmLK|qD*mV=G903i>H+O<^i5!joZ@uutLCXp+TSkvH>o$PL3Qr^!1J% zA1wP|> z8uc)khJM%!e?S2xCL}!8v)7S>2ScRj$rCGJLv8jzrvM!mYD;NmE3;`F+HdGW&6(X0 z0I3Lv-V1M%hR{kAveEfk6z56itjesFjze!IjaH^(y_3AOB&?f5lr2G#ELnhe{p7tNI zBtVM75b{>hkkpih0;W6e6hLBN;y?aD-Tvy7DJ(c9H^Tp`SHJk;i;e5oZ~fwnueNOY zYRlH`TfW@BRd9Z%%#vxu>7$@o3k^jT%+B_uf2dX?&j$Cz?Bi zGOeRN9ni-we+ktL^{RENR(u@Fm!W^raU>Ztt_WAJP98U&2@b>o-y|l_@KKYZ6MK02 z`JDkPWFRGX?q`P$JAIlh4ujKoGQ=r%Z0y&w7wfSLe`WZL7;gFc`wblwM&C>dyl#?) zq(vmk!H_g;TEF49d-nKr!w`=`iXuuHS`Ml}(zmLm)Q)U%bwGW{Vc^Rj&`g`5rFgHL$nn?q6Lro%pfOuL6S^*wKvregwqVcwrDhE*pMdOQ& zV_$n|HFX!+w%Q_sfgrA&MaBni$|#pu!|0e;I{3;KE#9+3r{(W0I&=I4m~(!3A^%84 z!7oyNuDie3*1g5U`4V#zr$M0%6Ad|S&>wukd<>1k$hx76KIbo$b_C<$PKZ#!u=529 zKbD3tTu4Rq%&@1Z#9!c0L)ILdq z9Xouaaf61`*pmM!48iiJ=bblau8kz5pkqq?N6}dHg%SYcowAxY^?B)1rC%98!B+=f zy}EnXZopK%TD5w09;jcpZvDFT>eqds;RAJW>(v#ve%(6t>eQ}Uxl-9OWeOE6lsh>Y z7LZjwpF|mCg%$%|9cE*g=;XnnRPY}&GN)w8l3#rCsc5CiyuGwyqunxYmv8-#tf`IG9EDx0E{ zi4_lApK1h7-t3LGi{y*_xdk@3XmGoO7QKtoW7 zx~IrvA)4a(3zjZexL|Uc-IZQXDf?6w*HI)54Nco7J`yG_p0PkQb=JSH`peIbJn-H3 ze+G@p^SzAbvsvEKtJe#)9KT_d-Y}^(A)q150Cvj%WHEOV&@TAGF=F$h$C*( zZ6|oc;3%p%D~GP}%Fcy%-jxs^KYq-M>_YA>N(&<`Vfh-ocJ<bs=g*RcKlJ{y0DeH+(N=nMx)87uvga4DWRXV{= z96#QT zRxsAco7w4azQuqRRp`)RRlkE|mOBVGHu1LyM(_p`SpqnIoOhZr%~b&*Ig48N!2PxM z@BQA@4kcf{qBFVVQH#BLm6c{`l?6$TLMWq2eIRs6=Odu%fEvQcjDV3rFoYCd-<`Ei z&HFd3UahqC7Kr4*9J3Avn>aVF_n?%gT&%)WoBPk&S`qJ)5~7z6xtjv=Boyw%-1b+Bu#2NZ%iG-WUI4d;|CRgw%)V*@Ou zsw#lWFDvU=^(0tgY+Q#Hts<<Nyp&_1Le;0_*Q07*| zWs`;XO-pI{H6KK=zu}@K70Q&8QZ>pTt_Vz8Gy*RDfJ`TUqHEaQe)W@*SBTm7C5jef zN8Jdp%k)(2J@+u*@aqUWI+?;^zM(V2!Vn7Np@1v+aJ@7PkU^D0G$TO6@gqljx91M^ z0$ek?Ve`anES;^4GYzEi39KF3r0#>?Y~98nx4AQB708t)3ZO$nNyyRuoc2e)`F`@{ChlSFfEub-H7Rjx6Cw z$k5q{+80RKumQlrUwx=yXiMZRl1C#CCxr3(Gx%i5!bQaj7t!nmM5~8N7-YiaOV2ZR z&Mdb|4iPzC&ThZuT^dqddwL0jX-LJ({JzbbH+vT=(5M^KdyrbohbkqPOEf>6X)Zmk z?}hYaD>?x3 zvM)gP#vC9E!i*lrB~oug!?x{yJeG>DgvI;clWO++KufQwatz-LeG&J7{ zSEK^Ec2#ItvJ@EzNkfGcZ;=WXSVF@baUGgLLupHqn1YOYhNPj!V`B?XL!&mv#4`0B zmKhq}8zl`Zl_|$(D%1m`)W+II3I`#VFwqS5c((U|pj^8ilKZPPR6)a%H%r6V*sNKb zHfXqg%NB~sTT)KBxh!yKSgX(~8t5>Ny_>)Fd!$eC)!CzRbiX;;TWi?Sg-XLtv zQsqBg{}DYDS_GyjJcU6an8IPI@?-5f7tECh8b;S$=%COAq6{DPvM*Q;prLIbRUQSn zmKy4B5B-Fwl|erg2H}_XI)=xveXUN6a^FSs_v*C;^X8W+S<0&zf)&4PWOfh`UI`W8 z5{LRwhoel*m^Pia6hkJgpczw7ZzdUu(Yr^_SQ>IoB*Z{exWR@1`DONfCc5Fje*f3% zRjbOEFVE8DL_+nh1XRRmv{vT#Ua|bWE0(VancF(GYtxJ-k@y>@!4q%GN0t491sr+f z@yY?goI{gs<}tWYP${tP^gCi5Y$7X&}ECcCz~FU zF6)$bYKv}|2@R=C7R;ELk(S3ckOnJ;V38k*p&>1$Aq;Q!U-D6ay*giLSdyYvpRyXAK1%d{MnbME|N<*3@5jZT6nrFu3H!hyL;ND8;zdOI$-nLnb zL{`i;-F$*M)3%u&pR3oy9e>!phs%y1IX3d~r|3Ead?tWlZdeFfK04iqY34#`NXD3= z`1a&iS^Y`h6RBSPjeLJxz52=Ob*&$0kS8%$O4vz-GCU@n8ki{xfuqG=WPLCIe*u*A z9(oyfU9#rHCWK-*XwV>rj`$ah908h6?K|*dWJbKq&r|PdAcSDUDfNV8R8y!_r%s(B z13Vf`aK`kM`d|6$3QNIMs8B)US6YR136MW;G&KC3mQr^6b!Z4(LPjU8ky-Mjq|zK3 zJeNW9Hubfs#R?Z8T}qo9bU8(Y)(UOi!$4?;#$0s1KTo>y zixLZI8Aa2*WBU^)j+xJGZ;?B)8DAtce2=X{i$}E%pbr1>%Ma38DPnU3MNZHuV7DU65dmZY&pZGpA8yDXep(z zKmjy-Z~9EuqCpXMB6OD? zcch4vgW6uoo#stQ?%%QN;k|o#hU_=7a>>$SY5AFG4-mCC(2&uBFSI~UF~K09Sxb#I zWRkMoeb0p9BYwVcfpWDO^GPO8BscH%Y1K=WN24^eDuR0n6@{5AfWa!E^@&VFtuQU2 zv|{H_gd5TU!|~DEV@TX6hHOX6M)uzJG%YCF{ob8Dr)06>0lCt=U6-q*^Ij4RM6XYJ zp7g1&z2^KFJP*!3!2p3h{+<{*G-uA7B%w-ENPKbD&~TRbWeA9hLq7i3uUl8;zWex2 z5c0TMTR@!nQ@u2Nus)+uY$P^j&HULjXU4t!@&k41RWv*fk177(Y@ zlg9I4Yo399g?NZEVv3tJi<-h9jA4-xWGtwlP`GyIUCGJG;~Cz`P+|YC3!7EVJd={1 zf9|=IT*(G%!nbfJ#Gf!uFiF;DC?aAQGGO4*Lx<&8#(%#bn|yz>_{`|x&(YFIVAabM zh44tRB|2ATqi8hq^XJTEu~v;FB=RD7THR1IJ83D6RyU+?on^)g&>ieQcqV{}5oqWX z33`u|$F&a@EUbEO1@fbq3w9|DEdC^+XX&RV+w7M;pjU4yH~aee1kbOApZ4I6-Ovt# z6+n-VZ%cYJg48**G=yIS&XzS>%}V#Nk-9ITP!e6M%NH%KT&hequWsnk=7f(q;)>-j zuw>S|p(1en8j3DP%$9u-1lxPaUb-va|A02$uy<#)u=8im4D9__QnpyICDu$}BN=*mTNaAC{x0@RMf%HQJ-*JyJ3G#3m4so zWj5Irh&EF1OM;Bqw{KtDHf{I;>QqF+U$5~3&dNk$IN{8da<9Gu!Es6Ym@4 zJ+v~vcb4*Ix*`=Lmj__W9+EWuhVRa1j=!%T*&DgadkghQL$}v! zlcxm7pgv>|bMEZ9k3aqx9`)+kt3~tXb!yjP88t#Th1sJ)MCD^{pb zqG+)q1q-o5E?bSj4q(bKPUsAl6pPvt>$Jya$pVX6c$W4_@{kw}^joJTFLOjfEF) zoyk!MM{dDX5u97UUKUx^%k8z%3&KIMG8cnlq~EYZ>xX~LY!3?tN-cVKUct0<(&a)6 zK`+JdWNcNp4(-jD(!jeg*~byZkP_PV*=Oxqv`mUi;3^x5QP!McE!50(DZ(S(HzwG! zRUeQd=X_B-^Y|02*kBXzJy}o5^Xqu7|KOCQoJ6ir^FUCVMvbSRO6XM&6^`^o5RxKl z`e1|4Hg2>jh7|a+`f&NmTK87YE~T1-22!<_P>QV*83h;53_IP)xtA+4v-sgg&6DGj z7&R20cfNh<1E6Ux$&qkROzVb?cW&8girme$yrQ0xx^|7_AXY4Sze14`RyX8w)%YSn zkT7~y+e?v)rsn-%$r{MJkhz@iY)Ovxv_2F{s1u2}B8%Vy5`?bplRdzPP*8kQ=hlW6{u zMpbLG@^)%$@Z1W&{=pmLpk5WgLB8{?k5VQa4S`VzWkJ-35c^O>MkL>>=oFfeDjMCo zb+Z%RDR%cQxyCPO`t<1q@)wY#Z)p6CC0%6v*)7FO){J+Ur$6E4 zaf1g8?Ap0Y-P(2FBfDcLyRBlVG*s>YL>{QD)Z}lp^yC*o%iWbL8`f`t$keo48;OQS zCFG+8{m9{=L1&Qy1;>mSdE(fQMC(@ezVvw0-hOKu-Ov_=0ELcMaRo{;GE-TW6rbR` z%wLjHc1xPI>{yXic^W+gHKfrENmZ0Ae4rtq>HTQ;)5lNvCm47H=r^t3z&--p1$+SI zKpMXZNkjahVf&V?4j($CCG3qw3kMo%UHsGOQ)5StDw2^uq0p48?zO(mqu7{Yg_y`7PgN>&3nnCYPlO4>HzX0}`jNgZ3Z z-u}7s&Ul{$yOA8TQc1|3Uj8%Io7f-SfG}+o?h8{h7%&QFWgyT1BKM;j3eE?eY^gG z+#;du#n6pNXCf68AvH_5(HIN0n-r*xn>1`h{p>s`52huGM~&=5iCRi?;xm;eZNJDL{LfFEhr=&6zzf z+2xLa;|&KZNvjeHgWNgtN<-c^MOB&7Wjv+kCrUQmT{)<`+O=sL9~Wm^S@m+SYiSiM zfI|8W)t~(5P0cgrxlxxdUh+#X=zx0y_mxYPCDF(3KzIXw!s=VdJM0DiNriV zzhoqO@%`({o}J&6EnF;9_5}xkhNLC)4PzNonk_XkSD#K@zTM%B%kricARpQP!_Z!R z0Sa*{m{1ZCfTP4Ia$L#6#ThUeaADw~bgy2SIpxia+<9`uNMD{8f(kq9aw=Gs@Y%Cx zBI6(ZAiBua}IObW{vg3#rlIFGR5f5Op8ecdL2KaLc(8Mj7x4>r~e5_ z+qZ7((Y=Q=b6Mi4^a_E)Z0S-Vzks%srksu>d=x{Jdg z(!cq|=bt;*n^N??T{d2Q{X(9yVZsT{wQi1yMB`CcuR`WIGV6cS#!U>bW#?Qp9S4OB z^>GcgcUo%dm>0&-1P%4%SLXRGNJ7R?=5uDwtXH>QQeq;iADB?fL$R_7l8R9eQLosL zv0LXZpMAVpR6??4BG=6GW%b?Oy)V8vwm2(n15l$3dVs~AN{(X4AK1irkEezWi%=kB z)Sg|wbXoIe&C^oTv@6XMt!e)>5fUd!sP$)Jwpc?$uAilU>D^OA^4i>6s`Scb%b7A}OT$KJZom|ed2ji)`DDY!Ck76N zbhP~z%A2oLkz%#0)o9zY)re=F-Mn$*pvkp};kpMxZq0?}hBQ7;pa+{_t&YwH)z1VvT>MyV4wX6Gg zf7i4@5~Rkf|-@gL`E^JR;K)nDX;x}_8iel;cMBO zH001Vq(vc5du4K^;-$ciXlh2+gL()7?Bh`NM_g^>Bs>}!^C;UlZF$I$*Nr&TUqJuY zm2b9g@7v!M!qCEZYcJAu)NT-bC6vB`<28*)OL^v8U zW+u(dk4TG8E?cm8|1Lc?E?@m`qpO-%!zlyJ7Lgx2boll0uT(2tKApv9w)f{;5o zccn^|TDEBU(%6^yRuL^gf6bxZCYx<<=6CPjJ!;gbrcIkNC^RW4r?$i8&Ye=VYSn=Q z2Yvqe=k)t{YSR$$>f1tF{Ri(aZPT(lczW>53a%@8J3)d zh}rRy1VY(>i=-Nm=c4iHwQ^{3uWmpZF!AKclP|pR0&As0Ln>rkjLSoLf_&sNnc~A$ ztA9Fq3f+nrOismdVm6U({&+KBEmgcYm7&l?xaW*D1(C+y4MbvNVyKxbSFSvAgt|~U0TDWdni7Ep*Ss@HJ|pz zo9E7+%``cAbXTO#96e%GvxW~9O3xo38_#wUu`#jP3=JtR;KFS(sp0wOMliFI@Ny#o zx%V7uqQtp<%huU5-g$ZS3)5bmx@qk?Hag*%a+Z-@3{0By_KYTV>gG+(%^1|q54U5% za~&MzEe(w-_%7(88a;euv&IkQOG~GZl7gahkmY4~z6g|qS{{V)vD4&p08rYHixw!< zqEVAcFOB=*`+Y<%FQ)g7^uWBS*8jrUb4%wh=+?et#ZqO`5_2Vrs+EuwpO`;6twyE$ z`uFL(arK7*h2qV&x478rWc`{C2lnVywM_Z+oXG$V8Y&P~a1VhXSd2&2!ev$hjgX}a z7j4zBF;zVSIOS7Kj4$iv!1E-G$SO&1zBHjt!-tCH$)B9aDxHb&PWPY}0-7dMA)w4L z6cEE`_NLDhpHw(^o(C#b9niD)ryp$$?v?OM#w|e>)cSnW$4~Yf@Ia+%g;LT}*-9xk zj%h4QX3gWn%#%|YT)J!9_8~nVt5LQh%eCd988a!FxflrP$m%A_A(JEWC#955FIc}) zjqVS3dSl$ApH7}OFOu)Z$&5sfe){Wgdv@%6{>i5+6e^x4Ho;7tkny5wufKB;6#A$a zPPSkQCj>(+Qy&{uKuG-Q9~6Di46Xn)v?diRTD0y1b-OCg1q6zApG^$l>-M3E?BT|@ZiT=wrt(Hb=xPOd}_^_ z56`nVM|8#{b`1rJW)s#1@BV1lI``Kqm@gk#q^5-hFcHd7sj|TYZG(K<2mG$3Kf>lI zAW^-OAXhxRZ!5>tqVhf9-kW)QC0=7RRzw@U%2dCP4;oAj1_}X?r6I2YK$D!`m8Eov zk}r;afyOsRy_(MhW`Yxq#%l_jCACkUdi$-nI<#-kh^G8`Gx(}^M;Nj}j*JN`lrMjs z>NQ|1%h=KXt zp?}q@{lKH0I=}YnYkR-@?k{cOb#K9zYM|gg5c0Eo=dKr?8}&$=hpSbnl%A4GnNTeQ z6jimd-f<^u@~|uet=hhat^ z+Q}owyumy%g%_`0+x_*f=Y~D=aPwA`%if!kGdX8`5=(#65XuA6Zv$bXX~`5-C?PRl zp1ifHRPWNR!}u4*?)+-UzkZi5N$fGI7nN^B3NIXI9_tJs+%IlcmO3T}Mw8Z4p_+032B&QvGB#nZWnwXT5m=iWJ@uWrlhR^gJxMKdI%NM0~jhuw! zMHLZqpUg~Lvvm36eFwH`+_ZA>GL7%AyY_=s)MMmK?;n?i2-vfbAMBDDbD!ul@X<#) zwr$*^MePO;)u`LFW<7Ch)O)CAy(YElb!pYEU-zD4pMGxjd+#4Ve!}?}6Vh7sXzasvx8ISi8>)qoH(&=?YePeU+UST zC)?CA)`Fc7sa-7%qk$k{2#=OZ_ZD+ESazn}Bkcwc8vM?T8T7EofMoN+$~)lx3izZ! zg)uo4*JM|+jB(^Y{vfORo;!JU{}2h?Rm`>{up-oIaz_^V6p37}KHzs&_j9 zb$|HbM^M{QqdGp)u2;A2V@JQhs2--bxS!mlf0b$kAD-s)Y17-aeK=1_ibB~cXeyv8 z-dCYwvnCJq>Dh}#X=w3dO; zyr&-@+P-z$YL%;)7E~F2smdT)8_cR+>AqIYn)mP3d+IBb7&5{BWfGN%K>ogs_Xepop7-Qh!@d}Zv*JGXDARz*rsjmD%F@RB2B(VJ)~8W3cpn0A`R+1@M!xE&pk10)%(j> zsrXN+Qq4cfr|J8aAD}5F((@QeUVa69U#XRJ`2}tJ?2F}d-;*sb$+>f@QUcBoT<^hT z-igfkAiD(v8YHUAmo9Bwx%!1+&vtCxwrbh(Xv%1v39+KPr6uO9RI*I7290`l>hkjN zQ6H^dgO(?E?c{`1HRtx}x~ZDVg!hWm`hZOF%EAQ)4;-BL=G(m=?bf_OW5$}wca+&r zkWwm~oL0Zu{heC1d9u&IId4w?ddpU3-^kOHMpotw7Q1=%`VAkh`|C!oV_|W0at2ewne00q+l^8zCv_w?{m4?@^657_(sC2{s5DkH5 zu+g-b`Gt-^o7kZremH;b%-PeYSSg5wJ&zndbo9t!?13Nl?_kH-ZQH)u_SKGUU(xA? zi;Ug2ZQG6=JAT-|pTO9|hYqsF)LF=K>eR(^XZP>j%X(;CyLL@ZPG*=*lpNGxeT6r7tWvg>9pF@r%t-rBa=s{rT6UKy>-i0^5e}XS=HRCfObY!xg)MU z`Qwil&Yx$$(O-VPbm8pTb3gq=eS*v!C_FiJ?C6nQ-|XDJb*o+*;O^MAZRgiJ_V4>% ziwO6`v7={Bonpn0bEnT-ICFOE7hf`%6J3dRNMmJiPQ|k2o_prmWlNWyJYjZD(O1^I zedZ;O%8|EKFEOvM?;7Ll{>02*4QWESNjX0gIh6JEPBEZ}HZDk{9CT6;0Xlyl7&5ZPH{0x8!5jLd;!Rqy@koFhgTFy^X-4`h8Vs==)~-_KO!UoB^Ld z{lrJ_kH<*=$dA~=M-X`8yqgaQ*4&34Y)Gph{1qTF**+$Q<+&EmoyV$igk-iC!}iWF*!S46ACC~pVWQgi z{a)Vukmj2mJHP&F`@#MDX}chY*yBf!ktp$8IDLk8&QqsPZCbPTu`XS;d70!W|H2vh zo*VWQuNehP^++*doImC{%9orxRVhg+%)kDk{4bn6M<(B&zkmV%`}cgi|GV!lo;znU zeCF(_)9lqHsUMMS9Qb}8A3v;W^39GN{1Cp`z5@$19pS6(1kk|z@|i!vo6KDk)g_+S zfrE?ZzT4u#257Ztg`f}(k=+vp_Uf~C`AWJfxG6$XR;P|1KYsM6SX#07@BeP+H@m*t zv3vX1lA@%mRt|UV_-5~(Zy8L>LpgQy*rjvl_{zQf%VqlPU=w;SAB~qU{mj{uCjTrY zEtz++?TO0x;7>gzIX`k3_w?}}wGhw~f7tsyOXM;BGgmy5FWCQxu`30iAM(@}n?61M z<8du6o{r@F$WazmAUSG61{Cf2YUiHqJ9lHb1#=hN2*RH2U&El|hYp`IclzV8qZdy9 zbnz#C^=B?zy!geY&7%hlMPdt_}ArMX(R`z4%ghbgumvM zab5ksFh}Ms((~rEGPMU^l(dLmI&+RE$Z~MYX3QBiXjqdfwbJ5qCC9|GG&lW>J`U1d zC_RQZW}~8EFtY-DqErThg9XIHq0sQ3cc2(Dhn=m}-(R%o^(j*(yf|jkOD_$7^2x_~ z_UPBUSHIr9yLRf>tZ}2JjT$v++@Nuz`dEZUuKQ5aMqN8~=-aD%-(Ec)>)CzevrkWW z@r8+F$4sC4>arzE)~sALV#El#6j^ajF^8@c8H;3!0A!DY}&Bl+g-a*N%(dGQv5c_5|tRAzT^j2J}oZ&LXCa;#7VxDzWL^xkJhbc zJ-s0V2eKGlYD$U}&Rw$2BDIHf4NCu@WAFhMva;*OP3u>!W+j%_CQN*F!UT$U*r35f z`t=*qSM0#P{aQTKlnDh`RJk_Inyc*iJk+#X$4-O#^fiI|KHk6I*byUN9XB33ebSVr z@6P*h`!z1l;CMCgQSpw8p8ofW>@X`7es}{|i_0}sBr;dAh!tzLPxNTYlcx+UU?rbz)S_rl zpRE6A#;dRQ=-9b@$xiId(MH*xal7l#iSN>9_U{sSNH+n-?V znzeYOdCT_ATjHu^19TPIHf>G-4g5s^0Z;VpM-jbFh9^#%Gj00%RjbylSkbjZ2SzT@ zR=~)d9QVYqQ|*}HBcS2xr60_B#`^n|HoHXUgk5npI2QU%Pbq`}5zU42h8Z zbbF*j`{u1Wv}lb*FtQ#Rw`t2kJ$eo!=K}^jJ#Y}&m^NYZ^l_8sO?&&JRcmHWnp(F? zwd4e77!M807A!ht%(%_#HY{Jbc=l^=yggykn=g^`;m-^l^z?v%TuxMvwrbm{d8 z+lX!6+Hnz#+^b#ZC;Rjt*?;g;g9be{c;NJx#=SFf^2|xEu37T_rys7HJ>_-Q6QHG( zu0vj@t}WVbUb~Lu=1-r&z?*konKEU>=#hhmK09devx9~V>)WsABON-okW_GuU{W+` zb!pzJbIaBPyZ3lz(BP*B4t#ddz!#r->dmp^W=)(jYtpMr-kH7j{bd_ISn<*Fm7j0g z#786Feuobn;PpTsIe+r>&*v}v`t#*qfBpr_*cfR%GnR>Fj{l{fdCizE#PFDd`+xZQ z%dMN2ubwk;>WG0uJ2Y)sv0yRTCF-6yrsOkr)NEhquuqtnBQfLu=QLD((7H@5r1s0m zn^CNA5vC31%$bux(yTqj@caL{Awv~Pk0I+R<<6bEaDjqFixknlXq9o1Ip{r0c&KK&Z5|wBp5z zk;&v-xfmmXTd-ik;>GbR#wi#k*K&b-iF@Sdqn^4r8|9Xmn3$B5RJd^Ak|j!zZJL#o zhV;zBlssv9nl)|8M!lbY{4rm2^5uW+>d_-dmn~hkaQ=I&^@@G(-FYf3oHu`QD7$3d zdrRiO$0;UvFL-y};spztd-(ZhpQ9Tw3KU(5*PFN9#BDwR6^jOcib!?wpfTjDEn8KA z1%ILsx}!s7AgECcaTSY3$inv%3lmX#j76zYrE2p=jUR2-e&o|nzcz8=g4wgl5{s>I zcVB$|#m66gykgl0OW#{CbLt!8M~!C8K#RsrXgTL)BP!Y|h(z>3Lq9W`MaIl{4K0?; zCuN;*<{lQ!S13pvC{JI$Z`%NA*5H_aXEeG z9sgulNbaQM6vh?gPAguxSh-SV%a$yYH#MDco~j$7sbLvIQn7TIG9^kfH8O8E6f4efjwkx`e|_R4p7QGDD?a^r^XH#^w&BCI%NH+MFlX-DlU^I~ z_!9u7R+Vb`@}%>m$a%p$>GVn6TdGX)f`#E!-drj4c(PvTU3W4{N^(S&P{4gwKGEbW z4J&=d62M)Lf{=IIm7biMH#s#UcUqB*0{4|Jk1d!tKfi1Gg8BIYM0S{EXT6H0%fjNq z=@}%No+~$NX=cCcZpbdJ4X(9^2;3vU(RF=8$e#7Q`-?E455U!Rlr1 ztx&Wiho<+Ct&3QEELZu$CFtg>T(oqFv;u{b)AQ#{rArZnVYBlTvSelL0!lS|))?|8 z>lheo0*K7oWg1w0^5;%1l9pa1EpPP_FBOSUi8> z!fAPnre-jvCE=dzIqr_hk%b+sv&G+&EiP*e9~kkj720 zPt8}MVDXxzE7U4mxz@c^8r7)NuE9e+TDKk8rR#`+LtY;}cG{S63*VZ#a`DoY3zw{X zZz&C)TR-25-S)-SO&@MpwP5Lo?=7YKa?Yfw6Q3FRRL{OW+jeMMuh9eLE0aTJ9VXn9 zO@{r%n}tT>a^{KiDTY22no%@2q#jLps+m8-P!(pJeXy2T0?;md(#0g4nZf*g%y z&ps^5T7`QnRI6HzmP~NduXi7`r**5>9N4!XHIqcddVpy4L-5BJ+c2D9E0TsTbK5h;m7`Y!ouZOKT)+oU;F8<+9~# zSF2vP#{JbQR=T%znbJjz(WaU+K7m|mwgstNNGZykqq}0VGHQ!&44IGu;`ttvVL~zV z_k~%?JdBNGA~|0LP=5~MSg&HurZwwho88}_VWs=; zFHuo!$?|103KhzgmYyv^E|1B^_e{=McJGB&q6Vg!<=PkrizX;Gs9iJn zhhtna8gJ|Co{jFWCS=1>g-YFJ=q6Q(5sZh=Arp7qB@hc|h%NY(#wE3)$JpAEvs8(} z7Jug4W66jL)+MkQGv81yy!&p}MjOz#-@4VSY41`PK`0FUUo_jYB?LEXI3LN;g@&Au z0lo+vE0=&IjKTWt{J>d|gsp$tw|yA3kq#Z(SQ^YkXvjJ(`Sazcil%n8mONtuI7q!m z0HujNt6|LT$~z!d-xIjUi(wuVtBk zZ-P6q@*hlS&CD|bf(bD(@!4Wxv&R@<2@qA_EP^C!3LM=>-$q>XfP_9IL6s|2y0O%R zRyIC{ZX^d~vda_+P{_`M;>w{HixLAvph;aIsIkdaf-{DKa8}_chc4F=sM1YsOohyx z5o`jgM0SB1KCnjhM-9W}#3NNV*2I7;T*ywNr5WKV{Nh?#eBv4HiL7I8CA_g*?j&sv zB`V@^IY@E@4XFTRfcE+DIGQ=VGIX#R-gt*&F&*wN_N;v5{XIdpp?Uz6mPNU0bc^GlXrP+N+B4o6xgf~l!k{tfB&}eJ|$t7o({hmM@#AG5#QjA#kgi4Ibkr0z3 z>7KZpF^(s6t53fG{_CC}g>%hFZnOr}d0I z3?Ud4dRggKO@zI}5KyXm4qShkzQ-+#r`c$O9Umr7e1&NU%0X2Mk(t;vs9%3teFHAH z@jxhRkkwkBkOK84Sp`F&5@1xRRB7h)w`B;fzX6L%M(E5Ea2a{?Dz&L>sevJ#P){4R zOogoe;)yQiLQ{B&zF@li@K>Xh^2#)R8Y^m%>VUWcH5XongmN9sQW}~7qTSGu$eseC z=%H*GiV;SQ1U4F^x?Bw)BndDi@fhvQaE~kT1W&5jX>wd8K1PWXeZ+(`N~X-U$d*m5 zppa8=P?;!)bn_Vt;2;QRv6gWnm}tR@D1C;fq=G-uLKd##6!1d87;+gN83Ho!SmP zJdP=i=vG2BEG@B2-cP_ahXh8`VP=OODxd|XIY`=33>Ax#gz*t2k%{oJvReeO6Ryd~ z85uky+q>uBs`x}hJyvv4%}%B_8e(z@)?iTtS@Ok96%<^$lj|jbD|4aj2}o@5NrYs) zB_Vb247}q|sh65vC?>e{=$Ik#=S5*OGUUYy2Mw?czk>IYh~&dWKM2U2cLkrinW=St zG;{-JPPgDmg?ZzXy`Fjq1knny(a=zNhYL5&rUrhLv}bP;f?h}l;LM&1@c&O7hQQOU z@B$^#MuR%(Q5#(b0V-7q9b(zo2;k_33=WBjsaCBTdmu7w-l7lz5;5Xs-ppC(jLJpZo{Gu{ zbOel!fom!`pz{ACx|jgb7Z_Tp1w(|D0Kmw|A~DNea0b+}nH}eae*z;DzzJqrLGc&d zC>Eic0i`SmZd64UexbKTR7;~j!ak5>uqqH$iV>?d&`SAheN+%Q61gaeK+U#%3KnTu zQcx-ZgAWXCmx)H_GZ5oATgv8%83<{*A5z-J%f+;Iy+Pe@6m5>fQJcVMiPz)i7EjA&C zS(iq7Cxy9ONT)n5R@y>|jYBh^U78IItq=rf0#@-+9g{f4Uy?{jgnBeiqBI%mK`ud_ zA)`?Sn;3rW3jp0|>Qa8PZgx}oKrhSWn#s9PdXMTd;% zKf$}maazjUasj5;IE61^T0}LB3m^+Y9|~h$qVa)) z41N&eVCldEo}$7Tb!rzsJAtlT%0fkCKb%jdw z)v;II!o>yh=an8KPktJb`k@4jq(+zC4&?rV8%+ZZDfV z$c>x8xWctix*?uIK-5A8X=Ihji5PUZ>~}NlL)JG7X#kTUk+2N(#0q`H;7`Vk&L}<{ zsxg8DaZVW&l8Rm@=mEZ>#hFG?7hBL%(8EPQUT9wiJB$wG@WGILj!$HDu z=(>(TFivxc&`?%UlQ7cSDfATn2@n-wrZ-TVTk-k-m^%+R$%<-m*N>kIY?_&l)01<~ zGdnxGvpci10Te+2HnQ` z?yaf0-7`D0yT12t%i43RPSw5LJ=E9d)Tt`-h?0|FUsmuZvwH$Nwd}A5MN$W;Jg{OB z=pcBsRiy=d>N3Tk6T331ij73^l*Zef(h#U=60Tth0y{8d-c+eo1<(et1b@;qo=!Al zKFX!`p!OY_G&k@m&Z0}T1jSf0=cmAq87Q441V)mw*{U2og;|lnC8<8mq?Irc7brQ9 zng*X|(9f;`C`0a=3%;v}W^wCN`O<=AmcVwh20&7w?U>K-(}Pptjm}8ZOK*G)JiUNDYPN7u^aPdQ|=A zXlTIQUZe~A2{9Lz8x4KXg$EWo#G}j|8{?Hjp(NTUlwipC1%G0(GzwKe5hUZ`DD?8p zJ<2HI)8oI>x4-pF{E!I%357J6^mWId2(M7~4U2_2>_Jl&;1#`;hTux(|3Db|p|3i` zKL&!ycjqF8kay7qtDs`u^a&=DLLj(Z8zbc8H3!# z+QKqHnpk5h*vz01FM3gdWtC0I)-(b>?MgaSevxa-2#YvNrNj6HUSvF?ppa_)pIq3) zTp=YqB5_19R6?+q5zRWcavZ7<5O4}}HQbc)O6)yxlL{ZXg>{w4#URumQletSM=EAu zbQ8R#bYc$!%d8>nqr8wMyhjq3B@Km3S=0kYrL)yrZ~e!HP9U%>002>uMFQDN*dMM2oAGz5s)VkA37qAo9vP_|T+;1*(I z@S0XZN%mxmwq-L8irco5S;fdxx@`m$ykc^)^iNj*vANuQjlob;@MnI}?Lot>K_U1P z!?02&2MvXtg$8dGB3qiLZ3qgzk(dxXWfJ9Eahd4KUn-;|R%D?s!^a%0JYQnLP&ikl zXskKo-;y*8H5mN;Wig3@lF%fK;N=^d5GYHZT#k>ey8X7>0iV4LKte)Y=|Fzy{`)Uo zvNM{q%>#xgOz0E=utb5dLjY3V+S>Z=vy$gO@&HU_{_y5o)~;GD3n4XN2D}*ug>ylO zDKvy5#zgX}<*Ak>>82&=`lYFwWvSYwscOH!C$^S)v!E+e(mxMwLWiHo<*)-mT6p)qTAZ? zY=b;iwvM*Tvh`AxCP%GaN-~Yha?Q(gwdJ{nGI<87YRj?>W!buNRYqU#B2}$Rv!s@# z`l!oA2jrQ>=iyjek!@a{ZPePv3i=ea#Ix%%6Fv-ZRM46BYmD``l%?imKR!5RjsM2c4Qu)qOzx=s;9g_ z&n@;ysX}{-D%40)NDm~0HWH6io=4~`uj;I*?kKD3D6j4=t7@qb{f=~1JN;y;=%JY% zQBu{^c9xS@u`EtF#g=Qq$x6tSv}UT?Gc}#*>Vfi_!HSv{Wwi)Bv`Wk23-TV-TErw& zL<$X?vsK)ygEyG2V#NV@XS%94Ro$7XWfD-(CQy?cAkqpj(NAZliZ|Ptu5C?Kw`HUu zZ=oww+nuWItEg=wypz4)EWl-yLM=12Ogr1DPWFhm0TZuvs z!H|F^8wb0p8WFaghFd|sM3Z7#nL=^-R+PYtlC2Vmi7$nQx^yBgnBTu44U1cVp+sRw zw3#w=D}taJtk#KFrbA@j8o$gppLo*4f73%@Vi3mv3Lc+&=IKNB+iwXpWNvTSjQK(9 zErG%X(=c{*f;Ue1{gEEJ8a@CqJioc~F3#P+B9c4m(q9$X};Y-}$+eB@^`nUYuQrPzqH+-qUC-IBpM>VSUH@BLC$*Qk{v%!I2i?e(ZseVAfDYg52I+)5lHTR|FLone zbgRCp5BXiU`a5p*b#BGmUEfQVHFu`va8+z8>{%dngloUr4V>o&->J`kuHK8cz#T7e zgI{v1zw6d~$Blp6t-0AvT;_()bR92GclM@gfd$S?vjNROGYbnKVg^#qCFUF`9Lm<6 z>jtiOD?jR1d_W(P&d+sy=ja{Jc7r6IKTPMi{>$CaSKZhxZq3)+>Qh`#ceeh3MIF4~ z54sia)Q99N>k(BawMCz_Iztd%d+ zwxQ@sIdA!VH~3k%>TK83TiJjq2mXwJ zOzpv){#@@k<5#)C!(7)`uCW~^3J?XIywl!X z-LbBRw|15rdY3%&$a!wy8aMn6w~CLhBU_96RE)$bVq?6Iv@n#ad7m5M$%jmUZax|kk&?KnMmPR;A9oubbsPTX)<2*MRQ=ga{?$!BNc;va-su^!oC~i{0QK-4x1Cx{W0C?{-t~ za|09UW-!e>DbKks*Lsl~_?-uQ^yaGzU$mz%o7t^0+f$zQw4Kf9@aNLRd_DM)eH^6mx#OvD3Z*6F1%t% z>!;lc-YL)XnD+CKoBEAgdz)K(yPLe-P5e?v;6J*_huu0l`J3DDDL1sKq6KRLxBxz= z2NMyz&l41?pHn=Xctpq3^{2a@pSp=h3vxBgFV z{iSZWn^hF4^15tc@1<=YccXkqkGrYImP~zop2fdk?@J3V6~GE=wHa6M05QkZsVWa#F?NxUkA4M(M1z|`%`?IkGM@gk=oAH zx#rq5)~g)sE9N2Kt}G1Y>W?Vz{hnLR7x6nc3CQ@h^IF$?tm{72^<3$Oe&ih;^-c%R#Fz8h%INJtEcI2m$G#p=px zD9qQ_mll$K)vbEm?ZRjKh+EHJ@==R=FboU%Y+XTibg9=x7R5j;rr{hMw5n~PVJWCh zhlwtPh6_Vst1g=G^Mf9OUMNXJKO1ORlpR0j@havEC9}0NFKfvr)@rt@*~$|!FriwE zorr+`@;@yIu-FtUcyZ|sMnQna%y_}ufAP`@rVEvKaja>qAW*Vi4Nr-j&m0p6HCH_tE zi!#}VHAlc_g*2?Fz(;z<>8C$wXUN94W}8AbF+SrBZ)~WkWmzHw;lADmMDP#{y`u(1 zYHKTUUvg{ibL*~kW1C&i!8^4bplQFI+cvwdTLhE>M7VaP8$8st@3$ig?fWlkJ9JUU zd))93+}b#?GByu;{?XKKM(YkGhS2cT+E1-pGd|Ny2z!&4s+pvhw{Z zT7T%qAJqru$@gU_~{y6_zaHGZ=c(t^b7^e@#UXlVZdI;p$}4k;iOb zl)cFHGX_5Dc7Z`3b1SOLa_nEhyWq>^c0K9p1DADN;a1)*9}X}At>t9+R?ucNX;o3%Q>U-VV z>)gsWyZ)nG*P*VH^lI06y6Xc~`i*b=tDCyktvGN|#}TgkDA!HxQLg7)H}WI5_K$7@ zrWS@9#xjoCtK5hpX47MCieFH}`9|F6G976%eSj>R-Cc>}+H z_~pVUOh3H%5Smi?Q(YfC)jw2z{H!_E_4efDtU#M&#DZhWb@lSvtKF!+JKmtY$NStQ zKxC~1?qc}M?VurEQ}LJT?%bHq?WxM&IetrQ#3<%(k|0|SKk^GJ;xJU3_?uU*2k9n^ zyW&e99m*+7q)@?EmDodOZY+k&0OuzI$C@@>vu{1Kg(<0{vepEjQ=&;`41Fp_p_ODXnlT3G9wY*Dbme-5=M2BwsTwI!$0%l`|4fMzBQ4S#lP z{&P+U{*huDN&(MID|iv2khXKYXu>|FAH3j#C!Ux-b_x=Tfu_-&+^xT#K7^6!&RJn@s8 zZ#iJ!{m|quL7=0CB(Sq2n22SIISH9aEvwaVWWCk()h|ie7s{rbY_-M#nH`nY7)lH> z7)n@z$M47{oN3XqPnu2amM!1K)qc#4yv6mh0V8jGAYFBdTY-VVaEjS-sT*KOi7`0+ zF9QpYQCU`TV7mP`ZbA)&^;nwlLV`%+03L#182Y&5K21G$yS4hOe#6~v&92KE*>4I( zHS3~K89uO$HLZ9uQ3Elzy77ZtD|gpb6{1W)PeplZWqHk2ZW#Ci5iF+fy3t*0n!%H7 zG9$N3H)bkNcD-t{ZNwD%gd4BdI2xt}c|4xHz)qnR{DWJIo0rA%5;dwUK)F9%1N!fmUmfyPr@H>OEIWG3s{fU>jh}QQ?{_22!LiFI zb~MpVe6WQ3j_)X~fD4EL9B*~~Oj{GUtGgO#8`&gSFOP_Sa8)Wq8v-tU*blvWO-B^2z+7)d}XJ&-ewj^<|~^rx-egj zM8h258_3k+iRE|Qm)#_PmT(YLi&_M+C>JtmXv*`WA^7vuLzt!^RN?^^V(v{FiSr|1 zcwDd0&{CW7F2>(94Py>UNr%SI7!5rNi-pirY8YhT@&p9CYo4PBA<^= zqDgpZ+zCs(EKt!GC9(K_`L73=J%qn37NV!*srA8&6-t)yHrZGFz3+G@Bogo$0pn$c zc4>HG_VA6TzP`P&iJ3$0Wni*g;1<7xbov5bCNR26$f#Tk&a70PcG)sw^7}eEk3Z^Y z4x%yyn?=eUAG-em4sBnvYV}TwcBFS&^MAXYCtxUe${s~ zqFm&kvhx1w`p=8!a|+vsLGqLxdx^xLT%aQ1F!C>B`)gh2>s+VUfMsRf*#eU+n0x&4 zhlZE9etx1G`|R#s#>2_>oiD3s!oorspgic-G9(HCbrA=emiQ2MuWSFMTMg!(beryS zYhGB^MEHualHAmIu!-6hOh1NYe$4;KjUVFL>Sf71$4D_cLuD2|q%nnF>$>h!rx`cB z)2+j>mF=C=DZ)D;A_RHWlJ>{c3H*?o_=Fp4(B%*C0;u5*1<+#p0W6-gyzG5TMFj{*e}`Y3x8njk9&Q|XbK1}69zx&iku-2@KFMnEQRTS=H>x~@=`P5?e; zH(}+*RP%w0+dB(vipf(5?6B|lThays03ue;0Hi=$zn9&3Tc+BmO)VcL_#o%L6!I(U z9pxhrs~HaL?sMaNr#o3yfr2hJ%r&MfuW&0s4+c1pdZX*>khKhQqw(72bIL~d-;tjU zYQe?PI82zX+o=wFkPdkaJi2dNG=M#Bv7m5DP@ByY#&fD0e5>mLB6S5$5vn?*yq`ZR zJ~2G)A9t(Z4$3664f$|iQq_L18^?0w$JpoH*uYY_EGsW$LQs91mP1AXBBv~6@|#^R ze;Y84=fB6T!-j3El=GgTAt#=XW@;~yzswCdocRI9$IhP<&-`n*_B7Ye`aV8PFlQXJ z2|;@17XmZ3IFK)QEBU&OXr{AJ6k6wO!WPnP9-9vJYOkY5fLfA8-Yb zFhcENJo}7*VQygJZGdV16!0HlonerUjf@;|@WEgB-1Uz>`lxtD0ijxj|9s@1Y~p>? zs}F5%Xk_zqx-zomj7i04!@SZZZh-Y=(p&t}I|yu{ zVZN+l-{q~)kWrDL3G^`BvF2T#GiD-}70Z_IS=Vu=40OznZMw&;#Z!v040HrGF%9_% zv9_)i8hTIZ!LGd~oo4_S6bfZz(S3C$zrSlUFD3V7KI?qf*9kOOf+33_()H>55sN!9 zNvM5L9mu?Ep2vbk@y-DkD8r?=>N0FBu>3|h3J#tW=j!^ey7842^#Y)H3A{nja>xP= zc?_lDO10EB{=!Wh2Mt-o5TlUA6Wm9bs4L=Wg|81x3*+v9#qG+JO^ow5 zy0yei@?a7;YBW@Ap$ziKSyc*x`9k@H^O&2&`!~TMMY6D67FJ+se#ou(v-}JY8lL8Q z+p|R7NLPJTwJ)phUYT#;w;6ooYvL9*H#)Vb?o)0Atf+0c?rm-mpSdc?Hm5itc}O-@ zTb*s#udG`Ll9iLv-AdSyi$`+3%48|DjR6?K=oL4GrQ!L2$` zxXBbV+~l#R0OIS#i_0>Qyz*MtWfa8oN%YRG@+9lu?}qpWBcf?&s2Pc~F>$tu!gDgG)R$06u@~1dcmldxb!GQfQB|OCK%_@7Q$-|9j{grQAR@>>Pss4 z!Vm|(Fd@vXL#^qDYXAH4>;#h&EMNEXFQ4~hyiZSbKTpUZMqrTyV}|(SFPT6ua}+w z&iDNK_Fu}b;1EzD2n`?q=Ra@$_P1Yu;z=ANK_k8e2xu>%lR8B`>`bs6D0l)Q*d+ol zcrBJ%?4PvI6kM-L!<7sLPYK#4H@~2l*&NK*7@J~3(r`I0VbZ1ZNR50p3?G0 zp#>(GdKArN$~r}8_;pc}yJH)^3L4^=6llsuY6a~L+we%&@e8*W9nxKH9WKFoEIw-4 z-z+0X-W;`a7gKE94jO*kjj`1yPhz$ntl?N3a$rOW<|KpUhFr^^)kFJ;guARezR+K- zixx4Qtra>nA!i#Ij6Qsf(C`Zm8p_WGrC}$*9uOHFQIi=)F-29#68bn<)wXNCg-9Kc zE#6B2r?%n2i#zb+;q_&l|B@SL4FZUUn|$nin1Bpyq0D7IC;r>jxq3ot;02%LLvHe{ zr9(~XfkcP(4j~QS=z807RS<&Tb=YMRawF^LqqTtoTbs_twVPtV699U#2A5KwL6C9rE1z7xP@q6GSZgopWHb(_*Y(UE2Fp<3v3Mj?< zdb^t%SfW%_rzp0esHwA*Zkg#bYmtwrF<*t#8XNP z5?0>F-4Ky5C%A5cqxcQRSAg76p|6sQ6R=0+~SyJ$*vRZ%X1z*lk?+a%WJho<2pxo;uIt7Kjq5d%$MVyH!;xKFu|%h+Zl&hrnyyN}a>PdVX4PG#b3rqSV% zuJ+Exx<-!ktFNgi)m7K^boPu6k8&J5=LH|Q-z(WvjnnQp_4Sc|JVFo8$uac$diJ@$ zJ@^p49e3nWYsOY$m+_4Y1l8eb5add1t^kN&#V*4_WDhrn8jUQG@;Di>_w?8V4B-{Fpvc|*8xvFpd=D*1OpR0_XW_FUfl zQ{l)a2F3^7Bm*xC9_WgfP!W=4BnW4ZdT5B>3>xADTf3=3Y(vxlA`~NsHGCB7s$0J0 zR{cY1NEFS1u8qxA1Vhq|;0?`;h{@99#_kS zsmzbLm9PLC7&Zz1l!K8hyTRmHQOK~#{3A$uRPE?%+*p6A3b3+L9stQi;S3t$I?j$% zH`=_R(r_)|xP(*k>w-7MEkGV`5P=upOnY_MEs|8%ODRs4vK6;`R#F| z8*i7LV`Sem6d2e+444x;PT-}nn%TnFbS@asaBG^Zsi=o>1kyAK4afd0gpzpLH((p) zh{+TZ@d?laf^?gPYl1>1r1c9^k+>iou#^B44p2gdfJ zDr9DsFP)z*_@cp+Fb;llh-$X-#}X1FZcOqIyRlAqjn$@9HPw7?&=hAA$;JYO)#VMBxgoyLPr4!2NA#y_H@iN9kogeQU%ig-o1>TZ ziuuVLA}(T`Kvdgs4YQ3Gx>3Fw&<3FZC0K-p2F;S@VMs%cQkp*jRa5LikHYOI%*Q(# z=*0VMgELS#2Mt5m83%nHR+(H9aK6xxvLPi%H7gGsgaYMkSH@7!%0y-lu??Sa z>uz@AyQN!!AnPe`%*x!K?6DTxeR!Kw*`c~dro%uILouKynir4(yM{EeF_q+!Qu*d| zeoeOi?XnnY|9Su((l_;AeB;%NG{IAPxp+#6Gm#lR<_%k*p>j<&%@+2_(gW@*yKRfJl*`KX zJ2zbGM%6xD{|A{j?8l3aZOB*2lrh}o)+D72=X%RdFAVjEr+V;3EAN<@T}>?y4B+@| znRvZZIJlAbg~Hod2a%$;Ty>==kc5EhGL>9s`tXHP2oP80n?LPV^6mdaewnQQj$8AJ zTqkN4MT2d~x{r^!;l_fXvp3JWlD=O`5VA});yP_F;{4$E17$!B?P!uT;dCh3D{Yv^Qk1@e4$av zUxtFAiV_q2WunB_&Q|UfLX`Nz*#uLjHf*&WWluwd`Miu`p{6e>2AruCmv2Q011h1O zVp{^lii&lU>#n%q!l$2mR_sEJr4ek&g}$aGxddmH6LAU|Sq<^;r=FUT{{8P~o__kd zr^O5uJ239)e;#^>B^&QN*^L}L9QEsZa+=x%8JBQ^ZQ8bK5 z7?oI*zjG76b89T!>(&q&fqb8qa7io&hNO*q%o}1yU>nNqu?-cAJPcnYp3=M2HYBd}#TqZ@F>eDm6@z z#R8-IWI9^ll=vs{k>Z4u-D4OGkKEC0Ljr-;6XQ|GyT$@l`_51Z&=5%YB>6$W$bUqt zTM;91s=Tj*bG=UBVYusK_8C{$z6EVzhA z;w;T)0ph;tE|vl6FA%0pCr?QYHF63@HpkpCi~3p1z}G=7OWiwiviOd7hi|q@ruIY@ z6Hj+n<5vWav0=x07GEe(Hn3!p4G{RlV4)ulObj{@%y-HWhX7FpIgE*JkF1Djh`$sX z5(>+Wz!v9~yngAxAJtv(nA?Rlk90^7jvnVEu1ldIZc;sF0xB5|BPJFq+iPn+>_+sh z@kcw!a+|}JcVXz6r<4sJ_<6%DryNBgR4w%7>xdubv*qs!Tb184tQOgKc{{hD75x)a zYBapijqq(^5;Cy}1mTf6RA-~%0*yh8M}8zoxBvgpFyvh+z|8<+h{9sWsYf9~2)KkC zl4y>qP|aiyg+$eC<%w2vtMMdWVS5Q7hOAFtlDLI04+Ps;G$;r}ng>@~7SWz=AQ!mo zw$KW`$f69Li-bE&?cvzG_<{@m_@_U4hn1__f)=5-BtI+KM5Jkv~T3$GOE?23w)F zzN}}4AiiIXqOpa9EWKazqVi_2C9JVP8nx-5;bcwoH=?y~vR42$;7{H7Puw`e-Cx`U z(IePy*gluKkzMl5ObKxWk{nYn!8q!lRJP)&J90;&Xaq6pDILRiYH^-MK<-NdI+$I& zgg%+Lw+_)fl-1+zT{T& zX=98h(l^}L-TD?z-Kigm;UB*W#J86!S_U2o}Y6N911+OQ++&d zxSmz3?+_ZMxE%@Nz(jss7{!SE6t?CoIdA=_iXNSr#Y2wka#d?u<`YpXOI4h;c$m0W z{&;v_O!Ki-j%?Rvr%vdJ64I@jgg%FBc8jh;9ec>|OH7@;>woOVk66;x%$jClQolKDt^ zfQ3iJOnXf=$a6Ywb3PoLsk1N}FpMb;J)iA)iIB0?6UCu2ArrkE!m(swsDRv6*`%ql ztFj@1IWA$76^1Me)hPFj2z5;MRbKEq#U;L~xNV{;y!8ESFCpYj$v(Y;)%r^nX3&sP zmzP&S-^&XX0F9-&8=~Xy$c?#V(C%z)Tf1u2{x93-1MfZOrmubd;fEi_4m1y^u`fwI zH6cv_06zJzC;#-PKi%~0n?Cm8kG%Wzx4v@Ey$PNf8XW3qZzr0RA%#0K!iOC65cGmk z&#;K>h3!DY^74V$Q;L7`uWsU$9ibtfQa#~Uat(%w*FoU1BJh)$;iwK3r0&I$gso9=Q6!0F{MI7o`f~v&=5vclpWiw5{Q`5dOiG~|0HtYxe%Q^T`iobp@i zJxhj(M&_I1^T$ekH$g9HIiJEDq-GU*4qBg5C5S9^R@YtahSk*|AyVIVlY19B@UmjY zu1*m}Gx)HCu;M9|1Lc7l4FTe4uKsM9>;{NpssmzH;J#up7Gm{qx*nH1oBZG@<&Vuz z6ngV;;Wpqj4Ovt;lWq&WTo?`QXbI0m4@9G3z(Ii{Mx4i7v5EZ zaEhO@%%QY3HFMb0*ox876)X1JXP@JbJnD#79dglm=U;vK6(70$3UU#yyy}DJoxl0$ z*PM9RQHSie|E?Q0vYLM7$cp~HzV43BmWC#R?r=NOp&ln82hbC8=})Ckn1n_{kG#aC zFW(k{_t;ku+mIj3y83?NpJ5V7UC&=QCX8vNj;_HtioUf=7FbbTUdgv z2HFNz-?QGZK^&?%md~H*y8kNZkujFdE#Kq%x^(Q7FwV3r$0It0_!GK?hDR*!vVk$S z4RgFxp^V0PBJkqzqHolF5V(Tw%AlXPZ<#FUDs z6n$3Tzs7Yjz|ubfErhJ-d|$*Jf;riN^PM}aB#MU3RWQe7Do{>YifG6?()EUTN>{VO z0<44(nU%esIpG;B;)U7iKi4Aj?}Tbun?`CX9AJ66|3^~8vR8)sv^`^!_E`{hcDT7foCyKDTD1(>is);agv6HEuXVJD>S^ojTj9Xa-kvCLHICUnK2V5 z@IK{2L+m4H_yF^UEEQKjBx>M;XcL5(hO#CCE;E2bL&kj5B*);w*GX6rG-PH_5wnTF z_=8;=6P?86FxSQwXBW6$-U~N^?>}=B$GWaUI+agXs8uN5PBRZZ4e7_zkjH>%V2Jz5 zts^5*P$)5_RfR9=nmYzkf^$CY#>Oy@jGnrADKc*d*onVX<9}Avh^Le%!9m9w6J32T zyOt>j^-LwKFvTK;&6S0hr`lOQi7|+6DCN3`3~?{Sl-iqu#VmDX^*#L?uq+zHWLP6p zcsW4;VI%~ZKts$}cJ^MMst0q-LMjc%*fCXUxB+MqMZ-6OJ;=Nv1}SPl&^jc?Uc+a* ze&>3kXp~%dN~hR6ov&LQq@6dLdQH`33eFhzkBVtX?8?V=-cUM(w&}{zY#o~z zV4(57coO!Q9b6`R#bElGNr)K;2gR~e8X`!!%=A_7mTJ9Ge`7Gyjl1|w0n6P zD$eF6ps$@q;limmo6Wdj8UjJ%pf?OdAR65$L9l#2yo&)E9oST|Nl3$D?j%b52%jhq zX=pm3LdjMo3&U2(UI)Qfg@yk+@;nh1K1^{FYKsfEqQq!8TTX}2!R{r<(v4pb>}9p_ zm0%1+(v=6L#~H{Y;bSzC3h;PIxQlGFX|=*Z)ObmB=UhMxDTB<2&5aU;TYbsf2|cA8 z82}BLH{=%Fs5lYOLY2)M;wgn(tU6?8HgkSXn}o5%kAXbv4a?i`l&T@dB965TiRL4v zf1@FJf`%*;lf7v0aI!Co8fc&pH9og>b;Oj8Gm0{K_anCk+mMl*4pHEr4HXTa(k4-k2+)wlfUTUyD~6t) zBd?1rprOqhf_U|mN=zwJnSADal1hQlu}L^ht}|c59(TYC7vwJ&@l0rlr?gz6 zX!wNrxMbc?S6BchY)O9Je9nzOB&Mqv^6V!1ik({ObHcAVXozjdLWUDv_w5pGB~E}_ z-Q-~voj8FpRQ<>l9Zlw1jtrZOC3UgoZLaGH-bD z3)D6YyrT&w@+p|7RB0&lh8)agJ*BoC zsI0zc-Vhp61!BMrNJ8Mf8x1kI7z}M^wpv|Qk2{np!iG%YaM$(|w_2wu)+@2g#PhN_Kx@b}TqA~+0r{jt-g$(c5o8>Zv?8A;#8$|W5eqjY0#~FeZvayK= z)VytIG~_w44V8vHvJH!@UKIO?l?x<^mWdCeN9f2_?N-$?T&QQ;A2rrwpHgV3B!Y&~ z3JXZ;X{aWltcEauDO5UF{n!fbDQq9&Co!K{l}Rgl(|JP)H^te=M&j+c8jLc5xcEpV zG?Z@>D@-N?1-NW;YPR7DK66az-@B=|Ef!BHTti1T%~pMsJs%N3iP4Z&EDpssY{^LQ zDpjzFN8NLI8$0Id`x2++Rc>W(g)C$7otRaa$a||B@bvPl0K&5K-gy{?`9{|MixU;w zumamqycVoCY|sc9Rw;tE1_PYHv>N7)q-)P}qeK}&Lw!6swu5=hIEtp0CsZ2FjlZz= zKZHUI#x2{1vw^R;-1CbnFK-vY&lr~UlosR3N*LI^U1FGxI7eZY*Nm7MbizIpO{hwg*d>GcbouO|GDa~p=cXYF z)}iTJ9>GpYhwSY^x14+mJ%uLa*-3#+U;@jfRBTm(=H}Ds|rQE~O#A##v#(h=($m z3lpEAMbW?x66f;l=3`3LM@mpAl;OeF$v&m#DTRis4{_~`-gJe6ELzXxIVhGx57|JK zAQ=*;9dV-H0KP!Bnh_KVVWA;=(U|2D+lG1QX7-~6my#1H3JN*w;3!9kCflmufaSQo z@z*Tvt}hq1@<@Vdn*=l~PXkJ^^(bEv#gxh~4dxlK4LO$<#IrsT8X5;N?gXG_QKqvj z&pazP`jWa1Hb`e84?=MSmD1498;Wg66R2lN%tLzsj)bVJ;!p|9H^zB*$9sR1>*EYx zR?~~g$zC++sw>^7MbSVaA}!lPm>BlvyDb(xyo#$5C8kLs zqn5o)!OJLcU*Dm>jMa<(P13MfV~Zt>%wETn&X;(>7{m$-uTw10k*QhkSq6ikn1L)p zp50U@6KN$~scdSIvNnN(^k!zG>5$V2FGh7ECNcul2w{ip=@!aX$Ux+4w^88X@sx73 zt8Fa9sP)DjdWfPif`^@Z*zt~_AqUR#`yBg=!Gv9~@Z8O?33Zbh9FG*{*rznZLPCje z#5R1$t>w5PdJa*D%#WeH>N|g}9x#R`Shhz+3;s0j%kl_wZ!%KxajmbBc|%5f5W^XW z43CWA+#dIRwZi|RXQ&ZaFGbgVag)sjwqBW4>) z6b*3$NEplo>CUea6Bc2%%02sFj;|@0n0NH8n)%C zj};o)%-|F!O^;?}BG{DS7gL;_<&|%D{p=vhyJICj=Pd74-oa-smT7Eh8u4k>UZ^?H zbr4RBfz0|=!hrWowXkf2cu~wi9stXFeOUtw^T8|b4n9mUji;2Y*jTgA9VNsxKA65S zS3O*T%XE;HGTfb5qrU{Up$DIl(O)Kn7*DfJ`OUw4d(zO*=7G44q}yWiViblnG?tM= zJ)ir+V!^ONxd)Kf@g=hfrb(?AX45QL4j{nRf?ggmiB^KYX;fnAMaG`jPYA}%u&}r! ztSu>fep#&$t(2arMKu8veRC1w$QHwyK@cc}j4LUdCRJVt)#!n8pQw_O$Tp0Y%o}vj z3F)(SGGHzFg1Ejz7QS;lJzQqM=QyW*8@h?i1XXzR7_={SE7sODN&F$}mL7oaaRip@>?5wOlqiU1|gQ)Q&3{WTJhX$)9Izo`DhAJ`*H&+bUEF_v3 zv#j+Pt8IcQN;)y_FaX)k<<+j^Rz16x-oPU3%U+$uQ3(+;1o>}DHGj+v5fe)%44#}g zziXj=u)bleu4%NcakRF1x2n$9xNgGrZCy6M6WCIKh4TmR*xtlZN~tXSngT(Fce4%o zFolLXb;ulLT|V1isC`YUmoYH9# z-N{kQ9A1Bmn_y`nI?Qi=%T1iHsJEv=OfdYhtTY669QSZgS=aYu_EQXS5{KKe><*H$ z+@8rw*av+i*JXqFNU^8-s~V4UJwKB-!v1Fbo|*crTe(ZFmEOP>GmIEzy3~T@^Bip` zUe>Nc?F$PXn3GScImwNf$2_bsKslzF01kfX1R}>EvNZlXZh}1=z#JAdfxDZk+E}XD zQ&rzxRnP7aD{7k8)poqy4e*DG(}0ikEH}8mq7g$9#)&U9SLm#)8>ntPrkp87`Q1XW z=#j2xu%@wHcr8Yv*ooMNdF;e!IU%Pz4NHXWN|qn;_r?tPg<>1##4yxDD9kFvsGJGG zC{zZMP>*C`>nAKI#$-n z3FhmnTaR?@9B9rt0z3c-Lz2#a=+<25dJkXHHBo5ksjQnQG#~0Zuw@8_XQ4fd?)C1X zMq9Q3Wxs0{7c=YwM7Z3Yu3~#tPy;DeR7Xa57-pL^#+sARt2Mh4o7@V`W#%r1x#@X-g zMAyZcxvb8>3TDj+pEmul>1+I`tAFTL{@ks;)2*hQ9oTLbqiO9MckExkybh}k3l0=E zWoyPNTlQNDQ2M^?#)ufFHh8uw@YU z!oPjC>pf&?_e51&Q&kN!eHe6*v@2b`YemyJZs;p+f-mAOx0=nBm;|oSYlny|R_fEinmc!q5Ia^R1gR1II4!J$i?ZV-|IiAGJgKQ9HKN1D8jZ zcb!xicu7^8OuD7Bqt&%1<@;Zo8aQT2=W!05&SPBXu`l2*oyYIceb`Q&Cshs{UDY>L zXr$GNnSmovdqMlLi$y_{7j>NIIuBpmc5-&`m_q-HDqD^$^q-U-ICgRO2|IKhw^Qda zJ9QoNf*v|N?ggDkFY7!Z+k1SjcarFMnK~4ElAXcFGIb{{?LBkH{^NH+whb@OHs@U@=2xc6O)htJ({`0ORaXYV}pzGafmT0F?EtxRUEOE>gY zRI)rD6BX1}XW64B!_1&CF`lp^=7two?9|Wp)QTbK$y?y`BLO`Nz40>U)*!j3;K@Vq3491 zyXg@9ce~;9cV6-Sr6cT*ciy6r_b*<-GxKZYutl9ODr*=_S9ORzD9?jSmO!A6eBFVW zZZ>B-VR_$)i+WCw)J=|j(xUDYckVuUX)oU_CO-(qr>c(1+^VX^BdZ2ppB_4SN#Dsk z^_;jJ9|X=Q^)RrZfnHbPI#Qkg)^lO&vmJ+~!DHCvd#A%5F){-a)YG8Td2O>6H{1#u(nJ!==Ybu0TV;v8wYLa6Q^b$Tc+mWyqS@q+HXS;`=$S*A9f?Jdi9 zrV8~H=_Zu%UeY;2h1{sIBHf*-!b`^Cv;7r?wsa->^{U4FU41G~hYhJLsVi04Q(oCt zk?XC*@~VK}R(IaT0BsNutuGl|4F)ex6V4*iY_$s1BAS9YfJy_z=? zdXZ)gevU*d61zrsqzc@wBb9HHP#jVfkH;q4cr3L;IV=epatqc|u=$#;s)&4~@#zoz ze&|hC^`)y?GnH(|&F-M&Eon|&ujHojB_(+lQ}D)HGL>!FLRUr-M{jhc`80^?EVO2; z`%~53S=L+>c!MmyXv(kzBj1wBcZzZqk-gpNJPO^}nl4exGcn4XFY&j+=r|q*NWmIh zrUR*J8n$JsNUfPFIy8a2C(B-)HT1*$8v5!lEfDa-u^NL~&VDs*qzp+~aoLrv?q%vN zQ`480SveLs=!9UQCs#Y1sb|iP{mDDB&?-Xgo9ep4ikcaOu}OdHLZo3!F(OvqSKwL z>B!aKBH%X(Z-ER%_%Ui7kiQEWn(n{HULAUTAcZ)hllM8z*7 zos}o3H-~K)0?ue+CCCVdyhOQGg$;cZstiNc#4b%vu*_>x?$x{w6!Y@72u4G*4egL7 zY(0!cJjZ&vJ=+4v-R(uGJdE7h!hDDk)>iEA{ZMrYFgqXs_C`kw_-O`pLIj~->)`D~Fc6P{=O;B<><~{Y8LKb((xw>L% zu{DjlLy<{L7XnABESD7udH@qHQ<~Tjhth;IeVJj*2&Tj4=2?|h9HJt*#JZ$q-*23~ zOxO|GVsDvqX0&*Mo~y$r}!}C-AVAOEVZ!c8Za#}KZ;t8&83zpW@sy6 zDwuc$@m_K}Zmkv{{pcA_n&Y{ZLg~Tu*;QLw0j5Twl}rK(QpHaz!L&S&bZ)Y&!I!ze z*d)|=7}r ztSv$?p+5&uinvsQ5XCxSNd%7g&?O%fI-A>bj)zIGsrW7^P?%5)nH5$^xdfc(zhTA9 zRT4G{s9I5Gx?I?}ZKcSJx8z>47-W-^wmr&hz`x+sYSdLDP2jfebQUC2F76G z$wGUoIN*aq8fq)qR}DeA7Wq7_leSzf2^y*mC>=IygpX(n3S~kN4kBzn6av#(Y3L2W zgpe=;i!V!oY5vHYLvvOdh91#S4ry47IZs0m5rks3;*wC`6NHg`CKlw%G)v~8a!Cc> zGv;BWpeEsLC=5HCL$>D(@934M?-&<(JSE;8mlll~mPg8Q@F!Lqi4P?z*MI1ke+`8m ze+e3T6q?=VFAXILpm6CG5V!<1R%n_D*%u;g1*u3m1Pko!$C+VG!*2?{h%0^)MD3Q zKv6;yUUJTaSaZ=r2`VVGJw=U!ia$UmG!)XwdJ0(wA+v-MnJRs0xtLJ^QJ5v`@gW^6 z=xHKAlul&tZUnXtm$|;k@)CEb$e@syY?lr1WYcVl1fyCKvCr%&3@ZR9*o~(Sjf{## zfQ6+d@Df3RsE8C9fn1n~Z56{yG3S>yh?OVsQZ-eEWnwK-V!UI+0X5bDq7#hQF|U8-W-SZCWOFRQ4T>Jf;2?(+Y7YsV|wEh6&6WAQFWo zFHMty-3vCzGtOI~uQG+%a@6d#AcZ-a#QjbGOV866q2vi0D9oxHHdL8+Y77d00odE8 z#5m|_=v$*O+sl&?1y47H>2wQ&oz)uSV3SuyFnSvAyqaBFZlFZo2B?XbavPdY@30M$ zd_Va8u=^;1hP<%j>V2c;P=fttA=Bi@@ z9vbGzvFxz*bOKRygmeNsIdn;yNGl2TG3Te4nc|`}hosy~@TUZn!{Y5y@T#Vt5lXGO z$ksz4DvYrxJ95V$i=n0_7{;BPAt-jADX1L>#l$fvh2oI3ZiS3$HYx$lt`xjVG9W@g z1uJS|QHoKC{irTV+=Ezf?361VDif)d)08m2pqqkBEkPk#ZKW7}s6k9cp|n+QiXeVV zS#Tk(L{pNM>naRnj5ug0PDrK#3*z|{8b%X>QUy1Ks-gxB1%FYAk{4(KGL3K1ezZd| z43&2#sC_3^o|ttkkx+Bbn8+o`R@P(6$)#>M(}>ZBWe4fh)rsBL!Uk)VQmD>Pn+>#; z6yUE~YGtBOP$&>2mxh>!TTR1R!56PmoT1?Hmk>hgg|gv^61F6555iqMw&p2#mK6!p zG)#0AXwH}`+zJ|cFnJCZmr&&kz2L`uUoy9Vz9}HswBT&|UK0hoi*IO`np4Gk`B~Vf z_Y$LWX1(t)=x2s#D4J2E7amb^6|WHVf|1BGQOv`zRkZS59Ib+|*vzy`Yg?RCYb>)W zk31uw*ALkjYFb-QpKTDP5k@B^Urf)1{TtCJQKFeyCkj?BL}RJDqA=0~br^%fL9ql4 zTL?0<7rcBqnqs~|F_iVir6me^fi$C`^)ET4v7P9Z)q+#wQIUiW7_uCl@Dh+wCH5o6 zoh|5-CR!NhTpFIVT;|b)fMOMj7gQ-3=_~%UIW}q3929z4`Vk$q@~lq)r-GnIu%#Rn z>cyDzurndbwKi%JwTgQX@1+4w&8~=0#>A+~$faFriIR~^*e8ab3Tj|VE3qY&hT3g` z{ph5*7V1=;HcsVYPYswT{p5|}8o(nuH}sJq8VE=vVt zyDy4?QPQa;s5InKT4^3Fk$?qwusm#4l7^u|C|ieNiOO4`q3C#Q6*Zo%U2_8&gc`*$` zY?-k}?%O5=Q)U?VtqeECO(>zttJ$S5u~yqLFG)iR{Vk>eq*fkClZR0`tTO$uMBc0> zA)4~h8X5$BZP)}YRaP4?1|lG{LLr)R)9`09jKkZh#1#5a73Ovs6KWbyzC@^`9JJh< zhh9NZNJH^_21#u|A(}vtG{=pgp7mw|xlh8r;$(bOHkqYH&T|SY<0=!ZR%D&R)8LkA z6dK^DRa8Z=vqIl3)}Ojt#Sv;yvnsVc)pAtQQOK$BLc<7rGwx#jhaf8{&r{8}HKUJ9 z4@AQp6f+unoLPzIU|7CQvKnqSyT>-9Bm-jP|1>Y?thtBa3}N9;(HZt#NuzIOA)u^j ztDHV~*N)%S!v~{nw>{=eD27^lRRd|Z+G73Ul41h-l2F+fdck04mmYkfK$TsFR7%J; z%rmeDcI2`P0yvTiclroTMR|2{qoH5z5~>6zI)& z7z*aY3^kEa@V-sC^wuA@phlAw$~p^8)=KUn#^Ag{VnQaCd`r&M!qquE`^X@yxQ@i4eLeG*@2JKqaZgXLK_f`VteY(Bm(0>C5LY;1LCdLc_o?6p!ev1oTx{h0_pR zI03`R(uL6w4zhs{DTZK8d>%b~oG%RlmeDXI*MekEH!qZI?rXi^Y3K<^RanSnPh~@I zp)oY;5^{(b4-qSzPtG`Rtr+J`o}(2C_6n7^NW(;j^dL-$_ixb-VV|XGj@wg3_fufa zK|`2W|ZH7Xx=7Hr)Oh2Td z*D=9sCdx}*qFl0ks|$@*G&g}fl|S7t zBri1#ktvs4oS%}!B-Ch9!@)AE=DPM@%GIun`c#Y0w-O<+0gL4bg`RGPMStl9El1h-RZK&uWFV7VTZNiZYh9^n z>8nDPS)aZHeUs@hD%8jpL#Ktfc;!%7CK z9MaIcL#+_5Sz88t;YD6zG6~f5G*mY!-cCuxd5W^)$#@|*wVB5_r?wb>VTnC<#3`fI zJn|4diMBivcAUm`%6jvU=|G45FA3Pud+39Q3xgU0ZbTT%-{K282hwO zod;Ah!WUEUAX}*5&A_l>Ng8_Cc?epGFHZ(7<5R07ty!_Muf4OWuD-Fhj?_?7Yl7r8bv>=^ zYllZSu3ocY)tdFI*X+7({l0s>Y|q{I=x*=8c57{H+H3?>S=F(^XZn}_U5;|_04a28<%f6{q1jh%V{TVKJL|rAAR5<#~$?RBlbJ+ z#S`mav_`(Ho|d-GhNkw0#JbkSOs4oI}7WG!*t% zHIWj43oi{HHvY>tFOrt&mM@~^;ez1V;R`7-SdcT|n;doJm0|(vVZ51jX8b^t%Gqd` z=o3x<0HKgj3#*Jlb}w>xfh`s)c-iZS5YI3oPQNL?eo)Do=$U@32P?N$Mnf1xn5C6i zhhfwuk7N`x!RKbHddsmS$h@-k;B~CrU;gKWxk+a1(dK`m&2JzU0D-F23j@a?+(2T}7B!|#6oS3kS$M>pT{=F{HL)*xr^dK4NN1y!++)WcEOl*#QnId#gh z$DQ@2GcJAK`PY5;8hX3_Q`ddu@+;+mFTVJ)i=uSpC6`_I(U0Hw+0TFJ+RuFQ$`4=q z{tuk>mNO1``G0jZHuIbYK@UU&Um~A@x!4}`j4Q6CIpB*FAZaEGELv*oxZ`kl@17f9 z_?p9xc<1SFz3BbtUvv4D*MIW5Z{7HnpZwsKU;Ox|zrEwmzy9%058eO310*tiAwT%Q z0}tJQ|L^a)_s-jX@ynn7?2e!P{I(zd_^Y4);#aQ!!WTdN*{d)6&=nV5a>)lTeES)1 z1)!UcJ#KPn6jN6oK!ZZbLzXR6_B2G0sX%jz+O(kL8V(xMFoD1DGJ(r&yo^z3;iFrL zLLj*P2)HoY(4R{0sRt0f?1coOEL0{@xX{Z4)cj@Gk1s4K6yp!I;zEzY`PhaAE5>sX zmPLmE+6HI|8hRdC6Mtz;QH(@*@d}|})HCbME2A(Q4Lxz9PK*Ar&J8iXL$77!9z$G$ ziFwfw2panW8d?cCJ=iPkIVw_pUyfkl!!J6mppRjM3UL<79)%`QRg!37lTcwc{ZMDS z$g`2o%C|s6k3s~cA?{F!)7#m#%lZvRAA0zC?>*=9pZV<1e)QwNJ@DW&Pe1+q^Upu` z+;im5YbJt<&ph+Y!w>z>?LYhZ4WIwQ#phpe^6@9^_2NB-`uZ_5c>qS>zV7bz6O;Sy z^IxZ)e9GmQT>6z8Zv5|G|K{m`KP~-Oht}0|&prF>v%kCdcW-+AY0dQwd_G1!qoJYD zyGgCeOvTpv##O^3d+qU(V~;%QoOi$HGoQNl$G6-HO6-}r3y)3q^wUq@|L4E_=;m8L z^NCNLb>=&cJmjz!Z`!4=qYKkX`cae6@CQLkr;sq@}T-jM43GGEHC-wB$d$M>j0h){N*oq+;;n+ z`|Z!~ifI~dm2FrIO=##57Gln1Uxnant*}@jR1Rer7hcXLdlVu>O9B^c6=Fz+{Mx?q zmgfzNY3K>)g%D53hC&IIshVT2m@QP5q?;9nx0^$)n0oU>Ax!kfV2Gy>b_Nl%4b_4R z6(iY$hHEb)*d+tL$t7B95qf}6Xc)AXwpyNOMOV;-S9l|TFJCCl%`THVc@irz1!Is` z*6>b$HLEaf8`}13rl=dsM3jszL92;K2PNb6g9bm_uLd@0lxd^|;5@}V>?lbPFuW9f zH84YjS(v4i$L>~yP+<<)Xf=nzJgerWVR3B;Krdqz@=|B1#J%vw?L%&=Zx~-Ww*Nk_ zxcK}J-1nQ`KK<{1M`Lg>L^ERl?(Tc8y7V$E%8AwE9WAZEi{^Y3a(A6@=z8VmQ z`*h>FDR}qacm0}f5(7RX{IkzJd*AQwd&8-(#|_JeAjX=`V8TH|pzW3~X_kQ{K$Vwc%+45ATyh41WF$#g# z3>w0|5Q{}9gff;e0L}U71#rpJ^7iYiYr30TU$l1JDaW0F4fy5jzi`*>zj*wy$K)e4 zp6S1OnS`4>bP3#vZt+VrwL{7E^~9r(op9)pd=WxJc~n_4UyQb`C^6g62<3T);7bq; zXTFexJ%;bi3n-WzD)hpznK zh5z%w12%%|ARUdlm~$Wh$Te$Ljxj~Z4>^!TL*I$f$}T02RQu%FhWZBpC}VbFv{xQT z_rJgIzEe+pEp{c!LaUgG#VE8}05Xk}kzl%l$)#?YIBAXT9f!>pt__ zJMa3}lTSXYpPjsMd+&xYdqiKVAIiV~{qM(v7nfd36s4i!Z)T}fNS(YMd+f0jUUe8> zq9NOMl1Z=+t|dz5xD1v3{Gc%|WLa2}AYk!j*l=!H*(Z@ju^Mu;gfLo2Xxqhw!Q2+4}$MU;c9Pi6>bE%EB{>_g(@(8~f>@oBW%6mkJ$f*8dKE^-Y z_xrnU`^Bv{efL{m{_5AibmJGU`^=|4@=;0GeDvCne(d^Bf9C5q-1zOUeC>zd`5tO0 zWBNrvj6XB!){1btKL7kbANl8N4m^a9!rQQOkgjBv*?`Ossz8K{P7cNk35`l2;1VS< zw!|v*@>UC;hPve%s|eXeZAO|Ua%OtDM6l*!x^N*V1Z~@kh6#Jn+lEo#Xvn5*mt&|I z6Uj^MFf%WEFl=bHp;(0^vj;7o1%i$JRhFVC8ao4mQQZb`1mI%MQY*9)53dkCRwZi6 z1=HbDO5&FXP1t|fo0sDj@~`#*3QHtVW5_e;sAhCWN*GS9oE$ZVbdcnA5a`^-dGrh% zjQ`25;^$Y;muSv^&H}uchVsM;S?f>`tS?U=26o0zE`13?$T(kaT(I1?@&xpP>7!tG z4E4hjyD7PK6$tEZlN zO7Q1RIg#{2^JkuY=E1-G^=G&I@WwBG@gpC);yq`a`P##e-goysUpTRjnA^z}W8;G( zq}4+s5_kaF!KerHfF#qVwgZ9A(9z5*j z`|*coq~n1@<1T@}$bO8&Y|ymi;T2NPWM5^1FAOz(RYG~8mxe-HV4@2s<{32_Et*&$ z^5*cJE|iAiLG_C!W-gs5y<%cE@94HLF{YugY_@(voly1`-)usHfFTNz%^0-8{;CE| z(=?RWn0TTMULgCaL%a0A@`CXtybNW7juC;}Ix%664o%;B)|@Ryd9bBE*G)&48Ri(S z4PpK+2v$X&c+Jp>=g}DLdD(D{K00=5{$Y+Oc4-?;(B{T*_VaWePsGDlWZX9a>iuTC(nxO4DvqUu(Vj z%lQa)M>NB>pvSjGwqzw<-*kL!vB1}{>(taO-~RzoF45R-jCua~JAV1g{a^V?-dc#i zgiMEF374#@V?9OONANG0P#Q9>Tj>wK^_>IvemN%%(Swo>6oz}O&5+@m`Ad0&P1Ut$ zobtLq+Ov0I13~7jr(MqJ~D_*+ShtB`t?LYd- zQ~&zcG@hP+{uyJSy{YFgs2}~!ukQTHmu~pLyWV^Ff4y>QW_c;!vTBj z&A05qHwO(v9gji;uocn`*@G;U6KZzpHMdrfBQ5;2AUlX!n#Bf8@Xc{QsFd+;S&Coq<7u^~E^OfzhP42Jkv){n3G=GVUA zjU5lLyYBeaLHi%TXBhG>AzLTDkjvVt>Z1-h)H-?gnP>m;_rL!OeCW$_&|iN4E8p02 zmlwh;4&mi!+`t%27>Ro5lJ3Y2O`2-LiDVfG)OfF5%)dUT-n(%QN1{xv7tc+Te#=goU&GQub z6gkC)iUF<8Kj9ETAJj2`s1M`<3*m9mK(n~--#06jT{tDZ_~r4K;}<2O9~kf&aM&2<|#6lMuk zOus#8h!Ywr_zDPyKrJh!LBkE}HxPAR_xUeyO#@z(n9w_*z#1SIB|dZ6m0X$UCARh= z;JS6FUZMyk?X66DJ=3h&T6aRMcukT#5b@LYc3h@z`wi55!=l8$)?U%2+{*7n9j>S*HKnqlT*;XUr z^-Ow06aKpsIOE_-KurP*vy5S3Ym(ddAOG;bJ^JXQ`n%BA^l2#kg=dPsKUl642Gj&W ziv7SheH6BL0R1%+QH;JM{l=FTx z%=#=hV3&(|Pq15Vps>;q@D(iXGah^_aNK8nfmTGx`G_4Ee463WXXOA{Frt-QA!ufH zs@N=z5WUE)a(p7lK*lmtu3F`2!fkXEW@zA0ZYvp|I2QDrX()pVvJeFkr$!fRgdNf`lw;( zb1!O3m6TD`m$GkH7fv-E^59WJ4ufe5@UGz)Y3Q@N zMLt18HVttbO%NJ1q$njhu_610IAQkY=;Nn9dHD%PK7(ufk39I0ls2p5-l96QVI}a> zmt1z#VNc_oMDebrMt6mV_JZ9J))f~_&UyR!Z@lN178~;6ROg=@3{T5d2%Jl;y8}OP&(N;bOn*|vWwnxBVqELvv(NGZFX&P>ydi_q+^dn%_=b)@x z&X(IHW+qyv%#{bFj=jQ8n|279@t5U(F(CRCW99rz24YkOGz|c{!gg@u}4yXrUQXcQ*}vGft$VRv&saO<5~77Ha^J%PflCtz|T% zsvC#sZ2%QX2o&vm?PlN6z`?+3GydzTeLPj3vDe4GlwT#Q3ZotjHTIb+yJcoo^?HTC z)SzK7QNXg{RVLc-JZ9t@1S1%1pfIzqfylv7>r>l< zhK|4Xok8sqIy7~g-T>D>Q5z`S$zZUtW7v;|y<$c~a7n&Q8V5w%*Cl2IxNMwQ*>PKN znZ3Z*Qa`#?6xuaFbK-fw%|SWI5R|M)FvG4bkImb2Y(8mkPma8Z0b`?Ze$X%r$U-5r zy@(?rl#qhij89DaV5+8$EweBH1I*aM0nL4CwL4-l4~O&8sgn+wj{qT8nCV$GfPfD95#nURMa{xCC^)srqm?7p|mOh z>Ywq^!_q42LzV~GH)IvFrOe!A zJCm{jIKa`+VAjx3%x%?#-=BTMFMsjc#~Lf8+qV7h&u%&M^cV80W;}Jv1}x{7y`Q3! zhT!kBmtVPZ+49-D?XmB&y+3`$r@3YqQ6Vf;hzM_Zd<_xe(N8;kg5V5qT95U`M(75f zMuC*Q&zBuWqv2nt*zod?e*BP?tGII)ftWF_i+2G&3E(3HlZ{`jj<#B}N0-c9_?Fk7 z_nW)#5v-ktWvE6&iJ)-Prtf_7TQ7X>sY~b1cW>nt_Q*3zIiPFE3L6>QiiL|VIQw;L zeZ3SK-hJnqGmkx)n=f?4Dy!m3VKHbZY&A$1#eOvG1H1MEYNlhLFpzCiy?n4cuNNW) z(6DR{%5vwHMyE-`VwSHBE*>6_V!bwKFDN8IE1^wLYsiUo+kG7&;G2r%cLsHHaH<~- z+s?TZ4+{NF6EF@zDH;lV0mKk`Muj=h^F`4BA1KteAVNDZ6a>i|No?wwGh;K6G7B-a zGO1GZ37ha|x7oAy;Q1h$JY!;)0rM$O4p9@D`x|s-Gf$#nHlPt^PB#U9!5{CG%e;~I2Upv2c;7A>stZ$-wKnK@}5t&E25%}o$HJ}B)Q zCAvu#n?m29VQwOKj0&aZc?MvEuTh>2$v@O$qqcaCE<#pwnUM<|*vBXQ$Wq?qkUW~m zj8-xTy;{kwYv z6@0JO9>e=A+w1D9{@teZikWt_#c|WE+qi=Fw1W<2^2ec0upqGP=?k-d$--&4U}Ek& z&O85}UzRhay=fR>V3*+J>IfUbA|%z;-jcZs-tyXWxx;ASQyA-Olx4_1PHH$HbmI-* zKJEAu=T1)gTBx(Nld#idVuOIW=x?7lw(_crLl1cJ*RQ>fpKi9D5RfP>c)L z{N`YUgy^>mzA(tbbYQn#n^+Xh`-53_#tn!KpEwkPyxy_l;?^Vy>9e%&6QM{(x*_AFa=G6Rv0j&lFJwwC(4<@L_=Ma@Vs>E ze0&l!kD`Ho76=FFJvz}Tdl+#bqs?nBWCYowB=0=mO)OgT1Tx_Qg<4VKp;^e0>z(3QB z4Rt#JZ{4xs`gJ8Xr0X$W$h-T{o{N@UeZ`dk5xBI&EJ*0Yq1zAq!#_S{-~G9m&ml}L zdup`g+7M*S3n%9M)j6CgEi~jY-Nc4$J7Ul7p(4KR=3-(13l!p?^Et15$;kpPevSe$+Oi`PE% zFps3W=gu{8!$Jh)zFwg430@T4PMjzd@`?>o|Ao-ORfUGTG$f1&u{RCXS44s#>&)Mp-uGZ6F6XsX7UFC zQ7M{eRtF!VVK6bwj3~|&X=qOq_k-Fl5_Z!N1KFs%1_a%o0m-~Ll8~j0Duycf=3!vO z%o#MK3fVfUNCJ*H>}cYJ{KZ8*@7YKrrUVMje_9Rh)-$Q9iN0gxnN7&Tjg(n#m_-pA z=2%&hGqH;l7?gj6RG%`7h7#0JRoGK(=&4eQE*e75+Gy2J&^Q}8#xed7vImrqC0g+# zA92VI#)j&P@U35LXf(X+%9Tr(^L>qmvqpHj8gIV1`tmCuedG}%pfiTd5aS5m@Ysfb z{JVD_wBM>02U?s^qM@yPdIG*q!}gg{-#0WGS`_I|P8+aH8k`a?DHdU9WO8h5^>HWs z{H7n-KzwLIpN)-A8sr~-^_vS`{n{n-764y11R*I~gyv_4Yozp^@z*VLga!^0yHUj+ z;t~5l`CDK9Dl4VGT66acPIxverRcRlO1vfkjbc4Ta1r-W%=+%4>~}QpxIf4iq3`+) zi2lN$As7dr7zl2ch8O3Vs1JdEmKVdw6in#irW`eS=8ccm8#pxmi%?gk1X z@=wD&fEb=?1+P$skSQ5{3JnX3O>GOOPD2`6(LV?(nuUM5X&8FL4ek8ojPd{?dgN|p z5HJf3Ji%pBMv`PTX&P7lielu!4lMPdA+iwGXdXq?MjrN|LBO+$(S?*zoQ@D6L&)}x zqN*Co+*a}q&=AiJKMfkb@+Iw4G@rlhO76|^HF>TYm+S3b;qH4ZU$BS>@!^NkDO2Z< zptEk{WB>T~?>?wTh>8k3XgEIi9p`q?@KBEp6+8|=VJ2V$i{Ok)g1j-RP)`qmaX>>K z|F317ASH;t^n)Kcc;$W?k`ByF0#lY-eg82$Zx?pm_{$n%!#Vz@VBNofWqU7J{N}S? z&r@#x_kVuE^?Y7dWd!UzQ=0K7w4v!KG~l?S92~R9sdYY9bQ)I(*)c2uU>2TW4ho39 zW5a3QqmNK=I;2}ZHg7s+*(Pu{9U&u6)Kjah4~;@XST>l0aBTn_qc-EOAqVCVnCiiS zG{F~}|En_aWX8U!XE|6jzO+9=6?#-UP9w@_O0WLf7doOZ8Hi1x>=w+et#%U5b*z-C z7bxIe*r+T9bTjkpfH3DSGv_1N$o-SSM{|8lnbty?e)Ulpg-;QXTnP=6C!P_yX(;1h zkj!$CwzmFU*D5J0S#VyXQQ4~(WEn8YBg9mX&~PgQ8RshdSt?SoQIc8Y>LseetRcw0 zq3l^~@FRJiZhf=FVY?pZL^1C&fdKw%R* zdTDFkM&TdX+XOVh23DB5gF%`=@QenTi9LGBec_m*{J$7>IPrskGmuE-L0KxnizXFHu##lygTm z8kNjctK2lUQQHxPp$tTZD+FATs10NwGs830qsf-YvcZ6)szxq91_(CMlFx9C9y!cH zpFLBnB+DqORc@}18hQ4qDl`onilOA|bKmew)1x6ji(CnXDiRnHl%bD(!%Ra~O7~sH zDH@|8fuS?eeqR1Y`!88>*+(vV@V@(;GmmRauApbzw)Gn}{PW+v=YW;_7_;g!DRNI5 z#=fCw*v4GiM(ie3q1e#yys_~YpZdHtzqrkaT$XQ5%pXzvu}2=|eaAd!hOew=%b1hV z7DxhBwrX0JE~kmS0cP?X1_ngPIK*o69z(nB&UZBYjoM{H1Y1+>MZ*lfEcYa!w)}cl zNg2mu%I2Ws3>tE3G{VFFdxhO6NT1OC!B`q?2qiX*C~treQCow6jbfP1Oz3q;CVLo6 z#vt8xg}@&II8*M((_zu}Nzve-kQc=eG77UCC`71yv;PVQq0uXfpcoUolm$#VFsw9$ zEW(Jv0=Q_k&>(0sfl`5spY{xI2!Iv02;^8YOY^}=Hv~h&cr=-7zBO3T00-WSHD@Sz zvym7|JO=DIIm4*v)AlqOW z-$H_Q$AJ0N@K6NNXxlb5n!_7T1PJwu%yf;cDs@N001a~PH_KszGGqinL>g7)9?=X) z*-yBY!*DBaScXAvm5oCd%lO%yhTA_=3iW8xo#4XQu<7~Wd}@5+RduCw-MY1({p3~q zEL*{-{5=$$3-u>p^YikCz*(~nShm*{AH3+H`|jVg^>GWngr6EGu3fk8Z{P7(doNvP z;o)qUXmQ_kXb49H#1JSNTs%q6InQ3Z`qIl30G1*6SVBXzs6qYj4}SdIV~!IFjl6P5 zcNU>9nEKB7y&&8xf zKhg6xeWsxwk`d0hR5&FXb_Rw6_6AgFsn;RE=y_!8VR{c zGz=S2Dcj2@ZdFCDq_)v8gfQqS$a8Q_LO4WdRP`%j$&YNOXs+$OQu?CPU&v7nMSmcm z8-;it9U?X~Q1U7Yip|^iS6sE%@)i66=nEU7Jj;hi?D;lB7DOMoY_F>>zU0CCY{}G* zsu+$ykEN|!fAj0#yyd(LRxDbgBc>C;bk-0nrGIr^d!^LRl~G>GO4q&@BrHh34{ z%K|nO$rTLl(=tK1H00tG$U)Go-bR(v(5CfrL(qb+Lc@AD(3V#Hku_?Ij4_iiGZjoh zHUKz5B#>j%?jp$;86u=hTn{^+F--~WJ~`DtsF{=_p2$F^>}`;I&R;?K{8K|pzo$I(DTo<(!+8}IR_ zc4Kno#h0>DD((aU5rRYwCIT{hWuY&1ax;R!@UvH3nMoKwg7semR^)qs_3N|F{8Jd3 zovW9?S#;VE!l0)hEaoa{$mfiWlMpiOf^I@yV6mr781JMoZ5rkiG8O{@pojqjQoBgl z4h1*md#9nkAXOSzd}}<&o}3jnMumaQG?Hi%X7Uh4ThXm#$8CIY#^p-Q^YW>A zn}&E+iZ4i2bfkXOBzi#*Wu%e4oXf2=)JmBfN)CsO@rPv$vfFKFWK6LGTV25&27I+l z!wdzxZ&+z)%cK?Ga%({G*vhMhhh`J*^`;@W?-?_#uon&GLA!yhd@|Zqd#$|s|AM8Du*nLp`N@f3ShVARu%T2jh6mPV!F8 z^KxjGdFfJTtk=B{DDbuQy9jxWjlWzRL_<(0-USL1{sM>{7bw6}1?6-u&UY+q3T=U~ z0fL^T7ATZubLeRsAG)J2B^!))t=_SZ zCLu?a3H~S_Ja>Q0mD5n3Cj6TB5lUA_|Dwyz}_%u3z5qmUGTqx?nMHbXq(<_wDCja94e5ccx(gF=*I8 zAw_OORI|}ld+zIZ!D4 zsfZIHPY`VIF38xkwqZQYVkTggr$fUAF8_a^;mDL$LFt+|@MaonrL+RE3Bh1f05NN( zBWHf~lN%hATZ|hh6z0%3IM`jxC=~tzf*~}J7sUYLAokSU$S-jtnQ*0D~F*1#4s?3L^r`3EIkkb9$& z0W9fNMG;zAUdd~t@&QD1gobSKY-|xa@47iC&%!q{Zq*~MM6@VMkU@7Ydx4Bv1b7im z8i1n;O_-_Ju!*9~qL>95DoGh~GzkL)h@)bIhEnoJ>9=oaG<@M1&_^gFr#o}#R~`(J zH6h!P(II>LeD_LegNE=(SY)0@useFb_Bc9w_Nt|O{@16je&peY4Tzx7mP*Tq!kxF> z{^mbFZ_(TZ3r8pa=9~)%7*+2pr3WZB>kH(1k+ z!XVv@gnl%{NvWzEg_(ND{bED0Ni<|;7j!5>Lna(F5TGjc0GSS!1*D2V%k*j1*0K=DZ4nO43FI{_W z_mkP6;foUu+2g|rD6|uveiEht(Ug5@_@7r?#SIJYiCZw})HC*R3>65*HlpiCIG73$ z7cIa3GoRC=+d63I*WqvZ;ZI(D#-Hx9aM?TGa6bEn{b(q>D$giHqa!prO9O76fBeat zHf~JRZKJTk#Jg_0{kca!%Qg-Do)km;b0dHJ5fl47;Bzc=thz>*fgqUM8gKxx{DoAVdoxVzx#s&P?$M5Bk(nh z`*ASq8wA{LF@eisLq4JodZIukNlnPkCUiVNrU^uOu+XvI$CrjYgDlgHURVNTLc_lW zTuwtxhDYP$oF7VhwL&jr#)GDev&MZi>G?_cYkQ+@c$Oc0DyfQJEDYdFbSE2%5elh_ zR`Mf3vOHvsza)KfG)V?)u9*Dz%of)d6+`6^v z;ubt$0$5~^Z`t~tuYKdJGhh0yH@)?aTW=Mx;uMWW)h`zosV&jyXlvz?W$!%y&BT4& z_g5GwhsYfQap~5r|8wI_EUPkL{J^j2@NR%j1BC^MbstdF3kYVRQAKfw!IxJ-vpjPe zcHEr%hYg$-&&Vn|;)VGUG3n zKtrgE(@D{t-Wl{$qm5NiiVaOaEC&047ZW(2(1?ay24~)Or8wB@p=uuA0X0%xNi{su z3L?m1&I#5up)p+>Vth#!S@Rx~Ftyzcg+g*TMckx0oSg6qC+Nw|p?~yU$l(jd;zAA* zt%(9hdh(BG$QbC|RxBO0hG#jK|AtMrM;1g1j6BX_ zijJ{0j0Y6yg+I!4XsD17R{*Px8{yc-!<}$qJNt2XkTq}n69mEXPot85wyshNgZ9)Q1G)j*+c(4!2lHINrHM6Uxg z-4N{7gtvY|CSaC#fQAc(TY9j}|1Ao^Vx{5s0z>g=sa@!s@2R~~DjHUULHmhqsP%t( zOivqA*3Cghf(;I;DE0*eLkJX#dQof$dhe3IkG>p*iny z3G4kq5pbFi3^+dN|NW6DmT4Fu(M zHQG|Eshc@pzgzgveu5gg7i5}8*Xl0kgKM*8xKb1442)SiYkHbxgOK@=IYq;h**31< zP$Q%Qf!lueb5=_Ec7f?=1rx;upo1(#LT3y(rFr(5CRvQ@)<-Qu*aQ$`XAqwvS{49VE{5C> zaMRHXe7t;+?bjV$4($jAcj@hk-VYJ&yh~VY{H_G@#G(;<4O2ZHqmwhuWzxQoN?eQa9Z_N6FN9e6lqQN20%Q%L z!NEqcVH`!FkerXEde9K?5+*1b=ITeX%uM#BPCOVa_^C%O-M+(PKjr4b@yZ z${>XVc?%mEkVlG!s*-b*GKjvyJ_J=oFKSM-7)?~ATx3^Ow;nL@2P&s%y59Eti=WxP zAw!ZAF;TMcC%yo|032J2(C{@cd6~$ve%-pyUH&N!i_$f0l35rBtwNy6YW)E(g!acA zdiYJ>x?%ICO~$>-zKX(H-nNa)`-j%pFr!ezlk?C^IXO%qHva5mo^{`S_cda}ZYE*? z4L|e`?;H2f%%J9HN(X~4Y6E;(h?A zEpAOM9_8H=9W>;e%+k>g8a4>EbHxJ0jJYf~oad^5T~9%lK|>xOBU${CTwY1D8``alDwNYq$D?sL`-_gG^D5xlbGgb za=PFfxxkU0!Z;h4<1!{^%w(zWPEHdwM=yKwnAl~80fO2JrX4i2!P-X#vZRSRRa^PN zfMPh8On4$24ItZKnVaK;B5u*kxdfDrM6DW1uinYkHV;4s^42dGIMf$8bAGoadYN@s zp;23-;h|5xp11uz_E-i12;la;ouXmi(Dw(UNAL$znC(TDu@T}@Kb_(SV^~gvhKk)b ztX=onD~yJGO@2~&AP@XCg`wFK?#gT!{H)o}dg{};<+stthEH>AWZb%Kiyu1m5oa0( z`!qK4(1gIqk>`y~JnzJli^KfQyJT!OKeq8B@BL>Uza|cXs({^Kp*t8vBarnA^fCvL z!+3}Bmm3BO5q5}%9VmPP)`0bM0f;I_qA}!FA=4?nn1@6|MyvVRn%5mYoCFQ! zkepdmDP#mbj0z8UHn-5wkNO~MRHmO@4492IAybmGt?f#4 z2B}{OGtKkSJP%1`>bK!gX8c`<4MoF@2ISjsyZz;V`chiqL~YfDmPtiJ?OkfI)B?t# z;iU@}z3uhq(wxs@8y@@WHP;=q=RWkM(c%F?1MbeJhI!bk~E-7AEQR4Au`i)nKx^+SPd;U#K6|{{Ly5Bl%S(Hjm6R+7Xl4)5t(_6 z*_cExxe7>W_C^n$a+PGKmI1De%?W5TygStF$E*bnv1uD)Q1>WN78Lp>V_?yICK}?9 zCVI7jz%e{D%TgtXW=MKOBPBUq10zkmnuKLQuDMiIvd1l7w#0!o5)2yh1?^8zuRTT= zv{FOCPI~-HkHEmfMglo{C1iaN)Ha4B4azKp8O>D{wYj-!(MTEH^%Uq)ol$gv4CH7Dn92Mxb`-SrzcZfvk%{krvUdE*6a`N@xlN3La3Iu&%nGtQydlUMHh zZ-0BCQD)mV9_;z!AN}aC{SV~(;zVGwVT9Z%m}g%m#ShL2#1OFOR^auY`>%Ct*J{JC zjMKIb4P;kcd?{~qYOqhk6ZkR*(I`Q~(@vOHY)BW14WXeix<-iMs-KXTMnO_fatyjVz)7J_ytmc?WWTBFI-dIoAl*6GRU}%Eng z$ut#+(L|QvjggR~#D*E3sz#EHJW!=#2o$rd+MLsn)ZGe=s)A55ld@kfW7Uc;VM$e> z5J8rPm6}lM-x~-+PulI7M;!H?Z`}~r8N?bQCRp}2@AxZjnuim)3L4@Nw+ac7#j->9 zTXo4le*h4JU34`29CiVa~L2&;aIkipk2 zW1OicS%5>{G16_fRYhUP%LlniKMfRiEQjvWLoz#r!qKuQx?LI)JT7t4LBoEunyJ1) zw;2^P{%DwsA;(L2Gx!3Cp^Q+G@Gz9q7u4KBLIOkXN<6_d6m-Nm<;;zmpqNY$m}%h` zXIgXs71))cQxC#`8zx3_X7T|vR7V&v!)t2AvkRv+A|cb0H*rC-3l{%pHRVf>}7e^iBY#;=cH zL~~VXNTIZ`g{2=c#jK3nd5sf(JDFh#&FKpPjS}|E#%dCJ2{9NfvEfgqfiYg$ldCzk z@`grL6eVYy7@KP4U&=6+pelNdB(rGJQ((@AL=1*n&HrJBvXSttm`g+eTWVbjjgd!%d_jY_Z$~oupYiO~H{S5=O`A3~o>K!2 z4_kTQ#K;)v#Pj5Ei^K?FkjAOpi@YL`tAf1RX&6|Xdi;s{rUP<)5jHM4MZ;U>d+r-% z`~{@C@s}ak&kX%8jS4|w$IAz&fkGm|HVtzy$V-=UaYtoEg~DQY-aBR-5Ew!?*arlc z_~W>_E-_Qy4Yu#bpX|H!4NdTFu+Wc&=rioJwuvUNm}@1=raQM*6@P|8fAPdLgT4V~ z`;V7+a8+v|augws=5tU53i;@CC^MnvDCRw6IE7wGD3nZiX!~nE@q#Co7A-D|pw0z+ zhQa{n%b_@zXH)p1B{@?ZN~-u6xcYn;kNs18v_)>lkji<+{4a8eZV*u4g87gU${{o~ zsFk}FegL&VO244gsOYcH(6{h`;YWC~?+)T;`MpA?A-!lqrfUXFQ9mG-3|@0DvQ^bE zQ^1v(7)@I&G2`db2m46qAL-!q^Fo-V3WW9+Xl1lgdc@z zVWTmSW2`Tw-g8^^PLCwnXe8+SC3e#U6j_Rf(WzRgN*y5^Q=DRqkYAGj;qkw~1#{+} zdh)Zs@ae00e?%cd(2&UM@vXo3(NEs=XK&bZ=`wypnvmlhSDOEMvKgK7?e^e*z<>NC z&d(fs*b(o0*WW+z$ioH^UJ3a4*7fVwf8p{^J@`wB~xo#R}6e9CZ-UbH+KF*F(8xTZjm{H8NA!q$GL5W#M8f&kVPLqZ^ zO1f^kH8cUchQ1UD9jNR zYIBfWK+O0<=AK|T2M5!TcyIvJcC0Gcrv=jeCKs)mSR^I01k;X1L!HkV)1=K@M8ZIG zzQrs)dow91sW~?MpMQ&B%^X<_#eAg{9LxevG}qBQ(-26Z(LCITgr;UvqC5V%J3hkj z{7|U_P7M|Pk!vPr4g}JSKWIoV@UIZFeru4Vt~D^)@-5IP#h0ZOme}ZLDI}}^L9h9o zR{Vff?W>(y2(7!5GSh&~xORjlIt>9O_Vh?D12qi22BT2{CIr53d@xg$nyW3ENNDKG zp4n0(FIB0bx>oPVBx>22B_aFYy)0>}N;ds+{Ln<+@PhzZRP@*BBJ(dCTahqJkKN3k zf06OOsQ>pzJcH%gfAY-p&i=DY|Lx*iZ@y*S+I2h@RFi+K9ICu|(`H_%^qI@A_{%>( z=XuAS$US<_Z1KOz@!3N>ql|rJ(%uUfpL)!3Z+gw^Kl=U;{OCJ3KJws0?c<)doVk^g zrMKSvv&%02=sV86;PjK8^VEG09 z?u`tr;(O~=7hQ7bKCAp?yB-pHgc$K4;8Th&DDom*_6?tN!pWPrn4ikl48RTY($zxk@ufFM z$WqJ-8NoEW?M7b;f;4ZtuAIQpP|+}PY364{d@tGHfli4}iz~GC1M)Qgm+#w)hWNoh z2}=pe^}DG%RmCqE_R$1^E~1$IpbUMMvF9tRmGsIRdTjVZP{oHTC5j<*%i%U$A!O$m z044zoS@v?6t7H&*S$5}`fd(+ADgh-q=YK^7g_3PI?^x*x! zz3Z+YeDj7&K624nFMB!9C|kL78DRR*`~La6U;oBkYt}scz=LZaUAtk!hCe)T|1WX0 zX3gDq-F4^PcdfZ=%^i2#v1QAab?epv%HRL)cQ^m^=BqFHh+aB9vg&V2C?Zu}lEmDsY)Uj0PW_Ec!-0F9g`O5rdxLK624Pdetfdw>7? z4(#PiE_;p?fCi1Be#-!KuJsFe@|?LcjAu1A$ue?p0xUe zlTJJS#MQ^0@WPXyd(KN=b=C{ceDdu!x?8Udx{{n$afGi8r+eJS=xIz_Q zdC{D?XT9|0Kf3Ar0Fl`9Qy;(du>Dyn9cAAz+S0IR!Vim?nDOq~V-9`#cmMmF{Q=mn zp_jXE`{i?tO)%Y@ak9W2H5}&P6pIQRc0T`TnstKh6#LycVb*3T?YpT;4h;v znVtXir0d76eCVlRpcRrabON1KVMY(U|+N7 zr)744hQxrZg_4VaLBmz`*i6M=24X=WGz43~h^UIm(@^IhlnTd~_n4aazt&M(1T}0? z4-Kic$dDMw=X@xjc?>5Q$%%|J4MR_J>~Rh+ghClZL(R10LLmqS2Qja*14!aA%l1!h zry&Gn7^bvyAVVCwv;D+){T#EU%j#}~lcK|xjG(@g$oPYa3?4J>TOo^3ja=W?%?v<- zAWG@=bMcEINMpHE2_=apY8%j@quiH@4GrF+M`UW1BS^0vVGZA%pG8G%!Wd2T7)lvX zWfOG`?kM6@RR~Hbr4LQ$ach$~dENeN*yJK^`Fml^oG*YPFh!Hg3u3_w!_T-^<6(8TU`Rb2ex@68gob%n46cuI&2J8ex6?Zip zC+3cpG_N%=!$-=rgTV^2ZnW)yW?D3?DD3+fnHmh1bD@o55N&6KUJ&G*OgSpkUE33I zC}r7QYwSy;3*;eyxfvzsCVOEn^1aeSwgZLT!VYk-fX`_d$m7Up$o+*j4UKL_LpwAg zS}Cm4rW;D8Tu=x>?6_zwf!0$fVi|fC9svi&7|DX#sx zB$?&N70}gDl{b%@-nTV}XK|d~CU6ZyUx8W@8WIn!hJ(D@6&M=8(#JgP#`rNNFdU)_ zQlKzoTJQzsO@m23+UIa+XqGiL)Gwn}btE<<`Ijd8l5rHnUf+T*#YeGluA-J{pXrXI z--=o_Atwnp4P~y90eM!cAr47lkOiZX0|*8oL{-Cy{7{P@EFpp%THDHE@sYfk`4>UP zfWw*SZ5ZwWfrca#9Fd&lFVP+)qSkfNw(i*qpntrmSw5l;+v8?2xl@4}R53L2` zb548a3HSVRO-~4hGS1li^rjyi`?MqJ3lAA{4LR6{&=ZcK+)*J=Xop1`0pP%*p>UT% zFu1vW8U_ksoMgc+=RGlpK~MdTDZ6>+DCET!y%$Bhc_$5ia+QjCIW%)n@&FWO@MW_g zAcCSofECJa0!p*P9PCL$2zX#kJ4QoMOw%Tlm`ynL&KnMk5=ND{FY_*BfI{$PuSxKE z9+H8=_yqXSKtnuhhtWt{7fXdXs_0!x<$@9Z<%A+OnjV=gkm;Y_KHBx-5Z zXvi>(5gsw|7gRJv^WYasHMarOFc1i$bZ;z^vKDOjBjlMJpJPL#ug|& zhE$aux*FnXFqnm)bxRdPiBP^{8Z(;M@8f6JFOQ{U{Vj^@$ODM*$dY4@D#%ET2IuD6p%sVLuw~m|hE{u|^spVJ8aPF`#w{yYhu) zrIcBgn6APLWlWFELN-A$kM7YC^abWZ05F(Y(kdviU3DmmVQGTzRB9??$4^zj2mu^u zCM1U@QAMo`BnSbvW@WFGtBal%;es*RnH68h5+RckJPbq=vo!rmsU~t|kzKvYLEG$#fytZtQmtC)`^vM-R7*~e495OI zjxEilus~+ycp%qo4+}7hD#;Whp;3}g+*)$pkwfeo%YYCV#|OiH1UL6#;C z4uPP}BbrouTERhD+0rPvQ*UB~DV>{rWqDSxn;0T?y`s>-Br?rK|@$PY>z3^Bdmd-t(vwb=Z)nX6FmdQo!=#loyQK+^~7I8*)JGu(6AeP z8H>Tn=?Ku!9u_)c4+~We%LX7ad^T(b6EJFfq7Y?V9-KZ6MaB*Y`qQ?9ar=xdq&A8n z>_56-za70-a+6{(4Q)*|(XjoZV?izj*qpb z##nt~y0$z2aL1NvJvQ{UOe3Oz2r?KvYiL?YV_*eL&O{pW0a*NhS#pgU<1mx4atsk#kVOzU-Wuk4*Y>|Rl6C4y3#0}5X?g4$G>nx}ga>|i?^|B`=S#=u0A(>tfhQxGXYWkxxL?2BqA=Ir zjPpyjEeP)rIR9CM*2E!8R-S&;@dq#88=x;3=4})_Zw-SNX<6oaH%nzJIVE>>BJ-F&NhXXx0b*5Tr*iWr_hk zBt&CrrKOG&q!b0d&`S^p_w~b^9ZamxlL`Foq)<-FfIl`0xhPQ+G_=%XyKn#v%aua{ zNgxF{>{KT3siBfg{ znW0411Wry9p)lvd<=DtDD4c3>63=E!`0L}}oxsqJ)Nq-?7h3s7*yGBlXug6aicU!j z53R@aQP+Oot@(<;U>WAfn)9)jUOtfd?zt)q5F%kFSpxP<`{erF#7bn8MxwfR256X# z11su9Z2<%Xv46DKLox|rEVd$I#)7ZV?QHo-|{V8xEXMS->+> zG!%1?6^bzcQHfSo>mx@ge3T~cP0r1szF_4kLnWyrp^zdJMk8vJ@zjRl0f8!Y(QSi< z=K3{M8#Xub;1P+xZJXKHL^ z)c>E8kgO7shthoI3)k=_Vuhs)0G8=IZGWisMdUyl`twCcprLIJF7V6pb4QJL`z%~~ z;rVa-$@hNnk`qpzm^BIqi5BNM4SmzlHV1dbEE2;OJzq zX{QCzu)cG!HMP8?^8SbnJN1<{J>`tNeliVpDke4ugNd1j6?3{j*rs8oUIU1MKXwU$ zT@(>^l6~FH?bN6U=E+Tsr8cAx$);gDQXs z&w!WBSF*zxIzy|~%bHVblPc$CM_|n`GG?sWwMNRCtqizvKmtbU zh&(3^KvfJwRpPJUqFK6odZ#aW))+8=iS(E)JKENhBq+rcS%ysW5(a`fvBt5;2#to$ z$K1pk2B4jc)Z$#oKrRLqnyQsS!%s1;;hu)nokuGPIhS$P&`~ZTqfs&>RXLQ~6~LBS z@dYhB93A6aSG74P?(uLQ6H37Z0g~JPk38_uKfL{&9As5^$nAy&!v;jW%?OB% z_0MK;)ZahouctQ}vKGpsXbYgsdHyp`xb>$$Tfct&t5!dMY}N?O)QoX3Ese^on`JwrDOV@_3ZdkP1i@J!8afI`d#sc`d315vTO3<- z(Ac6j4gE|hMTLH|XYFRkFD-JhHAWBvo+2t_brAqj%dFmJnJ*PGi)vnlXWYf;4i8~R z3!IH{1IBmpv}N`nPo zffGc&RtY#1Z86RAJCHP;+IH&f_URgGc@C%1u)g|GJ~di;*8nIo1|?*{NDgC4Z_t5R zRGx!Aj0bPzB#hM%p=dm6VF zp3_2F>#ozoc8lr)GYup1&?CsRgpi}CCfz4z!qou5Xy`#DHpbK8)`~d`-uTMb-2eM~ zZI=-2S!5{wRUV3ss@k^gwx8Yd+B09ebZVYp%0+%-*=TthTV`S~E-R6%-j+bC-1%@( zdmC@r{;PqZt&~1x>B@^PeBWamH?Ci|{^hHm$9lMNa2O{TTU3~7xT_0gSnlUi(jDZ56T;@ga&Ac8Qzp| zMHNcv&2vqdq0|g-{W^@uEpYRMB?1Qg6#%0A!w4EurGF_YlryEfW!(S`e;^stHke{^ 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�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