diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml new file mode 100644 index 0000000..22dbccb --- /dev/null +++ b/.github/workflows/create-release.yml @@ -0,0 +1,13 @@ +name: Create Release + +on: + push: + tags: + - "v*.*.*" + +permissions: + contents: write # For creating releases + +jobs: + call-create-release: + uses: aws-controllers-k8s/.github/.github/workflows/reusable-create-release.yaml@main diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b82694a --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +.DS_Store +*.swp +*~ +.idea +bin +build +.env +READ_BEFORE_COMMIT.md diff --git a/ATTRIBUTION.md b/ATTRIBUTION.md new file mode 100644 index 0000000..db4d9a7 --- /dev/null +++ b/ATTRIBUTION.md @@ -0,0 +1,1365 @@ +# Open Source Software Attribution + +The AWS Controllers for Kubernetes (ACK) source code is licensed under the +Apache License, version 2.0. A copy of this license is available in the +[LICENSE](LICENSE) file in the root source code directory and is included, +along with this document, in any images containing AWS service controller +binaries. + +## Package dependencies + +ACK depends on a number of Open Source Go packages. Direct dependencies are +listed in the +[`go.mod`](https://github.com/aws/aws-controllers-k8s/tree/main/go.mod) file. +Those direct package dependencies have some dependencies of their own (known as +"transitive dependencies") + +In this part of the Attribution document, we list our dependent packages and +include an indication of the Open Source License under which that package is +distributed. For any package *NOT* distributed under the terms of the Apache +License version 2.0, we include the full text of the package's License below. + +* `github.com/aws/aws-sdk-go` +* `github.com/dlclark/regexp2` +* `github.com/gertd/go-pluralize` +* `github.com/ghodss/yaml` +* `github.com/go-logr/logr` +* `github.com/google/go-cmp` +* `github.com/iancoleman/strcase` +* `github.com/mitchellh/go-homedir` +* `github.com/pkg/errors` +* `github.com/spf13/cobra` +* `github.com/spf13/pflag` +* `github.com/stretchr/testify` +* `golang.org/x/mod` +* `k8s.io/api` +* `k8s.io/apimachinery` +* `k8s.io/client-go` +* `sigs.k8s.io/controller-runtime` +* `sigs.k8s.io/controller-tools` + +### github.com/aws/aws-sdk-go + +Apache License version 2.0 + +### github.com/dlclark/regexp2 + +The MIT License (MIT) + +Copyright (c) Doug Clark + +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. + +#### github.com/dlclark/regexp2 Attribution + +============ +These pieces of code were ported from dotnet/corefx: + +syntax/charclass.go (from RegexCharClass.cs): ported to use the built-in Go unicode classes. Canonicalize is + a direct port, but most of the other code required large changes because the C# implementation + used a string to represent the CharSet data structure and I cleaned that up in my implementation. + +syntax/code.go (from RegexCode.cs): ported literally with various cleanups and layout to make it more Go-ish. + +syntax/escape.go (from RegexParser.cs): ported Escape method and added some optimizations. Unescape is inspired by + the C# implementation but couldn't be directly ported because of the lack of do-while syntax in Go. + +syntax/parser.go (from RegexpParser.cs and RegexOptions.cs): ported parser struct and associated methods as + literally as possible. Several language differences required changes. E.g. lack pre/post-fix increments as + expressions, lack of do-while loops, lack of overloads, etc. + +syntax/prefix.go (from RegexFCD.cs and RegexBoyerMoore.cs): ported as literally as possible and added support + for unicode chars that are longer than the 16-bit char in C# for the 32-bit rune in Go. + +syntax/replacerdata.go (from RegexReplacement.cs): conceptually ported and re-organized to handle differences + in charclass implementation, and fix odd code layout between RegexParser.cs, Regex.cs, and RegexReplacement.cs. + +syntax/tree.go (from RegexTree.cs and RegexNode.cs): ported literally as possible. + +syntax/writer.go (from RegexWriter.cs): ported literally with minor changes to make it more Go-ish. + +match.go (from RegexMatch.cs): ported, simplified, and changed to handle Go's lack of inheritence. + +regexp.go (from Regex.cs and RegexOptions.cs): conceptually serves the same "starting point", but is simplified + and changed to handle differences in C# strings and Go strings/runes. + +replace.go (from RegexReplacement.cs): ported closely and then cleaned up to combine the MatchEvaluator and + simple string replace implementations. + +runner.go (from RegexRunner.cs): ported literally as possible. + +regexp_test.go (from CaptureTests.cs and GroupNamesAndNumbers.cs): conceptually ported, but the code was + manually structured like Go tests. + +replace_test.go (from RegexReplaceStringTest0.cs): conceptually ported + +rtl_test.go (from RightToLeft.cs): conceptually ported +--- +dotnet/corefx was released under this license: + +The MIT License (MIT) + +Copyright (c) Microsoft Corporation + +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. + +============ +These pieces of code are copied from the Go framework: + +- The overall directory structure of regexp2 was inspired by the Go runtime regexp package. +- The optimization in the escape method of syntax/escape.go is from the Go runtime QuoteMeta() func in regexp/regexp.go +- The method signatures in regexp.go are designed to match the Go framework regexp methods closely +- func regexp2.MustCompile and func quote are almost identifical to the regexp package versions +- BenchmarkMatch* and TestProgramTooLong* funcs in regexp_performance_test.go were copied from the framework + regexp/exec_test.go +--- +The Go framework was released under this license: + +Copyright (c) 2012 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +============ +Some test data were gathered from the Mono project. + +regexp_mono_test.go: ported from https://github.com/mono/mono/blob/master/mcs/class/System/Test/System.Text.RegularExpressions/PerlTrials.cs +--- +Mono tests released under this license: + +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. + +### github.com/gertd/go-pluralize + +MIT License + +Copyright (c) 2019 Gert Drapers + +Copyright (c) 2013 Blake Embrey (hello@blakeembrey.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. + +### github.com/ghodss/yaml + +The MIT License (MIT) + +Copyright (c) 2014 Sam Ghods + +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. + + +Copyright (c) 2012 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +### github.com/go-logr/logr + +Apache License version 2.0 + +### github.com/google/go-cmp + +Copyright (c) 2017 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +### github.com/iancoleman/strcase + +The MIT License (MIT) + +Copyright (c) 2015 Ian Coleman +Copyright (c) 2018 Ma_124, + +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. + +### github.com/mitchellh/go-homedir + +The MIT License (MIT) + +Copyright (c) 2013 Mitchell Hashimoto + +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. + +### github.com/pkg/errors + +Copyright (c) 2015, Dave Cheney +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. + +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. + +### github.com/spf13/cobra + +Apache License version 2.0 + +Subdependencies: + +* `github.com/cpuguy83/go-md2man/v2` +* `github.com/inconshreveable/mousetrap` +* `github.com/spf13/pflag` +* `gopkg.in/yaml.v2` + +#### github.com/cpuguy83/go-md2man + +The MIT License (MIT) + +Copyright (c) 2014 Brian Goff + +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. + +#### github.com/inconshreveable/mousetrap + +Apache License version 2.0 + +#### goplg.in/yaml.v2 + +Apache License version 2.0 + +Subdependencies: + +* `gopkg.in/check.v1` + +#### gopkg.in/check.v1 + +Apache License version 2.0 + +### github.com/spf13/pflag` + +Apache License version 2.0 + +### github.com/stretchr/testify + +MIT License + +Copyright (c) 2012-2020 Mat Ryer, Tyler Bunnell and contributors. + +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. + +Subdependencies: +* `github.com/davecgh/go-spew` +* `github.com/pmezard/go-difflib` +* `github.com/stretchr/objx` +* `gopkg.in/yaml.v3` + +#### github.com/davecgh/go-spew + +ISC License + +Copyright (c) 2012-2016 Dave Collins + +Permission to use, copy, modify, and/or 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. + +#### github.com/pmezard/go-difflib + +Copyright (c) 2013, Patrick Mezard +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. + The names of its contributors may not 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. + +#### github.com/stretchr/objx + +The MIT License + +Copyright (c) 2014 Stretchr, Inc. +Copyright (c) 2017-2018 objx contributors + +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. + +#### gopkg.in/yaml.v3 + +Apache License version 2.0 + +### golang.org/x/mod + +Copyright (c) 2009 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Subdependencies: +* `golang.org/x/crypto` +* `golang.org/x/tools` +* `golang.org/x/xerrors` + +### k8s.io/api + +Apache License version 2.0 + +### k8s.io/apimachinery + +Apache License version 2.0 + +Subdependencies: + +* `github.com/davecgh/go-spew` +* `github.com/docker/spdystream` +* `github.com/elazarl/goproxy` +* `github.com/evanphx/json-patch` +* `github.com/fsnotify/fsnotify` +* `github.com/gogo/protobuf` +* `github.com/golang/groupcache` +* `github.com/golang/protobuf` +* `github.com/google/go-cmp` +* `github.com/google/gofuzz` +* `github.com/google/uuid` +* `github.com/googleapis/gnostic` +* `github.com/hashicorp/golang-lru` +* `github.com/json-iterator/go` +* `github.com/modern-go/reflect2` +* `github.com/mxk/go-flowrate` +* `github.com/onsi/ginkgo` +* `github.com/onsi/gomega` +* `github.com/pkg/errors` +* `github.com/spf13/pflag` +* `github.com/stretchr/testify` +* `golang.org/x/net` +* `golang.org/x/sys` +* `golang.org/x/text` +* `google.golang.org/protobuf` +* `gopkg.in/inf.v0` +* `gopkg.in/yaml.v2` +* `k8s.io/klog/v2` +* `k8s.io/kube-openapi` +* `sigs.k8s.io/structured-merge-diff/v4` +* `sigs.k8s.io/yaml` + +#### github.com/docker/spdystream + +Apache License version 2.0 + +#### github.com/elazarl/goproxy + +Copyright (c) 2012 Elazar Leibovich. 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 Elazar Leibovich. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#### github.com/evanphx/json-patch + +Copyright (c) 2014, Evan Phoenix +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 the Evan Phoenix nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#### github.com/fsnotify/fsnotify + +Copyright (c) 2012 The Go Authors. All rights reserved. +Copyright (c) 2012-2019 fsnotify Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#### github.com/gogo/protobuf + +Copyright (c) 2013, The GoGo Authors. All rights reserved. + +Protocol Buffers for Go with Gadgets + +Go support for Protocol Buffers - Google's data interchange format + +Copyright 2010 The Go Authors. All rights reserved. +https://github.com/golang/protobuf + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#### github.com/golang/groupcache + +Apache License version 2.0 + +#### github.com/golang/protobuf + +Copyright 2010 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#### github.com/google/gofuzz + +Apache License version 2.0 + +#### github.com/google/uuid + +Copyright (c) 2009,2014 Google Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#### github.com/googleapis/gnostic + +Apache License version 2.0 + +Subdependencies: + +* `github.com/docopt/docopt-go` +* `github.com/golang/protobuf` +* `github.com/stoewer/go-strcase` +* `google.golang.org/protobuf` +* `gopkg.in/check.v1` +* `gopkg.in/yaml.v3` + +##### github.com/docopt/docopt-go + +The MIT License (MIT) + +Copyright (c) 2013 Keith Batten +Copyright (c) 2016 David Irvine + +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. + +##### github.com/stoewer/go-strcase + +The MIT License (MIT) + +Copyright (c) 2017, Adrian Stoewer + +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. + +#### github.com/hashicorp/golang-lru + +Mozilla Public License, version 2.0 + +#### github.com/json-iterator/go + +MIT License + +Copyright (c) 2016 json-iterator + +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. + +Subdependencies: + +* `github.com/modern-go/reflect2` + +##### github.com/modern-go/reflect2 + +Apache License version 2.0 + +#### github.com/mxk/go-flowrate + +Copyright (c) 2014 The Go-FlowRate Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the + distribution. + + * Neither the name of the go-flowrate project nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#### github.com/onsi/ginkgo +#### github.com/onsi/gomega + +Copyright (c) 2013-2014 Onsi Fakhouri + +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. + +#### gopkg.in/inf.v0 + +Copyright (c) 2012 Péter Surányi. Portions Copyright (c) 2009 The Go +Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#### github.com/kubernetes-sigs/structured-merge-diff + +Apache License version 2.0 + +### k8s.io/client-go + +Apache License version 2.0 + +Subdependencies: + +* `github.com/Azure/go-autorest/autorest` +* `github.com/Azure/go-autorest/autorest/adal` +* `github.com/davecgh/go-spew` +* `github.com/evanphx/json-patch` +* `github.com/gogo/protobuf` +* `github.com/golang/groupcache` +* `github.com/golang/protobuf` +* `github.com/google/go-cmp` +* `github.com/google/gofuzz` +* `github.com/google/uuid` +* `github.com/googleapis/gnostic` +* `github.com/gregjones/httpcache` +* `github.com/imdario/mergo` +* `github.com/peterbourgon/diskv` +* `github.com/spf13/pflag` +* `github.com/stretchr/testify` +* `golang.org/x/crypto` +* `golang.org/x/net` +* `golang.org/x/oauth2` +* `golang.org/x/time` +* `k8s.io/api` +* `k8s.io/apimachinery` +* `k8s.io/klog/v2` +* `k8s.io/utils` +* `sigs.k8s.io/yaml` + +#### github.com/Azure/go-autorest + +Apache License version 2.0 + +Subdependencies: + +* `contrib.go.opencensus.io/exporter/ocagent` +* `github.com/dgrijalva/jwt-go` +* `github.com/dimchansky/utfbom` +* `github.com/mitchellh/go-homedir` +* `github.com/stretchr/testify` +* `go.opencensus.io` +* `golang.org/x/crypto` + +##### contrib.go.opencensus.io/ + +Apache License version 2.0 + +##### github.com/dgrijalva/jwt-go + +Copyright (c) 2012 Dave Grijalva + +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. + +##### github.com/dimchansky/utfbom + +Apache License version 2.0 + +##### go.opencensus.io + +Apache License version 2.0 + +#### github.com/gregjones/httpcache + +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. + +#### github.com/imdario/mergo + +Copyright (c) 2013 Dario Castañé. All rights reserved. +Copyright (c) 2012 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#### github.com/peterbourgon/diskv + +Copyright (c) 2011-2012 Peter Bourgon + +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. + +Subdependencies: + +* `github.com/google/btree` + +##### github.com/google/btree + +Apache License version 2.0 + +### sigs.k8s.io/controller-runtime + +Apache License version 2.0 + +Subdependencies: + +* `github.com/evanphx/json-patch` +* `github.com/fsnotify/fsnotify` +* `github.com/go-logr/logr` +* `github.com/go-logr/zapr` +* `github.com/onsi/ginkgo` +* `github.com/onsi/gomega` +* `github.com/prometheus/client_golang` +* `github.com/prometheus/client_model` +* `go.uber.org/goleak` +* `go.uber.org/zap` +* `golang.org/x/time` +* `gomodules.xyz/jsonpatch/v2` +* `k8s.io/api` +* `k8s.io/apiextensions-apiserver` +* `k8s.io/apimachinery` +* `k8s.io/client-go` +* `k8s.io/utils` +* `sigs.k8s.io/yaml` + +#### github.com/prometheus/client_golang + +Apaches License version 2.0 + +Subdependencies: + +* `github.com/beorn7/perks` +* `github.com/cespare/xxhash/v2` +* `github.com/golang/protobuf` +* `github.com/json-iterator/go` +* `github.com/prometheus/client_model` +* `github.com/prometheus/common` +* `github.com/prometheus/procfs` +* `golang.org/x/sys` + +##### github.com/beorn7/perks + +Copyright (C) 2013 Blake Mizerany + +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. + +##### github.com/cespare/xxhash + +Copyright (c) 2016 Caleb Spare + +MIT License + +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. + +#### go.uber.org/goleak +#### go.uber.org/zap + +The MIT License (MIT) + +Copyright (c) 2018 Uber Technologies, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +### sigs.k8s.io/controller-tools + +Apache License version 2.0 + +Subdependencies: + +* `github.com/fatih/color` +* `github.com/gobuffalo/flect` +* `github.com/google/go-cmp` +* `github.com/onsi/ginkgo` +* `github.com/onsi/gomega` +* `github.com/spf13/cobra` +* `github.com/spf13/pflag` +* `golang.org/x/tools` +* `gopkg.in/yaml.v3` +* `k8s.io/api` +* `k8s.io/apiextensions-apiserver` +* `k8s.io/apimachinery` +* `sigs.k8s.io/yaml` + +#### github.com/fatih/color + +The MIT License (MIT) + +Copyright (c) 2013 Fatih Arslan + +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. + +Subdependencies: + +* `github.com/mattn/go-colorable` +* `github.com/mattn/go-isatty` + +# github.com/mattn/go-colorable +# github.com/mattn/go-isatty + +The MIT License (MIT) + +Copyright (c) 2016 Yasuhiro Matsumoto + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c4b6a1c..9da1461 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,59 +1,85 @@ # Contributing Guidelines -Thank you for your interest in contributing to our project. Whether it's a bug report, new feature, correction, or additional -documentation, we greatly value feedback and contributions from our community. - -Please read through this document before submitting any issues or pull requests to ensure we have all the necessary -information to effectively respond to your bug report or contribution. +Thank you for your interest in contributing to our project. Whether it's a bug +report, new feature, correction, or additional documentation, we greatly value +feedback and contributions from our community. +Please read through this document before submitting any issues or pull requests +to ensure we have all the necessary information to effectively respond to your +bug report or contribution. ## Reporting Bugs/Feature Requests -We welcome you to use the GitHub issue tracker to report bugs or suggest features. +We welcome you to use the GitHub issue tracker to report bugs or suggest +features. -When filing an issue, please check existing open, or recently closed, issues to make sure somebody else hasn't already -reported the issue. Please try to include as much information as you can. Details like these are incredibly useful: +When filing an issue, please check existing open, or recently closed, issues to +make sure somebody else hasn't already reported the issue. Please try to +include as much information as you can. Details like these are incredibly +useful: * A reproducible test case or series of steps * The version of our code being used * Any modifications you've made relevant to the bug * Anything unusual about your environment or deployment - ## Contributing via Pull Requests -Contributions via pull requests are much appreciated. Before sending us a pull request, please ensure that: + +Contributions via pull requests are much appreciated. Before sending us a pull +request, please ensure that: 1. You are working against the latest source on the *main* branch. -2. You check existing open, and recently merged, pull requests to make sure someone else hasn't addressed the problem already. -3. You open an issue to discuss any significant work - we would hate for your time to be wasted. +2. You check existing open, and recently merged, pull requests to make sure + someone else hasn't addressed the problem already. +3. You open an issue to discuss any significant work - we would hate for your + time to be wasted. To send us a pull request, please: 1. Fork the repository. -2. Modify the source; please focus on the specific change you are contributing. If you also reformat all the code, it will be hard for us to focus on your change. +2. Modify the source; please focus on the specific change you are contributing. + If you also reformat all the code, it will be hard for us to focus on your + change. 3. Ensure local tests pass. 4. Commit to your fork using clear commit messages. -5. Send us a pull request, answering any default questions in the pull request interface. -6. Pay attention to any automated CI failures reported in the pull request, and stay involved in the conversation. +5. Send us a pull request, answering any default questions in the pull request + interface. +6. Pay attention to any automated CI failures reported in the pull request, and + stay involved in the conversation. -GitHub provides additional document on [forking a repository](https://help.github.com/articles/fork-a-repo/) and -[creating a pull request](https://help.github.com/articles/creating-a-pull-request/). +GitHub provides additional document on [forking a repository][fork] and +[creating a pull request][pr]. +[fork]: https://help.github.com/articles/fork-a-repo/ +[pr]: https://help.github.com/articles/creating-a-pull-request/ ## Finding contributions to work on -Looking at the existing issues is a great way to find something to contribute on. As our projects, by default, use the default GitHub issue labels (enhancement/bug/duplicate/help wanted/invalid/question/wontfix), looking at any 'help wanted' issues is a great place to start. +Looking at the existing issues is a great way to find something to contribute +on. As our projects, by default, use the default GitHub issue labels +(enhancement/bug/duplicate/help wanted/invalid/question/wontfix), looking at +any 'help wanted' issues is a great place to start. + +## Developer documentation + +[See the documentation][dev-docs] for detailed development information. + +[dev-docs]: https://aws-controllers-k8s.github.io/community/docs/contributor-docs/overview/ ## Code of Conduct -This project has adopted the [Amazon Open Source Code of Conduct](https://aws.github.io/code-of-conduct). -For more information see the [Code of Conduct FAQ](https://aws.github.io/code-of-conduct-faq) or contact -opensource-codeofconduct@amazon.com with any additional questions or comments. +We adhere to the [Amazon Open Source Code of Conduct][coc]. + +[coc]: https://aws.github.io/code-of-conduct ## Security issue notifications -If you discover a potential security issue in this project we ask that you notify AWS/Amazon Security via our [vulnerability reporting page](http://aws.amazon.com/security/vulnerability-reporting/). Please do **not** create a public github issue. +If you discover a potential security issue in this project we ask that you +notify AWS/Amazon Security via our [vulnerability reporting page][vuln]. Please +do **not** create a public Github issue. + +[vuln]: http://aws.amazon.com/security/vulnerability-reporting/ -## Licensing +## License -See the [LICENSE](LICENSE) file for our project's licensing. We will ask you to confirm the licensing of your contribution. +This project is [licensed][./LICENSE] under the Apache-2.0 License. diff --git a/GOVERNANCE.md b/GOVERNANCE.md new file mode 100644 index 0000000..c37b88a --- /dev/null +++ b/GOVERNANCE.md @@ -0,0 +1,36 @@ +# Project governance + +This document lays out the guidelines under which the AWS Controllers for Kubernetes (ACK) project will be governed. +The goal is to make sure that the roles and responsibilities are well defined and clarify on how decisions are made. + +## Roles + +In the context of ACK, we consider the following roles: + +* __Users__ ... everyone using ACK, typically willing to provide feedback on ACK by proposing features and/or filing issues. +* __Contributors__ ... everyone contributing code, documentation, examples, testing infra, and participating in feature proposals as well as design discussions. Code contributions will require a Developer Certificate of Origin (DCO). +* __Maintainers__ ... are responsible for engaging with and assisting contributors to iterate on the contributions until it reaches acceptable quality. Maintainers can decide whether the contributions can be accepted into the project or rejected. Any active contributor meeting the project quality can be made a Maintainer by the Advisory Board. +* __Advisory Board__ ... is responsible for defining the guidelines and processes that the project operates under. + +The initial members of the Advisory Board are `@jaypipes` and `@mhausenblas`. + + +## Communication + +The primary mechanism for communication will be via the `#provider-aws` channel on the Kubernetes Slack community. +All features and bug fixes will be tracked as issues in GitHub. All decisions will be documented in GitHub issues. + +In the future, we may consider using a public mailing list, which can be better archived. + +## Roadmap Planning + +Maintainers will share roadmap and release versions as milestones in GitHub. + +## Release Management + +The Advisory Board will propose a release management proposal via a GitHub issue and resolve it there. + +## Other relevant governance resources + +* The ACK [Contributing Guidelines](CONTRIBUTING.md) +* Our [Code of Conduct](CODE_OF_CONDUCT.md) diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..0953c01 --- /dev/null +++ b/Makefile @@ -0,0 +1,23 @@ +SHELL := /bin/bash # Use bash syntax + +# Set up variables +GO111MODULE=on + +# Build ldflags +VERSION ?= "v0.0.0" +GITCOMMIT=$(shell git rev-parse HEAD) +BUILDDATE=$(shell date -u +'%Y-%m-%dT%H:%M:%SZ') +GO_LDFLAGS=-ldflags "-X main.version=$(VERSION) \ + -X main.buildHash=$(GITCOMMIT) \ + -X main.buildDate=$(BUILDDATE)" + +.PHONY: all test + +all: test + +test: ## Run code tests + go test -v ./... + +help: ## Show this help. + @grep -F -h "##" $(MAKEFILE_LIST) | grep -F -v grep | sed -e 's/\\$$//' \ + | awk -F'[:#]' '{print $$1 = sprintf("%-30s", $$1), $$4}' diff --git a/NOTICE b/NOTICE index 616fc58..b8d0d46 100644 --- a/NOTICE +++ b/NOTICE @@ -1 +1 @@ -Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. diff --git a/OWNERS b/OWNERS new file mode 100644 index 0000000..ba901dc --- /dev/null +++ b/OWNERS @@ -0,0 +1,5 @@ +# See the OWNERS docs at https://go.k8s.io/owners + +approvers: + - core-ack-team + - service-team diff --git a/OWNERS_ALIASES b/OWNERS_ALIASES new file mode 100644 index 0000000..d0f2bb2 --- /dev/null +++ b/OWNERS_ALIASES @@ -0,0 +1,9 @@ +# See the OWNERS docs at https://go.k8s.io/owners#owners_aliases + +aliases: + core-ack-team: + - a-hilaly + - michaelhtm + - jlbutler + # TODO: Add your team members' GitHub aliases to the team alias + service-team: [] diff --git a/README.md b/README.md index 847260c..247688b 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,26 @@ -## My Project +# ACK service controller for AWS Glue -TODO: Fill this README out! +This repository contains source code for the AWS Controllers for Kubernetes +(ACK) service controller for . -Be sure to: +Please [log issues][ack-issues] and feedback on the main AWS Controllers for +Kubernetes Github project. -* Change the title in this README -* Edit your repository description on GitHub +[ack-issues]: https://github.com/aws/aws-controllers-k8s/issues -## Security +## Contributing -See [CONTRIBUTING](CONTRIBUTING.md#security-issue-notifications) for more information. +We welcome community contributions and pull requests. -## License +See our [contribution guide](/CONTRIBUTING.md) for more information on how to +report issues, set up a development environment, and submit code. + +We adhere to the [Amazon Open Source Code of Conduct][coc]. + +You can also learn more about our [Governance](/GOVERNANCE.md) structure. -This project is licensed under the Apache-2.0 License. +[coc]: https://aws.github.io/code-of-conduct + +## License +This project is [licensed](/LICENSE) under the Apache-2.0 License. diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..2c8325b --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,3 @@ +# Security issue notifications + +If you discover a potential security issue in this project we ask that you notify AWS/Amazon Security via our [vulnerability reporting page](http://aws.amazon.com/security/vulnerability-reporting/). Please do **not** create a public github issue. diff --git a/apis/v1alpha1/ack-generate-metadata.yaml b/apis/v1alpha1/ack-generate-metadata.yaml new file mode 100755 index 0000000..598a091 --- /dev/null +++ b/apis/v1alpha1/ack-generate-metadata.yaml @@ -0,0 +1,13 @@ +ack_generate_info: + build_date: "2024-08-13T00:36:22Z" + build_hash: 62466746500d0c01fcfa8e8e3ca6abd9386e4687 + go_version: go1.22.4 + version: v0.36.0-1-g6246674 +api_directory_checksum: 701b8fd3a5e005f42bf66b3469fec70129d973ff +api_version: v1alpha1 +aws_sdk_go_version: v1.55.5 +generator_config_info: + file_checksum: af33cec6b4ff8856b48451b54d6c37b6c011d921 + original_file_name: generator.yaml +last_modification: + reason: API generation diff --git a/apis/v1alpha1/doc.go b/apis/v1alpha1/doc.go new file mode 100644 index 0000000..702ee86 --- /dev/null +++ b/apis/v1alpha1/doc.go @@ -0,0 +1,4 @@ +// +k8s:deepcopy-gen=package +// Package v1alpha1 is the v1alpha1 version of the glue.services.k8s.aws API. +// +groupName=glue.services.k8s.aws +package v1alpha1 diff --git a/apis/v1alpha1/enums.go b/apis/v1alpha1/enums.go new file mode 100644 index 0000000..bb5bc85 --- /dev/null +++ b/apis/v1alpha1/enums.go @@ -0,0 +1,975 @@ +// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"). You may +// not use this file except in compliance with the License. A copy of the +// License is located at +// +// http://aws.amazon.com/apache2.0/ +// +// or in the "license" file accompanying this file. This file is distributed +// on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either +// express or implied. See the License for the specific language governing +// permissions and limitations under the License. + +// Code generated by ack-generate. DO NOT EDIT. + +package v1alpha1 + +type AdditionalOptionKeys string + +const ( + AdditionalOptionKeys_performanceTuning_caching AdditionalOptionKeys = "performanceTuning.caching" + AdditionalOptionKeys_observations_scope AdditionalOptionKeys = "observations.scope" +) + +type AggFunction string + +const ( + AggFunction_avg AggFunction = "avg" + AggFunction_countDistinct AggFunction = "countDistinct" + AggFunction_count AggFunction = "count" + AggFunction_first AggFunction = "first" + AggFunction_last AggFunction = "last" + AggFunction_kurtosis AggFunction = "kurtosis" + AggFunction_max AggFunction = "max" + AggFunction_min AggFunction = "min" + AggFunction_skewness AggFunction = "skewness" + AggFunction_stddev_samp AggFunction = "stddev_samp" + AggFunction_stddev_pop AggFunction = "stddev_pop" + AggFunction_sum AggFunction = "sum" + AggFunction_sumDistinct AggFunction = "sumDistinct" + AggFunction_var_samp AggFunction = "var_samp" + AggFunction_var_pop AggFunction = "var_pop" +) + +type AuthenticationType string + +const ( + AuthenticationType_BASIC AuthenticationType = "BASIC" + AuthenticationType_OAUTH2 AuthenticationType = "OAUTH2" + AuthenticationType_CUSTOM AuthenticationType = "CUSTOM" +) + +type BackfillErrorCode string + +const ( + BackfillErrorCode_ENCRYPTED_PARTITION_ERROR BackfillErrorCode = "ENCRYPTED_PARTITION_ERROR" + BackfillErrorCode_INTERNAL_ERROR BackfillErrorCode = "INTERNAL_ERROR" + BackfillErrorCode_INVALID_PARTITION_TYPE_DATA_ERROR BackfillErrorCode = "INVALID_PARTITION_TYPE_DATA_ERROR" + BackfillErrorCode_MISSING_PARTITION_VALUE_ERROR BackfillErrorCode = "MISSING_PARTITION_VALUE_ERROR" + BackfillErrorCode_UNSUPPORTED_PARTITION_CHARACTER_ERROR BackfillErrorCode = "UNSUPPORTED_PARTITION_CHARACTER_ERROR" +) + +type BlueprintRunState string + +const ( + BlueprintRunState_RUNNING BlueprintRunState = "RUNNING" + BlueprintRunState_SUCCEEDED BlueprintRunState = "SUCCEEDED" + BlueprintRunState_FAILED BlueprintRunState = "FAILED" + BlueprintRunState_ROLLING_BACK BlueprintRunState = "ROLLING_BACK" +) + +type BlueprintStatus string + +const ( + BlueprintStatus_CREATING BlueprintStatus = "CREATING" + BlueprintStatus_ACTIVE BlueprintStatus = "ACTIVE" + BlueprintStatus_UPDATING BlueprintStatus = "UPDATING" + BlueprintStatus_FAILED BlueprintStatus = "FAILED" +) + +type CatalogEncryptionMode string + +const ( + CatalogEncryptionMode_DISABLED CatalogEncryptionMode = "DISABLED" + CatalogEncryptionMode_SSE_KMS CatalogEncryptionMode = "SSE-KMS" + CatalogEncryptionMode_SSE_KMS_WITH_SERVICE_ROLE CatalogEncryptionMode = "SSE-KMS-WITH-SERVICE-ROLE" +) + +type CloudWatchEncryptionMode string + +const ( + CloudWatchEncryptionMode_DISABLED CloudWatchEncryptionMode = "DISABLED" + CloudWatchEncryptionMode_SSE_KMS CloudWatchEncryptionMode = "SSE-KMS" +) + +type ColumnStatisticsState string + +const ( + ColumnStatisticsState_STARTING ColumnStatisticsState = "STARTING" + ColumnStatisticsState_RUNNING ColumnStatisticsState = "RUNNING" + ColumnStatisticsState_SUCCEEDED ColumnStatisticsState = "SUCCEEDED" + ColumnStatisticsState_FAILED ColumnStatisticsState = "FAILED" + ColumnStatisticsState_STOPPED ColumnStatisticsState = "STOPPED" +) + +type ColumnStatisticsType string + +const ( + ColumnStatisticsType_BOOLEAN ColumnStatisticsType = "BOOLEAN" + ColumnStatisticsType_DATE ColumnStatisticsType = "DATE" + ColumnStatisticsType_DECIMAL ColumnStatisticsType = "DECIMAL" + ColumnStatisticsType_DOUBLE ColumnStatisticsType = "DOUBLE" + ColumnStatisticsType_LONG ColumnStatisticsType = "LONG" + ColumnStatisticsType_STRING ColumnStatisticsType = "STRING" + ColumnStatisticsType_BINARY ColumnStatisticsType = "BINARY" +) + +type Comparator string + +const ( + Comparator_EQUALS Comparator = "EQUALS" + Comparator_GREATER_THAN Comparator = "GREATER_THAN" + Comparator_LESS_THAN Comparator = "LESS_THAN" + Comparator_GREATER_THAN_EQUALS Comparator = "GREATER_THAN_EQUALS" + Comparator_LESS_THAN_EQUALS Comparator = "LESS_THAN_EQUALS" +) + +type Compatibility string + +const ( + Compatibility_NONE Compatibility = "NONE" + Compatibility_DISABLED Compatibility = "DISABLED" + Compatibility_BACKWARD Compatibility = "BACKWARD" + Compatibility_BACKWARD_ALL Compatibility = "BACKWARD_ALL" + Compatibility_FORWARD Compatibility = "FORWARD" + Compatibility_FORWARD_ALL Compatibility = "FORWARD_ALL" + Compatibility_FULL Compatibility = "FULL" + Compatibility_FULL_ALL Compatibility = "FULL_ALL" +) + +type CompressionType string + +const ( + CompressionType_gzip CompressionType = "gzip" + CompressionType_bzip2 CompressionType = "bzip2" +) + +type ConnectionPropertyKey string + +const ( + ConnectionPropertyKey_HOST ConnectionPropertyKey = "HOST" + ConnectionPropertyKey_PORT ConnectionPropertyKey = "PORT" + ConnectionPropertyKey_USERNAME ConnectionPropertyKey = "USERNAME" + ConnectionPropertyKey_PASSWORD ConnectionPropertyKey = "PASSWORD" + ConnectionPropertyKey_ENCRYPTED_PASSWORD ConnectionPropertyKey = "ENCRYPTED_PASSWORD" + ConnectionPropertyKey_JDBC_DRIVER_JAR_URI ConnectionPropertyKey = "JDBC_DRIVER_JAR_URI" + ConnectionPropertyKey_JDBC_DRIVER_CLASS_NAME ConnectionPropertyKey = "JDBC_DRIVER_CLASS_NAME" + ConnectionPropertyKey_JDBC_ENGINE ConnectionPropertyKey = "JDBC_ENGINE" + ConnectionPropertyKey_JDBC_ENGINE_VERSION ConnectionPropertyKey = "JDBC_ENGINE_VERSION" + ConnectionPropertyKey_CONFIG_FILES ConnectionPropertyKey = "CONFIG_FILES" + ConnectionPropertyKey_INSTANCE_ID ConnectionPropertyKey = "INSTANCE_ID" + ConnectionPropertyKey_JDBC_CONNECTION_URL ConnectionPropertyKey = "JDBC_CONNECTION_URL" + ConnectionPropertyKey_JDBC_ENFORCE_SSL ConnectionPropertyKey = "JDBC_ENFORCE_SSL" + ConnectionPropertyKey_CUSTOM_JDBC_CERT ConnectionPropertyKey = "CUSTOM_JDBC_CERT" + ConnectionPropertyKey_SKIP_CUSTOM_JDBC_CERT_VALIDATION ConnectionPropertyKey = "SKIP_CUSTOM_JDBC_CERT_VALIDATION" + ConnectionPropertyKey_CUSTOM_JDBC_CERT_STRING ConnectionPropertyKey = "CUSTOM_JDBC_CERT_STRING" + ConnectionPropertyKey_CONNECTION_URL ConnectionPropertyKey = "CONNECTION_URL" + ConnectionPropertyKey_KAFKA_BOOTSTRAP_SERVERS ConnectionPropertyKey = "KAFKA_BOOTSTRAP_SERVERS" + ConnectionPropertyKey_KAFKA_SSL_ENABLED ConnectionPropertyKey = "KAFKA_SSL_ENABLED" + ConnectionPropertyKey_KAFKA_CUSTOM_CERT ConnectionPropertyKey = "KAFKA_CUSTOM_CERT" + ConnectionPropertyKey_KAFKA_SKIP_CUSTOM_CERT_VALIDATION ConnectionPropertyKey = "KAFKA_SKIP_CUSTOM_CERT_VALIDATION" + ConnectionPropertyKey_KAFKA_CLIENT_KEYSTORE ConnectionPropertyKey = "KAFKA_CLIENT_KEYSTORE" + ConnectionPropertyKey_KAFKA_CLIENT_KEYSTORE_PASSWORD ConnectionPropertyKey = "KAFKA_CLIENT_KEYSTORE_PASSWORD" + ConnectionPropertyKey_KAFKA_CLIENT_KEY_PASSWORD ConnectionPropertyKey = "KAFKA_CLIENT_KEY_PASSWORD" + ConnectionPropertyKey_ENCRYPTED_KAFKA_CLIENT_KEYSTORE_PASSWORD ConnectionPropertyKey = "ENCRYPTED_KAFKA_CLIENT_KEYSTORE_PASSWORD" + ConnectionPropertyKey_ENCRYPTED_KAFKA_CLIENT_KEY_PASSWORD ConnectionPropertyKey = "ENCRYPTED_KAFKA_CLIENT_KEY_PASSWORD" + ConnectionPropertyKey_SECRET_ID ConnectionPropertyKey = "SECRET_ID" + ConnectionPropertyKey_CONNECTOR_URL ConnectionPropertyKey = "CONNECTOR_URL" + ConnectionPropertyKey_CONNECTOR_TYPE ConnectionPropertyKey = "CONNECTOR_TYPE" + ConnectionPropertyKey_CONNECTOR_CLASS_NAME ConnectionPropertyKey = "CONNECTOR_CLASS_NAME" + ConnectionPropertyKey_KAFKA_SASL_MECHANISM ConnectionPropertyKey = "KAFKA_SASL_MECHANISM" + ConnectionPropertyKey_KAFKA_SASL_PLAIN_USERNAME ConnectionPropertyKey = "KAFKA_SASL_PLAIN_USERNAME" + ConnectionPropertyKey_KAFKA_SASL_PLAIN_PASSWORD ConnectionPropertyKey = "KAFKA_SASL_PLAIN_PASSWORD" + ConnectionPropertyKey_ENCRYPTED_KAFKA_SASL_PLAIN_PASSWORD ConnectionPropertyKey = "ENCRYPTED_KAFKA_SASL_PLAIN_PASSWORD" + ConnectionPropertyKey_KAFKA_SASL_SCRAM_USERNAME ConnectionPropertyKey = "KAFKA_SASL_SCRAM_USERNAME" + ConnectionPropertyKey_KAFKA_SASL_SCRAM_PASSWORD ConnectionPropertyKey = "KAFKA_SASL_SCRAM_PASSWORD" + ConnectionPropertyKey_KAFKA_SASL_SCRAM_SECRETS_ARN ConnectionPropertyKey = "KAFKA_SASL_SCRAM_SECRETS_ARN" + ConnectionPropertyKey_ENCRYPTED_KAFKA_SASL_SCRAM_PASSWORD ConnectionPropertyKey = "ENCRYPTED_KAFKA_SASL_SCRAM_PASSWORD" + ConnectionPropertyKey_KAFKA_SASL_GSSAPI_KEYTAB ConnectionPropertyKey = "KAFKA_SASL_GSSAPI_KEYTAB" + ConnectionPropertyKey_KAFKA_SASL_GSSAPI_KRB5_CONF ConnectionPropertyKey = "KAFKA_SASL_GSSAPI_KRB5_CONF" + ConnectionPropertyKey_KAFKA_SASL_GSSAPI_SERVICE ConnectionPropertyKey = "KAFKA_SASL_GSSAPI_SERVICE" + ConnectionPropertyKey_KAFKA_SASL_GSSAPI_PRINCIPAL ConnectionPropertyKey = "KAFKA_SASL_GSSAPI_PRINCIPAL" + ConnectionPropertyKey_ROLE_ARN ConnectionPropertyKey = "ROLE_ARN" +) + +type ConnectionStatus string + +const ( + ConnectionStatus_READY ConnectionStatus = "READY" + ConnectionStatus_IN_PROGRESS ConnectionStatus = "IN_PROGRESS" + ConnectionStatus_FAILED ConnectionStatus = "FAILED" +) + +type ConnectionType string + +const ( + ConnectionType_JDBC ConnectionType = "JDBC" + ConnectionType_SFTP ConnectionType = "SFTP" + ConnectionType_MONGODB ConnectionType = "MONGODB" + ConnectionType_KAFKA ConnectionType = "KAFKA" + ConnectionType_NETWORK ConnectionType = "NETWORK" + ConnectionType_MARKETPLACE ConnectionType = "MARKETPLACE" + ConnectionType_CUSTOM ConnectionType = "CUSTOM" + ConnectionType_SALESFORCE ConnectionType = "SALESFORCE" +) + +type CrawlState string + +const ( + CrawlState_RUNNING CrawlState = "RUNNING" + CrawlState_CANCELLING CrawlState = "CANCELLING" + CrawlState_CANCELLED CrawlState = "CANCELLED" + CrawlState_SUCCEEDED CrawlState = "SUCCEEDED" + CrawlState_FAILED CrawlState = "FAILED" + CrawlState_ERROR CrawlState = "ERROR" +) + +type CrawlerHistoryState string + +const ( + CrawlerHistoryState_RUNNING CrawlerHistoryState = "RUNNING" + CrawlerHistoryState_COMPLETED CrawlerHistoryState = "COMPLETED" + CrawlerHistoryState_FAILED CrawlerHistoryState = "FAILED" + CrawlerHistoryState_STOPPED CrawlerHistoryState = "STOPPED" +) + +type CrawlerLineageSettings string + +const ( + CrawlerLineageSettings_ENABLE CrawlerLineageSettings = "ENABLE" + CrawlerLineageSettings_DISABLE CrawlerLineageSettings = "DISABLE" +) + +type CrawlerState string + +const ( + CrawlerState_READY CrawlerState = "READY" + CrawlerState_RUNNING CrawlerState = "RUNNING" + CrawlerState_STOPPING CrawlerState = "STOPPING" +) + +type CsvHeaderOption string + +const ( + CsvHeaderOption_UNKNOWN CsvHeaderOption = "UNKNOWN" + CsvHeaderOption_PRESENT CsvHeaderOption = "PRESENT" + CsvHeaderOption_ABSENT CsvHeaderOption = "ABSENT" +) + +type CsvSerdeOption string + +const ( + CsvSerdeOption_OpenCSVSerDe CsvSerdeOption = "OpenCSVSerDe" + CsvSerdeOption_LazySimpleSerDe CsvSerdeOption = "LazySimpleSerDe" + CsvSerdeOption_None CsvSerdeOption = "None" +) + +type DQCompositeRuleEvaluationMethod string + +const ( + DQCompositeRuleEvaluationMethod_COLUMN DQCompositeRuleEvaluationMethod = "COLUMN" + DQCompositeRuleEvaluationMethod_ROW DQCompositeRuleEvaluationMethod = "ROW" +) + +type DQStopJobOnFailureTiming string + +const ( + DQStopJobOnFailureTiming_Immediate DQStopJobOnFailureTiming = "Immediate" + DQStopJobOnFailureTiming_AfterDataLoad DQStopJobOnFailureTiming = "AfterDataLoad" +) + +type DQTransformOutput string + +const ( + DQTransformOutput_PrimaryInput DQTransformOutput = "PrimaryInput" + DQTransformOutput_EvaluationResults DQTransformOutput = "EvaluationResults" +) + +type DataFormat string + +const ( + DataFormat_AVRO DataFormat = "AVRO" + DataFormat_JSON DataFormat = "JSON" + DataFormat_PROTOBUF DataFormat = "PROTOBUF" +) + +type DataQualityRuleResultStatus string + +const ( + DataQualityRuleResultStatus_PASS DataQualityRuleResultStatus = "PASS" + DataQualityRuleResultStatus_FAIL DataQualityRuleResultStatus = "FAIL" + DataQualityRuleResultStatus_ERROR DataQualityRuleResultStatus = "ERROR" +) + +type DatabaseAttributes string + +const ( + DatabaseAttributes_NAME DatabaseAttributes = "NAME" +) + +type DeleteBehavior string + +const ( + DeleteBehavior_LOG DeleteBehavior = "LOG" + DeleteBehavior_DELETE_FROM_DATABASE DeleteBehavior = "DELETE_FROM_DATABASE" + DeleteBehavior_DEPRECATE_IN_DATABASE DeleteBehavior = "DEPRECATE_IN_DATABASE" +) + +type DeltaTargetCompressionType string + +const ( + DeltaTargetCompressionType_uncompressed DeltaTargetCompressionType = "uncompressed" + DeltaTargetCompressionType_snappy DeltaTargetCompressionType = "snappy" +) + +type EnableHybridValues string + +const ( + EnableHybridValues_TRUE EnableHybridValues = "TRUE" + EnableHybridValues_FALSE EnableHybridValues = "FALSE" +) + +type ExecutionClass string + +const ( + ExecutionClass_FLEX ExecutionClass = "FLEX" + ExecutionClass_STANDARD ExecutionClass = "STANDARD" +) + +type ExistCondition string + +const ( + ExistCondition_MUST_EXIST ExistCondition = "MUST_EXIST" + ExistCondition_NOT_EXIST ExistCondition = "NOT_EXIST" + ExistCondition_NONE ExistCondition = "NONE" +) + +type FederationSourceErrorCode string + +const ( + FederationSourceErrorCode_AccessDeniedException FederationSourceErrorCode = "AccessDeniedException" + FederationSourceErrorCode_EntityNotFoundException FederationSourceErrorCode = "EntityNotFoundException" + FederationSourceErrorCode_InvalidCredentialsException FederationSourceErrorCode = "InvalidCredentialsException" + FederationSourceErrorCode_InvalidInputException FederationSourceErrorCode = "InvalidInputException" + FederationSourceErrorCode_InvalidResponseException FederationSourceErrorCode = "InvalidResponseException" + FederationSourceErrorCode_OperationTimeoutException FederationSourceErrorCode = "OperationTimeoutException" + FederationSourceErrorCode_OperationNotSupportedException FederationSourceErrorCode = "OperationNotSupportedException" + FederationSourceErrorCode_InternalServiceException FederationSourceErrorCode = "InternalServiceException" + FederationSourceErrorCode_PartialFailureException FederationSourceErrorCode = "PartialFailureException" + FederationSourceErrorCode_ThrottlingException FederationSourceErrorCode = "ThrottlingException" +) + +type FieldName string + +const ( + FieldName_CRAWL_ID FieldName = "CRAWL_ID" + FieldName_STATE FieldName = "STATE" + FieldName_START_TIME FieldName = "START_TIME" + FieldName_END_TIME FieldName = "END_TIME" + FieldName_DPU_HOUR FieldName = "DPU_HOUR" +) + +type FilterLogicalOperator string + +const ( + FilterLogicalOperator_AND FilterLogicalOperator = "AND" + FilterLogicalOperator_OR FilterLogicalOperator = "OR" +) + +type FilterOperation string + +const ( + FilterOperation_EQ FilterOperation = "EQ" + FilterOperation_LT FilterOperation = "LT" + FilterOperation_GT FilterOperation = "GT" + FilterOperation_LTE FilterOperation = "LTE" + FilterOperation_GTE FilterOperation = "GTE" + FilterOperation_REGEX FilterOperation = "REGEX" + FilterOperation_ISNULL FilterOperation = "ISNULL" +) + +type FilterOperator string + +const ( + FilterOperator_GT FilterOperator = "GT" + FilterOperator_GE FilterOperator = "GE" + FilterOperator_LT FilterOperator = "LT" + FilterOperator_LE FilterOperator = "LE" + FilterOperator_EQ FilterOperator = "EQ" + FilterOperator_NE FilterOperator = "NE" +) + +type FilterValueType string + +const ( + FilterValueType_COLUMNEXTRACTED FilterValueType = "COLUMNEXTRACTED" + FilterValueType_CONSTANT FilterValueType = "CONSTANT" +) + +type GlueRecordType string + +const ( + GlueRecordType_DATE GlueRecordType = "DATE" + GlueRecordType_STRING GlueRecordType = "STRING" + GlueRecordType_TIMESTAMP GlueRecordType = "TIMESTAMP" + GlueRecordType_INT GlueRecordType = "INT" + GlueRecordType_FLOAT GlueRecordType = "FLOAT" + GlueRecordType_LONG GlueRecordType = "LONG" + GlueRecordType_BIGDECIMAL GlueRecordType = "BIGDECIMAL" + GlueRecordType_BYTE GlueRecordType = "BYTE" + GlueRecordType_SHORT GlueRecordType = "SHORT" + GlueRecordType_DOUBLE GlueRecordType = "DOUBLE" +) + +type HudiTargetCompressionType string + +const ( + HudiTargetCompressionType_gzip HudiTargetCompressionType = "gzip" + HudiTargetCompressionType_lzo HudiTargetCompressionType = "lzo" + HudiTargetCompressionType_uncompressed HudiTargetCompressionType = "uncompressed" + HudiTargetCompressionType_snappy HudiTargetCompressionType = "snappy" +) + +type JDBCConnectionType string + +const ( + JDBCConnectionType_sqlserver JDBCConnectionType = "sqlserver" + JDBCConnectionType_mysql JDBCConnectionType = "mysql" + JDBCConnectionType_oracle JDBCConnectionType = "oracle" + JDBCConnectionType_postgresql JDBCConnectionType = "postgresql" + JDBCConnectionType_redshift JDBCConnectionType = "redshift" +) + +type JDBCDataType string + +const ( + JDBCDataType_ARRAY JDBCDataType = "ARRAY" + JDBCDataType_BIGINT JDBCDataType = "BIGINT" + JDBCDataType_BINARY JDBCDataType = "BINARY" + JDBCDataType_BIT JDBCDataType = "BIT" + JDBCDataType_BLOB JDBCDataType = "BLOB" + JDBCDataType_BOOLEAN JDBCDataType = "BOOLEAN" + JDBCDataType_CHAR JDBCDataType = "CHAR" + JDBCDataType_CLOB JDBCDataType = "CLOB" + JDBCDataType_DATALINK JDBCDataType = "DATALINK" + JDBCDataType_DATE JDBCDataType = "DATE" + JDBCDataType_DECIMAL JDBCDataType = "DECIMAL" + JDBCDataType_DISTINCT JDBCDataType = "DISTINCT" + JDBCDataType_DOUBLE JDBCDataType = "DOUBLE" + JDBCDataType_FLOAT JDBCDataType = "FLOAT" + JDBCDataType_INTEGER JDBCDataType = "INTEGER" + JDBCDataType_JAVA_OBJECT JDBCDataType = "JAVA_OBJECT" + JDBCDataType_LONGNVARCHAR JDBCDataType = "LONGNVARCHAR" + JDBCDataType_LONGVARBINARY JDBCDataType = "LONGVARBINARY" + JDBCDataType_LONGVARCHAR JDBCDataType = "LONGVARCHAR" + JDBCDataType_NCHAR JDBCDataType = "NCHAR" + JDBCDataType_NCLOB JDBCDataType = "NCLOB" + JDBCDataType_NULL JDBCDataType = "NULL" + JDBCDataType_NUMERIC JDBCDataType = "NUMERIC" + JDBCDataType_NVARCHAR JDBCDataType = "NVARCHAR" + JDBCDataType_OTHER JDBCDataType = "OTHER" + JDBCDataType_REAL JDBCDataType = "REAL" + JDBCDataType_REF JDBCDataType = "REF" + JDBCDataType_REF_CURSOR JDBCDataType = "REF_CURSOR" + JDBCDataType_ROWID JDBCDataType = "ROWID" + JDBCDataType_SMALLINT JDBCDataType = "SMALLINT" + JDBCDataType_SQLXML JDBCDataType = "SQLXML" + JDBCDataType_STRUCT JDBCDataType = "STRUCT" + JDBCDataType_TIME JDBCDataType = "TIME" + JDBCDataType_TIME_WITH_TIMEZONE JDBCDataType = "TIME_WITH_TIMEZONE" + JDBCDataType_TIMESTAMP JDBCDataType = "TIMESTAMP" + JDBCDataType_TIMESTAMP_WITH_TIMEZONE JDBCDataType = "TIMESTAMP_WITH_TIMEZONE" + JDBCDataType_TINYINT JDBCDataType = "TINYINT" + JDBCDataType_VARBINARY JDBCDataType = "VARBINARY" + JDBCDataType_VARCHAR JDBCDataType = "VARCHAR" +) + +type JdbcMetadataEntry string + +const ( + JdbcMetadataEntry_COMMENTS JdbcMetadataEntry = "COMMENTS" + JdbcMetadataEntry_RAWTYPES JdbcMetadataEntry = "RAWTYPES" +) + +type JobBookmarksEncryptionMode string + +const ( + JobBookmarksEncryptionMode_DISABLED JobBookmarksEncryptionMode = "DISABLED" + JobBookmarksEncryptionMode_CSE_KMS JobBookmarksEncryptionMode = "CSE-KMS" +) + +type JobMode string + +const ( + JobMode_SCRIPT JobMode = "SCRIPT" + JobMode_VISUAL JobMode = "VISUAL" + JobMode_NOTEBOOK JobMode = "NOTEBOOK" +) + +type JobRunState string + +const ( + JobRunState_STARTING JobRunState = "STARTING" + JobRunState_RUNNING JobRunState = "RUNNING" + JobRunState_STOPPING JobRunState = "STOPPING" + JobRunState_STOPPED JobRunState = "STOPPED" + JobRunState_SUCCEEDED JobRunState = "SUCCEEDED" + JobRunState_FAILED JobRunState = "FAILED" + JobRunState_TIMEOUT JobRunState = "TIMEOUT" + JobRunState_ERROR JobRunState = "ERROR" + JobRunState_WAITING JobRunState = "WAITING" + JobRunState_EXPIRED JobRunState = "EXPIRED" +) + +type JoinType string + +const ( + JoinType_equijoin JoinType = "equijoin" + JoinType_left JoinType = "left" + JoinType_right JoinType = "right" + JoinType_outer JoinType = "outer" + JoinType_leftsemi JoinType = "leftsemi" + JoinType_leftanti JoinType = "leftanti" +) + +type Language string + +const ( + Language_PYTHON Language = "PYTHON" + Language_SCALA Language = "SCALA" +) + +type LastCrawlStatus string + +const ( + LastCrawlStatus_SUCCEEDED LastCrawlStatus = "SUCCEEDED" + LastCrawlStatus_CANCELLED LastCrawlStatus = "CANCELLED" + LastCrawlStatus_FAILED LastCrawlStatus = "FAILED" +) + +type Logical string + +const ( + Logical_AND Logical = "AND" + Logical_ANY Logical = "ANY" +) + +type LogicalOperator string + +const ( + LogicalOperator_EQUALS LogicalOperator = "EQUALS" +) + +type MLUserDataEncryptionModeString string + +const ( + MLUserDataEncryptionModeString_DISABLED MLUserDataEncryptionModeString = "DISABLED" + MLUserDataEncryptionModeString_SSE_KMS MLUserDataEncryptionModeString = "SSE-KMS" +) + +type MetadataOperation string + +const ( + MetadataOperation_CREATE MetadataOperation = "CREATE" +) + +type NodeType string + +const ( + NodeType_CRAWLER NodeType = "CRAWLER" + NodeType_JOB NodeType = "JOB" + NodeType_TRIGGER NodeType = "TRIGGER" +) + +type OAuth2GrantType string + +const ( + OAuth2GrantType_AUTHORIZATION_CODE OAuth2GrantType = "AUTHORIZATION_CODE" + OAuth2GrantType_CLIENT_CREDENTIALS OAuth2GrantType = "CLIENT_CREDENTIALS" + OAuth2GrantType_JWT_BEARER OAuth2GrantType = "JWT_BEARER" +) + +type ParamType string + +const ( + ParamType_str ParamType = "str" + ParamType_int ParamType = "int" + ParamType_float ParamType = "float" + ParamType_complex ParamType = "complex" + ParamType_bool ParamType = "bool" + ParamType_list ParamType = "list" + ParamType_null ParamType = "null" +) + +type ParquetCompressionType string + +const ( + ParquetCompressionType_snappy ParquetCompressionType = "snappy" + ParquetCompressionType_lzo ParquetCompressionType = "lzo" + ParquetCompressionType_gzip ParquetCompressionType = "gzip" + ParquetCompressionType_uncompressed ParquetCompressionType = "uncompressed" + ParquetCompressionType_none ParquetCompressionType = "none" +) + +type PartitionIndexStatus string + +const ( + PartitionIndexStatus_CREATING PartitionIndexStatus = "CREATING" + PartitionIndexStatus_ACTIVE PartitionIndexStatus = "ACTIVE" + PartitionIndexStatus_DELETING PartitionIndexStatus = "DELETING" + PartitionIndexStatus_FAILED PartitionIndexStatus = "FAILED" +) + +type Permission string + +const ( + Permission_ALL Permission = "ALL" + Permission_SELECT Permission = "SELECT" + Permission_ALTER Permission = "ALTER" + Permission_DROP Permission = "DROP" + Permission_DELETE Permission = "DELETE" + Permission_INSERT Permission = "INSERT" + Permission_CREATE_DATABASE Permission = "CREATE_DATABASE" + Permission_CREATE_TABLE Permission = "CREATE_TABLE" + Permission_DATA_LOCATION_ACCESS Permission = "DATA_LOCATION_ACCESS" +) + +type PermissionType string + +const ( + PermissionType_COLUMN_PERMISSION PermissionType = "COLUMN_PERMISSION" + PermissionType_CELL_FILTER_PERMISSION PermissionType = "CELL_FILTER_PERMISSION" + PermissionType_NESTED_PERMISSION PermissionType = "NESTED_PERMISSION" + PermissionType_NESTED_CELL_PERMISSION PermissionType = "NESTED_CELL_PERMISSION" +) + +type PiiType string + +const ( + PiiType_RowAudit PiiType = "RowAudit" + PiiType_RowMasking PiiType = "RowMasking" + PiiType_ColumnAudit PiiType = "ColumnAudit" + PiiType_ColumnMasking PiiType = "ColumnMasking" +) + +type PrincipalType string + +const ( + PrincipalType_USER PrincipalType = "USER" + PrincipalType_ROLE PrincipalType = "ROLE" + PrincipalType_GROUP PrincipalType = "GROUP" +) + +type QuoteChar string + +const ( + QuoteChar_quote QuoteChar = "quote" + QuoteChar_quillemet QuoteChar = "quillemet" + QuoteChar_single_quote QuoteChar = "single_quote" + QuoteChar_disabled QuoteChar = "disabled" +) + +type RECRawlBehavior string + +const ( + RECRawlBehavior_CRAWL_EVERYTHING RECRawlBehavior = "CRAWL_EVERYTHING" + RECRawlBehavior_CRAWL_NEW_FOLDERS_ONLY RECRawlBehavior = "CRAWL_NEW_FOLDERS_ONLY" + RECRawlBehavior_CRAWL_EVENT_MODE RECRawlBehavior = "CRAWL_EVENT_MODE" +) + +type RegistryStatus string + +const ( + RegistryStatus_AVAILABLE RegistryStatus = "AVAILABLE" + RegistryStatus_DELETING RegistryStatus = "DELETING" +) + +type ResourceShareType string + +const ( + ResourceShareType_FOREIGN ResourceShareType = "FOREIGN" + ResourceShareType_ALL ResourceShareType = "ALL" + ResourceShareType_FEDERATED ResourceShareType = "FEDERATED" +) + +type ResourceType string + +const ( + ResourceType_JAR ResourceType = "JAR" + ResourceType_FILE ResourceType = "FILE" + ResourceType_ARCHIVE ResourceType = "ARCHIVE" +) + +type S3EncryptionMode string + +const ( + S3EncryptionMode_DISABLED S3EncryptionMode = "DISABLED" + S3EncryptionMode_SSE_KMS S3EncryptionMode = "SSE-KMS" + S3EncryptionMode_SSE_S3 S3EncryptionMode = "SSE-S3" +) + +type ScheduleState string + +const ( + ScheduleState_SCHEDULED ScheduleState = "SCHEDULED" + ScheduleState_NOT_SCHEDULED ScheduleState = "NOT_SCHEDULED" + ScheduleState_TRANSITIONING ScheduleState = "TRANSITIONING" +) + +type SchemaDiffType string + +const ( + SchemaDiffType_SYNTAX_DIFF SchemaDiffType = "SYNTAX_DIFF" +) + +type SchemaStatus string + +const ( + SchemaStatus_AVAILABLE SchemaStatus = "AVAILABLE" + SchemaStatus_PENDING SchemaStatus = "PENDING" + SchemaStatus_DELETING SchemaStatus = "DELETING" +) + +type SchemaVersionStatus string + +const ( + SchemaVersionStatus_AVAILABLE SchemaVersionStatus = "AVAILABLE" + SchemaVersionStatus_PENDING SchemaVersionStatus = "PENDING" + SchemaVersionStatus_FAILURE SchemaVersionStatus = "FAILURE" + SchemaVersionStatus_DELETING SchemaVersionStatus = "DELETING" +) + +type Separator string + +const ( + Separator_comma Separator = "comma" + Separator_ctrla Separator = "ctrla" + Separator_pipe Separator = "pipe" + Separator_semicolon Separator = "semicolon" + Separator_tab Separator = "tab" +) + +type SessionStatus string + +const ( + SessionStatus_PROVISIONING SessionStatus = "PROVISIONING" + SessionStatus_READY SessionStatus = "READY" + SessionStatus_FAILED SessionStatus = "FAILED" + SessionStatus_TIMEOUT SessionStatus = "TIMEOUT" + SessionStatus_STOPPING SessionStatus = "STOPPING" + SessionStatus_STOPPED SessionStatus = "STOPPED" +) + +type Sort string + +const ( + Sort_ASC Sort = "ASC" + Sort_DESC Sort = "DESC" +) + +type SortDirectionType string + +const ( + SortDirectionType_DESCENDING SortDirectionType = "DESCENDING" + SortDirectionType_ASCENDING SortDirectionType = "ASCENDING" +) + +type SourceControlAuthStrategy string + +const ( + SourceControlAuthStrategy_PERSONAL_ACCESS_TOKEN SourceControlAuthStrategy = "PERSONAL_ACCESS_TOKEN" + SourceControlAuthStrategy_AWS_SECRETS_MANAGER SourceControlAuthStrategy = "AWS_SECRETS_MANAGER" +) + +type SourceControlProvider string + +const ( + SourceControlProvider_GITHUB SourceControlProvider = "GITHUB" + SourceControlProvider_GITLAB SourceControlProvider = "GITLAB" + SourceControlProvider_BITBUCKET SourceControlProvider = "BITBUCKET" + SourceControlProvider_AWS_CODE_COMMIT SourceControlProvider = "AWS_CODE_COMMIT" +) + +type StartingPosition string + +const ( + StartingPosition_latest StartingPosition = "latest" + StartingPosition_trim_horizon StartingPosition = "trim_horizon" + StartingPosition_earliest StartingPosition = "earliest" + StartingPosition_timestamp StartingPosition = "timestamp" +) + +type StatementState string + +const ( + StatementState_WAITING StatementState = "WAITING" + StatementState_RUNNING StatementState = "RUNNING" + StatementState_AVAILABLE StatementState = "AVAILABLE" + StatementState_CANCELLING StatementState = "CANCELLING" + StatementState_CANCELLED StatementState = "CANCELLED" + StatementState_ERROR StatementState = "ERROR" +) + +type TableOptimizerEventType string + +const ( + TableOptimizerEventType_starting TableOptimizerEventType = "starting" + TableOptimizerEventType_completed TableOptimizerEventType = "completed" + TableOptimizerEventType_failed TableOptimizerEventType = "failed" + TableOptimizerEventType_in_progress TableOptimizerEventType = "in_progress" +) + +type TableOptimizerType string + +const ( + TableOptimizerType_compaction TableOptimizerType = "compaction" +) + +type TargetFormat string + +const ( + TargetFormat_json TargetFormat = "json" + TargetFormat_csv TargetFormat = "csv" + TargetFormat_avro TargetFormat = "avro" + TargetFormat_orc TargetFormat = "orc" + TargetFormat_parquet TargetFormat = "parquet" + TargetFormat_hudi TargetFormat = "hudi" + TargetFormat_delta TargetFormat = "delta" +) + +type TaskRunSortColumnType string + +const ( + TaskRunSortColumnType_TASK_RUN_TYPE TaskRunSortColumnType = "TASK_RUN_TYPE" + TaskRunSortColumnType_STATUS TaskRunSortColumnType = "STATUS" + TaskRunSortColumnType_STARTED TaskRunSortColumnType = "STARTED" +) + +type TaskStatusType string + +const ( + TaskStatusType_STARTING TaskStatusType = "STARTING" + TaskStatusType_RUNNING TaskStatusType = "RUNNING" + TaskStatusType_STOPPING TaskStatusType = "STOPPING" + TaskStatusType_STOPPED TaskStatusType = "STOPPED" + TaskStatusType_SUCCEEDED TaskStatusType = "SUCCEEDED" + TaskStatusType_FAILED TaskStatusType = "FAILED" + TaskStatusType_TIMEOUT TaskStatusType = "TIMEOUT" +) + +type TaskType string + +const ( + TaskType_EVALUATION TaskType = "EVALUATION" + TaskType_LABELING_SET_GENERATION TaskType = "LABELING_SET_GENERATION" + TaskType_IMPORT_LABELS TaskType = "IMPORT_LABELS" + TaskType_EXPORT_LABELS TaskType = "EXPORT_LABELS" + TaskType_FIND_MATCHES TaskType = "FIND_MATCHES" +) + +type TransformSortColumnType string + +const ( + TransformSortColumnType_NAME TransformSortColumnType = "NAME" + TransformSortColumnType_TRANSFORM_TYPE TransformSortColumnType = "TRANSFORM_TYPE" + TransformSortColumnType_STATUS TransformSortColumnType = "STATUS" + TransformSortColumnType_CREATED TransformSortColumnType = "CREATED" + TransformSortColumnType_LAST_MODIFIED TransformSortColumnType = "LAST_MODIFIED" +) + +type TransformStatusType string + +const ( + TransformStatusType_NOT_READY TransformStatusType = "NOT_READY" + TransformStatusType_READY TransformStatusType = "READY" + TransformStatusType_DELETING TransformStatusType = "DELETING" +) + +type TransformType string + +const ( + TransformType_FIND_MATCHES TransformType = "FIND_MATCHES" +) + +type TriggerState string + +const ( + TriggerState_CREATING TriggerState = "CREATING" + TriggerState_CREATED TriggerState = "CREATED" + TriggerState_ACTIVATING TriggerState = "ACTIVATING" + TriggerState_ACTIVATED TriggerState = "ACTIVATED" + TriggerState_DEACTIVATING TriggerState = "DEACTIVATING" + TriggerState_DEACTIVATED TriggerState = "DEACTIVATED" + TriggerState_DELETING TriggerState = "DELETING" + TriggerState_UPDATING TriggerState = "UPDATING" +) + +type TriggerType string + +const ( + TriggerType_SCHEDULED TriggerType = "SCHEDULED" + TriggerType_CONDITIONAL TriggerType = "CONDITIONAL" + TriggerType_ON_DEMAND TriggerType = "ON_DEMAND" + TriggerType_EVENT TriggerType = "EVENT" +) + +type UnionType string + +const ( + UnionType_ALL UnionType = "ALL" + UnionType_DISTINCT UnionType = "DISTINCT" +) + +type UpdateBehavior string + +const ( + UpdateBehavior_LOG UpdateBehavior = "LOG" + UpdateBehavior_UPDATE_IN_DATABASE UpdateBehavior = "UPDATE_IN_DATABASE" +) + +type UpdateCatalogBehavior string + +const ( + UpdateCatalogBehavior_UPDATE_IN_DATABASE UpdateCatalogBehavior = "UPDATE_IN_DATABASE" + UpdateCatalogBehavior_LOG UpdateCatalogBehavior = "LOG" +) + +type ViewDialect string + +const ( + ViewDialect_REDSHIFT ViewDialect = "REDSHIFT" + ViewDialect_ATHENA ViewDialect = "ATHENA" + ViewDialect_SPARK ViewDialect = "SPARK" +) + +type ViewUpdateAction string + +const ( + ViewUpdateAction_ADD ViewUpdateAction = "ADD" + ViewUpdateAction_REPLACE ViewUpdateAction = "REPLACE" + ViewUpdateAction_ADD_OR_REPLACE ViewUpdateAction = "ADD_OR_REPLACE" + ViewUpdateAction_DROP ViewUpdateAction = "DROP" +) + +type WorkerType string + +const ( + WorkerType_Standard WorkerType = "Standard" + WorkerType_G_1X WorkerType = "G.1X" + WorkerType_G_2X WorkerType = "G.2X" + WorkerType_G_025X WorkerType = "G.025X" + WorkerType_G_4X WorkerType = "G.4X" + WorkerType_G_8X WorkerType = "G.8X" + WorkerType_Z_2X WorkerType = "Z.2X" +) + +type WorkflowRunStatus string + +const ( + WorkflowRunStatus_RUNNING WorkflowRunStatus = "RUNNING" + WorkflowRunStatus_COMPLETED WorkflowRunStatus = "COMPLETED" + WorkflowRunStatus_STOPPING WorkflowRunStatus = "STOPPING" + WorkflowRunStatus_STOPPED WorkflowRunStatus = "STOPPED" + WorkflowRunStatus_ERROR WorkflowRunStatus = "ERROR" +) diff --git a/apis/v1alpha1/generator.yaml b/apis/v1alpha1/generator.yaml new file mode 100644 index 0000000..f78281b --- /dev/null +++ b/apis/v1alpha1/generator.yaml @@ -0,0 +1,26 @@ +ignore: + resource_names: + - Blueprint + - Classifier + - Connection + - Crawler + - CustomEntityType + - DataQualityRuleset + - Database + - DevEndpoint + - Job + - MLTransform + - Partition + - PartitionIndex + - Registry + - Schema + - Script + - SecurityConfiguration + - Session + - Table + - TableOptimizer + - Trigger + - UsageProfile + - UserDefinedFunction + - Workflow +model_name: glue diff --git a/apis/v1alpha1/groupversion_info.go b/apis/v1alpha1/groupversion_info.go new file mode 100644 index 0000000..9c4ac30 --- /dev/null +++ b/apis/v1alpha1/groupversion_info.go @@ -0,0 +1,32 @@ +// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"). You may +// not use this file except in compliance with the License. A copy of the +// License is located at +// +// http://aws.amazon.com/apache2.0/ +// +// or in the "license" file accompanying this file. This file is distributed +// on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either +// express or implied. See the License for the specific language governing +// permissions and limitations under the License. + +// Code generated by ack-generate. DO NOT EDIT. + +package v1alpha1 + +import ( + "k8s.io/apimachinery/pkg/runtime/schema" + "sigs.k8s.io/controller-runtime/pkg/scheme" +) + +var ( + // GroupVersion is the API Group Version used to register the objects + GroupVersion = schema.GroupVersion{Group: "glue.services.k8s.aws", Version: "v1alpha1"} + + // SchemeBuilder is used to add go types to the GroupVersionKind scheme + SchemeBuilder = &scheme.Builder{GroupVersion: GroupVersion} + + // AddToScheme adds the types in this group-version to the given scheme. + AddToScheme = SchemeBuilder.AddToScheme +) diff --git a/apis/v1alpha1/types.go b/apis/v1alpha1/types.go new file mode 100644 index 0000000..9b23f5e --- /dev/null +++ b/apis/v1alpha1/types.go @@ -0,0 +1,29 @@ +// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"). You may +// not use this file except in compliance with the License. A copy of the +// License is located at +// +// http://aws.amazon.com/apache2.0/ +// +// or in the "license" file accompanying this file. This file is distributed +// on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either +// express or implied. See the License for the specific language governing +// permissions and limitations under the License. + +// Code generated by ack-generate. DO NOT EDIT. + +package v1alpha1 + +import ( + ackv1alpha1 "github.com/aws-controllers-k8s/runtime/apis/core/v1alpha1" + "github.com/aws/aws-sdk-go/aws" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// Hack to avoid import errors during build... +var ( + _ = &metav1.Time{} + _ = &aws.JSONValue{} + _ = ackv1alpha1.AWSAccountID("") +) diff --git a/cmd/controller/main.go b/cmd/controller/main.go new file mode 100644 index 0000000..b719610 --- /dev/null +++ b/cmd/controller/main.go @@ -0,0 +1,197 @@ +// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"). You may +// not use this file except in compliance with the License. A copy of the +// License is located at +// +// http://aws.amazon.com/apache2.0/ +// +// or in the "license" file accompanying this file. This file is distributed +// on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either +// express or implied. See the License for the specific language governing +// permissions and limitations under the License. + +// Code generated by ack-generate. DO NOT EDIT. + +package main + +import ( + "os" + + ackv1alpha1 "github.com/aws-controllers-k8s/runtime/apis/core/v1alpha1" + ackcfg "github.com/aws-controllers-k8s/runtime/pkg/config" + ackrt "github.com/aws-controllers-k8s/runtime/pkg/runtime" + acktypes "github.com/aws-controllers-k8s/runtime/pkg/types" + ackrtutil "github.com/aws-controllers-k8s/runtime/pkg/util" + ackrtwebhook "github.com/aws-controllers-k8s/runtime/pkg/webhook" + flag "github.com/spf13/pflag" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + clientgoscheme "k8s.io/client-go/kubernetes/scheme" + ctrlrt "sigs.k8s.io/controller-runtime" + ctrlrtcache "sigs.k8s.io/controller-runtime/pkg/cache" + ctrlrthealthz "sigs.k8s.io/controller-runtime/pkg/healthz" + ctrlrtmetrics "sigs.k8s.io/controller-runtime/pkg/metrics" + metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server" + ctrlrtwebhook "sigs.k8s.io/controller-runtime/pkg/webhook" + + svctypes "github.com/aws-controllers-k8s/glue-controller/apis/v1alpha1" + svcresource "github.com/aws-controllers-k8s/glue-controller/pkg/resource" + svcsdk "github.com/aws/aws-sdk-go/service/glue" + + "github.com/aws-controllers-k8s/glue-controller/pkg/version" +) + +var ( + awsServiceAPIGroup = "glue.services.k8s.aws" + awsServiceAlias = "glue" + awsServiceEndpointsID = svcsdk.EndpointsID + scheme = runtime.NewScheme() + setupLog = ctrlrt.Log.WithName("setup") +) + +func init() { + _ = clientgoscheme.AddToScheme(scheme) + + _ = svctypes.AddToScheme(scheme) + _ = ackv1alpha1.AddToScheme(scheme) +} + +func main() { + var ackCfg ackcfg.Config + ackCfg.BindFlags() + flag.Parse() + ackCfg.SetupLogger() + + managerFactories := svcresource.GetManagerFactories() + resourceGVKs := make([]schema.GroupVersionKind, 0, len(managerFactories)) + for _, mf := range managerFactories { + resourceGVKs = append(resourceGVKs, mf.ResourceDescriptor().GroupVersionKind()) + } + + if err := ackCfg.Validate(ackcfg.WithGVKs(resourceGVKs)); err != nil { + setupLog.Error( + err, "Unable to create controller manager", + "aws.service", awsServiceAlias, + ) + os.Exit(1) + } + + host, port, err := ackrtutil.GetHostPort(ackCfg.WebhookServerAddr) + if err != nil { + setupLog.Error( + err, "Unable to parse webhook server address.", + "aws.service", awsServiceAlias, + ) + os.Exit(1) + } + + watchNamespaces := make(map[string]ctrlrtcache.Config, 0) + namespaces, err := ackCfg.GetWatchNamespaces() + if err != nil { + setupLog.Error( + err, "Unable to parse watch namespaces.", + "aws.service", ackCfg.WatchNamespace, + ) + os.Exit(1) + } + + for _, namespace := range namespaces { + watchNamespaces[namespace] = ctrlrtcache.Config{} + } + mgr, err := ctrlrt.NewManager(ctrlrt.GetConfigOrDie(), ctrlrt.Options{ + Scheme: scheme, + Cache: ctrlrtcache.Options{ + Scheme: scheme, + DefaultNamespaces: watchNamespaces, + }, + WebhookServer: &ctrlrtwebhook.DefaultServer{ + Options: ctrlrtwebhook.Options{ + Port: port, + Host: host, + }, + }, + Metrics: metricsserver.Options{BindAddress: ackCfg.MetricsAddr}, + LeaderElection: ackCfg.EnableLeaderElection, + LeaderElectionID: "ack-" + awsServiceAPIGroup, + LeaderElectionNamespace: ackCfg.LeaderElectionNamespace, + HealthProbeBindAddress: ackCfg.HealthzAddr, + LivenessEndpointName: "/healthz", + ReadinessEndpointName: "/readyz", + }) + if err != nil { + setupLog.Error( + err, "unable to create controller manager", + "aws.service", awsServiceAlias, + ) + os.Exit(1) + } + + stopChan := ctrlrt.SetupSignalHandler() + + setupLog.Info( + "initializing service controller", + "aws.service", awsServiceAlias, + ) + sc := ackrt.NewServiceController( + awsServiceAlias, awsServiceAPIGroup, awsServiceEndpointsID, + acktypes.VersionInfo{ + version.GitCommit, + version.GitVersion, + version.BuildDate, + }, + ).WithLogger( + ctrlrt.Log, + ).WithResourceManagerFactories( + svcresource.GetManagerFactories(), + ).WithPrometheusRegistry( + ctrlrtmetrics.Registry, + ) + + if ackCfg.EnableWebhookServer { + webhooks := ackrtwebhook.GetWebhooks() + for _, webhook := range webhooks { + if err := webhook.Setup(mgr); err != nil { + setupLog.Error( + err, "unable to register webhook "+webhook.UID(), + "aws.service", awsServiceAlias, + ) + } + } + } + + if err = sc.BindControllerManager(mgr, ackCfg); err != nil { + setupLog.Error( + err, "unable bind to controller manager to service controller", + "aws.service", awsServiceAlias, + ) + os.Exit(1) + } + + if err = mgr.AddHealthzCheck("health", ctrlrthealthz.Ping); err != nil { + setupLog.Error( + err, "unable to set up health check", + "aws.service", awsServiceAlias, + ) + os.Exit(1) + } + if err = mgr.AddReadyzCheck("check", ctrlrthealthz.Ping); err != nil { + setupLog.Error( + err, "unable to set up ready check", + "aws.service", awsServiceAlias, + ) + os.Exit(1) + } + + setupLog.Info( + "starting manager", + "aws.service", awsServiceAlias, + ) + if err := mgr.Start(stopChan); err != nil { + setupLog.Error( + err, "unable to start controller manager", + "aws.service", awsServiceAlias, + ) + os.Exit(1) + } +} diff --git a/config/controller/deployment.yaml b/config/controller/deployment.yaml new file mode 100644 index 0000000..ad60d8c --- /dev/null +++ b/config/controller/deployment.yaml @@ -0,0 +1,106 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: ack-system +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: ack-glue-controller + namespace: ack-system + labels: + app.kubernetes.io/name: ack-glue-controller + app.kubernetes.io/part-of: ack-system +spec: + selector: + matchLabels: + app.kubernetes.io/name: ack-glue-controller + replicas: 1 + template: + metadata: + labels: + app.kubernetes.io/name: ack-glue-controller + spec: + containers: + - command: + - ./bin/controller + args: + - --aws-region + - "$(AWS_REGION)" + - --aws-endpoint-url + - "$(AWS_ENDPOINT_URL)" + - --enable-development-logging=$(ACK_ENABLE_DEVELOPMENT_LOGGING) + - --log-level + - "$(ACK_LOG_LEVEL)" + - --resource-tags + - "$(ACK_RESOURCE_TAGS)" + - --watch-namespace + - "$(ACK_WATCH_NAMESPACE)" + - --enable-leader-election=$(ENABLE_LEADER_ELECTION) + - --leader-election-namespace + - "$(LEADER_ELECTION_NAMESPACE)" + - --reconcile-default-max-concurrent-syncs + - "$(RECONCILE_DEFAULT_MAX_CONCURRENT_SYNCS)" + image: controller:latest + name: controller + ports: + - name: http + containerPort: 8080 + resources: + limits: + cpu: 100m + memory: 300Mi + requests: + cpu: 100m + memory: 200Mi + env: + - name: ACK_SYSTEM_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: AWS_REGION + value: "" + - name: AWS_ENDPOINT_URL + value: "" + - name: ACK_WATCH_NAMESPACE + value: "" + - name: ACK_ENABLE_DEVELOPMENT_LOGGING + value: "false" + - name: ACK_LOG_LEVEL + value: "info" + - name: ACK_RESOURCE_TAGS + value: "services.k8s.aws/controller-version=%CONTROLLER_SERVICE%-%CONTROLLER_VERSION%,services.k8s.aws/namespace=%K8S_NAMESPACE%" + - name: ENABLE_LEADER_ELECTION + value: "false" + - name: LEADER_ELECTION_NAMESPACE + value: "ack-system" + - name: "RECONCILE_DEFAULT_MAX_CONCURRENT_SYNCS" + value: "1" + securityContext: + allowPrivilegeEscalation: false + privileged: false + runAsNonRoot: true + capabilities: + drop: + - ALL + livenessProbe: + httpGet: + path: /healthz + port: 8081 + initialDelaySeconds: 15 + periodSeconds: 20 + readinessProbe: + httpGet: + path: /readyz + port: 8081 + initialDelaySeconds: 5 + periodSeconds: 10 + securityContext: + seccompProfile: + type: RuntimeDefault + terminationGracePeriodSeconds: 10 + serviceAccountName: ack-glue-controller + hostIPC: false + hostPID: false + hostNetwork: false + dnsPolicy: ClusterFirst diff --git a/config/controller/kustomization.yaml b/config/controller/kustomization.yaml new file mode 100644 index 0000000..4bfa098 --- /dev/null +++ b/config/controller/kustomization.yaml @@ -0,0 +1,9 @@ +resources: +- deployment.yaml +- service.yaml +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +images: +- name: controller + newName: public.ecr.aws/aws-controllers-k8s/glue-controller + newTag: 0.0.0-non-release-version diff --git a/config/controller/service.yaml b/config/controller/service.yaml new file mode 100644 index 0000000..0da1d84 --- /dev/null +++ b/config/controller/service.yaml @@ -0,0 +1,14 @@ +apiVersion: v1 +kind: Service +metadata: + name: ack-glue-metrics-service + namespace: ack-system +spec: + selector: + app.kubernetes.io/name: ack-glue-controller + ports: + - name: metricsport + port: 8080 + targetPort: http + protocol: TCP + type: NodePort diff --git a/config/crd/common/bases/services.k8s.aws_adoptedresources.yaml b/config/crd/common/bases/services.k8s.aws_adoptedresources.yaml new file mode 100644 index 0000000..65eff73 --- /dev/null +++ b/config/crd/common/bases/services.k8s.aws_adoptedresources.yaml @@ -0,0 +1,254 @@ +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.14.0 + name: adoptedresources.services.k8s.aws +spec: + group: services.k8s.aws + names: + kind: AdoptedResource + listKind: AdoptedResourceList + plural: adoptedresources + singular: adoptedresource + scope: Namespaced + versions: + - name: v1alpha1 + schema: + openAPIV3Schema: + description: AdoptedResource is the schema for the AdoptedResource API. + properties: + apiVersion: + description: |- + APIVersion defines the versioned schema of this representation of an object. + Servers should convert recognized schemas to the latest internal value, and + may reject unrecognized values. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources + type: string + kind: + description: |- + Kind is a string value representing the REST resource this object represents. + Servers may infer this from the endpoint the client submits requests to. + Cannot be updated. + In CamelCase. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + type: string + metadata: + type: object + spec: + description: AdoptedResourceSpec defines the desired state of the AdoptedResource. + properties: + aws: + description: AWSIdentifiers provide all unique ways to reference an + AWS resource. + properties: + additionalKeys: + additionalProperties: + type: string + description: |- + AdditionalKeys represents any additional arbitrary identifiers used when + describing the target resource. + type: object + arn: + description: |- + ARN is the AWS Resource Name for the resource. It is a globally + unique identifier. + type: string + nameOrID: + description: |- + NameOrId is a user-supplied string identifier for the resource. It may + or may not be globally unique, depending on the type of resource. + type: string + type: object + kubernetes: + description: |- + ResourceWithMetadata provides the values necessary to create a + Kubernetes resource and override any of its metadata values. + properties: + group: + type: string + kind: + type: string + metadata: + description: |- + ObjectMeta is metadata that all persisted resources must have, which includes all objects + users must create. + It is not possible to use `metav1.ObjectMeta` inside spec, as the controller-gen + automatically converts this to an arbitrary string-string map. + https://github.com/kubernetes-sigs/controller-tools/issues/385 + + + Active discussion about inclusion of this field in the spec is happening in this PR: + https://github.com/kubernetes-sigs/controller-tools/pull/395 + + + Until this is allowed, or if it never is, we will produce a subset of the object meta + that contains only the fields which the user is allowed to modify in the metadata. + properties: + annotations: + additionalProperties: + type: string + description: |- + Annotations is an unstructured key value map stored with a resource that may be + set by external tools to store and retrieve arbitrary metadata. They are not + queryable and should be preserved when modifying objects. + More info: http://kubernetes.io/docs/user-guide/annotations + type: object + generateName: + description: |- + GenerateName is an optional prefix, used by the server, to generate a unique + name ONLY IF the Name field has not been provided. + If this field is used, the name returned to the client will be different + than the name passed. This value will also be combined with a unique suffix. + The provided value has the same validation rules as the Name field, + and may be truncated by the length of the suffix required to make the value + unique on the server. + + + If this field is specified and the generated name exists, the server will + NOT return a 409 - instead, it will either return 201 Created or 500 with Reason + ServerTimeout indicating a unique name could not be found in the time allotted, and the client + should retry (optionally after the time indicated in the Retry-After header). + + + Applied only if Name is not specified. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#idempotency + type: string + labels: + additionalProperties: + type: string + description: |- + Map of string keys and values that can be used to organize and categorize + (scope and select) objects. May match selectors of replication controllers + and services. + More info: http://kubernetes.io/docs/user-guide/labels + type: object + name: + description: |- + Name must be unique within a namespace. Is required when creating resources, although + some resources may allow a client to request the generation of an appropriate name + automatically. Name is primarily intended for creation idempotence and configuration + definition. + Cannot be updated. + More info: http://kubernetes.io/docs/user-guide/identifiers#names + type: string + namespace: + description: |- + Namespace defines the space within each name must be unique. An empty namespace is + equivalent to the "default" namespace, but "default" is the canonical representation. + Not all objects are required to be scoped to a namespace - the value of this field for + those objects will be empty. + + + Must be a DNS_LABEL. + Cannot be updated. + More info: http://kubernetes.io/docs/user-guide/namespaces + type: string + ownerReferences: + description: |- + List of objects depended by this object. If ALL objects in the list have + been deleted, this object will be garbage collected. If this object is managed by a controller, + then an entry in this list will point to this controller, with the controller field set to true. + There cannot be more than one managing controller. + items: + description: |- + OwnerReference contains enough information to let you identify an owning + object. An owning object must be in the same namespace as the dependent, or + be cluster-scoped, so there is no namespace field. + properties: + apiVersion: + description: API version of the referent. + type: string + blockOwnerDeletion: + description: |- + If true, AND if the owner has the "foregroundDeletion" finalizer, then + the owner cannot be deleted from the key-value store until this + reference is removed. + See https://kubernetes.io/docs/concepts/architecture/garbage-collection/#foreground-deletion + for how the garbage collector interacts with this field and enforces the foreground deletion. + Defaults to false. + To set this field, a user needs "delete" permission of the owner, + otherwise 422 (Unprocessable Entity) will be returned. + type: boolean + controller: + description: If true, this reference points to the managing + controller. + type: boolean + kind: + description: |- + Kind of the referent. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + type: string + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names#names + type: string + uid: + description: |- + UID of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names#uids + type: string + required: + - apiVersion + - kind + - name + - uid + type: object + x-kubernetes-map-type: atomic + type: array + type: object + required: + - group + - kind + type: object + required: + - aws + - kubernetes + type: object + status: + description: AdoptedResourceStatus defines the observed status of the + AdoptedResource. + properties: + conditions: + description: |- + A collection of `ackv1alpha1.Condition` objects that describe the various + terminal states of the adopted resource CR and its target custom resource + items: + description: |- + Condition is the common struct used by all CRDs managed by ACK service + controllers to indicate terminal states of the CR and its backend AWS + service API resource + properties: + lastTransitionTime: + description: Last time the condition transitioned from one status + to another. + format: date-time + type: string + message: + description: A human readable message indicating details about + the transition. + type: string + reason: + description: The reason for the condition's last transition. + type: string + status: + description: Status of the condition, one of True, False, Unknown. + type: string + type: + description: Type is the type of the Condition + type: string + required: + - status + - type + type: object + type: array + required: + - conditions + type: object + type: object + served: true + storage: true + subresources: + status: {} diff --git a/config/crd/common/bases/services.k8s.aws_fieldexports.yaml b/config/crd/common/bases/services.k8s.aws_fieldexports.yaml new file mode 100644 index 0000000..4d3a8f1 --- /dev/null +++ b/config/crd/common/bases/services.k8s.aws_fieldexports.yaml @@ -0,0 +1,144 @@ +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.14.0 + name: fieldexports.services.k8s.aws +spec: + group: services.k8s.aws + names: + kind: FieldExport + listKind: FieldExportList + plural: fieldexports + singular: fieldexport + scope: Namespaced + versions: + - name: v1alpha1 + schema: + openAPIV3Schema: + description: FieldExport is the schema for the FieldExport API. + properties: + apiVersion: + description: |- + APIVersion defines the versioned schema of this representation of an object. + Servers should convert recognized schemas to the latest internal value, and + may reject unrecognized values. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources + type: string + kind: + description: |- + Kind is a string value representing the REST resource this object represents. + Servers may infer this from the endpoint the client submits requests to. + Cannot be updated. + In CamelCase. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + type: string + metadata: + type: object + spec: + description: FieldExportSpec defines the desired state of the FieldExport. + properties: + from: + description: |- + ResourceFieldSelector provides the values necessary to identify an individual + field on an individual K8s resource. + properties: + path: + type: string + resource: + description: |- + NamespacedResource provides all the values necessary to identify an ACK + resource of a given type (within the same namespace as the custom resource + containing this type). + properties: + group: + type: string + kind: + type: string + name: + type: string + required: + - group + - kind + - name + type: object + required: + - path + - resource + type: object + to: + description: |- + FieldExportTarget provides the values necessary to identify the + output path for a field export. + properties: + key: + description: Key overrides the default value (`.`) + for the FieldExport target + type: string + kind: + description: |- + FieldExportOutputType represents all types that can be produced by a field + export operation + enum: + - configmap + - secret + type: string + name: + type: string + namespace: + description: Namespace is marked as optional, so we cannot compose + `NamespacedName` + type: string + required: + - kind + - name + type: object + required: + - from + - to + type: object + status: + description: FieldExportStatus defines the observed status of the FieldExport. + properties: + conditions: + description: |- + A collection of `ackv1alpha1.Condition` objects that describe the various + recoverable states of the field CR + items: + description: |- + Condition is the common struct used by all CRDs managed by ACK service + controllers to indicate terminal states of the CR and its backend AWS + service API resource + properties: + lastTransitionTime: + description: Last time the condition transitioned from one status + to another. + format: date-time + type: string + message: + description: A human readable message indicating details about + the transition. + type: string + reason: + description: The reason for the condition's last transition. + type: string + status: + description: Status of the condition, one of True, False, Unknown. + type: string + type: + description: Type is the type of the Condition + type: string + required: + - status + - type + type: object + type: array + required: + - conditions + type: object + type: object + served: true + storage: true + subresources: + status: {} diff --git a/config/crd/common/kustomization.yaml b/config/crd/common/kustomization.yaml new file mode 100644 index 0000000..96349f6 --- /dev/null +++ b/config/crd/common/kustomization.yaml @@ -0,0 +1,7 @@ +# Code generated in runtime. DO NOT EDIT. + +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +resources: + - bases/services.k8s.aws_adoptedresources.yaml + - bases/services.k8s.aws_fieldexports.yaml diff --git a/config/crd/kustomization.yaml b/config/crd/kustomization.yaml new file mode 100644 index 0000000..ea0b795 --- /dev/null +++ b/config/crd/kustomization.yaml @@ -0,0 +1,4 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +resources: + - common diff --git a/config/default/kustomization.yaml b/config/default/kustomization.yaml new file mode 100644 index 0000000..c89f8ed --- /dev/null +++ b/config/default/kustomization.yaml @@ -0,0 +1,20 @@ +# Adds namespace to all resources. +# namespace: + +# Value of this field is prepended to the +# names of all resources, e.g. a deployment named +# "wordpress" becomes "alices-wordpress". +# Note that it should also match with the prefix (text before '-') of the namespace +# field above. +# namePrefix: + +# Labels to add to all resources and selectors. +#commonLabels: +# someName: someValue + +resources: +- ../crd +- ../rbac +- ../controller + +patchesStrategicMerge: diff --git a/config/overlays/namespaced/kustomization.yaml b/config/overlays/namespaced/kustomization.yaml new file mode 100644 index 0000000..f7aa018 --- /dev/null +++ b/config/overlays/namespaced/kustomization.yaml @@ -0,0 +1,15 @@ +resources: +- ../../default +patches: +- path: role.json + target: + group: rbac.authorization.k8s.io + version: v1 + kind: ClusterRole + name: ack-glue-controller +- path: role-binding.json + target: + group: rbac.authorization.k8s.io + version: v1 + kind: ClusterRoleBinding + name: ack-glue-controller-rolebinding \ No newline at end of file diff --git a/config/overlays/namespaced/role-binding.json b/config/overlays/namespaced/role-binding.json new file mode 100644 index 0000000..83e46c5 --- /dev/null +++ b/config/overlays/namespaced/role-binding.json @@ -0,0 +1,3 @@ +[{"op": "replace", "path": "/kind", "value": "RoleBinding"}, +{"op": "add", "path": "/metadata/namespace", "value": "ack-system"}, +{"op": "replace", "path": "/roleRef/kind", "value": "Role"}] \ No newline at end of file diff --git a/config/overlays/namespaced/role.json b/config/overlays/namespaced/role.json new file mode 100644 index 0000000..deddee7 --- /dev/null +++ b/config/overlays/namespaced/role.json @@ -0,0 +1,2 @@ +[{"op": "replace", "path": "/kind", "value": "Role"}, +{"op": "add", "path": "/metadata/namespace", "value": "ack-system"}] \ No newline at end of file diff --git a/config/rbac/cluster-role-binding.yaml b/config/rbac/cluster-role-binding.yaml new file mode 100644 index 0000000..ed6b527 --- /dev/null +++ b/config/rbac/cluster-role-binding.yaml @@ -0,0 +1,12 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: ack-glue-controller-rolebinding +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: ack-glue-controller +subjects: +- kind: ServiceAccount + name: ack-glue-controller + namespace: ack-system diff --git a/config/rbac/cluster-role-controller.yaml b/config/rbac/cluster-role-controller.yaml new file mode 100644 index 0000000..8d2bbfc --- /dev/null +++ b/config/rbac/cluster-role-controller.yaml @@ -0,0 +1,72 @@ +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: ack-glue-controller +rules: +- apiGroups: + - "" + resources: + - configmaps + verbs: + - get + - list + - patch + - watch +- apiGroups: + - "" + resources: + - namespaces + verbs: + - get + - list + - watch +- apiGroups: + - "" + resources: + - secrets + verbs: + - get + - list + - patch + - watch +- apiGroups: + - services.k8s.aws + resources: + - adoptedresources + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - services.k8s.aws + resources: + - adoptedresources/status + verbs: + - get + - patch + - update +- apiGroups: + - services.k8s.aws + resources: + - fieldexports + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - services.k8s.aws + resources: + - fieldexports/status + verbs: + - get + - patch + - update diff --git a/config/rbac/kustomization.yaml b/config/rbac/kustomization.yaml new file mode 100644 index 0000000..d9acdee --- /dev/null +++ b/config/rbac/kustomization.yaml @@ -0,0 +1,8 @@ +resources: +- cluster-role-binding.yaml +- cluster-role-controller.yaml +- role-reader.yaml +- role-writer.yaml +- service-account.yaml +- leader-election-role.yaml +- leader-election-role-binding.yaml diff --git a/config/rbac/leader-election-role-binding.yaml b/config/rbac/leader-election-role-binding.yaml new file mode 100644 index 0000000..353dbfe --- /dev/null +++ b/config/rbac/leader-election-role-binding.yaml @@ -0,0 +1,14 @@ +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + namespace: ack-system + name: glue-leader-election-rolebinding +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: glue-leader-election-role +subjects: +- kind: ServiceAccount + name: ack-glue-controller + namespace: ack-system diff --git a/config/rbac/leader-election-role.yaml b/config/rbac/leader-election-role.yaml new file mode 100644 index 0000000..eabbaad --- /dev/null +++ b/config/rbac/leader-election-role.yaml @@ -0,0 +1,26 @@ +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: glue-leader-election-role + namespace: ack-system +rules: +- apiGroups: + - coordination.k8s.io + resources: + - leases + verbs: + - get + - list + - watch + - create + - update + - patch + - delete +- apiGroups: + - "" + resources: + - events + verbs: + - create + - patch diff --git a/config/rbac/role-reader.yaml b/config/rbac/role-reader.yaml new file mode 100644 index 0000000..8fa957f --- /dev/null +++ b/config/rbac/role-reader.yaml @@ -0,0 +1,15 @@ +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + creationTimestamp: null + name: ack-glue-reader + namespace: default +rules: +- apiGroups: + - glue.services.k8s.aws + resources: + verbs: + - get + - list + - watch diff --git a/config/rbac/role-writer.yaml b/config/rbac/role-writer.yaml new file mode 100644 index 0000000..ae08ec4 --- /dev/null +++ b/config/rbac/role-writer.yaml @@ -0,0 +1,26 @@ +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + creationTimestamp: null + name: ack-glue-writer + namespace: default +rules: +- apiGroups: + - glue.services.k8s.aws + resources: + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - glue.services.k8s.aws + resources: + verbs: + - get + - patch + - update diff --git a/config/rbac/service-account.yaml b/config/rbac/service-account.yaml new file mode 100644 index 0000000..4dd18ce --- /dev/null +++ b/config/rbac/service-account.yaml @@ -0,0 +1,6 @@ +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: ack-glue-controller + namespace: ack-system diff --git a/generator.yaml b/generator.yaml new file mode 100644 index 0000000..f78281b --- /dev/null +++ b/generator.yaml @@ -0,0 +1,26 @@ +ignore: + resource_names: + - Blueprint + - Classifier + - Connection + - Crawler + - CustomEntityType + - DataQualityRuleset + - Database + - DevEndpoint + - Job + - MLTransform + - Partition + - PartitionIndex + - Registry + - Schema + - Script + - SecurityConfiguration + - Session + - Table + - TableOptimizer + - Trigger + - UsageProfile + - UserDefinedFunction + - Workflow +model_name: glue diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..42572a2 --- /dev/null +++ b/go.mod @@ -0,0 +1,77 @@ +module github.com/aws-controllers-k8s/glue-controller + +go 1.22.0 + +toolchain go1.22.3 + +require ( + github.com/aws-controllers-k8s/runtime v0.37.0 + github.com/aws/aws-sdk-go v1.55.5 + github.com/spf13/pflag v1.0.5 + k8s.io/apimachinery v0.30.3 + k8s.io/client-go v0.30.1 + sigs.k8s.io/controller-runtime v0.18.5 +) + +require ( + github.com/beorn7/perks v1.0.1 // indirect + github.com/cenkalti/backoff/v4 v4.2.1 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/emicklei/go-restful/v3 v3.11.0 // indirect + github.com/evanphx/json-patch/v5 v5.9.0 // indirect + github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/zapr v1.3.0 // indirect + github.com/go-openapi/jsonpointer v0.19.6 // indirect + github.com/go-openapi/jsonreference v0.20.2 // indirect + github.com/go-openapi/swag v0.22.3 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/gnostic-models v0.6.8 // indirect + github.com/google/go-cmp v0.6.0 // indirect + github.com/google/gofuzz v1.2.0 // indirect + github.com/google/uuid v1.3.0 // indirect + github.com/imdario/mergo v0.3.12 // indirect + github.com/itchyny/gojq v0.12.6 // indirect + github.com/itchyny/timefmt-go v0.1.3 // indirect + github.com/jaypipes/envutil v1.0.0 // indirect + github.com/jmespath/go-jmespath v0.4.0 // indirect + github.com/josharian/intern v1.0.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/mailru/easyjson v0.7.7 // indirect + github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/prometheus/client_golang v1.18.0 // indirect + github.com/prometheus/client_model v0.5.0 // indirect + github.com/prometheus/common v0.45.0 // indirect + github.com/prometheus/procfs v0.12.0 // indirect + github.com/samber/lo v1.37.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.26.0 // indirect + golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e // indirect + golang.org/x/net v0.23.0 // indirect + golang.org/x/oauth2 v0.12.0 // indirect + golang.org/x/sys v0.18.0 // indirect + golang.org/x/term v0.18.0 // indirect + golang.org/x/text v0.14.0 // indirect + golang.org/x/time v0.3.0 // indirect + gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect + google.golang.org/appengine v1.6.7 // indirect + google.golang.org/protobuf v1.33.0 // indirect + gopkg.in/inf.v0 v0.9.1 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + k8s.io/api v0.30.1 // indirect + k8s.io/apiextensions-apiserver v0.30.1 // indirect + k8s.io/klog/v2 v2.120.1 // indirect + k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 // indirect + k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect + sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect + sigs.k8s.io/yaml v1.4.0 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..a636d5e --- /dev/null +++ b/go.sum @@ -0,0 +1,218 @@ +github.com/aws-controllers-k8s/runtime v0.37.0 h1:NobDzkYdSnHG44glFmOKJkT5nqbBTcTZH8UDmv/4T6w= +github.com/aws-controllers-k8s/runtime v0.37.0/go.mod h1:gI2pWb20UGLP2SnHf1a1VzTd7iVVy+/I9VAzT0Y+Dew= +github.com/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU= +github.com/aws/aws-sdk-go v1.55.5/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= +github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= +github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= +github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch/v5 v5.9.0 h1:kcBlZQbplgElYIlo/n1hJbls2z/1awpXxpRi0/FOJfg= +github.com/evanphx/json-patch/v5 v5.9.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= +github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= +github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg= +github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= +github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= +github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= +github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= +github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= +github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= +github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= +github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/itchyny/gojq v0.12.6 h1:VjaFn59Em2wTxDNGcrRkDK9ZHMNa8IksOgL13sLL4d0= +github.com/itchyny/gojq v0.12.6/go.mod h1:ZHrkfu7A+RbZLy5J1/JKpS4poEqrzItSTGDItqsfP0A= +github.com/itchyny/timefmt-go v0.1.3 h1:7M3LGVDsqcd0VZH2U+x393obrzZisp7C0uEe921iRkU= +github.com/itchyny/timefmt-go v0.1.3/go.mod h1:0osSSCQSASBJMsIZnhAaF1C2fCBTJZXrnj37mG8/c+A= +github.com/jaypipes/envutil v1.0.0 h1:u6Vwy9HwruFihoZrL0bxDLCa/YNadGVwKyPElNmZWow= +github.com/jaypipes/envutil v1.0.0/go.mod h1:vgIRDly+xgBq0eeZRcflOHMMobMwgC6MkMbxo/Nw65M= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= +github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/onsi/ginkgo/v2 v2.17.1 h1:V++EzdbhI4ZV4ev0UTIj0PzhzOcReJFyJaLjtSF55M8= +github.com/onsi/ginkgo/v2 v2.17.1/go.mod h1:llBI3WDLL9Z6taip6f33H76YcWtJv+7R3HigUjbIBOs= +github.com/onsi/gomega v1.32.0 h1:JRYU78fJ1LPxlckP6Txi/EYqJvjtMrDC04/MM5XRHPk= +github.com/onsi/gomega v1.32.0/go.mod h1:a4x4gW6Pz2yK1MAmvluYme5lvYTn61afQ2ETw/8n4Lg= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk= +github.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA= +github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= +github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= +github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM= +github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY= +github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= +github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= +github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/samber/lo v1.37.0 h1:XjVcB8g6tgUp8rsPsJ2CvhClfImrpL04YpQHXeHPhRw= +github.com/samber/lo v1.37.0/go.mod h1:9vaz2O4o8oOnK23pd2TrXufcbdbJIa3b6cstBWKpopA= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= +go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e h1:+WEEuIdZHnUeJJmEUjyYC2gfUMj69yZXw17EnHg/otA= +golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e/go.mod h1:Kr81I6Kryrl9sr8s2FK3vxD90NdsKWRuOIl2O4CvYbA= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= +golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/oauth2 v0.12.0 h1:smVPGxink+n1ZI5pkQa8y6fZT0RW0MgCO5bFpepy4B4= +golang.org/x/oauth2 v0.12.0/go.mod h1:A74bZ3aGXgCY0qaIC9Ahg6Lglin4AMAco8cIv9baba4= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= +golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= +golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.18.0 h1:k8NLag8AGHnn+PHbl7g43CtqZAwG60vZkLqgyZgIHgQ= +golang.org/x/tools v0.18.0/go.mod h1:GL7B4CwcLLeo59yx/9UWWuNOW1n3VZ4f5axWfML7Lcg= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw= +gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= +google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/api v0.30.1 h1:kCm/6mADMdbAxmIh0LBjS54nQBE+U4KmbCfIkF5CpJY= +k8s.io/api v0.30.1/go.mod h1:ddbN2C0+0DIiPntan/bye3SW3PdwLa11/0yqwvuRrJM= +k8s.io/apiextensions-apiserver v0.30.1 h1:4fAJZ9985BmpJG6PkoxVRpXv9vmPUOVzl614xarePws= +k8s.io/apiextensions-apiserver v0.30.1/go.mod h1:R4GuSrlhgq43oRY9sF2IToFh7PVlF1JjfWdoG3pixk4= +k8s.io/apimachinery v0.30.3 h1:q1laaWCmrszyQuSQCfNB8cFgCuDAoPszKY4ucAjDwHc= +k8s.io/apimachinery v0.30.3/go.mod h1:iexa2somDaxdnj7bha06bhb43Zpa6eWH8N8dbqVjTUc= +k8s.io/client-go v0.30.1 h1:uC/Ir6A3R46wdkgCV3vbLyNOYyCJ8oZnjtJGKfytl/Q= +k8s.io/client-go v0.30.1/go.mod h1:wrAqLNs2trwiCH/wxxmT/x3hKVH9PuV0GGW0oDoHVqc= +k8s.io/klog/v2 v2.120.1 h1:QXU6cPEOIslTGvZaXvFWiP9VKyeet3sawzTOvdXb4Vw= +k8s.io/klog/v2 v2.120.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= +k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 h1:BZqlfIlq5YbRMFko6/PM7FjZpUb45WallggurYhKGag= +k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +sigs.k8s.io/controller-runtime v0.18.5 h1:nTHio/W+Q4aBlQMgbnC5hZb4IjIidyrizMai9P6n4Rk= +sigs.k8s.io/controller-runtime v0.18.5/go.mod h1:TVoGrfdpbA9VRFaRnKgk9P5/atA0pMwq+f+msb9M8Sg= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/helm/Chart.yaml b/helm/Chart.yaml new file mode 100644 index 0000000..23396bb --- /dev/null +++ b/helm/Chart.yaml @@ -0,0 +1,18 @@ +apiVersion: v1 +name: glue-chart +description: A Helm chart for the ACK service controller for () +version: 0.0.0-non-release-version +appVersion: 0.0.0-non-release-version +home: https://github.com/aws-controllers-k8s/glue-controller +icon: https://raw.githubusercontent.com/aws/eks-charts/master/docs/logo/aws.png +sources: + - https://github.com/aws-controllers-k8s/glue-controller +maintainers: + - name: ACK Admins + url: https://github.com/orgs/aws-controllers-k8s/teams/ack-admin + - name: Admins + url: https://github.com/orgs/aws-controllers-k8s/teams/glue-maintainer +keywords: + - aws + - kubernetes + - glue diff --git a/helm/crds/services.k8s.aws_adoptedresources.yaml b/helm/crds/services.k8s.aws_adoptedresources.yaml new file mode 100644 index 0000000..65eff73 --- /dev/null +++ b/helm/crds/services.k8s.aws_adoptedresources.yaml @@ -0,0 +1,254 @@ +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.14.0 + name: adoptedresources.services.k8s.aws +spec: + group: services.k8s.aws + names: + kind: AdoptedResource + listKind: AdoptedResourceList + plural: adoptedresources + singular: adoptedresource + scope: Namespaced + versions: + - name: v1alpha1 + schema: + openAPIV3Schema: + description: AdoptedResource is the schema for the AdoptedResource API. + properties: + apiVersion: + description: |- + APIVersion defines the versioned schema of this representation of an object. + Servers should convert recognized schemas to the latest internal value, and + may reject unrecognized values. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources + type: string + kind: + description: |- + Kind is a string value representing the REST resource this object represents. + Servers may infer this from the endpoint the client submits requests to. + Cannot be updated. + In CamelCase. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + type: string + metadata: + type: object + spec: + description: AdoptedResourceSpec defines the desired state of the AdoptedResource. + properties: + aws: + description: AWSIdentifiers provide all unique ways to reference an + AWS resource. + properties: + additionalKeys: + additionalProperties: + type: string + description: |- + AdditionalKeys represents any additional arbitrary identifiers used when + describing the target resource. + type: object + arn: + description: |- + ARN is the AWS Resource Name for the resource. It is a globally + unique identifier. + type: string + nameOrID: + description: |- + NameOrId is a user-supplied string identifier for the resource. It may + or may not be globally unique, depending on the type of resource. + type: string + type: object + kubernetes: + description: |- + ResourceWithMetadata provides the values necessary to create a + Kubernetes resource and override any of its metadata values. + properties: + group: + type: string + kind: + type: string + metadata: + description: |- + ObjectMeta is metadata that all persisted resources must have, which includes all objects + users must create. + It is not possible to use `metav1.ObjectMeta` inside spec, as the controller-gen + automatically converts this to an arbitrary string-string map. + https://github.com/kubernetes-sigs/controller-tools/issues/385 + + + Active discussion about inclusion of this field in the spec is happening in this PR: + https://github.com/kubernetes-sigs/controller-tools/pull/395 + + + Until this is allowed, or if it never is, we will produce a subset of the object meta + that contains only the fields which the user is allowed to modify in the metadata. + properties: + annotations: + additionalProperties: + type: string + description: |- + Annotations is an unstructured key value map stored with a resource that may be + set by external tools to store and retrieve arbitrary metadata. They are not + queryable and should be preserved when modifying objects. + More info: http://kubernetes.io/docs/user-guide/annotations + type: object + generateName: + description: |- + GenerateName is an optional prefix, used by the server, to generate a unique + name ONLY IF the Name field has not been provided. + If this field is used, the name returned to the client will be different + than the name passed. This value will also be combined with a unique suffix. + The provided value has the same validation rules as the Name field, + and may be truncated by the length of the suffix required to make the value + unique on the server. + + + If this field is specified and the generated name exists, the server will + NOT return a 409 - instead, it will either return 201 Created or 500 with Reason + ServerTimeout indicating a unique name could not be found in the time allotted, and the client + should retry (optionally after the time indicated in the Retry-After header). + + + Applied only if Name is not specified. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#idempotency + type: string + labels: + additionalProperties: + type: string + description: |- + Map of string keys and values that can be used to organize and categorize + (scope and select) objects. May match selectors of replication controllers + and services. + More info: http://kubernetes.io/docs/user-guide/labels + type: object + name: + description: |- + Name must be unique within a namespace. Is required when creating resources, although + some resources may allow a client to request the generation of an appropriate name + automatically. Name is primarily intended for creation idempotence and configuration + definition. + Cannot be updated. + More info: http://kubernetes.io/docs/user-guide/identifiers#names + type: string + namespace: + description: |- + Namespace defines the space within each name must be unique. An empty namespace is + equivalent to the "default" namespace, but "default" is the canonical representation. + Not all objects are required to be scoped to a namespace - the value of this field for + those objects will be empty. + + + Must be a DNS_LABEL. + Cannot be updated. + More info: http://kubernetes.io/docs/user-guide/namespaces + type: string + ownerReferences: + description: |- + List of objects depended by this object. If ALL objects in the list have + been deleted, this object will be garbage collected. If this object is managed by a controller, + then an entry in this list will point to this controller, with the controller field set to true. + There cannot be more than one managing controller. + items: + description: |- + OwnerReference contains enough information to let you identify an owning + object. An owning object must be in the same namespace as the dependent, or + be cluster-scoped, so there is no namespace field. + properties: + apiVersion: + description: API version of the referent. + type: string + blockOwnerDeletion: + description: |- + If true, AND if the owner has the "foregroundDeletion" finalizer, then + the owner cannot be deleted from the key-value store until this + reference is removed. + See https://kubernetes.io/docs/concepts/architecture/garbage-collection/#foreground-deletion + for how the garbage collector interacts with this field and enforces the foreground deletion. + Defaults to false. + To set this field, a user needs "delete" permission of the owner, + otherwise 422 (Unprocessable Entity) will be returned. + type: boolean + controller: + description: If true, this reference points to the managing + controller. + type: boolean + kind: + description: |- + Kind of the referent. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + type: string + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names#names + type: string + uid: + description: |- + UID of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names#uids + type: string + required: + - apiVersion + - kind + - name + - uid + type: object + x-kubernetes-map-type: atomic + type: array + type: object + required: + - group + - kind + type: object + required: + - aws + - kubernetes + type: object + status: + description: AdoptedResourceStatus defines the observed status of the + AdoptedResource. + properties: + conditions: + description: |- + A collection of `ackv1alpha1.Condition` objects that describe the various + terminal states of the adopted resource CR and its target custom resource + items: + description: |- + Condition is the common struct used by all CRDs managed by ACK service + controllers to indicate terminal states of the CR and its backend AWS + service API resource + properties: + lastTransitionTime: + description: Last time the condition transitioned from one status + to another. + format: date-time + type: string + message: + description: A human readable message indicating details about + the transition. + type: string + reason: + description: The reason for the condition's last transition. + type: string + status: + description: Status of the condition, one of True, False, Unknown. + type: string + type: + description: Type is the type of the Condition + type: string + required: + - status + - type + type: object + type: array + required: + - conditions + type: object + type: object + served: true + storage: true + subresources: + status: {} diff --git a/helm/crds/services.k8s.aws_fieldexports.yaml b/helm/crds/services.k8s.aws_fieldexports.yaml new file mode 100644 index 0000000..4d3a8f1 --- /dev/null +++ b/helm/crds/services.k8s.aws_fieldexports.yaml @@ -0,0 +1,144 @@ +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.14.0 + name: fieldexports.services.k8s.aws +spec: + group: services.k8s.aws + names: + kind: FieldExport + listKind: FieldExportList + plural: fieldexports + singular: fieldexport + scope: Namespaced + versions: + - name: v1alpha1 + schema: + openAPIV3Schema: + description: FieldExport is the schema for the FieldExport API. + properties: + apiVersion: + description: |- + APIVersion defines the versioned schema of this representation of an object. + Servers should convert recognized schemas to the latest internal value, and + may reject unrecognized values. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources + type: string + kind: + description: |- + Kind is a string value representing the REST resource this object represents. + Servers may infer this from the endpoint the client submits requests to. + Cannot be updated. + In CamelCase. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + type: string + metadata: + type: object + spec: + description: FieldExportSpec defines the desired state of the FieldExport. + properties: + from: + description: |- + ResourceFieldSelector provides the values necessary to identify an individual + field on an individual K8s resource. + properties: + path: + type: string + resource: + description: |- + NamespacedResource provides all the values necessary to identify an ACK + resource of a given type (within the same namespace as the custom resource + containing this type). + properties: + group: + type: string + kind: + type: string + name: + type: string + required: + - group + - kind + - name + type: object + required: + - path + - resource + type: object + to: + description: |- + FieldExportTarget provides the values necessary to identify the + output path for a field export. + properties: + key: + description: Key overrides the default value (`.`) + for the FieldExport target + type: string + kind: + description: |- + FieldExportOutputType represents all types that can be produced by a field + export operation + enum: + - configmap + - secret + type: string + name: + type: string + namespace: + description: Namespace is marked as optional, so we cannot compose + `NamespacedName` + type: string + required: + - kind + - name + type: object + required: + - from + - to + type: object + status: + description: FieldExportStatus defines the observed status of the FieldExport. + properties: + conditions: + description: |- + A collection of `ackv1alpha1.Condition` objects that describe the various + recoverable states of the field CR + items: + description: |- + Condition is the common struct used by all CRDs managed by ACK service + controllers to indicate terminal states of the CR and its backend AWS + service API resource + properties: + lastTransitionTime: + description: Last time the condition transitioned from one status + to another. + format: date-time + type: string + message: + description: A human readable message indicating details about + the transition. + type: string + reason: + description: The reason for the condition's last transition. + type: string + status: + description: Status of the condition, one of True, False, Unknown. + type: string + type: + description: Type is the type of the Condition + type: string + required: + - status + - type + type: object + type: array + required: + - conditions + type: object + type: object + served: true + storage: true + subresources: + status: {} diff --git a/helm/templates/NOTES.txt b/helm/templates/NOTES.txt new file mode 100644 index 0000000..8daf027 --- /dev/null +++ b/helm/templates/NOTES.txt @@ -0,0 +1,16 @@ +{{ .Chart.Name }} has been installed. +This chart deploys "public.ecr.aws/aws-controllers-k8s/glue-controller:0.0.0-non-release-version". + +Check its status by running: + kubectl --namespace {{ .Release.Namespace }} get pods -l "app.kubernetes.io/instance={{ .Release.Name }}" + +You are now able to create () resources! + +The controller is running in "{{ .Values.installScope }}" mode. +The controller is configured to manage AWS resources in region: "{{ .Values.aws.region }}" + +Visit https://aws-controllers-k8s.github.io/community/reference/ for an API +reference of all the resources that can be created using this controller. + +For more information on the AWS Controllers for Kubernetes (ACK) project, visit: +https://aws-controllers-k8s.github.io/community/ diff --git a/helm/templates/_helpers.tpl b/helm/templates/_helpers.tpl new file mode 100644 index 0000000..4927fdd --- /dev/null +++ b/helm/templates/_helpers.tpl @@ -0,0 +1,129 @@ +{{/* The name of the application this chart installs */}} +{{- define "ack-glue-controller.app.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "ack-glue-controller.app.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* The name and version as used by the chart label */}} +{{- define "ack-glue-controller.chart.name-version" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* The name of the service account to use */}} +{{- define "ack-glue-controller.service-account.name" -}} + {{ default "default" .Values.serviceAccount.name }} +{{- end -}} + +{{- define "ack-glue-controller.watch-namespace" -}} +{{- if eq .Values.installScope "namespace" -}} +{{ .Values.watchNamespace | default .Release.Namespace }} +{{- end -}} +{{- end -}} + +{{/* The mount path for the shared credentials file */}} +{{- define "ack-glue-controller.aws.credentials.secret_mount_path" -}} +{{- "/var/run/secrets/aws" -}} +{{- end -}} + +{{/* The path the shared credentials file is mounted */}} +{{- define "ack-glue-controller.aws.credentials.path" -}} +{{ $secret_mount_path := include "ack-glue-controller.aws.credentials.secret_mount_path" . }} +{{- printf "%s/%s" $secret_mount_path .Values.aws.credentials.secretKey -}} +{{- end -}} + +{{/* The rules a of ClusterRole or Role */}} +{{- define "ack-glue-controller.rbac-rules" -}} +rules: +- apiGroups: + - "" + resources: + - configmaps + verbs: + - get + - list + - patch + - watch +- apiGroups: + - "" + resources: + - namespaces + verbs: + - get + - list + - watch +- apiGroups: + - "" + resources: + - secrets + verbs: + - get + - list + - patch + - watch +- apiGroups: + - services.k8s.aws + resources: + - adoptedresources + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - services.k8s.aws + resources: + - adoptedresources/status + verbs: + - get + - patch + - update +- apiGroups: + - services.k8s.aws + resources: + - fieldexports + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - services.k8s.aws + resources: + - fieldexports/status + verbs: + - get + - patch + - update +{{- end }} + +{{/* Convert k/v map to string like: "key1=value1,key2=value2,..." */}} +{{- define "ack-glue-controller.feature-gates" -}} +{{- $list := list -}} +{{- range $k, $v := .Values.featureGates -}} +{{- $list = append $list (printf "%s=%s" $k ( $v | toString)) -}} +{{- end -}} +{{ join "," $list }} +{{- end -}} diff --git a/helm/templates/caches-role-binding.yaml b/helm/templates/caches-role-binding.yaml new file mode 100644 index 0000000..9acd630 --- /dev/null +++ b/helm/templates/caches-role-binding.yaml @@ -0,0 +1,26 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: ack-namespaces-cache-glue-controller +roleRef: + kind: ClusterRole + apiGroup: rbac.authorization.k8s.io + name: ack-namespaces-cache-glue-controller +subjects: +- kind: ServiceAccount + name: ack-glue-controller + namespace: {{ .Release.Namespace }} +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: ack-configmaps-cache-glue-controller + namespace: {{ .Release.Namespace }} +roleRef: + kind: Role + apiGroup: rbac.authorization.k8s.io + name: ack-configmaps-cache-glue-controller +subjects: +- kind: ServiceAccount + name: ack-glue-controller + namespace: {{ .Release.Namespace }} \ No newline at end of file diff --git a/helm/templates/caches-role.yaml b/helm/templates/caches-role.yaml new file mode 100644 index 0000000..bbaec32 --- /dev/null +++ b/helm/templates/caches-role.yaml @@ -0,0 +1,28 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: ack-namespaces-cache-glue-controller +rules: +- apiGroups: + - "" + resources: + - namespaces + verbs: + - get + - list + - watch +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: ack-configmaps-cache-glue-controller + namespace: {{ .Release.Namespace }} +rules: +- apiGroups: + - "" + resources: + - configmaps + verbs: + - get + - list + - watch \ No newline at end of file diff --git a/helm/templates/cluster-role-binding.yaml b/helm/templates/cluster-role-binding.yaml new file mode 100644 index 0000000..b4ece89 --- /dev/null +++ b/helm/templates/cluster-role-binding.yaml @@ -0,0 +1,36 @@ +{{ if eq .Values.installScope "cluster" }} +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: {{ include "ack-glue-controller.app.fullname" . }} +roleRef: + kind: ClusterRole + apiGroup: rbac.authorization.k8s.io + name: ack-glue-controller +subjects: +- kind: ServiceAccount + name: {{ include "ack-glue-controller.service-account.name" . }} + namespace: {{ .Release.Namespace }} +{{ else if eq .Values.installScope "namespace" }} +{{ $wn := include "ack-glue-controller.watch-namespace" . }} +{{ $namespaces := split "," $wn }} +{{ $fullname := include "ack-glue-controller.app.fullname" . }} +{{ $releaseNamespace := .Release.Namespace }} +{{ $serviceAccountName := include "ack-glue-controller.service-account.name" . }} +{{ range $namespaces }} +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: {{ $fullname }} + namespace: {{ . }} +roleRef: + kind: Role + apiGroup: rbac.authorization.k8s.io + name: ack-glue-controller +subjects: +- kind: ServiceAccount + name: {{ $serviceAccountName }} + namespace: {{ $releaseNamespace }} +{{ end }} +{{ end }} \ No newline at end of file diff --git a/helm/templates/cluster-role-controller.yaml b/helm/templates/cluster-role-controller.yaml new file mode 100644 index 0000000..8894ff9 --- /dev/null +++ b/helm/templates/cluster-role-controller.yaml @@ -0,0 +1,29 @@ +{{ $labels := .Values.role.labels }} +{{ $rbacRules := include "ack-glue-controller.rbac-rules" . }} +{{ if eq .Values.installScope "cluster" }} +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: ack-glue-controller + labels: + {{- range $key, $value := $labels }} + {{ $key }}: {{ $value | quote }} + {{- end }} +{{$rbacRules }} +{{ else if eq .Values.installScope "namespace" }} +{{ $wn := include "ack-glue-controller.watch-namespace" . }} +{{ $namespaces := split "," $wn }} +{{ range $namespaces }} +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: ack-glue-controller + namespace: {{ . }} + labels: + {{- range $key, $value := $labels }} + {{ $key }}: {{ $value | quote }} + {{- end }} +{{ $rbacRules }} +{{ end }} +{{ end }} \ No newline at end of file diff --git a/helm/templates/deployment.yaml b/helm/templates/deployment.yaml new file mode 100644 index 0000000..b68d9fe --- /dev/null +++ b/helm/templates/deployment.yaml @@ -0,0 +1,197 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "ack-glue-controller.app.fullname" . }} + namespace: {{ .Release.Namespace }} + labels: + app.kubernetes.io/name: {{ include "ack-glue-controller.app.name" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} + k8s-app: {{ include "ack-glue-controller.app.name" . }} + helm.sh/chart: {{ include "ack-glue-controller.chart.name-version" . }} +spec: + replicas: {{ .Values.deployment.replicas }} + selector: + matchLabels: + app.kubernetes.io/name: {{ include "ack-glue-controller.app.name" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + template: + metadata: +{{- if .Values.deployment.annotations }} + annotations: + {{- range $key, $value := .Values.deployment.annotations }} + {{ $key }}: {{ $value | quote }} + {{- end }} +{{- end }} + labels: + app.kubernetes.io/name: {{ include "ack-glue-controller.app.name" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + app.kubernetes.io/managed-by: Helm + k8s-app: {{ include "ack-glue-controller.app.name" . }} +{{- range $key, $value := .Values.deployment.labels }} + {{ $key }}: {{ $value | quote }} +{{- end }} + spec: + serviceAccountName: {{ include "ack-glue-controller.service-account.name" . }} + {{- if .Values.image.pullSecrets }} + imagePullSecrets: + {{- range .Values.image.pullSecrets }} + - name: {{ . }} + {{- end }} + {{- end }} + containers: + - command: + - ./bin/controller + args: + - --aws-region + - "$(AWS_REGION)" + - --aws-endpoint-url + - "$(AWS_ENDPOINT_URL)" +{{- if .Values.log.enable_development_logging }} + - --enable-development-logging +{{- end }} + - --log-level + - "$(ACK_LOG_LEVEL)" + - --resource-tags + - "$(ACK_RESOURCE_TAGS)" + - --watch-namespace + - "$(ACK_WATCH_NAMESPACE)" + - --deletion-policy + - "$(DELETION_POLICY)" +{{- if .Values.leaderElection.enabled }} + - --enable-leader-election + - --leader-election-namespace + - "$(LEADER_ELECTION_NAMESPACE)" +{{- end }} +{{- if gt (int .Values.reconcile.defaultResyncPeriod) 0 }} + - --reconcile-default-resync-seconds + - "$(RECONCILE_DEFAULT_RESYNC_SECONDS)" +{{- end }} +{{- range $key, $value := .Values.reconcile.resourceResyncPeriods }} + - --reconcile-resource-resync-seconds + - "$(RECONCILE_RESOURCE_RESYNC_SECONDS_{{ $key | upper }})" +{{- end }} +{{- if gt (int .Values.reconcile.defaultMaxConcurrentSyncs) 0 }} + - --reconcile-default-max-concurrent-syncs + - "$(RECONCILE_DEFAULT_MAX_CONCURRENT_SYNCS)" +{{- end }} +{{- range $key, $value := .Values.reconcile.resourceMaxConcurrentSyncs }} + - --reconcile-resource-max-concurrent-syncs + - "$(RECONCILE_RESOURCE_MAX_CONCURRENT_SYNCS_{{ $key | upper }})" +{{- end }} +{{- if .Values.featureGates}} + - --feature-gates + - "$(FEATURE_GATES)" +{{- end }} + image: {{ .Values.image.repository }}:{{ .Values.image.tag }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + name: controller + ports: + - name: http + containerPort: {{ .Values.deployment.containerPort }} + resources: + {{- toYaml .Values.resources | nindent 10 }} + env: + - name: ACK_SYSTEM_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: AWS_REGION + value: {{ .Values.aws.region }} + - name: AWS_ENDPOINT_URL + value: {{ .Values.aws.endpoint_url | quote }} + - name: ACK_WATCH_NAMESPACE + value: {{ include "ack-glue-controller.watch-namespace" . }} + - name: DELETION_POLICY + value: {{ .Values.deletionPolicy }} + - name: LEADER_ELECTION_NAMESPACE + value: {{ .Values.leaderElection.namespace | quote }} + - name: ACK_LOG_LEVEL + value: {{ .Values.log.level | quote }} + - name: ACK_RESOURCE_TAGS + value: {{ join "," .Values.resourceTags | quote }} +{{- if gt (int .Values.reconcile.defaultResyncPeriod) 0 }} + - name: RECONCILE_DEFAULT_RESYNC_SECONDS + value: {{ .Values.reconcile.defaultResyncPeriod | quote }} +{{- end }} +{{- range $key, $value := .Values.reconcile.resourceResyncPeriods }} + - name: RECONCILE_RESOURCE_RESYNC_SECONDS_{{ $key | upper }} + value: {{ $key }}={{ $value }} +{{- end }} +{{- if gt (int .Values.reconcile.defaultMaxConcurrentSyncs) 0 }} + - name: RECONCILE_DEFAULT_MAX_CONCURRENT_SYNCS + value: {{ .Values.reconcile.defaultMaxConcurrentSyncs | quote }} +{{- end }} +{{- range $key, $value := .Values.reconcile.resourceMaxConcurrentSyncs }} + - name: RECONCILE_RESOURCE_MAX_CONCURRENT_SYNCS_{{ $key | upper }} + value: {{ $key }}={{ $value }} +{{- end }} +{{- if .Values.featureGates}} + - name: FEATURE_GATES + value: {{ include "ack-glue-controller.feature-gates" . }} +{{- end }} + {{- if .Values.aws.credentials.secretName }} + - name: AWS_SHARED_CREDENTIALS_FILE + value: {{ include "ack-glue-controller.aws.credentials.path" . }} + - name: AWS_PROFILE + value: {{ .Values.aws.credentials.profile }} + {{- end }} + {{- if .Values.deployment.extraEnvVars -}} + {{ toYaml .Values.deployment.extraEnvVars | nindent 8 }} + {{- end }} + volumeMounts: + {{- if .Values.aws.credentials.secretName }} + - name: {{ .Values.aws.credentials.secretName }} + mountPath: {{ include "ack-glue-controller.aws.credentials.secret_mount_path" . }} + readOnly: true + {{- end }} + {{- if .Values.deployment.extraVolumeMounts -}} + {{ toYaml .Values.deployment.extraVolumeMounts | nindent 10 }} + {{- end }} + securityContext: + allowPrivilegeEscalation: false + privileged: false + runAsNonRoot: true + capabilities: + drop: + - ALL + livenessProbe: + httpGet: + path: /healthz + port: 8081 + initialDelaySeconds: 15 + periodSeconds: 20 + readinessProbe: + httpGet: + path: /readyz + port: 8081 + initialDelaySeconds: 5 + periodSeconds: 10 + securityContext: + seccompProfile: + type: RuntimeDefault + terminationGracePeriodSeconds: 10 + nodeSelector: {{ toYaml .Values.deployment.nodeSelector | nindent 8 }} + {{ if .Values.deployment.tolerations -}} + tolerations: {{ toYaml .Values.deployment.tolerations | nindent 8 }} + {{ end -}} + {{ if .Values.deployment.affinity -}} + affinity: {{ toYaml .Values.deployment.affinity | nindent 8 }} + {{ end -}} + {{ if .Values.deployment.priorityClassName -}} + priorityClassName: {{ .Values.deployment.priorityClassName }} + {{ end -}} + hostIPC: false + hostPID: false + hostNetwork: {{ .Values.deployment.hostNetwork }} + dnsPolicy: {{ .Values.deployment.dnsPolicy }} + volumes: + {{- if .Values.aws.credentials.secretName }} + - name: {{ .Values.aws.credentials.secretName }} + secret: + secretName: {{ .Values.aws.credentials.secretName }} + {{- end }} +{{- if .Values.deployment.extraVolumes }} +{{ toYaml .Values.deployment.extraVolumes | indent 8}} +{{- end }} diff --git a/helm/templates/leader-election-role-binding.yaml b/helm/templates/leader-election-role-binding.yaml new file mode 100644 index 0000000..be04942 --- /dev/null +++ b/helm/templates/leader-election-role-binding.yaml @@ -0,0 +1,18 @@ +{{ if .Values.leaderElection.enabled }} +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: glue-leader-election-rolebinding +{{ if .Values.leaderElection.namespace }} + namespace: {{ .Values.leaderElection.namespace }} +{{ else }} + namespace: {{ .Release.Namespace }} +{{ end }} +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: glue-leader-election-role +subjects: +- kind: ServiceAccount + name: {{ include "ack-glue-controller.service-account.name" . }} + namespace: {{ .Release.Namespace }}{{- end }} diff --git a/helm/templates/leader-election-role.yaml b/helm/templates/leader-election-role.yaml new file mode 100644 index 0000000..d731a25 --- /dev/null +++ b/helm/templates/leader-election-role.yaml @@ -0,0 +1,30 @@ +{{ if .Values.leaderElection.enabled }} +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: glue-leader-election-role +{{ if .Values.leaderElection.namespace }} + namespace: {{ .Values.leaderElection.namespace }} +{{ else }} + namespace: {{ .Release.Namespace }} +{{ end }} +rules: +- apiGroups: + - coordination.k8s.io + resources: + - leases + verbs: + - get + - list + - watch + - create + - update + - patch + - delete +- apiGroups: + - "" + resources: + - events + verbs: + - create + - patch{{- end }} diff --git a/helm/templates/metrics-service.yaml b/helm/templates/metrics-service.yaml new file mode 100644 index 0000000..9d5c082 --- /dev/null +++ b/helm/templates/metrics-service.yaml @@ -0,0 +1,29 @@ +{{- if .Values.metrics.service.create }} +apiVersion: v1 +kind: Service +metadata: + name: {{ .Chart.Name | trimSuffix "-chart" | trunc 44 }}-controller-metrics + namespace: {{ .Release.Namespace }} + labels: + app.kubernetes.io/name: {{ include "ack-glue-controller.app.name" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} + k8s-app: {{ include "ack-glue-controller.app.name" . }} + helm.sh/chart: {{ include "ack-glue-controller.chart.name-version" . }} +spec: + selector: + app.kubernetes.io/name: {{ include "ack-glue-controller.app.name" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + app.kubernetes.io/managed-by: Helm + k8s-app: {{ include "ack-glue-controller.app.name" . }} +{{- range $key, $value := .Values.deployment.labels }} + {{ $key }}: {{ $value | quote }} +{{- end }} + type: {{ .Values.metrics.service.type }} + ports: + - name: metricsport + port: 8080 + targetPort: http + protocol: TCP +{{- end }} diff --git a/helm/templates/role-reader.yaml b/helm/templates/role-reader.yaml new file mode 100644 index 0000000..a3b03d9 --- /dev/null +++ b/helm/templates/role-reader.yaml @@ -0,0 +1,15 @@ +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + creationTimestamp: null + name: ack-glue-reader + namespace: {{ .Release.Namespace }} +rules: +- apiGroups: + - glue.services.k8s.aws + resources: + verbs: + - get + - list + - watch diff --git a/helm/templates/role-writer.yaml b/helm/templates/role-writer.yaml new file mode 100644 index 0000000..4178f59 --- /dev/null +++ b/helm/templates/role-writer.yaml @@ -0,0 +1,26 @@ +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + creationTimestamp: null + name: ack-glue-writer + namespace: {{ .Release.Namespace }} +rules: +- apiGroups: + - glue.services.k8s.aws + resources: + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - glue.services.k8s.aws + resources: + verbs: + - get + - patch + - update diff --git a/helm/templates/service-account.yaml b/helm/templates/service-account.yaml new file mode 100644 index 0000000..8e6c9b0 --- /dev/null +++ b/helm/templates/service-account.yaml @@ -0,0 +1,18 @@ +{{- if .Values.serviceAccount.create }} +apiVersion: v1 +kind: ServiceAccount +metadata: + labels: + app.kubernetes.io/name: {{ include "ack-glue-controller.app.name" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} + k8s-app: {{ include "ack-glue-controller.app.name" . }} + helm.sh/chart: {{ include "ack-glue-controller.chart.name-version" . }} + name: {{ include "ack-glue-controller.service-account.name" . }} + namespace: {{ .Release.Namespace }} + annotations: + {{- range $key, $value := .Values.serviceAccount.annotations }} + {{ $key }}: {{ $value | quote }} + {{- end }} +{{- end }} diff --git a/helm/values.schema.json b/helm/values.schema.json new file mode 100644 index 0000000..7ccb485 --- /dev/null +++ b/helm/values.schema.json @@ -0,0 +1,290 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema#", + "properties": { + "image": { + "description": "Container Image", + "properties": { + "repository": { + "type": "string", + "minLength": 1 + }, + "tag": { + "type": "string", + "minLength": 1 + }, + "pullPolicy": { + "type": "string", + "enum": ["IfNotPresent", "Always", "Never"] + }, + "pullSecrets": { + "type": "array" + } + }, + "required": [ + "repository", + "tag", + "pullPolicy" + ], + "type": "object" + }, + "nameOverride": { + "type": "string" + }, + "fullNameOverride": { + "type": "string" + }, + "deployment": { + "description": "Deployment settings", + "properties": { + "annotations": { + "type": "object" + }, + "labels": { + "type": "object" + }, + "containerPort": { + "type": "integer", + "minimum": 1, + "maximum": 65535 + }, + "replicas": { + "type": "integer" + }, + "nodeSelector": { + "type": "object" + }, + "tolerations": { + "type": "array" + }, + "affinity": { + "type": "object" + }, + "priorityClassName": { + "type": "string" + }, + "extraVolumeMounts": { + "type": "array" + }, + "extraVolumes": { + "type": "array" + }, + "extraEnvVars": { + "type": "array" + } + }, + "required": [ + "containerPort" + ], + "type": "object" + }, + "role": { + "description": "Role settings", + "properties": { + "labels": { + "type": "object" + } + } + }, + "metrics": { + "description": "Metrics settings", + "properties": { + "service": { + "description": "Kubernetes service settings", + "properties": { + "create": { + "type": "boolean" + }, + "type": { + "type": "string", + "enum": ["ClusterIP", "NodePort", "LoadBalancer", "ExternalName"] + } + }, + "required": [ + "create", + "type" + ], + "type": "object" + } + }, + "required": [ + "service" + ], + "type": "object" + }, + "resources": { + "description": "Kubernetes resources settings", + "properties": { + "requests": { + "description": "Kubernetes resource requests", + "properties": { + "memory": { + "oneOf": [ + { "type": "number" }, + { "type": "string" } + ] + }, + "cpu": { + "oneOf": [ + { "type": "number" }, + { "type": "string" } + ] + } + }, + "required": [ + "memory", + "cpu" + ], + "type": "object" + }, + "limits": { + "description": "Kubernetes resource limits", + "properties": { + "memory": { + "oneOf": [ + { "type": "number" }, + { "type": "string" } + ] + }, + "cpu": { + "oneOf": [ + { "type": "number" }, + { "type": "string" } + ] + } + }, + "required": [ + "memory", + "cpu" + ], + "type": "object" + } + }, + "required": [ + "requests", + "limits" + ], + "type": "object" + }, + "aws": { + "description": "AWS API settings", + "properties": { + "region": { + "type": "string" + }, + "endpoint": { + "type": "string" + }, + "credentials": { + "description": "AWS credentials information", + "properties": { + "secretName": { + "type": "string" + }, + "secretKey": { + "type": "string" + }, + "profile": { + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "log": { + "description": "Logging settings", + "properties": { + "enable_development_logging": { + "type": "boolean" + }, + "level": { + "type": "string" + } + }, + "type": "object" + }, + "installScope": { + "type": "string", + "enum": ["cluster", "namespace"] + }, + "watchNamespace": { + "type": "string" + }, + "resourceTags": { + "type": "array", + "items": { + "type": "string", + "pattern": "(^$|^.*=.*$)" + } + }, + "deletionPolicy": { + "type": "string", + "enum": ["delete", "retain"] + }, + "reconcile": { + "description": "Reconcile settings. This is used to configure the controller's reconciliation behavior. e.g resyncPeriod and maxConcurrentSyncs", + "properties": { + "defaultResyncPeriod": { + "type": "number" + }, + "resourceResyncPeriods": { + "type": "object" + }, + "defaultMaxConcurentSyncs": { + "type": "number" + }, + "resourceMaxConcurrentSyncs": { + "type": "object" + } + }, + "type": "object" + }, + "leaderElection": { + "description": "Parameter to configure the controller's leader election system.", + "properties": { + "enabled": { + "type": "boolean" + }, + "namespace": { + "type": "string" + } + }, + "type": "object" + }, + "serviceAccount": { + "description": "ServiceAccount settings", + "properties": { + "create": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "annotations": { + "type": "object" + } + }, + "type": "object" + } + }, + "featureGates": { + "description": "Feature gates settings", + "type": "object", + "additionalProperties": { + "type": "boolean" + } + }, + "required": [ + "image", + "deployment", + "metrics", + "resources", + "log", + "installScope", + "resourceTags", + "serviceAccount" + ], + "title": "Values", + "type": "object" +} diff --git a/helm/values.yaml b/helm/values.yaml new file mode 100644 index 0000000..6403292 --- /dev/null +++ b/helm/values.yaml @@ -0,0 +1,162 @@ +# Default values for ack-glue-controller. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +image: + repository: public.ecr.aws/aws-controllers-k8s/glue-controller + tag: 0.0.0-non-release-version + pullPolicy: IfNotPresent + pullSecrets: [] + +nameOverride: "" +fullnameOverride: "" + +deployment: + annotations: {} + labels: {} + containerPort: 8080 + # Number of Deployment replicas + # This determines how many instances of the controller will be running. It's recommended + # to enable leader election if you need to increase the number of replicas > 1 + replicas: 1 + # Which nodeSelector to set? + # See: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#nodeselector + nodeSelector: + kubernetes.io/os: linux + # Which tolerations to set? + # See: https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/ + tolerations: [] + # What affinity to set? + # See: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity + affinity: {} + # Which priorityClassName to set? + # See: https://kubernetes.io/docs/concepts/scheduling-eviction/pod-priority-preemption/#pod-priority + priorityClassName: "" + # Specifies the hostname of the Pod. + # If not specified, the pod's hostname will be set to a system-defined value. + hostNetwork: false + # Set DNS policy for the pod. + # Defaults to "ClusterFirst". + # Valid values are 'ClusterFirstWithHostNet', 'ClusterFirst', 'Default' or 'None'. + # To have DNS options set along with hostNetwork, you have to specify DNS policy + # explicitly to 'ClusterFirstWithHostNet'. + dnsPolicy: ClusterFirst + extraVolumes: [] + extraVolumeMounts: [] + + # Additional server container environment variables + # + # You specify this manually like you would a raw deployment manifest. + # This means you can bind in environment variables from secrets. + # + # e.g. static environment variable: + # - name: DEMO_GREETING + # value: "Hello from the environment" + # + # e.g. secret environment variable: + # - name: USERNAME + # valueFrom: + # secretKeyRef: + # name: mysecret + # key: username + extraEnvVars: [] + + +# If "installScope: cluster" then these labels will be applied to ClusterRole +role: + labels: {} + +metrics: + service: + # Set to true to automatically create a Kubernetes Service resource for the + # Prometheus metrics server endpoint in controller + create: false + # Which Type to use for the Kubernetes Service? + # See: https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types + type: "ClusterIP" + +resources: + requests: + memory: "64Mi" + cpu: "50m" + limits: + memory: "128Mi" + cpu: "100m" + +aws: + # If specified, use the AWS region for AWS API calls + region: "" + endpoint_url: "" + credentials: + # If specified, Secret with shared credentials file to use. + secretName: "" + # Secret stringData key that contains the credentials + secretKey: "credentials" + # Profile used for AWS credentials + profile: "default" + +# log level for the controller +log: + enable_development_logging: false + level: info + +# Set to "namespace" to install the controller in a namespaced scope, will only +# watch for object creation in the namespace. By default installScope is +# cluster wide. +installScope: cluster + +# Set the value of the "namespace" to be watched by the controller +# This value is only used when the `installScope` is set to "namespace". If left empty, the default value is the release namespace for the chart. +# You can set multiple namespaces by providing a comma separated list of namespaces. e.g "namespace1,namespace2" +watchNamespace: "" + +resourceTags: + # Configures the ACK service controller to always set key/value pairs tags on + # resources that it manages. + - services.k8s.aws/controller-version=%CONTROLLER_SERVICE%-%CONTROLLER_VERSION% + - services.k8s.aws/namespace=%K8S_NAMESPACE% + +# Set to "retain" to keep all AWS resources intact even after the K8s resources +# have been deleted. By default, the ACK controller will delete the AWS resource +# before the K8s resource is removed. +deletionPolicy: delete + +# controller reconciliation configurations +reconcile: + # The default duration, in seconds, to wait before resyncing desired state of custom resources. + defaultResyncPeriod: 36000 # 10 Hours + # An object representing the reconcile resync configuration for each specific resource. + resourceResyncPeriods: {} + + # The default number of concurrent syncs that a reconciler can perform. + defaultMaxConcurrentSyncs: 1 + # An object representing the reconcile max concurrent syncs configuration for each specific + # resource. + resourceMaxConcurrentSyncs: {} + +serviceAccount: + # Specifies whether a service account should be created + create: true + # The name of the service account to use. + name: ack-glue-controller + annotations: {} + # eks.amazonaws.com/role-arn: arn:aws:iam::AWS_ACCOUNT_ID:role/IAM_ROLE_NAME + +# Configuration of the leader election. Required for running multiple instances of the +# controller within the same cluster. +# See https://kubernetes.io/docs/concepts/architecture/leases/#leader-election +leaderElection: + # Enable Controller Leader Election. Set this to true to enable leader election + # for this controller. + enabled: false + # Leader election can be scoped to a specific namespace. By default, the controller + # will attempt to use the namespace of the service account mounted to the Controller + # pod. + namespace: "" + +# Configuration for feature gates. These are optional controller features that +# can be individually enabled ("true") or disabled ("false") by adding key/value +# pairs below. +featureGates: {} + # featureGate1: true + # featureGate2: false diff --git a/metadata.yaml b/metadata.yaml new file mode 100644 index 0000000..f49b9cb --- /dev/null +++ b/metadata.yaml @@ -0,0 +1,8 @@ +service: + full_name: AWS Glue + short_name: Glue + link: https://aws.amazon.com/glue/ + documentation: https://docs.aws.amazon.com/glue/ +api_versions: + - api_version: v1alpha1 + status: available diff --git a/olm/olmconfig.yaml b/olm/olmconfig.yaml new file mode 100644 index 0000000..36c4121 --- /dev/null +++ b/olm/olmconfig.yaml @@ -0,0 +1,40 @@ +# This configuration is a placeholder. Replace any values with relevant values for your +# service controller project. +--- +annotations: + capabilityLevel: Basic Install + shortDescription: AWS Glue controller is a service controller for managing Glue resources + in Kubernetes +displayName: AWS Controllers for Kubernetes - Amazon Glue +description: |- + Manage Amazon Glue resources in AWS from within your Kubernetes cluster. + + + **About Amazon Glue** + + + {ADD YOUR DESCRIPTION HERE} + + + **About the AWS Controllers for Kubernetes** + + + This controller is a component of the [AWS Controller for Kubernetes](https://github.com/aws/aws-controllers-k8s) + project. This project is currently in **developer preview**. + + + **Pre-Installation Steps** + + + Please follow the following link: [Red Hat OpenShift](https://aws-controllers-k8s.github.io/community/docs/user-docs/openshift/) +samples: +- kind: ExampleCustomKind + spec: '{}' +- kind: SecondExampleCustomKind + spec: '{}' +maintainers: +- name: "glue maintainer team" + email: "ack-maintainers@amazon.com" +links: +- name: Amazon Glue Developer Resources + url: https://aws.amazon.com/Glue/developer-resources/ diff --git a/pkg/resource/registry.go b/pkg/resource/registry.go new file mode 100644 index 0000000..3f3aa28 --- /dev/null +++ b/pkg/resource/registry.go @@ -0,0 +1,45 @@ +// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"). You may +// not use this file except in compliance with the License. A copy of the +// License is located at +// +// http://aws.amazon.com/apache2.0/ +// +// or in the "license" file accompanying this file. This file is distributed +// on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either +// express or implied. See the License for the specific language governing +// permissions and limitations under the License. + +// Code generated by ack-generate. DO NOT EDIT. + +package resource + +import ( + ackrt "github.com/aws-controllers-k8s/runtime/pkg/runtime" + acktypes "github.com/aws-controllers-k8s/runtime/pkg/types" +) + +// +kubebuilder:rbac:groups=services.k8s.aws,resources=adoptedresources,verbs=get;list;watch;create;update;patch;delete +// +kubebuilder:rbac:groups=services.k8s.aws,resources=adoptedresources/status,verbs=get;update;patch +// +kubebuilder:rbac:groups=services.k8s.aws,resources=fieldexports,verbs=get;list;watch;create;update;patch;delete +// +kubebuilder:rbac:groups=services.k8s.aws,resources=fieldexports/status,verbs=get;update;patch +// +kubebuilder:rbac:groups="",resources=namespaces,verbs=get;list;watch +// +kubebuilder:rbac:groups="",resources=configmaps,verbs=get;list;watch;patch +// +kubebuilder:rbac:groups="",resources=secrets,verbs=get;list;watch;patch + +var ( + reg = ackrt.NewRegistry() +) + +// GetManagerFactories returns a slice of resource manager factories that are +// registered with this package +func GetManagerFactories() []acktypes.AWSResourceManagerFactory { + return reg.GetResourceManagerFactories() +} + +// RegisterManagerFactory registers a resource manager factory with the +// package's registry +func RegisterManagerFactory(f acktypes.AWSResourceManagerFactory) { + reg.RegisterResourceManagerFactory(f) +} diff --git a/pkg/version/version.go b/pkg/version/version.go new file mode 100644 index 0000000..de0f243 --- /dev/null +++ b/pkg/version/version.go @@ -0,0 +1,22 @@ +// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"). You may +// not use this file except in compliance with the License. A copy of the +// License is located at +// +// http://aws.amazon.com/apache2.0/ +// +// or in the "license" file accompanying this file. This file is distributed +// on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either +// express or implied. See the License for the specific language governing +// permissions and limitations under the License. + +// Code generated by ack-generate. DO NOT EDIT. + +package version + +var ( + GitVersion string + GitCommit string + BuildDate string +) diff --git a/templates/.gitkeep b/templates/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/test/e2e/.gitignore b/test/e2e/.gitignore new file mode 100644 index 0000000..92c35a4 --- /dev/null +++ b/test/e2e/.gitignore @@ -0,0 +1,4 @@ +__pycache__/ +*.py[cod] +**/bootstrap.yaml +**/bootstrap.pkl diff --git a/test/e2e/__init__.py b/test/e2e/__init__.py new file mode 100644 index 0000000..50680b4 --- /dev/null +++ b/test/e2e/__init__.py @@ -0,0 +1,34 @@ +# Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"). You may +# not use this file except in compliance with the License. A copy of the +# License is located at +# +# http://aws.amazon.com/apache2.0/ +# +# or in the "license" file accompanying this file. This file is distributed +# on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either +# express or implied. See the License for the specific language governing +# permissions and limitations under the License. + +import pytest +from typing import Dict, Any +from pathlib import Path + +from acktest.resources import load_resource_file + +SERVICE_NAME = "glue" +CRD_GROUP = "glue.services.k8s.aws" +CRD_VERSION = "v1alpha1" + +# PyTest marker for the current service +service_marker = pytest.mark.service(arg=SERVICE_NAME) + +bootstrap_directory = Path(__file__).parent +resource_directory = Path(__file__).parent / "resources" + +def load_glue_resource(resource_name: str, additional_replacements: Dict[str, Any] = {}): + """ Overrides the default `load_resource_file` to access the specific resources + directory for the current service. + """ + return load_resource_file(resource_directory, resource_name, additional_replacements=additional_replacements) diff --git a/test/e2e/bootstrap_resources.py b/test/e2e/bootstrap_resources.py new file mode 100644 index 0000000..450a769 --- /dev/null +++ b/test/e2e/bootstrap_resources.py @@ -0,0 +1,32 @@ +# Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"). You may +# not use this file except in compliance with the License. A copy of the +# License is located at +# +# http://aws.amazon.com/apache2.0/ +# +# or in the "license" file accompanying this file. This file is distributed +# on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either +# express or implied. See the License for the specific language governing +# permissions and limitations under the License. + +"""Declares the structure of the bootstrapped resources and provides a loader +for them. +""" + +from dataclasses import dataclass +from acktest.bootstrapping import Resources +from e2e import bootstrap_directory + +@dataclass +class BootstrapResources(Resources): + pass + +_bootstrap_resources = None + +def get_bootstrap_resources(bootstrap_file_name: str = "bootstrap.pkl") -> BootstrapResources: + global _bootstrap_resources + if _bootstrap_resources is None: + _bootstrap_resources = BootstrapResources.deserialize(bootstrap_directory, bootstrap_file_name=bootstrap_file_name) + return _bootstrap_resources diff --git a/test/e2e/conftest.py b/test/e2e/conftest.py new file mode 100644 index 0000000..a0bbc0c --- /dev/null +++ b/test/e2e/conftest.py @@ -0,0 +1,45 @@ +# Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"). You may +# not use this file except in compliance with the License. A copy of the +# License is located at +# +# http://aws.amazon.com/apache2.0/ +# +# or in the "license" file accompanying this file. This file is distributed +# on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either +# express or implied. See the License for the specific language governing +# permissions and limitations under the License. + +import boto3 +import pytest + +from acktest import k8s + +def pytest_addoption(parser): + parser.addoption("--runslow", action="store_true", default=False, help="run slow tests") + +def pytest_configure(config): + config.addinivalue_line( + "markers", "service(arg): mark test associated with a given service" + ) + config.addinivalue_line( + "markers", "slow: mark test as slow to run" + ) + +def pytest_collection_modifyitems(config, items): + if config.getoption("--runslow"): + return + skip_slow = pytest.mark.skip(reason="need --runslow option to run") + for item in items: + if "slow" in item.keywords: + item.add_marker(skip_slow) + +# Provide a k8s client to interact with the integration test cluster +@pytest.fixture(scope='class') +def k8s_client(): + return k8s._get_k8s_api_client() + +@pytest.fixture(scope='module') +def glue_client(): + return boto3.client('glue') diff --git a/test/e2e/replacement_values.py b/test/e2e/replacement_values.py new file mode 100644 index 0000000..331c308 --- /dev/null +++ b/test/e2e/replacement_values.py @@ -0,0 +1,18 @@ +# Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"). You may +# not use this file except in compliance with the License. A copy of the +# License is located at +# +# http://aws.amazon.com/apache2.0/ +# +# or in the "license" file accompanying this file. This file is distributed +# on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either +# express or implied. See the License for the specific language governing +# permissions and limitations under the License. +"""Stores the values used by each of the integration tests for replacing the +Glue-specific test variables. +""" + +REPLACEMENT_VALUES = { +} diff --git a/test/e2e/requirements.txt b/test/e2e/requirements.txt new file mode 100644 index 0000000..397b277 --- /dev/null +++ b/test/e2e/requirements.txt @@ -0,0 +1 @@ +acktest @ git+https://github.com/aws-controllers-k8s/test-infra.git@b9b2416624a69edc47f0aeaed34efac5d02b8673 diff --git a/test/e2e/resources/.gitkeep b/test/e2e/resources/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/test/e2e/service_bootstrap.py b/test/e2e/service_bootstrap.py new file mode 100644 index 0000000..770ea0d --- /dev/null +++ b/test/e2e/service_bootstrap.py @@ -0,0 +1,39 @@ +# Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"). You may +# not use this file except in compliance with the License. A copy of the +# License is located at +# +# http://aws.amazon.com/apache2.0/ +# +# or in the "license" file accompanying this file. This file is distributed +# on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either +# express or implied. See the License for the specific language governing +# permissions and limitations under the License. +"""Bootstraps the resources required to run the Glue integration tests. +""" +import logging + +from acktest.bootstrapping import Resources, BootstrapFailureException + +from e2e import bootstrap_directory +from e2e.bootstrap_resources import BootstrapResources + +def service_bootstrap() -> Resources: + logging.getLogger().setLevel(logging.INFO) + + resources = BootstrapResources( + # TODO: Add bootstrapping when you have defined the resources + ) + + try: + resources.bootstrap() + except BootstrapFailureException as ex: + exit(254) + + return resources + +if __name__ == "__main__": + config = service_bootstrap() + # Write config to current directory by default + config.serialize(bootstrap_directory) diff --git a/test/e2e/service_cleanup.py b/test/e2e/service_cleanup.py new file mode 100644 index 0000000..d765f51 --- /dev/null +++ b/test/e2e/service_cleanup.py @@ -0,0 +1,30 @@ +# Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"). You may +# not use this file except in compliance with the License. A copy of the +# License is located at +# +# http://aws.amazon.com/apache2.0/ +# +# or in the "license" file accompanying this file. This file is distributed +# on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either +# express or implied. See the License for the specific language governing +# permissions and limitations under the License. + +"""Cleans up the resources created by the bootstrapping process. +""" + +import logging + +from acktest.bootstrapping import Resources + +from e2e import bootstrap_directory + +def service_cleanup(): + logging.getLogger().setLevel(logging.INFO) + + resources = Resources.deserialize(bootstrap_directory) + resources.cleanup() + +if __name__ == "__main__": + service_cleanup() diff --git a/test/e2e/tests/.gitkeep b/test/e2e/tests/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/test/e2e/tests/__init__.py b/test/e2e/tests/__init__.py new file mode 100644 index 0000000..97b6b43 --- /dev/null +++ b/test/e2e/tests/__init__.py @@ -0,0 +1,12 @@ +# Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"). You may +# not use this file except in compliance with the License. A copy of the +# License is located at +# +# http://aws.amazon.com/apache2.0/ +# +# or in the "license" file accompanying this file. This file is distributed +# on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either +# express or implied. See the License for the specific language governing +# permissions and limitations under the License.