diff --git a/charts/gardener-extension-provider-aws/doc.go b/charts/gardener-extension-provider-aws/doc.go index 19f748a80..df763adc5 100644 --- a/charts/gardener-extension-provider-aws/doc.go +++ b/charts/gardener-extension-provider-aws/doc.go @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -//go:generate ../../vendor/github.com/gardener/gardener/hack/generate-controller-registration.sh provider-aws . ../../VERSION ../../example/controller-registration.yaml BackupBucket:aws BackupEntry:aws Bastion:aws ControlPlane:aws DNSRecord:aws-route53 Infrastructure:aws Worker:aws +//go:generate sh -c "../../vendor/github.com/gardener/gardener/hack/generate-controller-registration.sh provider-aws . $(cat ../../VERSION) ../../example/controller-registration.yaml BackupBucket:aws BackupEntry:aws Bastion:aws ControlPlane:aws DNSRecord:aws-route53 Infrastructure:aws Worker:aws" // Package chart enables go:generate support for generating the correct controller registration. package chart diff --git a/example/controller-registration.yaml b/example/controller-registration.yaml index d36431d01..343ac65db 100644 --- a/example/controller-registration.yaml +++ b/example/controller-registration.yaml @@ -5,7 +5,7 @@ metadata: name: provider-aws type: helm providerConfig: - chart: H4sIAAAAAAAAA+09a3fbNrL9rF+BqzSnSRtSL1vOam+6q9hq69PE0Vpucnqb1ociIYk1RTIEKUeb5r/fGQCkwIdE0XGcpiVOG5PgvPAaDAYDaG4EFnVpoNG3IXWZ7bmaH3gr24Is45q1vriF1IZ0dHjI/0LK/uXPnd5Bp3vY7fcxv3N4dHTwBTm8DeZlKWKhERDyReB54S64su+faZqXtP/xwghCfW0snZvzwAbuHxxsbf8ufEu3/9FRt/MFad9eMbenv3n7G779kgbY7gOy6jQM31de9V5Pb2sWXTUsyszA9kP+YUh+oM6SmNg1yMwLSLig5HvZkcjw1YSMZRciSa9quMaSDkhJd2usiph/6jr6K6ey8W95pj73PoxHyfjvdvr97PiH+aIe/3eRWi1y7PnrwJ4vQvLAfEi67c4/yGQ4JpMRgaFtuPzFmM1sxzZCSkxv6RvuWidDxyEcjZGAMhqsqKWTi4XNCIBSAn8d24QuRS0SuagLUEsMfcOEPxNvFl4bASXPBMgjstJJF7SFSf2QGIy4Xgh4HqAE1zYDai5Hf3Z6PDoDwZBDo9WC/2IKBUwS2lKjka7eJg8QoCk/NR/+E0msvYgsjTUyJREwC5NCSIGAOxYbKsA1Kbm2w4WQRlDRkcbPkoY3DQ0ANwDBh7eZCkiMUArN0yIM/UGrdX19rRtcYt0L5i1Zaawly6qB1BLrJ9ehDGv7TWQHUOLpmoC+BgRjCrI6xjVvsHlA4VvoodTXgR3a7vwRYbLCkYxlszCwp1GYqrRYRii6CgDVBl2gOZyQ00mTPB1OTiePkMir04sfXvx0QV4Nz8+HZxenowl5cU6OX5ydnF6cvjiDt+/I8Oxn8uPp2ckjQm1sSahOP8ASgJg2Vif0GKQ1oTQlQjylMJ+a9sw2oWjuPDLmlMw9mCBcKBHxabC0GTYrAwEtJOPYSzs0Qp6VK5feAJC5N5ijssN+rOst+G9FXcsLWnOQL5rq0MitWCFuHhaGedWK8TTTc8PAcxzQjwGdY01xljpbEFVxEl1yeDk6n0CFyDf61oCC09Y2KmhokafAMPKfRuYVDQdIS2SMAGUt3xmfifH5WFAaQx1RnnFyNjmnphdY+KYFHjTjYY+curMAsILIDKNAAL7ygisa4CPWDRkDE6xjMa1TFzsVI2qVscj3PTnly0xsCqxl4BdQMySbcpFUuRq+Sr2e0f80qWz+Dyn0V2j8D1kJVl//HcECoF7/3UXav/0vF9QBrcv00K+4Fiy1/zqddPt3u732UW3/3UV6904jFp3ZLlhFuERrEu39+0bZMg2xYObksA2VhGNMqcPAnvH1K7oWxPhLNIWJm0I/0m2vhYxSNLaQWBlOJCV69w7sGdOJrEROnUjEHYLkcbMCIpUB2QIh+XNO+VLYLnQdMAg5un5OHWqAnXEGwhVKlohmL2EiFJIRgl/sGVkYbBzA97ekyRZG97A/ALYvkT2wQng9NOYkwfAD2w1npHmf/fs+y0IG1PeYHXrBehcJKCMtIji4MUEorFLubINwDKhWx4fXuPRJ+VN0YygiYQTUTpB0iRLCcZsKcWPeOkmh7SW3b8DKoExsDrRT6hTEXkJLxjtlzvV+i/qOt15SN5QOlWQkstaqsx0PuoEHS4a16RiMpVAZrE+syAF7T796zLt/hs6nVmR1ulGqMP/LLlx5+i/1/+b8P91up9ut5/+7SDlVl9LQ4nnQ0ztdvbN1xk4pKvyIGmJuBqgleC4SqJXFnzLtP/5haT+z50vD10wYM95SW4bRfhtDJeO/0+lm9n+6B0e9evzfScrs/1zZrjVAnxI09XPDbyxpaFhGaAzA9BA7OJvG15IeIT8y3yiyhnm2sF6EbT0osMjRwvkDMqEzhuQAoWO2nBNnav+XBjpbDMgf3BC69z+tqe222KLBX9ErBUYsDWbA7tI3wgV6QL98ADrKIi22hh6MVk0L7HdCtHDtU+IQjRu+DzkBy5NWGNnQefLlgymUA0tHvnyXJv/+YWODMCMOI5qTB4JSzcGAJtobsrKDMDKcBClcUDd5wUTNhUfYle376FeT4BthBir19ylM9LvZbkSTzJm9EY6TNReGO0eyUJ/ol3ZhpO/LwfYJWH5XhEHVWXSVAuL0Ogf9tqxDl9ba/TNKN9H/fL5fURNWhBo65HGXge6YCsrsv4N+L6P/jzqHvVr/30UqWsi+5E37Im5Z4f2oOE0U+2uKu85HnT7EquUy3U9xCkE+u0qdJqesuj91k91qusn4d7w5ziR7RwWVjP+Do343a/91D/v1+L+LdFsDW/YJaROmR7ToY8r45UZJ3N9gqSj7oG46XmTJjhaJncMBkZSTAT2zHbA9NMUXiwixUfjLd6fPLkbnvya2C/fHZpJvBIwGCchzIzQXGRCF/NdcLHXjd2m4oDCCr3GDdevHhPyPdH2ZlQIKlXwfc2ny7KFpeFhFME6Ley6iLS5PoELivIsAbL+PVgFLw1zASn9bFez4/PeohO2fUsr0r1QbJrM1K7BBFKXUYkAw+09d0KVn2bP13gVNAEEpWjaqJAUQi8c3iS6XSIYyglsiv23wX+srI3itQ5Ffo5rC2CDQtq/1B9vUhqZ/869L/H+XbvmjsPbTqMx+mIg+tKxsLZDLy1jtXi4jJwSLxzXc8NK2Li+J52Nshxf8M8K6/8yqdsdgjCvowW6t9cee4/nWKhjn1BmhbxKDNJkRGaWWHvMkTWDajPeBPsaodqZaQA0L+lWI44+P52zeB41tZ3qu0Np3cEvjW27lVqwpUQUZK2E8PJ9sq7udMn7nBdAfxXNA5/StIj28yeffQntJnzQf/Ot/8eHb19a7g/ca/NuV/1788lvz168fNl+zbxxYDjlPAJLBA+69ffv6+puHr9mSzTkBqNFvdQBN+FwAxUuoe3xG6ukPUr77P2v3l9p96+L+D4P7zwf3J/+HVcfrMG3/3cD+r3waoDT+4yjr/+32u3X8752k27L/78YXLLgkS3js9Zqm8b9qQaDjJqpAVxYaEj2z3lh1DMdfGB1OJqkAqfiP1cVII+MtkfRMxwZJAdKlJp/FpIbO5g/kUDVMjCpGHvD5Yu1TxisqiettltDX8wQwbDfGb5bJV4SfhCCYm9yKUimY1cRRERM53vhVawUwqvFFhITfNApYWJEjx6nGU6CkHUrInoamFfcPBpYBGBuDRLPzjYuzePhlWCCmLlH0BHJTMEDH8HKYWcqxJWAsX76rc/ApD0cWQCT0fsaY5R1wyVDu/5UdaZ9p2n/+twy6BCVKw9ve/+32e0e5/d9+u57/7yJVNqjFBHnCO8OEhqmdgTi+LG81pDdxK9sIfGZ+zDRgUEDLcF1PHvwQoDJYDQrBZ/ZM3KaJh2JMw9F8D0ry1VcNPGeCiAyEwD0AQYQvO58pAuwSIR4mElUpP5/wswJyrbyg5hWLloWBFSk76wHfpCZf6heSi/4U6mqMO9zN7WEZzYfcjBLhpMBnMyM4qULtKhYhcd1giqMDjzfTUVmgsEBceCw8o+G1F1wNSBgk29Sh59AgWy8wPcxm0A4DcuZNZEMqe93x0nlARm9tFjIF74rCFHcsWxeW5ED2heus90PeMB29pWYU7sHTdm1uRAnPQ1wCbVuXl0i415Q2ozOhsXpq7vaWS8O11OpppSm3cgESCSyDgvAGQwPrbThQioRT/dR2oK4oU/Ohs1owKn5pno0uLocnz0/Pmo9Ic/Lz5PLi9PmouVkxrzwnWtLnXuSGKQIlxce0RCTsvoNsWRQbNF2pG7o8oEwht70+c5GzOEyDpe3yHvd9AFpmDCtuz5pQYGiBudltqGUrYL61UGa8YkrX5c6QmU2y6MyInPC5ZwE0HpUBK0n4Oz66/q8w/ycxxVUdALvn/06n18/O/732Qb3/dyepaPqWU3zS3nt7Afac1/lpCDXoYO56AT2nzIsCM16L5ubMIP6eXb8L9AFp4szSTC+sqjgZ4qkuoCsbK+QHG9dF62d4rHRADvkXftqWpRZSMvMYlZpgusOOKJGjLwngsUk6X8uCew7G3f/kW4mBgVTf/uQaK8N28JxmSqD0p43yg/xJFMxzwDxTgN3AjNkzgCRRlHmrB53MhXEhNzGCtscmbbeHUmcqdgi60/V1A2H3EgvqFub/TXvRMLBNpovzuRMzMHisoIIE6huAFjTixi5DiM3giIHuxXMOkQSx+L6HQvPD7pvTydCrVSdzmjoeBwbaj9uP283tlbnnIHwcY9yKzYlbCbZJh6aJA/Nst9aSU/gWS24n2nYLpAhsHDnO2AN9kXbGyAj65GOZBbhfFSCopoECxmyukxAw1qOa45lXTxQhBOBIwukx3DMAU+VBmsKzM+Un1DVQITgGwNQMoBmBPr7YDmVP0u4m2aWYrmLrG8zJ2jVZMSeKR99vyogjl/PhR+pvwoPFTsxd9MWg1/BWiSctGpqt4k4llUNLcXRnySBnH0/7V5dVxS4VmMG8NxersxtwUrDLOFkuC/iFBdXZJKj780jGiXDNam/8PajHSMcc5z/jyf70ucO3KoensZd4Px7Xhh1qqKa9qDKrV4B7IVCzDBfUcMIFnwirN42CXNY4dupuiuqs0vil3Li5qIk1PXbujVmzlQFHeRFjDBOELO1rfqVG9RIIvDLJr+l04XlXsS5JTO0nOzxoW7Hl/KjhFK6KJcHEvpcuocZ47Uc5PYyPKCVHgyJqls3QoFFCLlKVJT9v9uUY2A2/g71Cmo+a22hJ3kWEXslPW6hQd5Vf/D8bDU9G55ejZ6NjvOLm8mz4fDQZD49HylqeR6x8BzZS2g8ws6ljndNZOlfmC09IbGzrSbPe1MSO5T19Pvx+9BKEfXF++eLl6PzV+elFTtYBafErWZQI6VZhyPQuWxkbvcBbEvcQ0eppb4kwtcbcfqzYXbgRGnqm5wzIxfE4u1MVpNeRIiWZg4I9qw3GH8SVxminXbBJx2ut0O8VFzkJf42T6usqnfY/tMW3RdcXCZNrdQUO433Qc5py1ha0PN4K5uLGotITrCEsGIa5DyTZIz2JYG00nyTnyU+5cpXZwveq7JWL4vHVwiS1rFZKhQvskbhaKr02jdG5Y7jsFogMlur1PXVzH/ngybFCZnvcJaEihJ7vOd58/SPK2EzvVKDfnHeSYr/klk5X6IvcO3gjTimf5EG3LT9V6pn79cvq8pb18x2y11vP6bS//xeGNkyeQcQvAZ1G1pzu6wguO/91eFCw/1uf/72TJMfzPCQP0PlT5NR8SDrZI2A+91K0Vp0pWC2xw3jsWSdJB3nKO8hte45v5tAt8JWyaFpa4A925H4O+qbC+Ffvhqm0BVQ2/nu58d87PKrvf76TpI5qtU8X3wSkbyJAxqpjtmCcl970LFYfnbgTtBtzx5sazomYuwdkZjiMpi+ebsZMRURc/u7phNcgdRmn3vzU1fynTfuP/2BqmDe7CL5k/MNgz9z/2O0cHtXz/50kDJ9WdQBvZSMKFzDO/ivct5v7vmRwtAN1RoNzz6FV5vcqM3cQObjM0TCq+/vAi3y+5tG2HxptpJb4CKpuMrB8TguaPYzUD7hNYNOCnDQo9/anX1QAU1SOfFH87QU5Kl7ins2+qkBpR2dhngouvIqp581n0OlTWVVoqPFVts3EwzVaOvzJT54ivv2cb5Jt2/L5FhFHqKwkNy1E8+tmnrjpQRXIgB3ZD/N0uZ2YoWYGtFDaagTjfG6Dim+qcsxurRXX6nVpFTab/A+GX8h+FWNsHY0CwZJXYKeuWlYBfFsZMcoHVwTjbW7zy1dCYo6zzGtrBvXnYPyT+AILcVeOMEah3sOkpwufgoSS28uyeyexJTEidzOnXgyxc5saVjB0aC5jCpoDSiLyNxC5T797U/EAK9nNQ0scWYPuGYX8PmvpgjTVgx+SJ4/jiuuJ335mb77KOuVLI3uv3i2PGerM8PmQKWwHxCwnBX3EY6bh7GpRfqINYKDUMbhowyzxD5oSnooq/2gzA7CQjvS4CnZI2EgO9ChzVok8sDT8HcYzn34E8iQVSnA7K9lPPe/HaX/7Tw7LG5iAZeu/o052/dftdev7f+4kFZ7/kx3+bxb3F/Ijb1JTnI5T/p/94vaSfTCN+OU7W5l91fSmFt8aMAIwIirtkVVu/8rjX07LVdRA2fjvHmTvf+/1j+rzP3eSdo3/eML7pE7cT11Bf/FUYfyLQ6LV3b/l8/9h1v/T6x3W/p87SXL/p8IBQFVjxAeHs+uBicjf5huudoi5iraoYj9YoJxCqkGPt90VLJ0sTSzQE4vCcBzv+iXfcx+99Q3pWOYhEbxa8J0GpcVRYFFE3wigaKGMMxZGx9zHo0c7jlzHtKhrBmsff5iLFzZ5VQK8i3/TYFv77z/+V75xw98BLRn/nV7e/3twUN//cScp0+ewkcXRAisz1Jt5F4Pc/+025ah/KR0MY88aJg6G/a8QAd57WhCxxV4gfDza1Tj6dJ7QCkoImvDXiGxt80EcGfjq669k9MjSdoeoEKgSim/60ZYrI/Ky6BsCOuAVXxtRjqaEDy3p0gvWNxJAoN5EBon5PvOzL/FqJQlyLDpYhvm5w2Vl0T4AIPSy2nwiRwT4KOoXRVeB9Q3c57Ihf8epTP+LOLcP+wHo0v2/flb/tzv92v9zJ0kcXuJKMv6RpwGhUfzzHUn3gE6BXtHNr2JuNhZamaNHoTEfEG4z4OD2lRNPp7MzLxzjr8XCuG+IMGMYv+8b90BfiJ8awc2Qe0Sc8uYvDTUyZ0A6jWw0D8+RBxsP2/cRIXZ7I2lQCQNuKfFJLYloLZoT8hqe6/fD9rKRVrj9g+d2qVpq4hwI8isR7Qik7kImU5Ea9S+OmipHl3ZCsU2wbCGEuuG4C0w5r7MDLNmW3AFDSO60DDZS/sNTceNSEY5yKGVAutip0tucO9iLjc4dAMrBlB1QW498xIEpjfyRhAH55ddG5oABz8s4OhMS90hR/CzebAZDQN5cPuDPqdsPtMRG4d8IEXTPlRGs/KDtJqRYfZw63rS1NNDV2ZpGtmOJX+ppnXjQMQP++8qCtqoXYqXgeXOHXm4OTApczVha/QOJxpVAs6e3mzIj+WX3jt7p6G8/71J1cqVqfvsES9YVH3RdbzRSflpxv0zi9B2Qg4OezIqPQXTa3cN2o5E+hjlQdBWexBzEu9ONe/fw9zhwx1IEQsmDvI8I1ec6YfHJ4Oma4EJe2xzcBcyGBEbqQEcox+QocIzLPya6Mz5rLFVow0zKVXzPXdEtd/LnqhGo9Tvz3MQUT26cK4Tgd8F12iKOW17U1unh6+batMylaWb+vLBY9mszg4UxUHIx2uP297bMTC3t0/H4uOdPp/HxWmXxLWokZiTaOp5FYs3GryWs7c461alOdapTnepUpzrVqU51qlOd6lSnOtWpTnWqU53qVKc6fdT0/5pzsGwAoAAA + chart: H4sIAAAAAAAAA+09a3fbNrL9rF+BqzSnSRtSL1vOcm+6q9hq69PE0Vpucnqb1ociIYk1RTJ8yNGm+e93BgBJ8CFRdBynaYnTxiQ4MxgMgMFgMIAWum9Sh/oKfRtSJ7BcR/F8d22ZkKVfB50vbiF1IR0dHrK/kPJ/2XNvcNDrH/aHQ8zvHR4dHXxBDm+j8KoUBaHuE/KF77rhLriq759pWlS0//FS90N1o6/sm5eBDTw8ONja/n34lm3/o6N+7wvSvb1qbk9/8/bXPesl9bHdNbLutXTPk17VwUDtKiZdt0waGL7lhezDiPxA7RUxsGuQueuTcEnJ96IjkdGrKZmILkSSXtVy9BXVSEV3a63LCv/UMvorp6rxb7qGunA/rIyK8d/vdw/z4787PGrG/12kToccu97GtxbLkDwwHpJ+t/cPMh1NyHRMYGjrDnvR53PLtvSQEsNdebqzUcnItglDC4hPA+qvqamSi6UVEAClBP7algFdipokclAXoJYYeboBf6buPLzWfUqecZBHZK2SPmgLg3oh0QPiuCHguYDiX1sBUHMY+rPT4/EZMIYltDod+C+mUFJIQltoNNJXu+QBArTFp/bDfyKJjRuRlb7BQkkEhYVJJQRDUDpWGwTgGJRcW+GSc8OpqEjjZ0HDnYU6gOuA4MHbXAYkeiiYZmkZhp7W6VxfX6s641h1/UVHCC3oiLoqwLXA+smxaYDSfhNZPtR4tiGgrwFBnwGvtn7NGmzhU/gWusj1tW+FlrN4RAIhcCRjWkHoW7MozAgt5hGqLgOA2KALtEdTcjptk6ej6en0ERJ5dXrxw4ufLsir0fn56OzidDwlL87J8Yuzk9OL0xdn8PYdGZ39TH48PTt5RKiFLQni9HysAbBpoTihxyCtKaUZFuIpJfCoYc0tA6rmLCJ9QcnChQnCgRoRj/orK8BmDYBBE8nY1soK9ZBlFeqltgBk4WoLVHbYj4MlUQzSVtUO/Lemjun6nQWwGc1UaOtOrBfTh6VuXHVidMVwndB3bRvUpE8XKDBWsgpkZf1JVPLlA0MPCS/n5fh8CtJ5KF7pWx3EQDvbiKHZRZ5CuZH3NDKuaKghSZ4xBpSNeA/YvIzPx5zSBCRGWcbJ2fScGq5v4pviu9CohwNy6sx9wPIjI4x8DvjK9a+oj49tFBWZQCkocj7LUwf7WEAyEow8zxUWgMjElkGhQ4E+NUKSVoxkKtbyZOrNBP/pUtX8H1LoodDaH7ISrL/+O4IFQLP+u4u0f/tfLqkNWjdQQ6/mWrDK/uv1etn27/cH3cb+u5P07p1CTDq3HLCKcInWJsr7962qZRpiwZTJYFsyCVufUTsAe8ZTr+iGE2Mv0Qwmbgr9SLXcDhaUobGFxFq3I8HRu3dgzxh2ZCZ8qkQg7mCkiJtnEKloZAuEKJ+VVKyF5UDXAYOQoavn1KY62BlnwFwpZwlr1gpmPs4ZIfjFmpOlHkx8+P6WtIOl3j8calDsSyweikJ4NdQXJMHwfMsJ56R9P/j3/SAP6VPPDazQ9Te7SEAdaRlB7cYEobJSvfMNwjBArLYHr3Htk/pn6MZQRMBwqJ0g2RolhOM25ezGZaskg7YX354OK4MqthnQTq4zEHsxLQreyXOh95vUs93NijqhcKgkIzHorHvb8aAbuLBk2Bi2HgQZ1ADWJ2Zkg4GnXj1m3T9H51MrsibdKNWY/0UXrj39V/p/e8Nhfv7v9fvN/H8XqaDqMhqaP2sDtddXe1tn7Iyiwo+oIRaGj1qC5SKBRln8KdP+4x/W8nNrsdI9xYAx466UVRjttzFUMf57vX5u/6d/cDRoxv+dpNz+z5XlmBp6kaCpn+tea0VD3dRDXQPTg+/gpI2vJD1CfAw8vcwaZtnceuG2tVZikaOF8wdkQmcMyQFCx8Wyklih1n+prwZLjfzBDKF7/9OZWU4nWLbYK7qhwIil/hyKu/T0cIke0C8fgI4ySSfYQA9Gq6YD9jshSrjxKLGJwgzfh4yA6QorjKR0nnz5YAb1wNqRL99lyb9/2EoR5sQOiGIXgaBWCzCgifKGrC0/jHQ7QQqX1EleMFFj6ZLgyvI8dKQJ8JQZTab+PoOJjjbLiWiSObdS5hhZY6k7CyQL8kS/tAMjfd8SLI+A5XdFAhCdSdcZIEavdzDsChk6tNHun1G6if5n8/2aGrAiVNAhj7sMdMdUUGX/HQwHOf1/1DscNPr/LlLZQvYla9oXccty70fNaaLcX1PedT7q9MFXLZfZfopTCJazq9ZZctKq+1M32a2mm4x/213gTLJ3VFDF+D84Gvbz9l//cNiM/7tItzWwRZ8QNmF2RPM+Jo1fZpTE/Q2WiqIPqobtRqboaBHfKtSIoJwM6Lllg+2hSL5YRIiNwl++O312MT7/NbFdmD82lzzdD6ifgDzXQ2OZA5HIf83Yknd8V7oDCsP/GrdUt35MyP9IN5d5LqBSyfcJ46ZYPDQNC6vwJ1l2z3m0xeUJCCTOu/DB9vtoAljpxhJW+ttEsOPz30MI2z9llOlfSRpGYCmmbwErUq35gAisP3VFV65pzTd7VzQBBKVoWqiSJECsHtskulwhGRoQ3BL5LcV/ra51/7UKVX6Nagpjg0DbvlYfbFMbivrNvy7x/1265Y9S6WdRA+thwvrINPNSIJeXsdq9XEV2CBaPozvhpWVeXhLXw2AO1/9nhLL/zES7YzDGAnqwW2v9sed4vjUB45w6J/RNYpAmM2JAqanGZZI2RufE+0AfY1TbM8Wnugn9KsTxx8ZzPu+DxrY9O5do7Tu4hfEttnJrSoqLIGclTEbn022y28njd64P/ZE/+3RB30rcw5t4/i20VvRJ+8G//hcfvn1tvjt4r8C/ffHvxS+/tX/9+mH7dfCNDcsh+wlABvCAe2/fvr7+5uHrYBUsGAGQ6LcqgCblXADFS5A9PiP17AfB3/2flfsr5b55cf8H7f5z7f70/1B0TIZZ++8G9n/t0wCV8R9Hef9vf9g/bOz/u0i3Zf/fjS+Yl5Is4bHXK4rC/soVgY6bqAJVWmgI9Nx6Y93TbW+p9xiZRABC8R/Li5FWzlsi6Bm2BZwCpEMNNosJDZ3P18RQ1Q2MKsYy4PPFxqMBE1QS19uuoK8WCWDYbozfruKvDD8JQTDS3JpcSZj12JEREz7eeHWlAhj1ykWEpLxZ5AdhzRIZTr0yOUrWoYTF09Aw4/4RgGUAxoaWaHa2cXEWD79cEYipChQ1gUwrBugYXg4zSzW2AIz5K3Z1Bj5jAcgciITuzxilvAMuGcrDv7Ij7TNN+8//pk5XoERpeNv7v/3h4Kiw/zvsNvP/XaTaBjWfIE9YZ5jSMLMzEMeXFa2G7CZubRuBzcyPAwUKKKGlO44rDn5wUBGsBpVgM3subtPAQzGGbiueCzX56qsWnjNBxACYwD0AToQtO59JDOxiIR4mAlWqP5vw8wwyrbykxlUQrUoDKzJ21gO2SU2+VC9EKepTkNUEd7jb28My2g+ZGcXDSaGcdEawM5XaVS1CYtlgiqMDj9PpqCpQmCMu3SA8o+G1619pJPSTberQtamflwtMD/M5tINGztypaEhprzteOmtk/NYKwkDCu6IwxR2L1oUlOZB94dib/ZDTQsdvqRGFe5RpORYzorjnIa6Bsq3LCyTca8qa0bnQWDUzd7urle6Ysng6WcqdQoBEAhtARViDoYH1NtSkKuFUP7NskBUN5HzorCaMil/aZ+OLy9HJ89Oz9iPSnv48vbw4fT5upyvmtWtHK/rcjZwwQ6Ci+phWiITdV8vXRbJBs0JN6bKAMoncdnkWImdxmPory2E97nsftMwEVtyuOaVQoAnmZr8l162k8K2VMuIVU1aWO0Nm0mTSuR7Z4XPXBGg8KgNWEvd3fHT9X2P+T2KK6zoAds//vd5gmJ//B92DZv/vTlLZ9C2m+KS99/YC7Dmvs9MQctDBwnF9ek4DN/KNeC1amDP9+Ht+/c7RNdLGmaWdXVjVcTLEU51P1xYK5AcL10WbZ3isVCOH7As7bRtkFlIi8xiVGi90hx1RwcdQEMBzknSxERV3bYy7/8kzEwMDqb79ydHXumXjwcwMQ9lPqfKD/GnkLwrALJOD3cCM2TOAJFGURasHncylcSE3MYK2xyZtt4cyZyp2MLrT9XUDZvdiC2QL83/aXjT0LSNQ+YHcqeHrLFZQQgL1DUBLGjFjN0CIdHDEQPfiOYcIglh9z0Wm2WH39Dwy9GrZyZyljud/gfbj7uNue7sw9xyEj2OMW7E5cSvBMujIMHBgnu3WWmIK32LJ7UTbboGUgU0i2564oC+yzhgRQZ98rLIA9xMBgioKKGDMZjoJAWM9qtiucfVEYoIDjgWcGsM9AzCZH6TJPTszdiZdARWCYwBMTR+aEejji2XT4EnW3SS6VKDK2GqKOd04RlBeEsXD7jctiCFXl8MO0d+kjCB2Yu6izwe9grdKPOnQ0OiUdyqhHDqSoztPBkv28Hx/fV5l7EqGA5j3Fnx1doOSJOyqkkwn8NkVBfWLSVD3LyMZJ9w1q7zx9qAeIx0znP9MpvvTZw7fuiU8jb3E+5VxrVuhgmrajWoX9QpwLzhqvsAl1e1wySbC+k0jIVc1jpW5jaJ+UVn8ytKYuajwNT127tSs2VoAQ3kRY4wShDzta3aJRv0acLwqzq/pbOm6V7EuSUztJzs8aFuxxfyo4BQusyXA+L6XKqAmeM9HNT2Mj6gkR/0yaqYVoEEjhVxkhCU+p/tyAdgNv4O9QtqP2ttoibLLCL0Sn7ZQoc66uPh/Nh6djM8vx8/Gx3jFzeXZ6Pl4Ohkdj6W1PItY+Q5spKwfYG5R2zyn82yuyOeekNjYVpNmvamJHfN7+nz0/fglMPvi/PLFy/H5q/PTiwKvGumwO1ikCOlOacj0LlsZG73EWxL3EN7qWW8JN7UmzH6s2V2YERq6hmtr5OJ4kt+p8rPrSJ6STK1kzyrF+IM4whjtdUs26ZjUSv1ecZWT8Nc4yb6uymn/Q1t8W3R9GTOFVpfgMN4HPacZZ21Jy+OtYA5uLEo9wRzBgmFU+ECSPdKTCNZGi2lynvyUKVeRzX2v0l45rx5bLUwzy2qpVrjAHvOrpbJr0xidOYarboHIYcle31On8JENnkJRWNged0nICKHruba72PyIPLazOxXoN2edpNwvuaXTlfoi9w7eiFPGJ3nQ74pPtXrmfv2yPr9V/XwH783Wczbt7/+FoQ2Tpx+xS0Bnkbmg+zqCq85/HR6U7P8253/vJInxvAjJA3T+lDk1H5Je/giYx7wUnXVvBlZL7DCeuOZJ0kGesg5y257jmzl0S3ylQTSrrPAHO3I/B31TY/zLd8PU2gKqGv+DwvgfHB419z/fSZJHtdyny28CUtMIkInsmC0Z55U3PfPVRy/uBN3WwnZnun3C526NzHU7oNmLp9txoTwirnj3dFKWlrmFU21/ajH/adP+49+f6cbNLoKvGP8w2HP3P/Z7h0fN/H8nCcOnZR3AWlmPwiWMs/9y921635cIjrZBZtQ/d21aZ36vM3P7kY3LHAWjur/33chjax5l+6HRVmaJj6DyJkNQzOlAs4eR/AG3CSxakpMFZd7+7IsMYHDhiBfJ316SI+Ml7tn8qwyUdXSW5sng3KuYeU4/g06fCVGhocZW2VbAH67R0mFPXvIUse3nYpNs25Yvtgg/QmUmuVkm2l+3i8QNF0QgAnZEPyzSZXZijprh01Ju6xGM85kNyr/JyjG/tVYu1etKEbbb7A+GX4h+FWNsHY0cwRRXYGfuVpYBPEsaMdIHhwfjpbf5FYWQmONB7rUzB/nZGP/Ev8BC3BEjLKAg9zDp6dynIKDE9rLo3klsSYzI3MyZF53v3GaGFQwdWsiYgeaAmvD8FKLw6Xd3xh9gJZs+dPiRNeieUcgusBYuSEM++CHKZHFcsZzY7WdW+lXIlC2NrL16tzhmqAa6x4ZMaTsgZjUp6CNuYOj2rhZlJ9oABmodg/M2zBP/oCnhKRf5R5sZoAjhSI9FsIPDVnKgR5qzKviBpeHvMJ7Z9MORp5lQgttZyX7qeT9O+9t/YljewASsWv8d9fLrv/6g39z/cyep9Pyf6PB/s7i/kB15E5ridJLx/+wXt5fsgynEq97Zyu2rZje12NaA7oMRUWuPrHb71x7/Ylquowaqxn//IH//+2B41Jz/uZO0a/zHE94ndeJ+agH9xVON8c8PidZ3/1bP/4d5/89gcNj4f+4kif2fGgcAZY0RHxzOrwemPH+bb7jeIeY62qKO/WCCcgqpAj3ectawdDIVvkBPLArdtt3rl2zPffzW04VjmYVEMLHgO/UrqyPBIoue7kPVQhFnzI2OhYdHj3YcuY5pUcfwNx7+MBerbPIqBXiX/6bBtvbff/yvPf2GvwNaMf57g6L/9+Cguf/jTlKuz2Ej86MFZm6ot4suBrH/22+LUf9SOBgmrjlKHAz7XyECZe9pQcQWewnz8WiX4+izeVwrSCFo3F/Ds5X0Az8y8NXXX4nokZXljFAhUCkU3/CiLVdGFHlRUwIq4JVfG1GNJoUPrejK9Tc3YoCj3oQHgfk+97Mv8WolCXIsO1iG+YXDZVXRPgDA9bLcfDyHB/hI6hdZl4HVFO5z2ZC/41Sl/3mc24f9AHTl/t8wr/+7vWHj/7mTxA8vMSUZ/8iTRmgU/3xH0j2gU6BXNP05zHRjoZM7ehTqC40wmwEHtyedeDqdn7nhBH8tFsZ9i4cZw/h937oH+oL/1Ahuhtwj/JQ3e2nJkTka6bXy0TwsRxxsPOzeR4TY7Y2kQSVozFJik1oS0Vo2JxQ1PNPvh91VK6twhwfPrUq11MY5EPiXItoRSN6FTKYiOeqfHzWVji7thArSYNlSCHnDcReYdF5nB1iyLbkDhpDCaRlspOKHp/zGpTIc6VCKRvrYqbLbnDuK5xudOwCkgyk7oLYe+YgDU1rFIwka+eXXVu6AAcvLOToTEvdIWfws3mwGQ0DcXK6x58ztB0pio7BvhHC659IIln7JNg0plh9ntjvrrHR0dXZmkWWb/Jd6OicudEyf/b4ypy3rhVgpuO7CppfpgUmOq+grc3gg0JgSaA/UbltkJL/s3lN7PfXt512rXqFW7W+fYM36/IOqqq1Wxk/L75dJnL4aOTgYiKz4GESv2z/stlrZY5iapKvwJKYW70637t3D3+PAHUseCCUO8j4iVF2oJIhPBs82BBfySnpwFzBbAhipAx2uHJOjwDEu+5jozvissVChLSOpV/k9d2W33Imfq0agzu+B6ySmeHLjXCkEuwuu1+Vx3OKitt4AX9Nr03KXphnF88J82a/M9SCMgZKL0R53v7dEZmZpn43Hxz1/OouP10qLby6RuCDe1vEsEms2di1hY3c2qUlNalKTmtSkJjWpSU1qUpOa1KQmNalJTWpSk5rUpCY16aOm/weH99bfAKAAAA== values: image: tag: v1.33.0-dev diff --git a/go.mod b/go.mod index 331b924bb..aebf3570c 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/aws/aws-sdk-go v1.38.19 github.com/coreos/go-systemd/v22 v22.3.2 github.com/gardener/etcd-druid v0.7.0 - github.com/gardener/gardener v1.38.1 + github.com/gardener/gardener v1.39.0 github.com/gardener/machine-controller-manager v0.42.0 github.com/go-logr/logr v0.4.0 github.com/golang/mock v1.6.0 diff --git a/go.sum b/go.sum index 7c324ebe0..87bdffb6b 100644 --- a/go.sum +++ b/go.sum @@ -251,8 +251,8 @@ github.com/gardener/gardener v1.6.5/go.mod h1:w5IHIQDccvSxZJFOtBa8YConyyFgt07DBH github.com/gardener/gardener v1.11.3/go.mod h1:5DzqfOm+G8UftKu5zUbYJ+9Cnfd4XrvRNDabkM9AIp4= github.com/gardener/gardener v1.17.1/go.mod h1:uucRHq0xV46xd9MpJJjRswx/Slq3+ipbbJg09FVUtvM= github.com/gardener/gardener v1.23.0/go.mod h1:xS/sYyzYsq2W0C79mT98G/qoOTvy/hHTfApHIVF3v2o= -github.com/gardener/gardener v1.38.1 h1:lqI3VTSgrD9L5sAT3QlVFTBCutc2ey9dvDrSODSWWho= -github.com/gardener/gardener v1.38.1/go.mod h1:f/JP0PoYUe3OUKDIYRHKELauY8YJvxhfoadVS+C9yk4= +github.com/gardener/gardener v1.39.0 h1:DTtuSlgV7yZnJHmh8tRdLi2pBm6fQ6LdpueFQ0nBErM= +github.com/gardener/gardener v1.39.0/go.mod h1:NwK0dGM8H+lgLncEa0iQKWRLqGNqYHtDkwia+msLuc0= github.com/gardener/gardener-resource-manager v0.10.0/go.mod h1:0pKTHOhvU91eQB0EYr/6Ymd7lXc/5Hi8P8tF/gpV0VQ= github.com/gardener/gardener-resource-manager v0.13.1/go.mod h1:0No/XttYRUwDn5lSppq9EqlKdo/XJQ44aCZz5BVu3Vw= github.com/gardener/gardener-resource-manager v0.18.0/go.mod h1:k53Yw2iDAIpTxnChQY9qFHrRtuPQWJDNnCP9eE6TnWQ= @@ -263,6 +263,7 @@ github.com/gardener/hvpa-controller v0.3.1/go.mod h1:rjsb3BPKJFMluudZ8/bhCCDQfFC github.com/gardener/landscaper/apis v0.7.0/go.mod h1:++MW27PlSnbWM4AJipikw62RSprxO5TKVxZ8nh0e4Yw= github.com/gardener/machine-controller-manager v0.27.0/go.mod h1:zlIxuLQMtRO+aXOFsG6qtYkBmggbWY82K7MSO051ARU= github.com/gardener/machine-controller-manager v0.33.0/go.mod h1:jxxE+mGgXwg4iPlCHTG4GtUfK2CcHA6yYoIIowoxOZU= +github.com/gardener/machine-controller-manager v0.41.0/go.mod h1:43OABkCemMS6b35z3OprbfaT3p2HxKAZkJekjCO2T48= github.com/gardener/machine-controller-manager v0.42.0 h1:U0I8C9MA9soVG7CFeZBaxzdGwZMdEle61Ok81LCw0Fk= github.com/gardener/machine-controller-manager v0.42.0/go.mod h1:43OABkCemMS6b35z3OprbfaT3p2HxKAZkJekjCO2T48= github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= @@ -548,6 +549,7 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kubernetes-csi/csi-lib-utils v0.7.1/go.mod h1:bze+2G9+cmoHxN6+WyG1qT4MDxgZJMLGwc7V4acPNm0= github.com/kubernetes-csi/csi-test v2.0.0+incompatible/go.mod h1:YxJ4UiuPWIhMBkxUKY5c267DyA0uDZ/MtAimhx/2TA0= +github.com/kubernetes-csi/external-snapshotter/v2 v2.1.4 h1:5k854kIoa81t4A0BhVAXV/VcNKklXwdPyGrvkCDoZC4= github.com/kubernetes-csi/external-snapshotter/v2 v2.1.4/go.mod h1:2ar8FelpdkUJaoqp8cQpucBd8pir8c1K5BQIVZwUbJI= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= @@ -906,9 +908,8 @@ 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/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.1 h1:OJxoQ/rynoF0dcCdI7cLPktw/hR2cueqYfjm43oqK38= -golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180112015858-5ccada7d0a7b/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1062,9 +1063,8 @@ golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210817190340-bfb29a6856f2 h1:c8PlLMqBbOHoqtjteWm5/kbe6rNY2pbRfbIMVnepueo= golang.org/x/sys v0.0.0-20210817190340-bfb29a6856f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211015200801-69063c4bb744 h1:KzbpndAYEM+4oHRp9JmB2ewj0NHHxO3Z0g7Gus2O1kk= -golang.org/x/sys v0.0.0-20211015200801-69063c4bb744/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d h1:SZxvLBoTP5yHO3Frd4z4vrF+DBX9vMVanchswa69toE= @@ -1399,6 +1399,7 @@ k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e h1:KLHHjkdQFomZy8+06csTWZ0m1343QqxZhR2LJ1OxCYM= k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= +k8s.io/kube-proxy v0.22.2/go.mod h1:pk0QwfYdTsg7aC9ycMF5MFbasIxhBAPFCvfwdmNikZs= k8s.io/kubelet v0.16.8/go.mod h1:mzDpnryQg2dlB6V3/WAgb1baIamiICtWpXMFrPOFh6I= k8s.io/kubelet v0.17.6/go.mod h1:H7KZAYjmw/M8LkZq14BfLcvOTOWWocOv8H4dGkkipLM= k8s.io/kubelet v0.18.8/go.mod h1:6z1jHCk0NPE6WshFStfqcgQ1bnD3tetcPmhC2915aio= diff --git a/pkg/admission/validator/webhook.go b/pkg/admission/validator/webhook.go index f0da4a836..465686ebb 100644 --- a/pkg/admission/validator/webhook.go +++ b/pkg/admission/validator/webhook.go @@ -21,7 +21,6 @@ import ( extensionswebhook "github.com/gardener/gardener/extensions/pkg/webhook" "github.com/gardener/gardener/pkg/apis/core" corev1 "k8s.io/api/core/v1" - "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/manager" "sigs.k8s.io/controller-runtime/pkg/predicate" @@ -41,9 +40,9 @@ func New(mgr manager.Manager) (*extensionswebhook.Webhook, error) { Name: extensionswebhook.ValidatorName, Path: extensionswebhook.ValidatorPath, Predicates: []predicate.Predicate{extensionspredicate.GardenCoreProviderType(aws.Type)}, - Validators: map[extensionswebhook.Validator][]client.Object{ - NewShootValidator(): {&core.Shoot{}}, - NewCloudProfileValidator(): {&core.CloudProfile{}}, + Validators: map[extensionswebhook.Validator][]extensionswebhook.Type{ + NewShootValidator(): {{Obj: &core.Shoot{}}}, + NewCloudProfileValidator(): {{Obj: &core.CloudProfile{}}}, }, }) } @@ -56,8 +55,8 @@ func NewSecretsWebhook(mgr manager.Manager) (*extensionswebhook.Webhook, error) Provider: aws.Type, Name: SecretsValidatorName, Path: extensionswebhook.ValidatorPath + "/secrets", - Validators: map[extensionswebhook.Validator][]client.Object{ - NewSecretValidator(): {&corev1.Secret{}}, + Validators: map[extensionswebhook.Validator][]extensionswebhook.Type{ + NewSecretValidator(): {{Obj: &corev1.Secret{}}}, }, }) } diff --git a/pkg/apis/aws/v1alpha1/zz_generated.conversion.go b/pkg/apis/aws/v1alpha1/zz_generated.conversion.go index 63d119935..93ab74669 100644 --- a/pkg/apis/aws/v1alpha1/zz_generated.conversion.go +++ b/pkg/apis/aws/v1alpha1/zz_generated.conversion.go @@ -2,7 +2,7 @@ // +build !ignore_autogenerated /* -Copyright (c) 2022 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/apis/aws/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/aws/v1alpha1/zz_generated.deepcopy.go index b48d2fb2a..c66a38a69 100644 --- a/pkg/apis/aws/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/aws/v1alpha1/zz_generated.deepcopy.go @@ -2,7 +2,7 @@ // +build !ignore_autogenerated /* -Copyright (c) 2022 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/apis/aws/v1alpha1/zz_generated.defaults.go b/pkg/apis/aws/v1alpha1/zz_generated.defaults.go index 7759fc18d..8e4a91a9c 100644 --- a/pkg/apis/aws/v1alpha1/zz_generated.defaults.go +++ b/pkg/apis/aws/v1alpha1/zz_generated.defaults.go @@ -2,7 +2,7 @@ // +build !ignore_autogenerated /* -Copyright (c) 2022 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/apis/aws/zz_generated.deepcopy.go b/pkg/apis/aws/zz_generated.deepcopy.go index e0fc2ddee..f57dd827e 100644 --- a/pkg/apis/aws/zz_generated.deepcopy.go +++ b/pkg/apis/aws/zz_generated.deepcopy.go @@ -2,7 +2,7 @@ // +build !ignore_autogenerated /* -Copyright (c) 2022 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/apis/config/v1alpha1/zz_generated.conversion.go b/pkg/apis/config/v1alpha1/zz_generated.conversion.go index 69999c56b..578b2b245 100644 --- a/pkg/apis/config/v1alpha1/zz_generated.conversion.go +++ b/pkg/apis/config/v1alpha1/zz_generated.conversion.go @@ -2,7 +2,7 @@ // +build !ignore_autogenerated /* -Copyright (c) 2022 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/apis/config/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/config/v1alpha1/zz_generated.deepcopy.go index 885f9f510..5d6c2f664 100644 --- a/pkg/apis/config/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/config/v1alpha1/zz_generated.deepcopy.go @@ -2,7 +2,7 @@ // +build !ignore_autogenerated /* -Copyright (c) 2022 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/apis/config/v1alpha1/zz_generated.defaults.go b/pkg/apis/config/v1alpha1/zz_generated.defaults.go index 3bc9bbd35..f31795e55 100644 --- a/pkg/apis/config/v1alpha1/zz_generated.defaults.go +++ b/pkg/apis/config/v1alpha1/zz_generated.defaults.go @@ -2,7 +2,7 @@ // +build !ignore_autogenerated /* -Copyright (c) 2022 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/apis/config/zz_generated.deepcopy.go b/pkg/apis/config/zz_generated.deepcopy.go index 473f0de34..16104605d 100644 --- a/pkg/apis/config/zz_generated.deepcopy.go +++ b/pkg/apis/config/zz_generated.deepcopy.go @@ -2,7 +2,7 @@ // +build !ignore_autogenerated /* -Copyright (c) 2022 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/controller/bastion/actuator_reconcile.go b/pkg/controller/bastion/actuator_reconcile.go index 40d24d750..0456d4ec5 100644 --- a/pkg/controller/bastion/actuator_reconcile.go +++ b/pkg/controller/bastion/actuator_reconcile.go @@ -27,11 +27,9 @@ import ( "github.com/aws/aws-sdk-go/service/ec2" "github.com/gardener/gardener/extensions/pkg/controller" extensionsv1alpha1 "github.com/gardener/gardener/pkg/apis/extensions/v1alpha1" - "github.com/gardener/gardener/pkg/controllerutils" reconcilerutils "github.com/gardener/gardener/pkg/controllerutils/reconciler" "github.com/go-logr/logr" corev1 "k8s.io/api/core/v1" - "k8s.io/client-go/util/retry" "sigs.k8s.io/controller-runtime/pkg/client" ) @@ -74,10 +72,9 @@ func (a *actuator) Reconcile(ctx context.Context, bastion *extensionsv1alpha1.Ba // once a public endpoint is available, publish the endpoint on the // Bastion resource to notify upstream about the ready instance - return controllerutils.TryUpdateStatus(ctx, retry.DefaultBackoff, a.Client(), bastion, func() error { - bastion.Status.Ingress = *endpoints.public - return nil - }) + patch := client.MergeFrom(bastion.DeepCopy()) + bastion.Status.Ingress = *endpoints.public + return a.Client().Status().Patch(ctx, bastion, patch) } func ensureSecurityGroup(ctx context.Context, logger logr.Logger, bastion *extensionsv1alpha1.Bastion, awsClient *awsclient.Client, opt *Options) (string, error) { diff --git a/pkg/controller/controlplane/add.go b/pkg/controller/controlplane/add.go index b03dd9f67..6a8f3b3e6 100644 --- a/pkg/controller/controlplane/add.go +++ b/pkg/controller/controlplane/add.go @@ -49,7 +49,7 @@ type AddOptions struct { // The opts.Reconciler is being set with a newly instantiated actuator. func AddToManagerWithOptions(mgr manager.Manager, opts AddOptions) error { return controlplane.Add(mgr, controlplane.AddArgs{ - Actuator: genericactuator.NewActuator(aws.Name, controlPlaneSecrets, controlPlaneExposureSecrets, configChart, controlPlaneChart, controlPlaneShootChart, + Actuator: genericactuator.NewActuator(aws.Name, controlPlaneSecrets, nil, nil, controlPlaneExposureSecrets, nil, nil, configChart, controlPlaneChart, controlPlaneShootChart, controlPlaneShootCRDsChart, storageClassChart, cpExposureChart, NewValuesProvider(logger), extensionscontroller.ChartRendererFactoryFunc(util.NewChartRendererForShoot), imagevector.ImageVector(), aws.CloudProviderConfigName, opts.ShootWebhooks, mgr.GetWebhookServer().Port, logger), ControllerOptions: opts.Controller, diff --git a/pkg/controller/dnsrecord/actuator.go b/pkg/controller/dnsrecord/actuator.go index 3708ecc44..951b8b811 100644 --- a/pkg/controller/dnsrecord/actuator.go +++ b/pkg/controller/dnsrecord/actuator.go @@ -28,11 +28,9 @@ import ( gardencorev1beta1helper "github.com/gardener/gardener/pkg/apis/core/v1beta1/helper" extensionsv1alpha1 "github.com/gardener/gardener/pkg/apis/extensions/v1alpha1" extensionsv1alpha1helper "github.com/gardener/gardener/pkg/apis/extensions/v1alpha1/helper" - "github.com/gardener/gardener/pkg/controllerutils" "github.com/gardener/gardener/pkg/controllerutils/reconciler" kutil "github.com/gardener/gardener/pkg/utils/kubernetes" "github.com/go-logr/logr" - "k8s.io/client-go/util/retry" "sigs.k8s.io/controller-runtime/pkg/client" ) @@ -97,10 +95,9 @@ func (a *actuator) Reconcile(ctx context.Context, dns *extensionsv1alpha1.DNSRec } // Update resource status - return controllerutils.TryUpdateStatus(ctx, retry.DefaultBackoff, a.client, dns, func() error { - dns.Status.Zone = &zone - return nil - }) + patch := client.MergeFrom(dns.DeepCopy()) + dns.Status.Zone = &zone + return a.client.Status().Patch(ctx, dns, patch) } // Delete deletes the DNSRecord. diff --git a/pkg/controller/dnsrecord/actuator_test.go b/pkg/controller/dnsrecord/actuator_test.go index e08709f55..0f910c668 100644 --- a/pkg/controller/dnsrecord/actuator_test.go +++ b/pkg/controller/dnsrecord/actuator_test.go @@ -143,14 +143,8 @@ var _ = Describe("Actuator", func() { awsClient.EXPECT().GetDNSHostedZones(ctx).Return(zones, nil) awsClient.EXPECT().CreateOrUpdateDNSRecordSet(ctx, zone, domainName, string(extensionsv1alpha1.DNSRecordTypeA), []string{address}, int64(120)).Return(nil) awsClient.EXPECT().DeleteDNSRecordSet(ctx, zone, "comment-"+domainName, "TXT", nil, int64(0)).Return(nil) - c.EXPECT().Get(ctx, kutil.Key(namespace, name), gomock.AssignableToTypeOf(&extensionsv1alpha1.DNSRecord{})).DoAndReturn( - func(_ context.Context, _ client.ObjectKey, obj *extensionsv1alpha1.DNSRecord) error { - *obj = *dns - return nil - }, - ) - sw.EXPECT().Update(ctx, gomock.AssignableToTypeOf(&extensionsv1alpha1.DNSRecord{})).DoAndReturn( - func(_ context.Context, obj *extensionsv1alpha1.DNSRecord, opts ...client.UpdateOption) error { + sw.EXPECT().Patch(ctx, gomock.AssignableToTypeOf(&extensionsv1alpha1.DNSRecord{}), gomock.Any()).DoAndReturn( + func(_ context.Context, obj *extensionsv1alpha1.DNSRecord, _ client.Patch, opts ...client.PatchOption) error { Expect(obj.Status).To(Equal(extensionsv1alpha1.DNSRecordStatus{ Zone: pointer.String(zone), })) diff --git a/pkg/controller/infrastructure/actuator_reconcile.go b/pkg/controller/infrastructure/actuator_reconcile.go index ca2ded772..e0d63b8e3 100644 --- a/pkg/controller/infrastructure/actuator_reconcile.go +++ b/pkg/controller/infrastructure/actuator_reconcile.go @@ -29,12 +29,10 @@ import ( extensionscontroller "github.com/gardener/gardener/extensions/pkg/controller" "github.com/gardener/gardener/extensions/pkg/terraformer" extensionsv1alpha1 "github.com/gardener/gardener/pkg/apis/extensions/v1alpha1" - "github.com/gardener/gardener/pkg/controllerutils" "github.com/go-logr/logr" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/client-go/rest" - "k8s.io/client-go/util/retry" "sigs.k8s.io/controller-runtime/pkg/client" ) @@ -197,11 +195,10 @@ func updateProviderStatus(ctx context.Context, c client.Client, infrastructure * return err } - return controllerutils.TryUpdateStatus(ctx, retry.DefaultBackoff, c, infrastructure, func() error { - infrastructure.Status.ProviderStatus = &runtime.RawExtension{Object: infrastructureStatus} - infrastructure.Status.State = &runtime.RawExtension{Raw: stateByte} - return nil - }) + patch := client.MergeFrom(infrastructure.DeepCopy()) + infrastructure.Status.ProviderStatus = &runtime.RawExtension{Object: infrastructureStatus} + infrastructure.Status.State = &runtime.RawExtension{Raw: stateByte} + return c.Status().Patch(ctx, infrastructure, patch) } func computeProviderStatus(ctx context.Context, tf terraformer.Terraformer, infrastructureConfig *awsapi.InfrastructureConfig) (*awsv1alpha1.InfrastructureStatus, *terraformer.RawState, error) { diff --git a/pkg/controller/worker/actuator.go b/pkg/controller/worker/actuator.go index 75e66f7ce..6976f983b 100644 --- a/pkg/controller/worker/actuator.go +++ b/pkg/controller/worker/actuator.go @@ -53,6 +53,8 @@ func NewActuator() worker.Actuator { mcmShootChart, imagevector.ImageVector(), extensionscontroller.ChartRendererFactoryFunc(util.NewChartRendererForShoot), + false, + false, ) } diff --git a/pkg/controller/worker/helper.go b/pkg/controller/worker/helper.go index 2d07920cc..30df88476 100644 --- a/pkg/controller/worker/helper.go +++ b/pkg/controller/worker/helper.go @@ -21,11 +21,10 @@ import ( api "github.com/gardener/gardener-extension-provider-aws/pkg/apis/aws" "github.com/gardener/gardener-extension-provider-aws/pkg/apis/aws/v1alpha1" - "github.com/gardener/gardener/pkg/controllerutils" kutil "github.com/gardener/gardener/pkg/utils/kubernetes" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" - "k8s.io/client-go/util/retry" + "sigs.k8s.io/controller-runtime/pkg/client" ) func (w *workerDelegate) decodeWorkerProviderStatus() (*api.WorkerStatus, error) { @@ -54,8 +53,7 @@ func (w *workerDelegate) updateWorkerProviderStatus(ctx context.Context, workerS return err } - return controllerutils.TryUpdateStatus(ctx, retry.DefaultBackoff, w.Client(), w.worker, func() error { - w.worker.Status.ProviderStatus = &runtime.RawExtension{Object: workerStatusV1alpha1} - return nil - }) + patch := client.MergeFrom(w.worker.DeepCopy()) + w.worker.Status.ProviderStatus = &runtime.RawExtension{Object: workerStatusV1alpha1} + return w.Client().Status().Patch(ctx, w.worker, patch) } diff --git a/pkg/controller/worker/machines_test.go b/pkg/controller/worker/machines_test.go index 6a702fdb9..7bb75ad8b 100644 --- a/pkg/controller/worker/machines_test.go +++ b/pkg/controller/worker/machines_test.go @@ -733,9 +733,8 @@ var _ = Describe("Machines", func() { Object: expectedImages, } - c.EXPECT().Get(ctx, gomock.Any(), gomock.AssignableToTypeOf(&extensionsv1alpha1.Worker{})).Return(nil) c.EXPECT().Status().Return(statusWriter) - statusWriter.EXPECT().Update(ctx, workerWithExpectedImages).Return(nil) + statusWriter.EXPECT().Patch(ctx, workerWithExpectedImages, gomock.Any()).Return(nil) err = workerDelegate.UpdateMachineImagesStatus(ctx) Expect(err).NotTo(HaveOccurred()) diff --git a/pkg/webhook/controlplane/add.go b/pkg/webhook/controlplane/add.go index b194e25aa..40e8bd7a0 100644 --- a/pkg/webhook/controlplane/add.go +++ b/pkg/webhook/controlplane/add.go @@ -22,7 +22,6 @@ import ( "github.com/gardener/gardener/pkg/operation/botanist/component/extensions/operatingsystemconfig/original/components/kubelet" oscutils "github.com/gardener/gardener/pkg/operation/botanist/component/extensions/operatingsystemconfig/utils" appsv1 "k8s.io/api/apps/v1" - "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/manager" @@ -38,7 +37,10 @@ func AddToManager(mgr manager.Manager) (*extensionswebhook.Webhook, error) { return controlplane.New(mgr, controlplane.Args{ Kind: controlplane.KindShoot, Provider: aws.Type, - Types: []client.Object{&appsv1.Deployment{}, &extensionsv1alpha1.OperatingSystemConfig{}}, + Types: []extensionswebhook.Type{ + {Obj: &appsv1.Deployment{}}, + {Obj: &extensionsv1alpha1.OperatingSystemConfig{}}, + }, Mutator: genericmutator.NewMutator(NewEnsurer(logger), oscutils.NewUnitSerializer(), kubelet.NewConfigCodec(fciCodec), fciCodec, logger), }) diff --git a/pkg/webhook/controlplane/ensurer.go b/pkg/webhook/controlplane/ensurer.go index cfeddbc66..e1d549ea3 100644 --- a/pkg/webhook/controlplane/ensurer.go +++ b/pkg/webhook/controlplane/ensurer.go @@ -21,6 +21,7 @@ import ( "github.com/gardener/gardener-extension-provider-aws/pkg/aws" + "github.com/Masterminds/semver" "github.com/coreos/go-systemd/v22/unit" extensionscontroller "github.com/gardener/gardener/extensions/pkg/controller" "github.com/gardener/gardener/extensions/pkg/controller/csimigration" @@ -387,7 +388,7 @@ func (e *ensurer) ensureChecksumAnnotations(ctx context.Context, template *corev } // EnsureKubeletServiceUnitOptions ensures that the kubelet.service unit options conform to the provider requirements. -func (e *ensurer) EnsureKubeletServiceUnitOptions(ctx context.Context, gctx gcontext.GardenContext, new, _ []*unit.UnitOption) ([]*unit.UnitOption, error) { +func (e *ensurer) EnsureKubeletServiceUnitOptions(ctx context.Context, gctx gcontext.GardenContext, kubeletVersion *semver.Version, new, _ []*unit.UnitOption) ([]*unit.UnitOption, error) { cluster, err := gctx.GetCluster(ctx) if err != nil { return nil, err @@ -424,7 +425,7 @@ func ensureKubeletCommandLineArgs(command []string, csiEnabled bool) []string { } // EnsureKubeletConfiguration ensures that the kubelet configuration conforms to the provider requirements. -func (e *ensurer) EnsureKubeletConfiguration(ctx context.Context, gctx gcontext.GardenContext, new, _ *kubeletconfigv1beta1.KubeletConfiguration) error { +func (e *ensurer) EnsureKubeletConfiguration(ctx context.Context, gctx gcontext.GardenContext, kubeletVersion *semver.Version, new, _ *kubeletconfigv1beta1.KubeletConfiguration) error { cluster, err := gctx.GetCluster(ctx) if err != nil { return err diff --git a/pkg/webhook/controlplane/ensurer_test.go b/pkg/webhook/controlplane/ensurer_test.go index 0e84aa04b..858fea20a 100644 --- a/pkg/webhook/controlplane/ensurer_test.go +++ b/pkg/webhook/controlplane/ensurer_test.go @@ -18,6 +18,7 @@ import ( "context" "testing" + "github.com/Masterminds/semver" "github.com/gardener/gardener-extension-provider-aws/pkg/aws" "github.com/coreos/go-systemd/v22/unit" @@ -629,7 +630,7 @@ done hostnamectlUnitOption, } - opts, err := ensurer.EnsureKubeletServiceUnitOptions(ctx, eContextK8s116, oldUnitOptions, nil) + opts, err := ensurer.EnsureKubeletServiceUnitOptions(ctx, eContextK8s116, semver.MustParse("1.16.0"), oldUnitOptions, nil) Expect(err).To(Not(HaveOccurred())) Expect(opts).To(Equal(newUnitOptions)) }) @@ -646,7 +647,7 @@ done hostnamectlUnitOption, } - opts, err := ensurer.EnsureKubeletServiceUnitOptions(ctx, eContextK8s117, oldUnitOptions, nil) + opts, err := ensurer.EnsureKubeletServiceUnitOptions(ctx, eContextK8s117, semver.MustParse("1.17.0"), oldUnitOptions, nil) Expect(err).To(Not(HaveOccurred())) Expect(opts).To(Equal(newUnitOptions)) }) @@ -664,7 +665,7 @@ done hostnamectlUnitOption, } - opts, err := ensurer.EnsureKubeletServiceUnitOptions(ctx, eContextK8s118, oldUnitOptions, nil) + opts, err := ensurer.EnsureKubeletServiceUnitOptions(ctx, eContextK8s118, semver.MustParse("1.18.0"), oldUnitOptions, nil) Expect(err).To(Not(HaveOccurred())) Expect(opts).To(Equal(newUnitOptions)) }) @@ -693,7 +694,7 @@ done } kubeletConfig := *oldKubeletConfig - err := ensurer.EnsureKubeletConfiguration(ctx, eContextK8s117, &kubeletConfig, nil) + err := ensurer.EnsureKubeletConfiguration(ctx, eContextK8s117, semver.MustParse("1.17.0"), &kubeletConfig, nil) Expect(err).To(Not(HaveOccurred())) Expect(&kubeletConfig).To(Equal(newKubeletConfig)) }) @@ -709,7 +710,7 @@ done } kubeletConfig := *oldKubeletConfig - err := ensurer.EnsureKubeletConfiguration(ctx, eContextK8s118, &kubeletConfig, nil) + err := ensurer.EnsureKubeletConfiguration(ctx, eContextK8s118, semver.MustParse("1.18.0"), &kubeletConfig, nil) Expect(err).To(Not(HaveOccurred())) Expect(&kubeletConfig).To(Equal(newKubeletConfig)) }) @@ -725,7 +726,7 @@ done } kubeletConfig := *oldKubeletConfig - err := ensurer.EnsureKubeletConfiguration(ctx, eContextK8s121, &kubeletConfig, nil) + err := ensurer.EnsureKubeletConfiguration(ctx, eContextK8s121, semver.MustParse("1.21.0"), &kubeletConfig, nil) Expect(err).To(Not(HaveOccurred())) Expect(&kubeletConfig).To(Equal(newKubeletConfig)) }) diff --git a/pkg/webhook/controlplaneexposure/add.go b/pkg/webhook/controlplaneexposure/add.go index 7f95b7086..347042bf3 100644 --- a/pkg/webhook/controlplaneexposure/add.go +++ b/pkg/webhook/controlplaneexposure/add.go @@ -24,7 +24,6 @@ import ( "github.com/gardener/gardener/extensions/pkg/webhook/controlplane/genericmutator" appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" - "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/manager" ) @@ -48,8 +47,12 @@ func AddToManagerWithOptions(mgr manager.Manager, opts AddOptions) (*extensionsw return controlplane.New(mgr, controlplane.Args{ Kind: controlplane.KindSeed, Provider: aws.Type, - Types: []client.Object{&corev1.Service{}, &appsv1.Deployment{}, &druidv1alpha1.Etcd{}}, - Mutator: genericmutator.NewMutator(NewEnsurer(&opts.ETCDStorage, logger), nil, nil, nil, logger), + Types: []extensionswebhook.Type{ + {Obj: &corev1.Service{}}, + {Obj: &appsv1.Deployment{}}, + {Obj: &druidv1alpha1.Etcd{}}, + }, + Mutator: genericmutator.NewMutator(NewEnsurer(&opts.ETCDStorage, logger), nil, nil, nil, logger), }) } diff --git a/pkg/webhook/shoot/add.go b/pkg/webhook/shoot/add.go index cd268efdb..d756efc21 100644 --- a/pkg/webhook/shoot/add.go +++ b/pkg/webhook/shoot/add.go @@ -19,7 +19,6 @@ import ( "github.com/gardener/gardener/extensions/pkg/webhook/shoot" corev1 "k8s.io/api/core/v1" - "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/manager" ) @@ -38,7 +37,9 @@ var logger = log.Log.WithName("aws-shoot-webhook") func AddToManagerWithOptions(mgr manager.Manager, opts AddOptions) (*extensionswebhook.Webhook, error) { logger.Info("Adding webhook to manager") return shoot.New(mgr, shoot.Args{ - Types: []client.Object{&corev1.ConfigMap{}}, + Types: []extensionswebhook.Type{ + {Obj: &corev1.ConfigMap{}}, + }, Mutator: NewMutator(), }) } diff --git a/vendor/github.com/gardener/gardener/charts/images.go b/vendor/github.com/gardener/gardener/charts/images.go index 0d2c6799f..2b1250dc9 100644 --- a/vendor/github.com/gardener/gardener/charts/images.go +++ b/vendor/github.com/gardener/gardener/charts/images.go @@ -1,5 +1,5 @@ /* -Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/github.com/gardener/gardener/charts/images.yaml b/vendor/github.com/gardener/gardener/charts/images.yaml index 130bdd7ad..dc9dd86bc 100644 --- a/vendor/github.com/gardener/gardener/charts/images.yaml +++ b/vendor/github.com/gardener/gardener/charts/images.yaml @@ -81,7 +81,7 @@ images: - name: cluster-autoscaler sourceRepository: github.com/gardener/autoscaler repository: eu.gcr.io/gardener-project/gardener/autoscaler/cluster-autoscaler - tag: "v0.18.0" + tag: "v0.19.0" targetVersion: ">= 1.16" - name: cluster-autoscaler sourceRepository: github.com/gardener/autoscaler @@ -121,7 +121,7 @@ images: - name: grafana sourceRepository: github.com/grafana/grafana repository: grafana/grafana - tag: "7.5.11" + tag: "7.5.12" - name: blackbox-exporter sourceRepository: github.com/prometheus/blackbox_exporter repository: quay.io/prometheus/blackbox-exporter diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/controller/backupbucket/controller.go b/vendor/github.com/gardener/gardener/extensions/pkg/controller/backupbucket/controller.go index 1a0fb195e..c88be4ade 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/controller/backupbucket/controller.go +++ b/vendor/github.com/gardener/gardener/extensions/pkg/controller/backupbucket/controller.go @@ -18,7 +18,6 @@ import ( extensionspredicate "github.com/gardener/gardener/extensions/pkg/predicate" extensionsv1alpha1 "github.com/gardener/gardener/pkg/apis/extensions/v1alpha1" "github.com/gardener/gardener/pkg/controllerutils/mapper" - predicateutils "github.com/gardener/gardener/pkg/controllerutils/predicate" corev1 "k8s.io/api/core/v1" "sigs.k8s.io/controller-runtime/pkg/controller" @@ -57,22 +56,7 @@ type AddArgs struct { // DefaultPredicates returns the default predicates for a BackupBucket reconciler. func DefaultPredicates(ignoreOperationAnnotation bool) []predicate.Predicate { - if ignoreOperationAnnotation { - return []predicate.Predicate{ - predicate.GenerationChangedPredicate{}, - } - } - - return []predicate.Predicate{ - predicate.Or( - predicateutils.HasOperationAnnotation(), - extensionspredicate.LastOperationNotSuccessful(), - predicate.And( - predicate.GenerationChangedPredicate{}, - extensionspredicate.IsDeleting(), - ), - ), - } + return extensionspredicate.DefaultControllerPredicates(ignoreOperationAnnotation) } // Add creates a new BackupBucket Controller and adds it to the Manager. diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/controller/backupentry/controller.go b/vendor/github.com/gardener/gardener/extensions/pkg/controller/backupentry/controller.go index bb9513945..20a361167 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/controller/backupentry/controller.go +++ b/vendor/github.com/gardener/gardener/extensions/pkg/controller/backupentry/controller.go @@ -25,7 +25,6 @@ import ( extensionspredicate "github.com/gardener/gardener/extensions/pkg/predicate" extensionsv1alpha1 "github.com/gardener/gardener/pkg/apis/extensions/v1alpha1" "github.com/gardener/gardener/pkg/controllerutils/mapper" - predicateutils "github.com/gardener/gardener/pkg/controllerutils/predicate" ) const ( @@ -56,22 +55,7 @@ type AddArgs struct { // DefaultPredicates returns the default predicates for a controlplane reconciler. func DefaultPredicates(ignoreOperationAnnotation bool) []predicate.Predicate { - if ignoreOperationAnnotation { - return []predicate.Predicate{ - predicate.GenerationChangedPredicate{}, - } - } - - return []predicate.Predicate{ - predicate.Or( - predicateutils.HasOperationAnnotation(), - extensionspredicate.LastOperationNotSuccessful(), - predicate.And( - predicate.GenerationChangedPredicate{}, - extensionspredicate.IsDeleting(), - ), - ), - } + return extensionspredicate.DefaultControllerPredicates(ignoreOperationAnnotation) } // Add creates a new BackupEntry Controller and adds it to the Manager. diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/controller/backupentry/genericactuator/actuator.go b/vendor/github.com/gardener/gardener/extensions/pkg/controller/backupentry/genericactuator/actuator.go index d71fbf6b5..7e6b1ce52 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/controller/backupentry/genericactuator/actuator.go +++ b/vendor/github.com/gardener/gardener/extensions/pkg/controller/backupentry/genericactuator/actuator.go @@ -71,7 +71,7 @@ func (a *actuator) deployEtcdBackupSecret(ctx context.Context, be *extensionsv1a a.logger.Info("SeedNamespace for shoot not found. Avoiding etcd backup secret deployment") return nil } - a.logger.Error(err, "failed to get seed namespace") + a.logger.Error(err, "Failed to get seed namespace") return err } if namespace.DeletionTimestamp != nil { @@ -81,7 +81,7 @@ func (a *actuator) deployEtcdBackupSecret(ctx context.Context, be *extensionsv1a backupSecret, err := kutil.GetSecretByReference(ctx, a.client, &be.Spec.SecretRef) if err != nil { - a.logger.Error(err, "failed to read backup extension secret") + a.logger.Error(err, "Failed to read backup extension secret") return err } diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/controller/backupentry/reconciler.go b/vendor/github.com/gardener/gardener/extensions/pkg/controller/backupentry/reconciler.go index c0f4d5491..a82963492 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/controller/backupentry/reconciler.go +++ b/vendor/github.com/gardener/gardener/extensions/pkg/controller/backupentry/reconciler.go @@ -265,7 +265,7 @@ func (r *reconciler) migrate(ctx context.Context, be *extensionsv1alpha1.BackupE } r.logger.Info("Removing all finalizers", "backupentry", kutil.ObjectName(be)) - if err := extensionscontroller.DeleteAllFinalizers(ctx, r.client, be); err != nil { + if err := controllerutils.RemoveAllFinalizers(ctx, r.client, r.client, be); err != nil { return reconcile.Result{}, fmt.Errorf("error removing all finalizers from backupentry: %+v", err) } diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/controller/bastion/controller.go b/vendor/github.com/gardener/gardener/extensions/pkg/controller/bastion/controller.go index 0e939fc6d..b9987dc80 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/controller/bastion/controller.go +++ b/vendor/github.com/gardener/gardener/extensions/pkg/controller/bastion/controller.go @@ -23,7 +23,6 @@ import ( extensionspredicate "github.com/gardener/gardener/extensions/pkg/predicate" extensionsv1alpha1 "github.com/gardener/gardener/pkg/apis/extensions/v1alpha1" - predicateutils "github.com/gardener/gardener/pkg/controllerutils/predicate" ) const ( @@ -50,22 +49,7 @@ type AddArgs struct { // DefaultPredicates returns the default predicates for a bastion reconciler. func DefaultPredicates(ignoreOperationAnnotation bool) []predicate.Predicate { - if ignoreOperationAnnotation { - return []predicate.Predicate{ - predicate.GenerationChangedPredicate{}, - } - } - - return []predicate.Predicate{ - predicate.Or( - predicateutils.HasOperationAnnotation(), - extensionspredicate.LastOperationNotSuccessful(), - predicate.And( - predicate.GenerationChangedPredicate{}, - extensionspredicate.IsDeleting(), - ), - ), - } + return extensionspredicate.DefaultControllerPredicates(ignoreOperationAnnotation) } // Add creates a new Bastion Controller and adds it to the Manager. diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/controller/cmd/options.go b/vendor/github.com/gardener/gardener/extensions/pkg/controller/cmd/options.go index ea58d7ba1..6d45be3c1 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/controller/cmd/options.go +++ b/vendor/github.com/gardener/gardener/extensions/pkg/controller/cmd/options.go @@ -59,6 +59,9 @@ const ( // DisableFlag is the name of the command line flag to disable individual controllers. DisableFlag = "disable-controllers" + + // GardenerVersionFlag is the name of the command line flag containing the Gardener version. + GardenerVersionFlag = "gardener-version" ) // LeaderElectionNameID returns a leader election ID for the given name. @@ -426,3 +429,33 @@ func (d *SwitchOptions) Completed() *SwitchConfig { type SwitchConfig struct { AddToManager func(manager.Manager) error } + +// GeneralOptions are command line options that can be set for general configuration. +type GeneralOptions struct { + // GardenerVersion string + GardenerVersion string + + config *GeneralConfig +} + +// GeneralConfig is a completed general configuration. +type GeneralConfig struct { + // GardenerVersion string + GardenerVersion string +} + +// Complete implements Complete. +func (r *GeneralOptions) Complete() error { + r.config = &GeneralConfig{r.GardenerVersion} + return nil +} + +// Completed returns the completed GeneralConfig. Only call this if `Complete` was successful. +func (r *GeneralOptions) Completed() *GeneralConfig { + return r.config +} + +// AddFlags implements Flagger.AddFlags. +func (r *GeneralOptions) AddFlags(fs *pflag.FlagSet) { + fs.StringVar(&r.GardenerVersion, GardenerVersionFlag, "", "Version of the gardenlet.") +} diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/controller/controlplane/controller.go b/vendor/github.com/gardener/gardener/extensions/pkg/controller/controlplane/controller.go index 639524722..13b3065a0 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/controller/controlplane/controller.go +++ b/vendor/github.com/gardener/gardener/extensions/pkg/controller/controlplane/controller.go @@ -24,7 +24,6 @@ import ( extensionspredicate "github.com/gardener/gardener/extensions/pkg/predicate" extensionsv1alpha1 "github.com/gardener/gardener/pkg/apis/extensions/v1alpha1" "github.com/gardener/gardener/pkg/controllerutils/mapper" - predicateutils "github.com/gardener/gardener/pkg/controllerutils/predicate" ) const ( @@ -55,23 +54,7 @@ type AddArgs struct { // DefaultPredicates returns the default predicates for a controlplane reconciler. func DefaultPredicates(ignoreOperationAnnotation bool) []predicate.Predicate { - if ignoreOperationAnnotation { - return []predicate.Predicate{ - predicate.GenerationChangedPredicate{}, - } - } - - return []predicate.Predicate{ - predicate.Or( - predicateutils.HasOperationAnnotation(), - extensionspredicate.LastOperationNotSuccessful(), - predicate.And( - predicate.GenerationChangedPredicate{}, - extensionspredicate.IsDeleting(), - ), - ), - extensionspredicate.ShootNotFailed(), - } + return extensionspredicate.DefaultControllerPredicates(ignoreOperationAnnotation, extensionspredicate.ShootNotFailedPredicate()) } // Add creates a new ControlPlane Controller and adds it to the Manager. diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/controller/controlplane/genericactuator/actuator.go b/vendor/github.com/gardener/gardener/extensions/pkg/controller/controlplane/genericactuator/actuator.go index b5cfcafa5..cecc46de1 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/controller/controlplane/genericactuator/actuator.go +++ b/vendor/github.com/gardener/gardener/extensions/pkg/controller/controlplane/genericactuator/actuator.go @@ -32,6 +32,7 @@ import ( "github.com/gardener/gardener/pkg/extensions" "github.com/gardener/gardener/pkg/utils/chart" "github.com/gardener/gardener/pkg/utils/flow" + gutil "github.com/gardener/gardener/pkg/utils/gardener" "github.com/gardener/gardener/pkg/utils/imagevector" kutil "github.com/gardener/gardener/pkg/utils/kubernetes" "github.com/gardener/gardener/pkg/utils/managedresources" @@ -77,7 +78,8 @@ type ValuesProvider interface { // the values provided by the given values provider. func NewActuator( providerName string, - secrets, exposureSecrets secretutil.Interface, + secrets secretutil.Interface, shootAccessSecrets []*gutil.ShootAccessSecret, legacySecretNamesToCleanup []string, + exposureSecrets secretutil.Interface, exposureShootAccessSecrets []*gutil.ShootAccessSecret, legacyExposureSecretNamesToCleanup []string, configChart, controlPlaneChart, controlPlaneShootChart, controlPlaneShootCRDsChart, storageClassesChart, controlPlaneExposureChart chart.Interface, vp ValuesProvider, chartRendererFactory extensionscontroller.ChartRendererFactory, @@ -88,9 +90,16 @@ func NewActuator( logger logr.Logger, ) controlplane.Actuator { return &actuator{ - providerName: providerName, + providerName: providerName, + secrets: secrets, - exposureSecrets: exposureSecrets, + shootAccessSecrets: shootAccessSecrets, + legacySecretNamesToCleanup: legacySecretNamesToCleanup, + + exposureSecrets: exposureSecrets, + exposureShootAccessSecrets: exposureShootAccessSecrets, + legacyExposureSecretNamesToCleanup: legacyExposureSecretNamesToCleanup, + configChart: configChart, controlPlaneChart: controlPlaneChart, controlPlaneShootChart: controlPlaneShootChart, @@ -109,9 +118,18 @@ func NewActuator( // actuator is an Actuator that acts upon and updates the status of ControlPlane resources. type actuator struct { - providerName string + providerName string + + // Deprecated: Use 'shootAccessSecrets' instead. secrets secretutil.Interface - exposureSecrets secretutil.Interface + shootAccessSecrets []*gutil.ShootAccessSecret + legacySecretNamesToCleanup []string + + // Deprecated: Use 'exposureShootAccessSecrets' instead. + exposureSecrets secretutil.Interface + exposureShootAccessSecrets []*gutil.ShootAccessSecret + legacyExposureSecretNamesToCleanup []string + configChart chart.Interface controlPlaneChart chart.Interface controlPlaneShootChart chart.Interface @@ -208,6 +226,12 @@ func (a *actuator) reconcileControlPlaneExposure( checksums = controlplane.ComputeChecksums(deployedSecrets, nil) } + for _, shootAccessSecret := range a.exposureShootAccessSecrets { + if err := shootAccessSecret.WithNamespaceOverride(cp.Namespace).Reconcile(ctx, a.client); err != nil { + return false, fmt.Errorf("could not reconcile control plane exposure shoot access secret '%s' for controlplane '%s': %w", shootAccessSecret.Secret.Name, kutil.ObjectName(cp), err) + } + } + // Get control plane exposure chart values values, err := a.vp.GetControlPlaneExposureChartValues(ctx, cp, cluster, checksums) if err != nil { @@ -221,6 +245,12 @@ func (a *actuator) reconcileControlPlaneExposure( return false, fmt.Errorf("could not apply control plane exposure chart for controlplane '%s': %w", kutil.ObjectName(cp), err) } + for _, name := range a.legacyExposureSecretNamesToCleanup { + if err := kutil.DeleteObject(ctx, a.client, &corev1.Secret{ObjectMeta: metav1.ObjectMeta{Name: name, Namespace: cp.Namespace}}); err != nil { + return false, fmt.Errorf("could not delete legacy control plane exposure secret '%s' for controlplane '%s': %w", name, kutil.ObjectName(cp), err) + } + } + return false, nil } @@ -254,6 +284,12 @@ func (a *actuator) reconcileControlPlane( } } + for _, shootAccessSecret := range a.shootAccessSecrets { + if err := shootAccessSecret.WithNamespaceOverride(cp.Namespace).Reconcile(ctx, a.client); err != nil { + return false, fmt.Errorf("could not reconcile shoot access secret '%s' for controlplane '%s': %w", shootAccessSecret.Secret.Name, kutil.ObjectName(cp), err) + } + } + // Get config chart values if a.configChart != nil { values, err := a.vp.GetConfigChartValues(ctx, cp, cluster) @@ -356,6 +392,12 @@ func (a *actuator) reconcileControlPlane( } } + for _, name := range a.legacySecretNamesToCleanup { + if err := kutil.DeleteObject(ctx, a.client, &corev1.Secret{ObjectMeta: metav1.ObjectMeta{Name: name, Namespace: cp.Namespace}}); err != nil { + return false, fmt.Errorf("could not delete legacy secret '%s' for controlplane '%s': %w", name, kutil.ObjectName(cp), err) + } + } + return requeue, nil } @@ -377,7 +419,7 @@ func (a *actuator) Delete( func (a *actuator) deleteControlPlaneExposure( ctx context.Context, cp *extensionsv1alpha1.ControlPlane, - cluster *extensionscontroller.Cluster, + _ *extensionscontroller.Cluster, ) error { // Delete control plane objects if a.controlPlaneExposureChart != nil { @@ -391,7 +433,19 @@ func (a *actuator) deleteControlPlaneExposure( if a.exposureSecrets != nil { a.logger.Info("Deleting secrets for control plane with purpose exposure", "controlplane", kutil.ObjectName(cp)) if err := a.exposureSecrets.Delete(ctx, a.clientset, cp.Namespace); client.IgnoreNotFound(err) != nil { - return fmt.Errorf("could not delete secrets for controlplane exposure '%s': %w", kutil.ObjectName(cp), err) + return fmt.Errorf("could not delete secrets for control plane exposure '%s': %w", kutil.ObjectName(cp), err) + } + } + + for _, shootAccessSecret := range a.exposureShootAccessSecrets { + if err := kutil.DeleteObject(ctx, a.client, shootAccessSecret.WithNamespaceOverride(cp.Namespace).Secret); err != nil { + return fmt.Errorf("could not delete control plane exposure shoot access secret '%s' for controlplane '%s': %w", shootAccessSecret.Secret.Name, kutil.ObjectName(cp), err) + } + } + + for _, name := range a.legacyExposureSecretNamesToCleanup { + if err := kutil.DeleteObject(ctx, a.client, &corev1.Secret{ObjectMeta: metav1.ObjectMeta{Name: name, Namespace: cp.Namespace}}); err != nil { + return fmt.Errorf("could not delete control plane exposure legacy secret '%s' for controlplane '%s': %w", name, kutil.ObjectName(cp), err) } } @@ -403,7 +457,7 @@ func (a *actuator) deleteControlPlaneExposure( func (a *actuator) deleteControlPlane( ctx context.Context, cp *extensionsv1alpha1.ControlPlane, - cluster *extensionscontroller.Cluster, + _ *extensionscontroller.Cluster, ) error { // Delete the managed resources if err := managedresources.Delete(ctx, a.client, cp.Namespace, StorageClassesChartResourceName, false); err != nil { @@ -461,6 +515,18 @@ func (a *actuator) deleteControlPlane( } } + for _, shootAccessSecret := range a.shootAccessSecrets { + if err := kutil.DeleteObject(ctx, a.client, shootAccessSecret.WithNamespaceOverride(cp.Namespace).Secret); err != nil { + return fmt.Errorf("could not delete shoot access secret '%s' for controlplane '%s': %w", shootAccessSecret.Secret.Name, kutil.ObjectName(cp), err) + } + } + + for _, name := range a.legacySecretNamesToCleanup { + if err := kutil.DeleteObject(ctx, a.client, &corev1.Secret{ObjectMeta: metav1.ObjectMeta{Name: name, Namespace: cp.Namespace}}); err != nil { + return fmt.Errorf("could not delete legacy secret '%s' for controlplane '%s': %w", name, kutil.ObjectName(cp), err) + } + } + if len(a.shootWebhooks) > 0 { networkPolicy := extensionswebhookshoot.GetNetworkPolicyMeta(cp.Namespace, a.providerName) if err := a.client.Delete(ctx, networkPolicy); client.IgnoreNotFound(err) != nil { diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/controller/controlplane/reconciler.go b/vendor/github.com/gardener/gardener/extensions/pkg/controller/controlplane/reconciler.go index 734d61cb7..225920a10 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/controller/controlplane/reconciler.go +++ b/vendor/github.com/gardener/gardener/extensions/pkg/controller/controlplane/reconciler.go @@ -203,7 +203,7 @@ func (r *reconciler) migrate(ctx context.Context, cp *extensionsv1alpha1.Control } r.logger.Info("Removing all finalizers.", "controlplane", kutil.ObjectName(cp)) - if err := extensionscontroller.DeleteAllFinalizers(ctx, r.client, cp); err != nil { + if err := controllerutils.RemoveAllFinalizers(ctx, r.client, r.client, cp); err != nil { return reconcile.Result{}, fmt.Errorf("error removing finalizers from controlplane: %+v", err) } diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/controller/csimigration/README.md b/vendor/github.com/gardener/gardener/extensions/pkg/controller/csimigration/README.md index 57960c558..baab84fbe 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/controller/csimigration/README.md +++ b/vendor/github.com/gardener/gardener/extensions/pkg/controller/csimigration/README.md @@ -26,6 +26,13 @@ Also, the `kube-apiserver` enables the `PersistentVolumeLabel` admission plugin, As part of the CSI migration, the `CSIMigrationComplete` feature gate may only be enabled if all nodes have been drained, and all `kubelet`s have been updated with the feature gate flags. As provider extensions usually perform a rolling update of worker machines when the Kubernetes minor version is upgraded, it is recommended to start the CSI migration during such a Kubernetes version upgrade. + +> ⚠️ As of [gardener/gardener#4971](https://github.com/gardener/gardener/pull/4971), the Kubernetes version used for specific worker pools can differ from the control plane's Kubernetes version. Hence, not all worker nodes might be rolled out when the Kubernetes version is updated. However, it is required to roll out all nodes when performing CSI migration. +> +> Consequently, it is highly recommended that extensions validate `Shoot` resources to ensure worker pool Kubernetes versions may only differ from control plane Kubernetes version when CSI migration version is reached. +> +> For example, when CSI migration is performed with `1.18` (i.e, during the `Shoot` upgrade from `1.17` to `1.18`) then it shall not be possible to specify `.spec.provider.workers[].kubernetes.version` if `.spec.kubernetes.version` is less than `1.18`. + Consequently, the migration can now happen by executing with the following steps: 1. The `CSIMigration` and `CSIMigrationAWS` feature gates must be enabled on all master components, i.e., `kube-apiserver`, `kube-controller-manager`, and `kube-scheduler`. diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/controller/dnsrecord/controller.go b/vendor/github.com/gardener/gardener/extensions/pkg/controller/dnsrecord/controller.go index aeabe87bb..c8e42adc2 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/controller/dnsrecord/controller.go +++ b/vendor/github.com/gardener/gardener/extensions/pkg/controller/dnsrecord/controller.go @@ -55,23 +55,16 @@ type AddArgs struct { // DefaultPredicates returns the default predicates for a dnsrecord reconciler. func DefaultPredicates(ignoreOperationAnnotation bool) []predicate.Predicate { - if ignoreOperationAnnotation { - return []predicate.Predicate{ - predicate.GenerationChangedPredicate{}, - } - } - - return []predicate.Predicate{ - predicate.Or( - predicateutils.HasOperationAnnotation(), - extensionspredicate.LastOperationNotSuccessful(), - predicate.And( - predicate.GenerationChangedPredicate{}, - extensionspredicate.IsDeleting(), - ), + return extensionspredicate.DefaultControllerPredicates(ignoreOperationAnnotation, + // Special case for preconditions for the DNSRecord controller: Some DNSRecord resources are created in the + // 'garden' namespace and don't belong to a Shoot. Most other DNSRecord resources are created in regular shoot + // namespaces (in such cases we want to check whether the respective Shoot is failed). Consequently, we add both + // preconditions and ensure at least one of them applies. + predicateutils.Or( + extensionspredicate.IsInGardenNamespacePredicate, + extensionspredicate.ShootNotFailedPredicate(), ), - extensionspredicate.ShootNotFailed(), - } + ) } // Add creates a new dnsrecord controller and adds it to the given Manager. diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/controller/dnsrecord/reconciler.go b/vendor/github.com/gardener/gardener/extensions/pkg/controller/dnsrecord/reconciler.go index ee531d527..016dae91a 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/controller/dnsrecord/reconciler.go +++ b/vendor/github.com/gardener/gardener/extensions/pkg/controller/dnsrecord/reconciler.go @@ -45,7 +45,7 @@ type reconciler struct { client client.Client reader client.Reader - statusUpdater extensionscontroller.StatusUpdater + statusUpdater extensionscontroller.StatusUpdaterCustom } // NewReconciler creates a new reconcile.Reconciler that reconciles @@ -137,17 +137,17 @@ func (r *reconciler) reconcile(ctx context.Context, dns *extensionsv1alpha1.DNSR return reconcile.Result{}, err } - if err := r.statusUpdater.Processing(ctx, dns, operationType, "Reconciling the dnsrecord"); err != nil { + if err := r.statusUpdater.ProcessingCustom(ctx, dns, operationType, "Reconciling the dnsrecord", nil); err != nil { return reconcile.Result{}, err } r.logger.Info("Starting the reconciliation of dnsrecord", "dnsrecord", kutil.ObjectName(dns)) if err := r.actuator.Reconcile(ctx, dns, cluster); err != nil { - _ = r.statusUpdater.Error(ctx, dns, reconcilerutils.ReconcileErrCauseOrErr(err), operationType, "Error reconciling dnsrecord") + _ = r.statusUpdater.ErrorCustom(ctx, dns, reconcilerutils.ReconcileErrCauseOrErr(err), operationType, "Error reconciling dnsrecord", addCreatedConditionFalse) return reconcilerutils.ReconcileErr(err) } - if err := r.statusUpdater.Success(ctx, dns, operationType, "Successfully reconciled dnsrecord"); err != nil { + if err := r.statusUpdater.SuccessCustom(ctx, dns, operationType, "Successfully reconciled dnsrecord", addCreatedConditionTrue); err != nil { return reconcile.Result{}, err } @@ -159,17 +159,17 @@ func (r *reconciler) restore(ctx context.Context, dns *extensionsv1alpha1.DNSRec return reconcile.Result{}, err } - if err := r.statusUpdater.Processing(ctx, dns, gardencorev1beta1.LastOperationTypeRestore, "Restoring the dnsrecord"); err != nil { + if err := r.statusUpdater.ProcessingCustom(ctx, dns, gardencorev1beta1.LastOperationTypeRestore, "Restoring the dnsrecord", nil); err != nil { return reconcile.Result{}, err } r.logger.Info("Starting the restoration of dnsrecord", "dnsrecord", kutil.ObjectName(dns)) if err := r.actuator.Restore(ctx, dns, cluster); err != nil { - _ = r.statusUpdater.Error(ctx, dns, reconcilerutils.ReconcileErrCauseOrErr(err), gardencorev1beta1.LastOperationTypeRestore, "Error restoring dnsrecord") + _ = r.statusUpdater.ErrorCustom(ctx, dns, reconcilerutils.ReconcileErrCauseOrErr(err), gardencorev1beta1.LastOperationTypeRestore, "Error restoring dnsrecord", addCreatedConditionFalse) return reconcilerutils.ReconcileErr(err) } - if err := r.statusUpdater.Success(ctx, dns, gardencorev1beta1.LastOperationTypeRestore, "Successfully restored dnsrecord"); err != nil { + if err := r.statusUpdater.SuccessCustom(ctx, dns, gardencorev1beta1.LastOperationTypeRestore, "Successfully restored dnsrecord", addCreatedConditionTrue); err != nil { return reconcile.Result{}, err } @@ -181,22 +181,22 @@ func (r *reconciler) restore(ctx context.Context, dns *extensionsv1alpha1.DNSRec } func (r *reconciler) migrate(ctx context.Context, dns *extensionsv1alpha1.DNSRecord, cluster *extensionscontroller.Cluster) (reconcile.Result, error) { - if err := r.statusUpdater.Processing(ctx, dns, gardencorev1beta1.LastOperationTypeMigrate, "Migrating the dnsrecord"); err != nil { + if err := r.statusUpdater.ProcessingCustom(ctx, dns, gardencorev1beta1.LastOperationTypeMigrate, "Migrating the dnsrecord", nil); err != nil { return reconcile.Result{}, err } r.logger.Info("Starting the migration of dnsrecord", "dnsrecord", kutil.ObjectName(dns)) if err := r.actuator.Migrate(ctx, dns, cluster); err != nil { - _ = r.statusUpdater.Error(ctx, dns, reconcilerutils.ReconcileErrCauseOrErr(err), gardencorev1beta1.LastOperationTypeMigrate, "Error migrating dnsrecord") + _ = r.statusUpdater.ErrorCustom(ctx, dns, reconcilerutils.ReconcileErrCauseOrErr(err), gardencorev1beta1.LastOperationTypeMigrate, "Error migrating dnsrecord", nil) return reconcilerutils.ReconcileErr(err) } - if err := r.statusUpdater.Success(ctx, dns, gardencorev1beta1.LastOperationTypeMigrate, "Successfully migrated dnsrecord"); err != nil { + if err := r.statusUpdater.SuccessCustom(ctx, dns, gardencorev1beta1.LastOperationTypeMigrate, "Successfully migrated dnsrecord", nil); err != nil { return reconcile.Result{}, err } r.logger.Info("Removing all finalizers", "dnsrecord", kutil.ObjectName(dns)) - if err := extensionscontroller.DeleteAllFinalizers(ctx, r.client, dns); err != nil { + if err := controllerutils.RemoveAllFinalizers(ctx, r.client, r.client, dns); err != nil { return reconcile.Result{}, fmt.Errorf("error removing finalizers from dnsrecord: %+v", err) } @@ -213,19 +213,24 @@ func (r *reconciler) delete(ctx context.Context, dns *extensionsv1alpha1.DNSReco return reconcile.Result{}, nil } - operationType := gardencorev1beta1helper.ComputeOperationType(dns.ObjectMeta, dns.Status.LastOperation) - if err := r.statusUpdater.Processing(ctx, dns, operationType, "Deleting the dnsrecord"); err != nil { - return reconcile.Result{}, err - } + switch getCreatedConditionStatus(dns.GetExtensionStatus()) { + case gardencorev1beta1.ConditionTrue, gardencorev1beta1.ConditionUnknown: + operationType := gardencorev1beta1helper.ComputeOperationType(dns.ObjectMeta, dns.Status.LastOperation) + if err := r.statusUpdater.ProcessingCustom(ctx, dns, operationType, "Deleting the dnsrecord", nil); err != nil { + return reconcile.Result{}, err + } - r.logger.Info("Starting the deletion of dnsrecord", "dnsrecord", kutil.ObjectName(dns)) - if err := r.actuator.Delete(ctx, dns, cluster); err != nil { - _ = r.statusUpdater.Error(ctx, dns, reconcilerutils.ReconcileErrCauseOrErr(err), operationType, "Error deleting dnsrecord") - return reconcilerutils.ReconcileErr(err) - } + r.logger.Info("Starting the deletion of dnsrecord", "dnsrecord", kutil.ObjectName(dns)) + if err := r.actuator.Delete(ctx, dns, cluster); err != nil { + _ = r.statusUpdater.ErrorCustom(ctx, dns, reconcilerutils.ReconcileErrCauseOrErr(err), operationType, "Error deleting dnsrecord", nil) + return reconcilerutils.ReconcileErr(err) + } - if err := r.statusUpdater.Success(ctx, dns, operationType, "Successfully deleted dnsrecord"); err != nil { - return reconcile.Result{}, err + if err := r.statusUpdater.SuccessCustom(ctx, dns, operationType, "Successfully deleted dnsrecord", nil); err != nil { + return reconcile.Result{}, err + } + case gardencorev1beta1.ConditionFalse: + r.logger.Info("Deleting dnsrecord is no-op as not created", "dnsrecord", kutil.ObjectName(dns)) } r.logger.Info("Removing finalizer", "dnsrecord", kutil.ObjectName(dns)) @@ -235,3 +240,45 @@ func (r *reconciler) delete(ctx context.Context, dns *extensionsv1alpha1.DNSReco return reconcile.Result{}, nil } + +func updateCreatedCondition(status extensionsv1alpha1.Status, conditionStatus gardencorev1beta1.ConditionStatus, reason, message string, updateIfExisting bool) error { + conditions := status.GetConditions() + c := gardencorev1beta1helper.GetCondition(conditions, extensionsv1alpha1.ConditionTypeCreated) + if c != nil && !updateIfExisting { + return nil + } + if c != nil && c.Status == conditionStatus { + return nil + } + + builder, err := gardencorev1beta1helper.NewConditionBuilder(extensionsv1alpha1.ConditionTypeCreated) + if err != nil { + return err + } + if c != nil { + builder = builder.WithOldCondition(*c) + } + + new, _ := builder.WithStatus(conditionStatus).WithReason(reason).WithMessage(message).Build() + status.SetConditions(gardencorev1beta1helper.MergeConditions(conditions, new)) + return nil +} + +func getCreatedConditionStatus(status extensionsv1alpha1.Status) gardencorev1beta1.ConditionStatus { + for _, c := range status.GetConditions() { + if c.Type == extensionsv1alpha1.ConditionTypeCreated { + return c.Status + } + } + return gardencorev1beta1.ConditionUnknown +} + +func addCreatedConditionFalse(status extensionsv1alpha1.Status) error { + message := "Error on initial record creation in infrastructure" + return updateCreatedCondition(status, gardencorev1beta1.ConditionFalse, "Error", message, false) +} + +func addCreatedConditionTrue(status extensionsv1alpha1.Status) error { + message := "Record was created successfully in infrastructure at least once" + return updateCreatedCondition(status, gardencorev1beta1.ConditionTrue, "Success", message, true) +} diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/controller/healthcheck/reconciler.go b/vendor/github.com/gardener/gardener/extensions/pkg/controller/healthcheck/reconciler.go index e23f8d954..14e7744df 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/controller/healthcheck/reconciler.go +++ b/vendor/github.com/gardener/gardener/extensions/pkg/controller/healthcheck/reconciler.go @@ -23,7 +23,6 @@ import ( "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" - "k8s.io/client-go/util/retry" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/manager" @@ -36,7 +35,6 @@ import ( gardenv1beta1constants "github.com/gardener/gardener/pkg/apis/core/v1beta1/constants" gardencorev1beta1helper "github.com/gardener/gardener/pkg/apis/core/v1beta1/helper" extensionsv1alpha1 "github.com/gardener/gardener/pkg/apis/extensions/v1alpha1" - "github.com/gardener/gardener/pkg/controllerutils" kutil "github.com/gardener/gardener/pkg/utils/kubernetes" ) @@ -268,19 +266,17 @@ type condition struct { } func (r *reconciler) updateExtensionConditions(ctx context.Context, extension extensionsv1alpha1.Object, conditions ...condition) error { - return controllerutils.TryPatchStatus(ctx, retry.DefaultBackoff, r.client, extension, func() error { - for _, cond := range conditions { - now := metav1.Now() - if c := gardencorev1beta1helper.GetCondition(extension.GetExtensionStatus().GetConditions(), gardencorev1beta1.ConditionType(cond.healthConditionType)); c != nil { - cond.builder.WithOldCondition(*c) - } - updatedCondition, _ := cond.builder.WithNowFunc(func() metav1.Time { return now }).Build() - // always update - the Gardenlet expects a recent health check - updatedCondition.LastUpdateTime = now - extension.GetExtensionStatus().SetConditions(gardencorev1beta1helper.MergeConditions(extension.GetExtensionStatus().GetConditions(), updatedCondition)) + for _, cond := range conditions { + now := metav1.Now() + if c := gardencorev1beta1helper.GetCondition(extension.GetExtensionStatus().GetConditions(), gardencorev1beta1.ConditionType(cond.healthConditionType)); c != nil { + cond.builder.WithOldCondition(*c) } - return nil - }) + updatedCondition, _ := cond.builder.WithNowFunc(func() metav1.Time { return now }).Build() + // always update - the Gardenlet expects a recent health check + updatedCondition.LastUpdateTime = now + extension.GetExtensionStatus().SetConditions(gardencorev1beta1helper.MergeConditions(extension.GetExtensionStatus().GetConditions(), updatedCondition)) + } + return r.client.Status().Update(ctx, extension) } func (r *reconciler) resultWithRequeue() reconcile.Result { diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/controller/infrastructure/controller.go b/vendor/github.com/gardener/gardener/extensions/pkg/controller/infrastructure/controller.go index 00af1eee5..2dbbdbae0 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/controller/infrastructure/controller.go +++ b/vendor/github.com/gardener/gardener/extensions/pkg/controller/infrastructure/controller.go @@ -25,7 +25,6 @@ import ( extensionspredicate "github.com/gardener/gardener/extensions/pkg/predicate" extensionsv1alpha1 "github.com/gardener/gardener/pkg/apis/extensions/v1alpha1" "github.com/gardener/gardener/pkg/controllerutils/mapper" - predicateutils "github.com/gardener/gardener/pkg/controllerutils/predicate" ) const ( @@ -60,24 +59,7 @@ type AddArgs struct { // DefaultPredicates returns the default predicates for an infrastructure reconciler. func DefaultPredicates(ignoreOperationAnnotation bool) []predicate.Predicate { - if ignoreOperationAnnotation { - return []predicate.Predicate{ - predicate.GenerationChangedPredicate{}, - extensionspredicate.ShootNotFailed(), - } - } - - return []predicate.Predicate{ - predicate.Or( - predicateutils.HasOperationAnnotation(), - extensionspredicate.LastOperationNotSuccessful(), - predicate.And( - predicate.GenerationChangedPredicate{}, - extensionspredicate.IsDeleting(), - ), - ), - extensionspredicate.ShootNotFailed(), - } + return extensionspredicate.DefaultControllerPredicates(ignoreOperationAnnotation, extensionspredicate.ShootNotFailedPredicate()) } // Add creates a new Infrastructure Controller and adds it to the Manager. diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/controller/status.go b/vendor/github.com/gardener/gardener/extensions/pkg/controller/status.go index e6bf96a0e..49f04d3de 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/controller/status.go +++ b/vendor/github.com/gardener/gardener/extensions/pkg/controller/status.go @@ -18,15 +18,13 @@ import ( "context" "fmt" - gardencorev1beta1 "github.com/gardener/gardener/pkg/apis/core/v1beta1" - gardencorev1beta1helper "github.com/gardener/gardener/pkg/apis/core/v1beta1/helper" - extensionsv1alpha1 "github.com/gardener/gardener/pkg/apis/extensions/v1alpha1" - "github.com/gardener/gardener/pkg/controllerutils" - "github.com/go-logr/logr" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/client-go/util/retry" "sigs.k8s.io/controller-runtime/pkg/client" + + gardencorev1beta1 "github.com/gardener/gardener/pkg/apis/core/v1beta1" + gardencorev1beta1helper "github.com/gardener/gardener/pkg/apis/core/v1beta1/helper" + extensionsv1alpha1 "github.com/gardener/gardener/pkg/apis/extensions/v1alpha1" ) // LastOperation creates a new LastOperation from the given parameters. @@ -73,6 +71,21 @@ type StatusUpdater interface { Success(context.Context, extensionsv1alpha1.Object, gardencorev1beta1.LastOperationType, string) error } +// UpdaterFunc is a function to perform additional updates of the status. +type UpdaterFunc func(extensionsv1alpha1.Status) error + +// StatusUpdaterCustom contains functions for customized updating statuses of extension resources after a controller operation. +type StatusUpdaterCustom interface { + // InjectClient injects the client into the status updater. + InjectClient(client.Client) + // Processing updates the last operation of an extension resource when an operation is started. + ProcessingCustom(context.Context, extensionsv1alpha1.Object, gardencorev1beta1.LastOperationType, string, UpdaterFunc) error + // Error updates the last operation of an extension resource when an operation was erroneous. + ErrorCustom(context.Context, extensionsv1alpha1.Object, error, gardencorev1beta1.LastOperationType, string, UpdaterFunc) error + // Success updates the last operation of an extension resource when an operation was successful. + SuccessCustom(context.Context, extensionsv1alpha1.Object, gardencorev1beta1.LastOperationType, string, UpdaterFunc) error +} + // NewStatusUpdater returns a new status updater. func NewStatusUpdater(logger logr.Logger) *statusUpdater { return &statusUpdater{logger: logger} @@ -84,27 +97,40 @@ type statusUpdater struct { } var _ = StatusUpdater(&statusUpdater{}) +var _ = StatusUpdaterCustom(&statusUpdater{}) func (s *statusUpdater) InjectClient(c client.Client) { s.client = c } func (s *statusUpdater) Processing(ctx context.Context, obj extensionsv1alpha1.Object, lastOperationType gardencorev1beta1.LastOperationType, description string) error { + return s.ProcessingCustom(ctx, obj, lastOperationType, description, nil) +} + +func (s *statusUpdater) ProcessingCustom(ctx context.Context, obj extensionsv1alpha1.Object, lastOperationType gardencorev1beta1.LastOperationType, description string, updater UpdaterFunc) error { if s.client == nil { return fmt.Errorf("client is not set. Call InjectClient() first") } s.logger.Info(description, s.logKeysAndValues(obj)...) - return controllerutils.TryUpdateStatus(ctx, retry.DefaultBackoff, s.client, obj, func() error { - lastOp := LastOperation(lastOperationType, gardencorev1beta1.LastOperationStateProcessing, 1, description) - - obj.GetExtensionStatus().SetLastOperation(lastOp) - return nil - }) + patch := client.MergeFrom(obj.DeepCopyObject().(client.Object)) + lastOp := LastOperation(lastOperationType, gardencorev1beta1.LastOperationStateProcessing, 1, description) + obj.GetExtensionStatus().SetLastOperation(lastOp) + if updater != nil { + err := updater(obj.GetExtensionStatus()) + if err != nil { + return err + } + } + return s.client.Status().Patch(ctx, obj, patch) } func (s *statusUpdater) Error(ctx context.Context, obj extensionsv1alpha1.Object, err error, lastOperationType gardencorev1beta1.LastOperationType, description string) error { + return s.ErrorCustom(ctx, obj, err, lastOperationType, description, nil) +} + +func (s *statusUpdater) ErrorCustom(ctx context.Context, obj extensionsv1alpha1.Object, err error, lastOperationType gardencorev1beta1.LastOperationType, description string, updater UpdaterFunc) error { if s.client == nil { return fmt.Errorf("client is not set. Call InjectClient() first") } @@ -112,31 +138,44 @@ func (s *statusUpdater) Error(ctx context.Context, obj extensionsv1alpha1.Object errDescription := gardencorev1beta1helper.FormatLastErrDescription(fmt.Errorf("%s: %v", description, err)) s.logger.Error(fmt.Errorf(errDescription), "error", s.logKeysAndValues(obj)...) - return controllerutils.TryUpdateStatus(ctx, retry.DefaultBackoff, s.client, obj, func() error { - lastOp, lastErr := ReconcileError(lastOperationType, errDescription, 50, gardencorev1beta1helper.ExtractErrorCodes(gardencorev1beta1helper.DetermineError(err, err.Error()))...) - - obj.GetExtensionStatus().SetObservedGeneration(obj.GetGeneration()) - obj.GetExtensionStatus().SetLastOperation(lastOp) - obj.GetExtensionStatus().SetLastError(lastErr) - return nil - }) + lastOp, lastErr := ReconcileError(lastOperationType, errDescription, 50, gardencorev1beta1helper.ExtractErrorCodes(gardencorev1beta1helper.DetermineError(err, err.Error()))...) + + patch := client.MergeFrom(obj.DeepCopyObject().(client.Object)) + obj.GetExtensionStatus().SetObservedGeneration(obj.GetGeneration()) + obj.GetExtensionStatus().SetLastOperation(lastOp) + obj.GetExtensionStatus().SetLastError(lastErr) + if updater != nil { + err := updater(obj.GetExtensionStatus()) + if err != nil { + return err + } + } + return s.client.Status().Patch(ctx, obj, patch) } func (s *statusUpdater) Success(ctx context.Context, obj extensionsv1alpha1.Object, lastOperationType gardencorev1beta1.LastOperationType, description string) error { + return s.SuccessCustom(ctx, obj, lastOperationType, description, nil) +} + +func (s *statusUpdater) SuccessCustom(ctx context.Context, obj extensionsv1alpha1.Object, lastOperationType gardencorev1beta1.LastOperationType, description string, updater UpdaterFunc) error { if s.client == nil { return fmt.Errorf("client is not set. Call InjectClient() first") } s.logger.Info(description, s.logKeysAndValues(obj)...) - return controllerutils.TryUpdateStatus(ctx, retry.DefaultBackoff, s.client, obj, func() error { - lastOp, lastErr := ReconcileSucceeded(lastOperationType, description) - - obj.GetExtensionStatus().SetObservedGeneration(obj.GetGeneration()) - obj.GetExtensionStatus().SetLastOperation(lastOp) - obj.GetExtensionStatus().SetLastError(lastErr) - return nil - }) + patch := client.MergeFrom(obj.DeepCopyObject().(client.Object)) + lastOp, lastErr := ReconcileSucceeded(lastOperationType, description) + obj.GetExtensionStatus().SetObservedGeneration(obj.GetGeneration()) + obj.GetExtensionStatus().SetLastOperation(lastOp) + obj.GetExtensionStatus().SetLastError(lastErr) + if updater != nil { + err := updater(obj.GetExtensionStatus()) + if err != nil { + return err + } + } + return s.client.Status().Patch(ctx, obj, patch) } func (s *statusUpdater) logKeysAndValues(obj metav1.Object) []interface{} { diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/controller/utils.go b/vendor/github.com/gardener/gardener/extensions/pkg/controller/utils.go index b2f28feb0..924615faf 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/controller/utils.go +++ b/vendor/github.com/gardener/gardener/extensions/pkg/controller/utils.go @@ -18,21 +18,21 @@ import ( "context" "fmt" "reflect" + "strings" gardencorev1beta1 "github.com/gardener/gardener/pkg/apis/core/v1beta1" v1beta1constants "github.com/gardener/gardener/pkg/apis/core/v1beta1/constants" extensionsv1alpha1 "github.com/gardener/gardener/pkg/apis/extensions/v1alpha1" - "github.com/gardener/gardener/pkg/controllerutils" + resourcesv1alpha1 "github.com/gardener/gardener/pkg/apis/resources/v1alpha1" kutil "github.com/gardener/gardener/pkg/utils/kubernetes" - resourcesv1alpha1 "github.com/gardener/gardener/pkg/apis/resources/v1alpha1" + "github.com/Masterminds/semver" autoscalingv1 "k8s.io/api/autoscaling/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" utilruntime "k8s.io/apimachinery/pkg/util/runtime" autoscalingv1beta2 "k8s.io/autoscaler/vertical-pod-autoscaler/pkg/apis/autoscaling.k8s.io/v1beta2" "k8s.io/client-go/kubernetes/scheme" - "k8s.io/client-go/util/retry" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller" "sigs.k8s.io/controller-runtime/pkg/manager" @@ -83,14 +83,6 @@ func (a *AddToManagerBuilder) AddToManager(m manager.Manager) error { return nil } -// DeleteAllFinalizers removes all finalizers from the object and issues an update. -func DeleteAllFinalizers(ctx context.Context, client client.Client, obj client.Object) error { - return controllerutils.TryUpdate(ctx, retry.DefaultBackoff, client, obj, func() error { - obj.SetFinalizers(nil) - return nil - }) -} - // GetSecretByReference returns the Secret object matching the given SecretReference. var GetSecretByReference = kutil.GetSecretByReference @@ -168,3 +160,58 @@ func ShouldSkipOperation(operationType gardencorev1beta1.LastOperationType, obj func GetObjectByReference(ctx context.Context, c client.Client, ref *autoscalingv1.CrossVersionObjectReference, namespace string, obj client.Object) error { return c.Get(ctx, client.ObjectKey{Namespace: namespace, Name: v1beta1constants.ReferencedResourcesPrefix + ref.Name}, obj) } + +var ( + versionConstraintGreaterEqual136 *semver.Constraints + versionConstraintGreaterEqual137 *semver.Constraints +) + +func init() { + var err error + + versionConstraintGreaterEqual136, err = semver.NewConstraint(">= 1.36") + utilruntime.Must(err) + versionConstraintGreaterEqual137, err = semver.NewConstraint(">= 1.37") + utilruntime.Must(err) +} + +func parseGardenerVersion(version string) (*semver.Version, error) { + v := version + if idx := strings.Index(v, "-"); idx >= 0 { + v = version[:idx] + } + + return semver.NewVersion(v) +} + +// UseTokenRequestor returns true when the provided Gardener version is large enough for supporting acquiring tokens +// for shoot cluster control plane components running in the seed based on the TokenRequestor controller of +// gardener-resource-manager (https://github.com/gardener/gardener/blob/master/docs/concepts/resource-manager.md#tokenrequestor). +func UseTokenRequestor(gardenerVersion string) (bool, error) { + if gardenerVersion == "" { + return false, nil + } + + gv, err := parseGardenerVersion(gardenerVersion) + if err != nil { + return false, fmt.Errorf("could not parse Gardener version: %w", err) + } + + return versionConstraintGreaterEqual136.Check(gv), nil +} + +// UseServiceAccountTokenVolumeProjection returns true when the provided Gardener version is large enough for supporting +// automatic token volume projection for components running in the seed and shoot clusters based on the respective +// webhook part of gardener-resource-manager (https://github.com/gardener/gardener/blob/master/docs/concepts/resource-manager.md#auto-mounting-projected-serviceaccount-tokens). +func UseServiceAccountTokenVolumeProjection(gardenerVersion string) (bool, error) { + if gardenerVersion == "" { + return false, nil + } + + gv, err := parseGardenerVersion(gardenerVersion) + if err != nil { + return false, fmt.Errorf("could not parse Gardener version: %w", err) + } + + return versionConstraintGreaterEqual137.Check(gv), nil +} diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/controller/worker/controller.go b/vendor/github.com/gardener/gardener/extensions/pkg/controller/worker/controller.go index 40cb9def4..038b46865 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/controller/worker/controller.go +++ b/vendor/github.com/gardener/gardener/extensions/pkg/controller/worker/controller.go @@ -27,7 +27,6 @@ import ( extensionspredicate "github.com/gardener/gardener/extensions/pkg/predicate" extensionsv1alpha1 "github.com/gardener/gardener/pkg/apis/extensions/v1alpha1" "github.com/gardener/gardener/pkg/controllerutils/mapper" - predicateutils "github.com/gardener/gardener/pkg/controllerutils/predicate" ) const ( @@ -60,23 +59,7 @@ type AddArgs struct { // DefaultPredicates returns the default predicates for a Worker reconciler. func DefaultPredicates(ignoreOperationAnnotation bool) []predicate.Predicate { - if ignoreOperationAnnotation { - return []predicate.Predicate{ - predicate.GenerationChangedPredicate{}, - } - } - - return []predicate.Predicate{ - predicate.Or( - predicateutils.HasOperationAnnotation(), - extensionspredicate.LastOperationNotSuccessful(), - predicate.And( - predicate.GenerationChangedPredicate{}, - extensionspredicate.IsDeleting(), - ), - ), - extensionspredicate.ShootNotFailed(), - } + return extensionspredicate.DefaultControllerPredicates(ignoreOperationAnnotation, extensionspredicate.ShootNotFailedPredicate()) } // Add creates a new Worker Controller and adds it to the Manager. diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/controller/worker/genericactuator/actuator.go b/vendor/github.com/gardener/gardener/extensions/pkg/controller/worker/genericactuator/actuator.go index 35c01c218..5744d58c2 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/controller/worker/genericactuator/actuator.go +++ b/vendor/github.com/gardener/gardener/extensions/pkg/controller/worker/genericactuator/actuator.go @@ -65,21 +65,37 @@ type genericActuator struct { gardenerClientset gardenerkubernetes.Interface chartApplier gardenerkubernetes.ChartApplier chartRendererFactory extensionscontroller.ChartRendererFactory + + // TODO(rfranzke/BeckerMax): Remove these flags when all provider extensions enable the token requestor and + // projected token mount. + useTokenRequestor bool + useProjectedTokenMount bool } // NewActuator creates a new Actuator that reconciles // Worker resources of Gardener's `extensions.gardener.cloud` API group. // It provides a default implementation that allows easier integration of providers. -func NewActuator(logger logr.Logger, delegateFactory DelegateFactory, mcmName string, mcmSeedChart, mcmShootChart chart.Interface, imageVector imagevector.ImageVector, chartRendererFactory extensionscontroller.ChartRendererFactory) worker.Actuator { +func NewActuator( + logger logr.Logger, + delegateFactory DelegateFactory, + mcmName string, + mcmSeedChart, + mcmShootChart chart.Interface, + imageVector imagevector.ImageVector, + chartRendererFactory extensionscontroller.ChartRendererFactory, + useTokenRequestor bool, + useProjectedTokenMount bool, +) worker.Actuator { return &genericActuator{ - logger: logger.WithName("worker-actuator"), - - delegateFactory: delegateFactory, - mcmName: mcmName, - mcmSeedChart: mcmSeedChart, - mcmShootChart: mcmShootChart, - imageVector: imageVector, - chartRendererFactory: chartRendererFactory, + logger: logger.WithName("worker-actuator"), + delegateFactory: delegateFactory, + mcmName: mcmName, + mcmSeedChart: mcmSeedChart, + mcmShootChart: mcmShootChart, + imageVector: imageVector, + chartRendererFactory: chartRendererFactory, + useTokenRequestor: useTokenRequestor, + useProjectedTokenMount: useProjectedTokenMount, } } @@ -239,8 +255,8 @@ func (a *genericActuator) shallowDeleteMachineClassSecrets(ctx context.Context, // Delete the finalizers to all secrets which were used for machine classes that do not exist anymore. for _, secret := range secretList.Items { if !wantedMachineDeployments.HasSecret(secret.Name) { - if err := extensionscontroller.DeleteAllFinalizers(ctx, a.client, &secret); err != nil { - return fmt.Errorf("Error removing finalizer from MachineClassSecret: %s/%s: %w", secret.Namespace, secret.Name, err) + if err := controllerutils.RemoveAllFinalizers(ctx, a.client, a.client, &secret); err != nil { + return fmt.Errorf("error removing finalizer from MachineClassSecret: %s/%s: %w", secret.Namespace, secret.Name, err) } if err := a.client.Delete(ctx, &secret); err != nil { return err @@ -306,7 +322,7 @@ func (a *genericActuator) shallowDeleteAllObjects(ctx context.Context, logger lo return meta.EachListItem(objectList, func(obj runtime.Object) error { object := obj.(client.Object) - if err := extensionscontroller.DeleteAllFinalizers(ctx, a.client, object); err != nil { + if err := controllerutils.RemoveAllFinalizers(ctx, a.client, a.client, object); err != nil { return err } if err := a.client.Delete(ctx, object); client.IgnoreNotFound(err) != nil { diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/controller/worker/genericactuator/actuator_reconcile.go b/vendor/github.com/gardener/gardener/extensions/pkg/controller/worker/genericactuator/actuator_reconcile.go index 388e5fb88..d621b2e8a 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/controller/worker/genericactuator/actuator_reconcile.go +++ b/vendor/github.com/gardener/gardener/extensions/pkg/controller/worker/genericactuator/actuator_reconcile.go @@ -23,12 +23,9 @@ import ( machinev1alpha1 "github.com/gardener/machine-controller-manager/pkg/apis/machine/v1alpha1" "github.com/go-logr/logr" - appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/sets" - "k8s.io/client-go/util/retry" "sigs.k8s.io/controller-runtime/pkg/client" "github.com/gardener/gardener/extensions/pkg/controller" @@ -59,13 +56,7 @@ func (a *genericActuator) Reconcile(ctx context.Context, worker *extensionsv1alp // all remaining worker nodes. Hence, we cannot set the replicas=0 here (otherwise it would be offline and not able to delete the nodes). var replicaFunc = func() (int32, error) { if extensionscontroller.IsHibernated(cluster) { - deployment := &appsv1.Deployment{} - if err := a.client.Get(ctx, kutil.Key(worker.Namespace, a.mcmName), deployment); err != nil && !apierrors.IsNotFound(err) { - return 0, err - } - if replicas := deployment.Spec.Replicas; replicas != nil { - return *replicas, nil - } + return kutil.CurrentReplicaCountForDeployment(ctx, a.client, worker.Namespace, a.mcmName) } return 1, nil } @@ -147,7 +138,7 @@ func (a *genericActuator) Reconcile(ctx context.Context, worker *extensionsv1alp // check if the machine controller manager is stuck isStuck, msg, err2 := a.IsMachineControllerStuck(ctx, worker) if err2 != nil { - logger.Error(err2, "failed to check if the machine controller manager pod is stuck after unsuccessfully waiting for all machine deployments to be ready") + logger.Error(err2, "Failed to check if the machine controller manager pod is stuck after unsuccessfully waiting for all machine deployments to be ready") // continue in order to return `err` and determine error codes } @@ -493,14 +484,12 @@ func (a *genericActuator) updateWorkerStatusMachineDeployments(ctx context.Conte return err } - return controllerutils.TryUpdateStatus(ctx, retry.DefaultBackoff, a.client, worker, func() error { - if len(statusMachineDeployments) > 0 { - worker.Status.MachineDeployments = statusMachineDeployments - } + if len(statusMachineDeployments) > 0 { + worker.Status.MachineDeployments = statusMachineDeployments + } - worker.Status.Conditions = gardencorev1beta1helper.MergeConditions(worker.Status.Conditions, rollingUpdateCondition) - return nil - }) + worker.Status.Conditions = gardencorev1beta1helper.MergeConditions(worker.Status.Conditions, rollingUpdateCondition) + return a.client.Status().Update(ctx, worker) } const ( diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/controller/worker/genericactuator/actuator_restore.go b/vendor/github.com/gardener/gardener/extensions/pkg/controller/worker/genericactuator/actuator_restore.go index 35ac73132..29ea29ba5 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/controller/worker/genericactuator/actuator_restore.go +++ b/vendor/github.com/gardener/gardener/extensions/pkg/controller/worker/genericactuator/actuator_restore.go @@ -22,14 +22,12 @@ import ( machinev1alpha1 "github.com/gardener/machine-controller-manager/pkg/apis/machine/v1alpha1" "github.com/go-logr/logr" apierrors "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/client-go/util/retry" "sigs.k8s.io/controller-runtime/pkg/client" extensionscontroller "github.com/gardener/gardener/extensions/pkg/controller" workercontroller "github.com/gardener/gardener/extensions/pkg/controller/worker" extensionsv1alpha1 "github.com/gardener/gardener/pkg/apis/extensions/v1alpha1" "github.com/gardener/gardener/pkg/client/kubernetes" - "github.com/gardener/gardener/pkg/controllerutils" kutil "github.com/gardener/gardener/pkg/utils/kubernetes" ) @@ -129,16 +127,19 @@ func (a *genericActuator) restoreMachineSetsAndMachines(ctx context.Context, log for _, machine := range wantedMachineDeployment.State.Machines { newMachine := (&machine).DeepCopy() newMachine.Status = machinev1alpha1.MachineStatus{} - if err := a.client.Create(ctx, newMachine); kutil.IgnoreAlreadyExists(err) != nil { - return err + if err := a.client.Create(ctx, newMachine); err != nil { + if !apierrors.IsAlreadyExists(err) { + return err + } + + // machine already exists, get the current object and update the status + if err := a.client.Get(ctx, client.ObjectKeyFromObject(newMachine), newMachine); err != nil { + return err + } } - if err := controllerutils.TryPatchStatus(ctx, retry.DefaultBackoff, a.client, newMachine, func() error { - newMachine.Status = machine.Status - return nil - }); err != nil { - return err - } + newMachine.Status = machine.Status + return a.client.Status().Update(ctx, newMachine) } } diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/controller/worker/genericactuator/machine_controller_manager.go b/vendor/github.com/gardener/gardener/extensions/pkg/controller/worker/genericactuator/machine_controller_manager.go index cf01e0252..795b69a36 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/controller/worker/genericactuator/machine_controller_manager.go +++ b/vendor/github.com/gardener/gardener/extensions/pkg/controller/worker/genericactuator/machine_controller_manager.go @@ -33,6 +33,7 @@ import ( extensionsv1alpha1 "github.com/gardener/gardener/pkg/apis/extensions/v1alpha1" "github.com/gardener/gardener/pkg/client/kubernetes" "github.com/gardener/gardener/pkg/utils" + gutil "github.com/gardener/gardener/pkg/utils/gardener" kutil "github.com/gardener/gardener/pkg/utils/kubernetes" "github.com/gardener/gardener/pkg/utils/managedresources" "github.com/gardener/gardener/pkg/utils/secrets" @@ -57,12 +58,20 @@ func (a *genericActuator) deployMachineControllerManager(ctx context.Context, lo return err } - // Generate MCM kubeconfig and inject its checksum into the MCM values. - mcmKubeconfigSecret, err := createKubeconfigForMachineControllerManager(ctx, a.client, workerObj.Namespace, a.mcmName) - if err != nil { - return err + mcmValues["useTokenRequestor"] = a.useTokenRequestor + mcmValues["useProjectedTokenMount"] = a.useProjectedTokenMount + + if a.useTokenRequestor { + if err := gutil.NewShootAccessSecret(a.mcmName, workerObj.Namespace).Reconcile(ctx, a.client); err != nil { + return err + } + } else { + mcmKubeconfigSecret, err := createKubeconfigForMachineControllerManager(ctx, a.client, workerObj.Namespace, a.mcmName) + if err != nil { + return err + } + injectPodAnnotation(mcmValues, "checksum/secret-machine-controller-manager", utils.ComputeChecksum(mcmKubeconfigSecret.Data)) } - injectPodAnnotation(mcmValues, "checksum/secret-machine-controller-manager", utils.ComputeChecksum(mcmKubeconfigSecret.Data)) replicaCount, err := replicas() if err != nil { @@ -84,7 +93,12 @@ func (a *genericActuator) deployMachineControllerManager(ctx context.Context, lo return fmt.Errorf("waiting until deployment/%s is updated: %w", McmDeploymentName, err) } - return nil + // TODO(rfranzke/BeckerMax): Remove in a future release. + secretName := a.mcmName + if !a.useTokenRequestor { + secretName = "shoot-access-" + a.mcmName + } + return kutil.DeleteObject(ctx, a.client, &corev1.Secret{ObjectMeta: metav1.ObjectMeta{Name: secretName, Namespace: workerObj.Namespace}}) } func (a *genericActuator) deleteMachineControllerManager(ctx context.Context, logger logr.Logger, workerObj *extensionsv1alpha1.Worker) error { @@ -104,7 +118,11 @@ func (a *genericActuator) deleteMachineControllerManager(ctx context.Context, lo return fmt.Errorf("cleaning up machine-controller-manager resources in seed failed: %w", err) } - return nil + return kutil.DeleteObjects(ctx, a.client, + // TODO(rfranzke/BeckerMax): Remove in a future release. + &corev1.Secret{ObjectMeta: metav1.ObjectMeta{Name: "shoot-access-" + a.mcmName, Namespace: workerObj.Namespace}}, + &corev1.Secret{ObjectMeta: metav1.ObjectMeta{Name: a.mcmName, Namespace: workerObj.Namespace}}, + ) } func (a *genericActuator) waitUntilMachineControllerManagerIsDeleted(ctx context.Context, logger logr.Logger, namespace string) error { @@ -140,6 +158,8 @@ func (a *genericActuator) applyMachineControllerManagerShootChart(ctx context.Co return err } + values["useTokenRequestor"] = a.useTokenRequestor + if err := managedresources.RenderChartAndCreate(ctx, workerObj.Namespace, McmShootResourceName, false, a.client, chartRenderer, a.mcmShootChart, values, a.imageVector, metav1.NamespaceSystem, cluster.Shoot.Spec.Kubernetes.Version, true, false); err != nil { return fmt.Errorf("could not apply control plane shoot chart for worker '%s': %w", kutil.ObjectName(workerObj), err) } diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/controller/worker/state_actuator.go b/vendor/github.com/gardener/gardener/extensions/pkg/controller/worker/state_actuator.go index eb72d3a0a..e324e283c 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/controller/worker/state_actuator.go +++ b/vendor/github.com/gardener/gardener/extensions/pkg/controller/worker/state_actuator.go @@ -20,16 +20,14 @@ import ( "fmt" "sort" - workerhelper "github.com/gardener/gardener/extensions/pkg/controller/worker/helper" - extensionsv1alpha1 "github.com/gardener/gardener/pkg/apis/extensions/v1alpha1" - "github.com/gardener/gardener/pkg/controllerutils" - machinev1alpha1 "github.com/gardener/machine-controller-manager/pkg/apis/machine/v1alpha1" "github.com/go-logr/logr" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" - "k8s.io/client-go/util/retry" "sigs.k8s.io/controller-runtime/pkg/client" + + workerhelper "github.com/gardener/gardener/extensions/pkg/controller/worker/helper" + extensionsv1alpha1 "github.com/gardener/gardener/pkg/apis/extensions/v1alpha1" ) type genericStateActuator struct { @@ -68,10 +66,9 @@ func (a *genericStateActuator) updateWorkerState(ctx context.Context, worker *ex if err != nil { return err } - return controllerutils.TryUpdateStatus(ctx, retry.DefaultBackoff, a.client, worker, func() error { - worker.Status.State = &runtime.RawExtension{Raw: rawState} - return nil - }) + + worker.Status.State = &runtime.RawExtension{Raw: rawState} + return a.client.Status().Update(ctx, worker) } func (a *genericStateActuator) getWorkerState(ctx context.Context, namespace string) (*State, error) { @@ -166,7 +163,7 @@ func addMachineSetToMachineDeploymentState(machineSets []machinev1alpha1.Machine return } - //remove redundant data from the machine set + // remove redundant data from the machine set for index := range machineSets { machineSet := &machineSets[index] machineSet.ObjectMeta = metav1.ObjectMeta{ @@ -187,7 +184,7 @@ func addMachineToMachineDeploymentState(machine *machinev1alpha1.Machine, machin return } - //remove redundant data from the machine + // remove redundant data from the machine machine.ObjectMeta = metav1.ObjectMeta{ Name: machine.Name, Namespace: machine.Namespace, diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/controller/worker/state_reconciler.go b/vendor/github.com/gardener/gardener/extensions/pkg/controller/worker/state_reconciler.go index 3f8dd54b6..0ea075ac0 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/controller/worker/state_reconciler.go +++ b/vendor/github.com/gardener/gardener/extensions/pkg/controller/worker/state_reconciler.go @@ -88,8 +88,7 @@ func (r *stateReconciler) Reconcile(ctx context.Context, request reconcile.Reque return errorutils.ReconcileErr(err) } - msg := "Successfully updated worker state" - logger.Info(msg) + logger.Info("Successfully updated worker state") return reconcile.Result{}, nil } diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/controller/worker/templates/machineclasses.tpl.yaml b/vendor/github.com/gardener/gardener/extensions/pkg/controller/worker/templates/machineclasses.tpl.yaml index be0d9757d..a0d50bd75 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/controller/worker/templates/machineclasses.tpl.yaml +++ b/vendor/github.com/gardener/gardener/extensions/pkg/controller/worker/templates/machineclasses.tpl.yaml @@ -61,6 +61,36 @@ spec: type: string metadata: type: object + nodeTemplate: + description: NodeTemplate contains subfields to track all node resources + and other node info required to scale nodegroup from zero + properties: + capacity: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: Capacity contains subfields to track all node resources + required to scale nodegroup from zero + type: object + instanceType: + description: Instance type of the node belonging to nodeGroup + type: string + region: + description: Region of the expected node belonging to nodeGroup + type: string + zone: + description: Zone of the expected node belonging to nodeGroup + type: string + required: + - capacity + - instanceType + - region + - zone + type: object + x-kubernetes-preserve-unknown-fields: true provider: description: Provider is the combination of name and location of cloud-specific drivers. diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/predicate/default.go b/vendor/github.com/gardener/gardener/extensions/pkg/predicate/default.go new file mode 100644 index 000000000..70581474b --- /dev/null +++ b/vendor/github.com/gardener/gardener/extensions/pkg/predicate/default.go @@ -0,0 +1,118 @@ +// Copyright (c) 2022 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package predicate + +import ( + "github.com/gardener/gardener/pkg/api/extensions" + gardencorev1beta1 "github.com/gardener/gardener/pkg/apis/core/v1beta1" + v1beta1constants "github.com/gardener/gardener/pkg/apis/core/v1beta1/constants" + + apiequality "k8s.io/apimachinery/pkg/api/equality" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/event" + "sigs.k8s.io/controller-runtime/pkg/predicate" +) + +// DefaultControllerPredicates returns the default predicates for extension controllers. If the operation annotation +// is ignored then the only returned predicate is the 'GenerationChangedPredicate'. +func DefaultControllerPredicates(ignoreOperationAnnotation bool, preconditions ...predicate.Predicate) []predicate.Predicate { + if ignoreOperationAnnotation { + return append(preconditions, predicate.GenerationChangedPredicate{}) + } + return append(preconditions, defaultControllerPredicate) +} + +var defaultControllerPredicate = predicate.Funcs{ + CreateFunc: func(e event.CreateEvent) bool { + if e.Object == nil { + return false + } + + // If a relevant operation annotation is present then we admit reconciliation. + if hasOperationAnnotation(e.Object) { + return true + } + + // If the object's deletion timestamp is set then we admit reconciliation. + // Note that while an object cannot be created with a deletion timestamp, on startup, the controller receives + // ADD/CREATE events for all existing objects which might already have a deletion timestamp. + if e.Object.GetDeletionTimestamp() != nil { + return true + } + + // If the last operation does not indicate success then we admit reconciliation. This also means triggers if the + // last operation is not yet set. + // Note that this check is only performed for CREATE events in order to trigger a retry after controller restart. + // If it also reacted on UPDATE events the controller would constantly enqueue the resource when other updates + // (like status changes) happen, i.e., it might trigger itself endlessly when a previous reconciliation failed + // (since it updated the last operation to 'error'). + if lastOperationNotSuccessful(e.Object) { + return true + } + + // If none of the above conditions applies then reconciliation is not allowed. + return false + }, + + UpdateFunc: func(e event.UpdateEvent) bool { + // If a relevant operation annotation is present then we admit reconciliation. The OperationAnnotationWrapper + // ensures that this annotation is removed right after the reconciler has picked up the object. This prevents + // that both the OperationAnnotationWrapper and the reconciler endlessly trigger further events when removing + // the annotation or updating the status. + if hasOperationAnnotation(e.ObjectNew) { + return true + } + + // If the object's deletion timestamp is set and the status has not changed then we admit reconciliation. This + // covers the actual delete request (which once increases the generation) and further updates (e.g., when + // gardenlet updates the timestamp annotation). It prevents that the controller triggers itself endlessly when + // updating the status while the deletion timestamp is set. + if e.ObjectNew.GetDeletionTimestamp() != nil && statusEqual(e.ObjectOld, e.ObjectNew) { + return true + } + + // If none of the above conditions applies then reconciliation is not allowed. + return false + }, + + DeleteFunc: func(event.DeleteEvent) bool { return false }, + GenericFunc: func(event.GenericEvent) bool { return false }, +} + +func hasOperationAnnotation(obj client.Object) bool { + return obj.GetAnnotations()[v1beta1constants.GardenerOperation] == v1beta1constants.GardenerOperationReconcile || + obj.GetAnnotations()[v1beta1constants.GardenerOperation] == v1beta1constants.GardenerOperationRestore || + obj.GetAnnotations()[v1beta1constants.GardenerOperation] == v1beta1constants.GardenerOperationMigrate +} + +func lastOperationNotSuccessful(obj client.Object) bool { + acc, err := extensions.Accessor(obj) + if err != nil { + return false // Error is ignored here since we cannot do anything meaningful with it. + } + + lastOp := acc.GetExtensionStatus().GetLastOperation() + return lastOp == nil || lastOp.State != gardencorev1beta1.LastOperationStateSucceeded +} + +func statusEqual(oldObj, newObj client.Object) bool { + oldAcc, err1 := extensions.Accessor(oldObj) + newAcc, err2 := extensions.Accessor(newObj) + if err1 != nil || err2 != nil { + return false // Errors are ignored here since we cannot do anything meaningful with them. + } + + return apiequality.Semantic.DeepEqual(oldAcc.GetExtensionStatus(), newAcc.GetExtensionStatus()) +} diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/predicate/preconditions.go b/vendor/github.com/gardener/gardener/extensions/pkg/predicate/preconditions.go new file mode 100644 index 000000000..63b1fcc41 --- /dev/null +++ b/vendor/github.com/gardener/gardener/extensions/pkg/predicate/preconditions.go @@ -0,0 +1,75 @@ +// Copyright (c) 2022 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package predicate + +import ( + "context" + + extensionscontroller "github.com/gardener/gardener/extensions/pkg/controller" + v1beta1constants "github.com/gardener/gardener/pkg/apis/core/v1beta1/constants" + contextutil "github.com/gardener/gardener/pkg/utils/context" + + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/event" + "sigs.k8s.io/controller-runtime/pkg/predicate" +) + +// IsInGardenNamespacePredicate is a predicate which returns true when the provided object is in the 'garden' namespace. +var IsInGardenNamespacePredicate = predicate.NewPredicateFuncs(func(obj client.Object) bool { + return obj != nil && obj.GetNamespace() == v1beta1constants.GardenNamespace +}) + +// ShootNotFailedPredicate returns a predicate which returns true when the Shoot's `.status.lastOperation.state` is not +// equals 'Failed'. +func ShootNotFailedPredicate() predicate.Predicate { + return &shootNotFailedPredicate{} +} + +type shootNotFailedPredicate struct { + ctx context.Context + reader client.Reader +} + +func (p *shootNotFailedPredicate) InjectStopChannel(stopChan <-chan struct{}) error { + p.ctx = contextutil.FromStopChannel(stopChan) + return nil +} + +func (p *shootNotFailedPredicate) InjectClient(client client.Client) error { + p.reader = client + return nil +} + +func (p *shootNotFailedPredicate) Create(e event.CreateEvent) bool { + if e.Object == nil { + return false + } + + cluster, err := extensionscontroller.GetCluster(p.ctx, p.reader, e.Object.GetNamespace()) + if err != nil { + logger.Error(err, "Could not check if shoot is failed") + return false + } + + return !extensionscontroller.IsFailed(cluster) +} + +func (p *shootNotFailedPredicate) Update(e event.UpdateEvent) bool { + return p.Create(event.CreateEvent{Object: e.ObjectNew}) +} + +func (p *shootNotFailedPredicate) Delete(_ event.DeleteEvent) bool { return false } + +func (p *shootNotFailedPredicate) Generic(_ event.GenericEvent) bool { return false } diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/predicate/predicate.go b/vendor/github.com/gardener/gardener/extensions/pkg/predicate/predicate.go index d32b301c4..7aa0e0bd2 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/predicate/predicate.go +++ b/vendor/github.com/gardener/gardener/extensions/pkg/predicate/predicate.go @@ -15,83 +15,19 @@ package predicate import ( - "context" - "errors" - extensionscontroller "github.com/gardener/gardener/extensions/pkg/controller" gardencore "github.com/gardener/gardener/pkg/api/core" "github.com/gardener/gardener/pkg/api/extensions" - gardencorev1beta1 "github.com/gardener/gardener/pkg/apis/core/v1beta1" - v1beta1constants "github.com/gardener/gardener/pkg/apis/core/v1beta1/constants" extensionsv1alpha1 "github.com/gardener/gardener/pkg/apis/extensions/v1alpha1" predicateutils "github.com/gardener/gardener/pkg/controllerutils/predicate" - contextutil "github.com/gardener/gardener/pkg/utils/context" "github.com/gardener/gardener/pkg/utils/version" - - "github.com/go-logr/logr" - "sigs.k8s.io/controller-runtime/pkg/cache" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/event" "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/predicate" ) -// Log is the logger for predicates. -var Log logr.Logger = log.Log - -type shootNotFailedMapper struct { - ctx context.Context - log logr.Logger - client client.Client - cache cache.Cache -} - -func (s *shootNotFailedMapper) InjectClient(c client.Client) error { - s.client = c - return nil -} - -func (s *shootNotFailedMapper) InjectStopChannel(stopChan <-chan struct{}) error { - s.ctx = contextutil.FromStopChannel(stopChan) - return nil -} - -func (s *shootNotFailedMapper) InjectCache(cache cache.Cache) error { - s.cache = cache - return nil -} - -func (s *shootNotFailedMapper) Map(e event.GenericEvent) bool { - // Return true for resources in the garden namespace, as they are not associated with a shoot - if e.Object.GetNamespace() == v1beta1constants.GardenNamespace { - return true - } - - // Wait for cache sync because of backing client cache. - if !s.cache.WaitForCacheSync(s.ctx) { - err := errors.New("failed to wait for caches to sync") - s.log.Error(err, "Could not wait for Cache to sync", "predicate", "ShootNotFailed") - return false - } - - cluster, err := extensionscontroller.GetCluster(s.ctx, s.client, e.Object.GetNamespace()) - if err != nil { - s.log.Error(err, "Could not retrieve corresponding cluster") - return false - } - - if extensionscontroller.IsFailed(cluster) { - return cluster.Shoot.Generation != cluster.Shoot.Status.ObservedGeneration - } - - return true -} - -// ShootNotFailed is a predicate for failed shoots. -func ShootNotFailed() predicate.Predicate { - return predicateutils.FromMapper(&shootNotFailedMapper{log: Log.WithName("shoot-not-failed")}, - predicateutils.CreateTrigger, predicateutils.UpdateNewTrigger, predicateutils.DeleteTrigger, predicateutils.GenericTrigger) -} +var logger = log.Log.WithName("predicate") // HasType filters the incoming OperatingSystemConfigs for ones that have the same type // as the given type. @@ -106,38 +42,6 @@ func HasType(typeName string) predicate.Predicate { }), predicateutils.CreateTrigger, predicateutils.UpdateNewTrigger, predicateutils.DeleteTrigger, predicateutils.GenericTrigger) } -// LastOperationNotSuccessful is a predicate for unsuccessful last operations **only** for creation events. -func LastOperationNotSuccessful() predicate.Predicate { - operationNotSucceeded := func(obj client.Object) bool { - acc, err := extensions.Accessor(obj) - if err != nil { - return false - } - - lastOp := acc.GetExtensionStatus().GetLastOperation() - return lastOp == nil || - lastOp.State != gardencorev1beta1.LastOperationStateSucceeded - } - - return predicate.Funcs{ - CreateFunc: func(event event.CreateEvent) bool { - return operationNotSucceeded(event.Object) - }, - UpdateFunc: func(event event.UpdateEvent) bool { - return false - }, - GenericFunc: func(event event.GenericEvent) bool { - return false - }, - DeleteFunc: func(event event.DeleteEvent) bool { - return false - }, - } -} - -// IsDeleting is an alias for a predicate which checks if the passed object has a deletion timestamp. -var IsDeleting = predicateutils.IsDeleting - // AddTypePredicate returns a new slice which contains a type predicate and the given `predicates`. // if more than one extensionTypes is given all given types are or combined func AddTypePredicate(predicates []predicate.Predicate, extensionTypes ...string) []predicate.Predicate { diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/terraformer/config.go b/vendor/github.com/gardener/gardener/extensions/pkg/terraformer/config.go index a0dbd061e..5f422115a 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/terraformer/config.go +++ b/vendor/github.com/gardener/gardener/extensions/pkg/terraformer/config.go @@ -92,6 +92,12 @@ func (t *terraformer) UseV2(v2 bool) Terraformer { return t } +// UseProjectedTokenMount configures the useProjectedTokenMount field. +func (t *terraformer) UseProjectedTokenMount(useProjectedTokenMount bool) Terraformer { + t.useProjectedTokenMount = useProjectedTokenMount + return t +} + // SetLogLevel sets the log level of the Terraformer pod. It only takes effect when UseV2 is set to true. func (t *terraformer) SetLogLevel(level string) Terraformer { t.logLevel = level diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/terraformer/state.go b/vendor/github.com/gardener/gardener/extensions/pkg/terraformer/state.go index 88ec49f42..32739c115 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/terraformer/state.go +++ b/vendor/github.com/gardener/gardener/extensions/pkg/terraformer/state.go @@ -108,7 +108,7 @@ func (t *terraformer) IsStateEmpty(ctx context.Context) bool { } { resourceName := obj.GetName() if err := t.client.Get(ctx, kutil.Key(t.namespace, resourceName), obj); client.IgnoreNotFound(err) != nil { - t.logger.Error(err, "failed to get resource", "name", resourceName) + t.logger.Error(err, "Failed to get resource", "name", resourceName) return false } diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/terraformer/terraformer.go b/vendor/github.com/gardener/gardener/extensions/pkg/terraformer/terraformer.go index f9d96b3b3..8ab555a1b 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/terraformer/terraformer.go +++ b/vendor/github.com/gardener/gardener/extensions/pkg/terraformer/terraformer.go @@ -23,7 +23,6 @@ import ( "github.com/go-logr/logr" corev1 "k8s.io/api/core/v1" rbacv1 "k8s.io/api/rbac/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" corev1client "k8s.io/client-go/kubernetes/typed/core/v1" @@ -200,7 +199,7 @@ func (t *terraformer) execute(ctx context.Context, command string) error { deployNewPod = false } else { // delete still existing pod and wait until it's gone - logger.Info(fmt.Sprintf("still existing Terraform pod with command %q found - ensuring the cleanup before starting a new Terraform pod with command %q", cmd, command)) + logger.Info(fmt.Sprintf("Still existing Terraform pod with command %q found - ensuring the cleanup before starting a new Terraform pod with command %q", cmd, command)) if err := t.EnsureCleanedUp(ctx); err != nil { return err } @@ -208,7 +207,7 @@ func (t *terraformer) execute(ctx context.Context, command string) error { case len(podList.Items) > 1: // unreachable - logger.Error(fmt.Errorf("too many Terraformer pods"), "unexpected number of still existing Terraformer pods: %d", len(podList.Items)) + logger.Error(fmt.Errorf("too many Terraformer pods"), "Unexpected number of still existing Terraformer pods: %d", len(podList.Items)) if err := t.EnsureCleanedUp(ctx); err != nil { return err } @@ -295,15 +294,15 @@ const ( func (t *terraformer) ensureServiceAccount(ctx context.Context) error { serviceAccount := &corev1.ServiceAccount{ObjectMeta: metav1.ObjectMeta{Namespace: t.namespace, Name: name}} - if err := t.client.Get(ctx, client.ObjectKeyFromObject(serviceAccount), serviceAccount); err != nil { - if !apierrors.IsNotFound(err) { - return err - } - if err := t.client.Create(ctx, serviceAccount); err != nil { - return err + _, err := controllerutils.GetAndCreateOrStrategicMergePatch(ctx, t.client, serviceAccount, func() error { + if t.useProjectedTokenMount { + serviceAccount.AutomountServiceAccountToken = pointer.Bool(false) + } else { + serviceAccount.AutomountServiceAccountToken = nil } - } - return nil + return nil + }) + return err } func (t *terraformer) ensureRole(ctx context.Context) error { diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/terraformer/types.go b/vendor/github.com/gardener/gardener/extensions/pkg/terraformer/types.go index 90bcd1fb2..966721834 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/terraformer/types.go +++ b/vendor/github.com/gardener/gardener/extensions/pkg/terraformer/types.go @@ -73,6 +73,9 @@ type terraformer struct { deadlineCleaning time.Duration deadlinePod time.Duration deadlinePodCreation time.Duration + + // TODO(rfranzke/BeckerMax): Remove these flags when all provider extensions enable the projected token mount. + useProjectedTokenMount bool } // RawState represent the terraformer state's raw data @@ -119,6 +122,7 @@ type Terraformer interface { SetDeadlinePod(time.Duration) Terraformer SetDeadlinePodCreation(time.Duration) Terraformer SetOwnerRef(*metav1.OwnerReference) Terraformer + UseProjectedTokenMount(bool) Terraformer InitializeWith(ctx context.Context, initializer Initializer) Terraformer Apply(ctx context.Context) error Destroy(ctx context.Context) error diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/terraformer/waiter.go b/vendor/github.com/gardener/gardener/extensions/pkg/terraformer/waiter.go index 2f846ab90..2a824a858 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/terraformer/waiter.go +++ b/vendor/github.com/gardener/gardener/extensions/pkg/terraformer/waiter.go @@ -92,7 +92,7 @@ func (t *terraformer) waitForPod(ctx context.Context, logger logr.Logger, pod *c if containerStateWaiting := containerStatuses[0].State.Waiting; containerStateWaiting != nil && containerStateWaiting.Reason == "ContainerCreating" { if podAge := time.Now().UTC().Sub(pod.CreationTimestamp.Time.UTC()); podAge > t.deadlinePodCreation { status = podStatusCreationTimeout - log.Info("timeout creating pod") + log.Info("Timeout creating pod") return retry.Ok() } } diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/util/shoot.go b/vendor/github.com/gardener/gardener/extensions/pkg/util/shoot.go index eeb94977d..6bcd73fde 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/util/shoot.go +++ b/vendor/github.com/gardener/gardener/extensions/pkg/util/shoot.go @@ -37,6 +37,7 @@ const CAChecksumAnnotation = "checksum/ca" // GetOrCreateShootKubeconfig gets or creates a Kubeconfig for a Shoot cluster which has a running control plane in the given `namespace`. // If the CA of an existing Kubeconfig has changed, it creates a new Kubeconfig. // Newly generated Kubeconfigs are applied with the given `client` to the given `namespace`. +// Deprecated: Use gutil.NewShootAccessSecret instead. func GetOrCreateShootKubeconfig(ctx context.Context, c client.Client, certificateConfig secrets.CertificateSecretConfig, namespace string) (*corev1.Secret, error) { caSecret, ca, err := secrets.LoadCAFromSecret(ctx, c, namespace, v1beta1constants.SecretNameCACluster) if err != nil { diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/webhook/controlplane/controlplane.go b/vendor/github.com/gardener/gardener/extensions/pkg/webhook/controlplane/controlplane.go index 99a50b6c0..8f2385449 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/webhook/controlplane/controlplane.go +++ b/vendor/github.com/gardener/gardener/extensions/pkg/webhook/controlplane/controlplane.go @@ -18,7 +18,6 @@ import ( "fmt" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/manager" "sigs.k8s.io/controller-runtime/pkg/webhook/admission" @@ -52,7 +51,7 @@ type Args struct { // Provider is the provider of this webhook. Provider string // Types is a list of resource types. - Types []client.Object + Types []extensionswebhook.Type // Mutator is a mutator to be used by the admission handler. Mutator extensionswebhook.Mutator } diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/webhook/controlplane/genericmutator/mutator.go b/vendor/github.com/gardener/gardener/extensions/pkg/webhook/controlplane/genericmutator/mutator.go index 05c0e730d..5b76376ff 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/webhook/controlplane/genericmutator/mutator.go +++ b/vendor/github.com/gardener/gardener/extensions/pkg/webhook/controlplane/genericmutator/mutator.go @@ -21,14 +21,17 @@ import ( extensionswebhook "github.com/gardener/gardener/extensions/pkg/webhook" gcontext "github.com/gardener/gardener/extensions/pkg/webhook/context" + gardencorev1beta1 "github.com/gardener/gardener/pkg/apis/core/v1beta1" v1beta1constants "github.com/gardener/gardener/pkg/apis/core/v1beta1/constants" + v1beta1helper "github.com/gardener/gardener/pkg/apis/core/v1beta1/helper" extensionsv1alpha1 "github.com/gardener/gardener/pkg/apis/extensions/v1alpha1" "github.com/gardener/gardener/pkg/operation/botanist/component/extensions/operatingsystemconfig/original/components/kubelet" "github.com/gardener/gardener/pkg/operation/botanist/component/extensions/operatingsystemconfig/utils" + kutil "github.com/gardener/gardener/pkg/utils/kubernetes" + "github.com/Masterminds/semver" "github.com/coreos/go-systemd/v22/unit" druidv1alpha1 "github.com/gardener/etcd-druid/api/v1alpha1" - kutil "github.com/gardener/gardener/pkg/utils/kubernetes" "github.com/go-logr/logr" appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" @@ -61,21 +64,21 @@ type Ensurer interface { // if the gardenlet's ReversedVPN feature gate is enabeld. EnsureVPNSeedServerDeployment(ctx context.Context, gctx gcontext.GardenContext, new, old *appsv1.Deployment) error // EnsureKubeletServiceUnitOptions ensures that the kubelet.service unit options conform to the provider requirements. - EnsureKubeletServiceUnitOptions(ctx context.Context, gctx gcontext.GardenContext, new, old []*unit.UnitOption) ([]*unit.UnitOption, error) + EnsureKubeletServiceUnitOptions(ctx context.Context, gctx gcontext.GardenContext, kubeletVersion *semver.Version, new, old []*unit.UnitOption) ([]*unit.UnitOption, error) // EnsureKubeletConfiguration ensures that the kubelet configuration conforms to the provider requirements. // "old" might be "nil" and must always be checked. - EnsureKubeletConfiguration(ctx context.Context, gctx gcontext.GardenContext, new, old *kubeletconfigv1beta1.KubeletConfiguration) error + EnsureKubeletConfiguration(ctx context.Context, gctx gcontext.GardenContext, kubeletVersion *semver.Version, new, old *kubeletconfigv1beta1.KubeletConfiguration) error + // ShouldProvisionKubeletCloudProviderConfig returns true if the cloud provider config file should be added to the kubelet configuration. + ShouldProvisionKubeletCloudProviderConfig(ctx context.Context, gctx gcontext.GardenContext, kubeletVersion *semver.Version) bool + // EnsureKubeletCloudProviderConfig ensures that the cloud provider config file content conforms to the provider requirements. + EnsureKubeletCloudProviderConfig(ctx context.Context, gctx gcontext.GardenContext, kubeletVersion *semver.Version, configContent *string, namespace string) error // EnsureKubernetesGeneralConfiguration ensures that the kubernetes general configuration conforms to the provider requirements. // "old" might be "nil" and must always be checked. EnsureKubernetesGeneralConfiguration(ctx context.Context, gctx gcontext.GardenContext, new, old *string) error - // ShouldProvisionKubeletCloudProviderConfig returns true if the cloud provider config file should be added to the kubelet configuration. - ShouldProvisionKubeletCloudProviderConfig(ctx context.Context, gctx gcontext.GardenContext) bool - // EnsureKubeletCloudProviderConfig ensures that the cloud provider config file content conforms to the provider requirements. - EnsureKubeletCloudProviderConfig(context.Context, gcontext.GardenContext, *string, string) error // EnsureAdditionalUnits ensures additional systemd units // "old" might be "nil" and must always be checked. EnsureAdditionalUnits(ctx context.Context, gctx gcontext.GardenContext, new, old *[]extensionsv1alpha1.Unit) error - // EnsureAdditionalFile ensures additional systemd files + // EnsureAdditionalFiles ensures additional systemd files // "old" might be "nil" and must always be checked. EnsureAdditionalFiles(ctx context.Context, gctx gcontext.GardenContext, new, old *[]extensionsv1alpha1.File) error } @@ -228,16 +231,42 @@ func findFileWithPath(osc *extensionsv1alpha1.OperatingSystemConfig, path string } func (m *mutator) mutateOperatingSystemConfig(ctx context.Context, gctx gcontext.GardenContext, osc, oldOSC *extensionsv1alpha1.OperatingSystemConfig) error { + cluster, err := gctx.GetCluster(ctx) + if err != nil { + return err + } + + // Calculate effective kubelet version for the worker pool this OperatingSystemConfig belongs to + controlPlaneVersion, err := semver.NewVersion(cluster.Shoot.Spec.Kubernetes.Version) + if err != nil { + return err + } + + var workerKubernetes *gardencorev1beta1.WorkerKubernetes + if poolName, ok := osc.Labels[v1beta1constants.LabelWorkerPool]; ok { + for _, worker := range cluster.Shoot.Spec.Provider.Workers { + if worker.Name == poolName { + workerKubernetes = worker.Kubernetes + break + } + } + } + + kubeletVersion, err := v1beta1helper.CalculateEffectiveKubernetesVersion(controlPlaneVersion, workerKubernetes) + if err != nil { + return err + } + // Mutate kubelet.service unit, if present if content := getKubeletService(osc); content != nil { - if err := m.ensureKubeletServiceUnitContent(ctx, gctx, content, getKubeletService(oldOSC)); err != nil { + if err := m.ensureKubeletServiceUnitContent(ctx, gctx, kubeletVersion, content, getKubeletService(oldOSC)); err != nil { return err } } // Mutate kubelet configuration file, if present if content := getKubeletConfigFile(osc); content != nil { - if err := m.ensureKubeletConfigFileContent(ctx, gctx, content, getKubeletConfigFile(oldOSC)); err != nil { + if err := m.ensureKubeletConfigFileContent(ctx, gctx, kubeletVersion, content, getKubeletConfigFile(oldOSC)); err != nil { return err } } @@ -250,8 +279,8 @@ func (m *mutator) mutateOperatingSystemConfig(ctx context.Context, gctx gcontext } // Check if cloud provider config needs to be ensured - if m.ensurer.ShouldProvisionKubeletCloudProviderConfig(ctx, gctx) { - if err := m.ensureKubeletCloudProviderConfig(ctx, gctx, osc); err != nil { + if m.ensurer.ShouldProvisionKubeletCloudProviderConfig(ctx, gctx, kubeletVersion) { + if err := m.ensureKubeletCloudProviderConfig(ctx, gctx, kubeletVersion, osc); err != nil { return err } } @@ -273,7 +302,7 @@ func (m *mutator) mutateOperatingSystemConfig(ctx context.Context, gctx gcontext return m.ensurer.EnsureAdditionalUnits(ctx, gctx, &osc.Spec.Units, oldUnits) } -func (m *mutator) ensureKubeletServiceUnitContent(ctx context.Context, gctx gcontext.GardenContext, content, oldContent *string) error { +func (m *mutator) ensureKubeletServiceUnitContent(ctx context.Context, gctx gcontext.GardenContext, kubeletVersion *semver.Version, content, oldContent *string) error { var ( opts, oldOpts []*unit.UnitOption err error @@ -291,7 +320,7 @@ func (m *mutator) ensureKubeletServiceUnitContent(ctx context.Context, gctx gcon } } - if opts, err = m.ensurer.EnsureKubeletServiceUnitOptions(ctx, gctx, opts, oldOpts); err != nil { + if opts, err = m.ensurer.EnsureKubeletServiceUnitOptions(ctx, gctx, kubeletVersion, opts, oldOpts); err != nil { return err } @@ -303,7 +332,7 @@ func (m *mutator) ensureKubeletServiceUnitContent(ctx context.Context, gctx gcon return nil } -func (m *mutator) ensureKubeletConfigFileContent(ctx context.Context, gctx gcontext.GardenContext, fci, oldFCI *extensionsv1alpha1.FileContentInline) error { +func (m *mutator) ensureKubeletConfigFileContent(ctx context.Context, gctx gcontext.GardenContext, kubeletVersion *semver.Version, fci, oldFCI *extensionsv1alpha1.FileContentInline) error { var ( kubeletConfig, oldKubeletConfig *kubeletconfigv1beta1.KubeletConfiguration err error @@ -321,7 +350,7 @@ func (m *mutator) ensureKubeletConfigFileContent(ctx context.Context, gctx gcont } } - if err = m.ensurer.EnsureKubeletConfiguration(ctx, gctx, kubeletConfig, oldKubeletConfig); err != nil { + if err = m.ensurer.EnsureKubeletConfiguration(ctx, gctx, kubeletVersion, kubeletConfig, oldKubeletConfig); err != nil { return err } @@ -361,7 +390,7 @@ func (m *mutator) ensureKubernetesGeneralConfiguration(ctx context.Context, gctx if len(s) == 0 { // File entries with empty content are not valid, so we do not add them to the OperatingSystemConfig resource. - m.logger.Info("skipping modification of kubernetes general configuration file entry because the new content is empty", "operatingsystemconfig", objectName) + m.logger.Info("Skipping modification of kubernetes general configuration file entry because the new content is empty", "operatingsystemconfig", objectName) return nil } @@ -378,18 +407,18 @@ func (m *mutator) ensureKubernetesGeneralConfiguration(ctx context.Context, gctx // CloudProviderConfigPath is the path to the cloudprovider.conf kubelet configuration file. const CloudProviderConfigPath = "/var/lib/kubelet/cloudprovider.conf" -func (m *mutator) ensureKubeletCloudProviderConfig(ctx context.Context, gctx gcontext.GardenContext, osc *extensionsv1alpha1.OperatingSystemConfig) error { +func (m *mutator) ensureKubeletCloudProviderConfig(ctx context.Context, gctx gcontext.GardenContext, kubeletVersion *semver.Version, osc *extensionsv1alpha1.OperatingSystemConfig) error { var err error // Ensure kubelet cloud provider config var s string - if err = m.ensurer.EnsureKubeletCloudProviderConfig(ctx, gctx, &s, osc.Namespace); err != nil { + if err = m.ensurer.EnsureKubeletCloudProviderConfig(ctx, gctx, kubeletVersion, &s, osc.Namespace); err != nil { return err } if len(s) == 0 { // File entries with empty content are not valid, so we do not add them to the OperatingSystemConfig resource. - m.logger.Info("skipping addition of kubelet cloud provider config file entry because its content is empty", "operatingsystemconfig", kutil.ObjectName(osc)) + m.logger.Info("Skipping addition of kubelet cloud provider config file entry because its content is empty", "operatingsystemconfig", kutil.ObjectName(osc)) return nil } diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/webhook/controlplane/genericmutator/noopensurer.go b/vendor/github.com/gardener/gardener/extensions/pkg/webhook/controlplane/genericmutator/noopensurer.go index 0d2569d45..6f47a98a0 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/webhook/controlplane/genericmutator/noopensurer.go +++ b/vendor/github.com/gardener/gardener/extensions/pkg/webhook/controlplane/genericmutator/noopensurer.go @@ -17,6 +17,7 @@ package genericmutator import ( "context" + "github.com/Masterminds/semver" "github.com/coreos/go-systemd/v22/unit" druidv1alpha1 "github.com/gardener/etcd-druid/api/v1alpha1" gcontext "github.com/gardener/gardener/extensions/pkg/webhook/context" @@ -62,27 +63,27 @@ func (e *NoopEnsurer) EnsureVPNSeedServerDeployment(ctx context.Context, gctx gc } // EnsureKubeletServiceUnitOptions ensures that the kubelet.service unit options conform to the provider requirements. -func (e *NoopEnsurer) EnsureKubeletServiceUnitOptions(ctx context.Context, gctx gcontext.GardenContext, new, old []*unit.UnitOption) ([]*unit.UnitOption, error) { +func (e *NoopEnsurer) EnsureKubeletServiceUnitOptions(ctx context.Context, gctx gcontext.GardenContext, kubeletVersion *semver.Version, new, old []*unit.UnitOption) ([]*unit.UnitOption, error) { return new, nil } // EnsureKubeletConfiguration ensures that the kubelet configuration conforms to the provider requirements. -func (e *NoopEnsurer) EnsureKubeletConfiguration(ctx context.Context, gctx gcontext.GardenContext, new, old *kubeletconfigv1beta1.KubeletConfiguration) error { - return nil -} - -// EnsureKubernetesGeneralConfiguration ensures that the kubernetes general configuration conforms to the provider requirements. -func (e *NoopEnsurer) EnsureKubernetesGeneralConfiguration(ctx context.Context, gctx gcontext.GardenContext, new, old *string) error { +func (e *NoopEnsurer) EnsureKubeletConfiguration(ctx context.Context, gctx gcontext.GardenContext, kubeletVersion *semver.Version, new, old *kubeletconfigv1beta1.KubeletConfiguration) error { return nil } // ShouldProvisionKubeletCloudProviderConfig returns if the cloud provider config file should be added to the kubelet configuration. -func (e *NoopEnsurer) ShouldProvisionKubeletCloudProviderConfig(context.Context, gcontext.GardenContext) bool { +func (e *NoopEnsurer) ShouldProvisionKubeletCloudProviderConfig(ctx context.Context, gctx gcontext.GardenContext, kubeletVersion *semver.Version) bool { return false } // EnsureKubeletCloudProviderConfig ensures that the cloud provider config file conforms to the provider requirements. -func (e *NoopEnsurer) EnsureKubeletCloudProviderConfig(context.Context, gcontext.GardenContext, *string, string) error { +func (e *NoopEnsurer) EnsureKubeletCloudProviderConfig(ctx context.Context, gctx gcontext.GardenContext, kubeletVersion *semver.Version, configContent *string, namespace string) error { + return nil +} + +// EnsureKubernetesGeneralConfiguration ensures that the kubernetes general configuration conforms to the provider requirements. +func (e *NoopEnsurer) EnsureKubernetesGeneralConfiguration(ctx context.Context, gctx gcontext.GardenContext, new, old *string) error { return nil } diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/webhook/handler.go b/vendor/github.com/gardener/gardener/extensions/pkg/webhook/handler.go index a699a7fea..297030c4c 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/webhook/handler.go +++ b/vendor/github.com/gardener/gardener/extensions/pkg/webhook/handler.go @@ -37,7 +37,7 @@ import ( // HandlerBuilder contains information which are required to create an admission handler. type HandlerBuilder struct { - mutatorMap map[Mutator][]client.Object + mutatorMap map[Mutator][]Type predicates []predicate.Predicate scheme *runtime.Scheme logger logr.Logger @@ -46,14 +46,14 @@ type HandlerBuilder struct { // NewBuilder creates a new HandlerBuilder. func NewBuilder(mgr manager.Manager, logger logr.Logger) *HandlerBuilder { return &HandlerBuilder{ - mutatorMap: make(map[Mutator][]client.Object), + mutatorMap: make(map[Mutator][]Type), scheme: mgr.GetScheme(), logger: logger.WithName("handler"), } } // WithMutator adds the given mutator for the given types to the HandlerBuilder. -func (b *HandlerBuilder) WithMutator(mutator Mutator, types ...client.Object) *HandlerBuilder { +func (b *HandlerBuilder) WithMutator(mutator Mutator, types ...Type) *HandlerBuilder { mutator = hybridMutator(mutator) b.mutatorMap[mutator] = append(b.mutatorMap[mutator], types...) @@ -61,7 +61,7 @@ func (b *HandlerBuilder) WithMutator(mutator Mutator, types ...client.Object) *H } // WithValidator adds the given validator for the given types to the HandlerBuilder. -func (b *HandlerBuilder) WithValidator(validator Validator, types ...client.Object) *HandlerBuilder { +func (b *HandlerBuilder) WithValidator(validator Validator, types ...Type) *HandlerBuilder { mutator := hybridValidator(validator) b.mutatorMap[mutator] = append(b.mutatorMap[mutator], types...) return b @@ -84,7 +84,7 @@ func (b *HandlerBuilder) Build() (admission.Handler, error) { } for m, t := range b.mutatorMap { - typesMap, err := buildTypesMap(b.scheme, t) + typesMap, err := buildTypesMap(b.scheme, objectsFromTypes(t)) if err != nil { return nil, err } @@ -161,7 +161,7 @@ func handle(ctx context.Context, req admission.Request, m Mutator, t client.Obje obj := t.DeepCopyObject().(client.Object) _, _, err := decoder.Decode(req.Object.Raw, nil, obj) if err != nil { - logger.Error(err, "could not decode request", "request", ar) + logger.Error(err, "Could not decode request", "request", ar) return admission.Errored(http.StatusBadRequest, fmt.Errorf("could not decode request %v: %w", ar, err)) } @@ -171,7 +171,7 @@ func handle(ctx context.Context, req admission.Request, m Mutator, t client.Obje if len(req.OldObject.Raw) != 0 { oldObj = t.DeepCopyObject().(client.Object) if _, _, err := decoder.Decode(ar.OldObject.Raw, nil, oldObj); err != nil { - logger.Error(err, "could not decode old object", "object", oldObj) + logger.Error(err, "Could not decode old object", "object", oldObj) return admission.Errored(http.StatusBadRequest, fmt.Errorf("could not decode old object %v: %v", oldObj, err)) } } @@ -184,7 +184,7 @@ func handle(ctx context.Context, req admission.Request, m Mutator, t client.Obje // Process the resource newObj := obj.DeepCopyObject().(client.Object) if err = m.Mutate(ctx, newObj, oldObj); err != nil { - logger.Error(fmt.Errorf("could not process: %w", err), "admission denied", "kind", ar.Kind.Kind, "namespace", obj.GetNamespace(), "name", obj.GetName()) + logger.Error(fmt.Errorf("could not process: %w", err), "Admission denied", "kind", ar.Kind.Kind, "namespace", obj.GetNamespace(), "name", obj.GetName()) return admission.Errored(http.StatusBadRequest, err) } @@ -207,6 +207,14 @@ func handle(ctx context.Context, req admission.Request, m Mutator, t client.Obje return admission.ValidationResponse(true, "") } +func objectsFromTypes(in []Type) []client.Object { + out := make([]client.Object, 0, len(in)) + for _, t := range in { + out = append(out, t.Obj) + } + return out +} + // buildTypesMap builds a map of the given types keyed by their GroupVersionKind, using the scheme from the given Manager. func buildTypesMap(scheme *runtime.Scheme, types []client.Object) (map[metav1.GroupVersionKind]client.Object, error) { typesMap := make(map[metav1.GroupVersionKind]client.Object) diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/webhook/handler_shootclient.go b/vendor/github.com/gardener/gardener/extensions/pkg/webhook/handler_shootclient.go index 2ae290132..94da6293e 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/webhook/handler_shootclient.go +++ b/vendor/github.com/gardener/gardener/extensions/pkg/webhook/handler_shootclient.go @@ -35,9 +35,9 @@ import ( ) // NewHandlerWithShootClient creates a new handler for the given types, using the given mutator, and logger. -func NewHandlerWithShootClient(mgr manager.Manager, types []client.Object, mutator MutatorWithShootClient, logger logr.Logger) (http.Handler, error) { +func NewHandlerWithShootClient(mgr manager.Manager, types []Type, mutator MutatorWithShootClient, logger logr.Logger) (http.Handler, error) { // Build a map of the given types keyed by their GVKs - typesMap, err := buildTypesMap(mgr.GetScheme(), types) + typesMap, err := buildTypesMap(mgr.GetScheme(), objectsFromTypes(types)) if err != nil { return nil, err } diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/webhook/registration.go b/vendor/github.com/gardener/gardener/extensions/pkg/webhook/registration.go index 57eb8f6f7..8bfe17e0d 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/webhook/registration.go +++ b/vendor/github.com/gardener/gardener/extensions/pkg/webhook/registration.go @@ -25,7 +25,6 @@ import ( admissionregistrationv1 "k8s.io/api/admissionregistration/v1" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" "k8s.io/utils/pointer" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client/apiutil" @@ -42,8 +41,6 @@ const ( // RegisterWebhooks registers the given webhooks in the Kubernetes cluster targeted by the provided manager. func RegisterWebhooks(ctx context.Context, mgr manager.Manager, namespace, providerName string, servicePort int, mode, url string, caBundle []byte, webhooks []*Webhook) (webhooksToRegisterSeed []admissionregistrationv1.MutatingWebhook, webhooksToRegisterShoot []admissionregistrationv1.MutatingWebhook, err error) { var ( - fail = admissionregistrationv1.Fail - ignore = admissionregistrationv1.Ignore exact = admissionregistrationv1.Exact mutatingWebhookConfigurationSeed = &admissionregistrationv1.MutatingWebhookConfiguration{ObjectMeta: metav1.ObjectMeta{Name: NamePrefix + providerName}} ) @@ -72,20 +69,30 @@ func RegisterWebhooks(ctx context.Context, mgr manager.Manager, namespace, provi TimeoutSeconds: pointer.Int32(10), } + if webhook.TimeoutSeconds != nil { + webhookToRegister.TimeoutSeconds = webhook.TimeoutSeconds + } + + shootMode := ModeURLWithServiceName + if mode == ModeURL { + shootMode = ModeURL + } + switch webhook.Target { case TargetSeed: - webhookToRegister.FailurePolicy = &fail + webhookToRegister.FailurePolicy = getFailurePolicy(admissionregistrationv1.Fail, webhook.FailurePolicy) webhookToRegister.MatchPolicy = &exact webhookToRegister.ClientConfig = buildClientConfigFor(webhook, namespace, providerName, servicePort, mode, url, caBundle) webhooksToRegisterSeed = append(webhooksToRegisterSeed, webhookToRegister) case TargetShoot: - webhookToRegister.FailurePolicy = &ignore + webhookToRegister.FailurePolicy = getFailurePolicy(admissionregistrationv1.Ignore, webhook.FailurePolicy) webhookToRegister.MatchPolicy = &exact - webhookToRegister.ClientConfig = buildClientConfigFor(webhook, namespace, providerName, servicePort, ModeURLWithServiceName, url, caBundle) + webhookToRegister.ClientConfig = buildClientConfigFor(webhook, namespace, providerName, servicePort, shootMode, url, caBundle) webhooksToRegisterShoot = append(webhooksToRegisterShoot, webhookToRegister) default: return nil, nil, fmt.Errorf("invalid webhook target: %s", webhook.Target) } + } if len(webhooksToRegisterSeed) > 0 { @@ -118,12 +125,19 @@ func RegisterWebhooks(ctx context.Context, mgr manager.Manager, namespace, provi return webhooksToRegisterSeed, webhooksToRegisterShoot, nil } +func getFailurePolicy(def admissionregistrationv1.FailurePolicyType, overwrite *admissionregistrationv1.FailurePolicyType) *admissionregistrationv1.FailurePolicyType { + if overwrite != nil { + return overwrite + } + return &def +} + // buildRule creates and returns a RuleWithOperations for the given object type. -func buildRule(mgr manager.Manager, t runtime.Object) (*admissionregistrationv1.RuleWithOperations, error) { +func buildRule(mgr manager.Manager, t Type) (*admissionregistrationv1.RuleWithOperations, error) { // Get GVK from the type - gvk, err := apiutil.GVKForObject(t, mgr.GetScheme()) + gvk, err := apiutil.GVKForObject(t.Obj, mgr.GetScheme()) if err != nil { - return nil, fmt.Errorf("could not get GroupVersionKind from object %v: %w", t, err) + return nil, fmt.Errorf("could not get GroupVersionKind from object %v: %w", t.Obj, err) } // Get REST mapping from GVK @@ -132,6 +146,11 @@ func buildRule(mgr manager.Manager, t runtime.Object) (*admissionregistrationv1. return nil, fmt.Errorf("could not get REST mapping from GroupVersionKind '%s': %w", gvk.String(), err) } + resource := mapping.Resource.Resource + if t.Subresource != nil { + resource += fmt.Sprintf("/%s", *t.Subresource) + } + // Create and return RuleWithOperations return &admissionregistrationv1.RuleWithOperations{ Operations: []admissionregistrationv1.OperationType{ @@ -141,7 +160,7 @@ func buildRule(mgr manager.Manager, t runtime.Object) (*admissionregistrationv1. Rule: admissionregistrationv1.Rule{ APIGroups: []string{gvk.Group}, APIVersions: []string{gvk.Version}, - Resources: []string{mapping.Resource.Resource}, + Resources: []string{resource}, }, }, nil } diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/webhook/shoot/shoot.go b/vendor/github.com/gardener/gardener/extensions/pkg/webhook/shoot/shoot.go index 4e2e17fed..a4579c561 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/webhook/shoot/shoot.go +++ b/vendor/github.com/gardener/gardener/extensions/pkg/webhook/shoot/shoot.go @@ -18,7 +18,6 @@ import ( "fmt" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/manager" "sigs.k8s.io/controller-runtime/pkg/webhook/admission" @@ -39,7 +38,7 @@ var logger = log.Log.WithName("shoot-webhook") // Args are arguments for creating a webhook targeting a shoot. type Args struct { // Types is a list of resource types. - Types []client.Object + Types []extensionswebhook.Type // Mutator is a mutator to be used by the admission handler. It doesn't need the shoot client. Mutator extensionswebhook.Mutator // MutatorWithShootClient is a mutator to be used by the admission handler. It needs the shoot client. diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/webhook/webhook.go b/vendor/github.com/gardener/gardener/extensions/pkg/webhook/webhook.go index 327a9fe9d..06d2151c0 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/webhook/webhook.go +++ b/vendor/github.com/gardener/gardener/extensions/pkg/webhook/webhook.go @@ -17,6 +17,7 @@ package webhook import ( "net/http" + admissionregistrationv1 "k8s.io/api/admissionregistration/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/log" @@ -44,11 +45,19 @@ type Webhook struct { Provider string Path string Target string - Types []client.Object + Types []Type Webhook *admission.Webhook Handler http.Handler Selector *metav1.LabelSelector ObjectSelector *metav1.LabelSelector + FailurePolicy *admissionregistrationv1.FailurePolicyType + TimeoutSeconds *int32 +} + +// Type contains information about the Kubernetes object types and subresources the webhook acts upon. +type Type struct { + Obj client.Object + Subresource *string } // Args contains Webhook creation arguments. @@ -57,8 +66,8 @@ type Args struct { Name string Path string Predicates []predicate.Predicate - Validators map[Validator][]client.Object - Mutators map[Mutator][]client.Object + Validators map[Validator][]Type + Mutators map[Mutator][]Type } // New creates a new Webhook with the given args. diff --git a/vendor/github.com/gardener/gardener/extensions/test/integration/healthcheck/healthcheck_operation.go b/vendor/github.com/gardener/gardener/extensions/test/integration/healthcheck/healthcheck_operation.go index 1e33cfebc..a9816123d 100644 --- a/vendor/github.com/gardener/gardener/extensions/test/integration/healthcheck/healthcheck_operation.go +++ b/vendor/github.com/gardener/gardener/extensions/test/integration/healthcheck/healthcheck_operation.go @@ -26,7 +26,6 @@ import ( v1beta1helper "github.com/gardener/gardener/pkg/apis/core/v1beta1/helper" extensionsv1alpha1 "github.com/gardener/gardener/pkg/apis/extensions/v1alpha1" resourcesv1alpha1 "github.com/gardener/gardener/pkg/apis/resources/v1alpha1" - "github.com/gardener/gardener/pkg/controllerutils" kutil "github.com/gardener/gardener/pkg/utils/kubernetes" "github.com/gardener/gardener/test/framework" @@ -35,7 +34,6 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/types" - "k8s.io/client-go/util/retry" "k8s.io/utils/pointer" "sigs.k8s.io/controller-runtime/pkg/client" ) @@ -133,8 +131,8 @@ func TestHealthCheckWithManagedResource(ctx context.Context, timeout time.Durati }, healthConditionType, gardencorev1beta1.ConditionTrue, healthcheck.ReasonSuccessful) framework.ExpectNoError(err) }() - managedResource := resourcesv1alpha1.ManagedResource{} - if err = f.SeedClient.Client().Get(ctx, kutil.Key(f.ShootSeedNamespace(), managedResourceName), &managedResource); err != nil { + managedResource := &resourcesv1alpha1.ManagedResource{} + if err = f.SeedClient.Client().Get(ctx, kutil.Key(f.ShootSeedNamespace(), managedResourceName), managedResource); err != nil { return err } // overwrite Condition with type ResourcesHealthy on the managed resource to make the health check in the provider fail @@ -143,11 +141,15 @@ func TestHealthCheckWithManagedResource(ctx context.Context, timeout time.Durati Status: gardencorev1beta1.ConditionFalse, Reason: "dummyFailureReason", } - if err = controllerutils.TryUpdateStatus(ctx, retry.DefaultBackoff, f.SeedClient.Client(), &managedResource, func() error { - newConditions := v1beta1helper.MergeConditions(managedResource.Status.Conditions, managedResourceCondition) - managedResource.Status.Conditions = newConditions - return nil - }); err != nil { + + // Generally, merge patching conditions without optimistic locking is unsafe. However, this is a test and we only want + // to provoke a failure situation, we don't care if we unintentionally overwrite other condition updates here. + // https://media.giphy.com/media/QMHoU66sBXqqLqYvGO/giphy.gif + patch := client.MergeFrom(managedResource.DeepCopy()) + newConditions := v1beta1helper.MergeConditions(managedResource.Status.Conditions, managedResourceCondition) + managedResource.Status.Conditions = newConditions + + if err := f.SeedClient.Client().Status().Patch(ctx, managedResource, patch); err != nil { return err } diff --git a/vendor/github.com/gardener/gardener/hack/LICENSE_BOILERPLATE.txt b/vendor/github.com/gardener/gardener/hack/LICENSE_BOILERPLATE.txt index e12758c65..30aba94bd 100755 --- a/vendor/github.com/gardener/gardener/hack/LICENSE_BOILERPLATE.txt +++ b/vendor/github.com/gardener/gardener/hack/LICENSE_BOILERPLATE.txt @@ -1,5 +1,5 @@ /* -Copyright (c) YEAR SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/github.com/gardener/gardener/hack/compare-k8s-feature-gates.sh b/vendor/github.com/gardener/gardener/hack/compare-k8s-feature-gates.sh index 65801fdb0..6e5586fe9 100755 --- a/vendor/github.com/gardener/gardener/hack/compare-k8s-feature-gates.sh +++ b/vendor/github.com/gardener/gardener/hack/compare-k8s-feature-gates.sh @@ -19,6 +19,8 @@ set -e usage() { echo "Usage:" echo "> compare-k8s-feature-gates.sh [ -h | ]" + echo + echo ">> For example: compare-k8s-feature-gates.sh 1.22 1.23" exit 0 } @@ -58,4 +60,4 @@ echo "Feature gates added in $2 compared to $1:" diff "${out_dir}/featuregates-$1.txt" "${out_dir}/featuregates-$2.txt" | grep '>' | awk '{print $2}' echo echo "Feature gates removed in $2 compared to $1:" -diff "${out_dir}/featuregates-$1.txt" "${out_dir}/featuregates-$2.txt" | grep '<' | awk '{print $2}' \ No newline at end of file +diff "${out_dir}/featuregates-$1.txt" "${out_dir}/featuregates-$2.txt" | grep '<' | awk '{print $2}' diff --git a/vendor/github.com/gardener/gardener/hack/generate-controller-registration.sh b/vendor/github.com/gardener/gardener/hack/generate-controller-registration.sh index bf2e0a3ac..b3b102317 100755 --- a/vendor/github.com/gardener/gardener/hack/generate-controller-registration.sh +++ b/vendor/github.com/gardener/gardener/hack/generate-controller-registration.sh @@ -24,7 +24,7 @@ generate-controller-registration [kind Name of the controller registration to generate. Location of the chart directory. - Location of the VERSION file. + Version to use for the Helm chart and the tag in the ControllerDeployment. The destination file to write the registration YAML to. A tuple of kind and type of the controller registration to generate. Separated by ':'. @@ -41,14 +41,12 @@ if [ "$1" == "--optional" ]; then fi NAME="$1" CHART_DIR="$2" -VERSION_FILE="$3" +VERSION="$3" DEST="$4" KIND_AND_TYPE="$5" ( [[ -z "$NAME" ]] || [[ -z "$CHART_DIR" ]] || [[ -z "$DEST" ]] || [[ -z "$KIND_AND_TYPE" ]]) && usage -VERSION="$(cat "$VERSION_FILE")" - KINDS_AND_TYPES=("$KIND_AND_TYPE" "${@:6}") # The following code is to make `helm package` idempotent: Usually, everytime `helm package` is invoked, diff --git a/vendor/github.com/gardener/gardener/hack/test-e2e-local.sh b/vendor/github.com/gardener/gardener/hack/test-e2e-local.sh new file mode 100755 index 000000000..e87cc1156 --- /dev/null +++ b/vendor/github.com/gardener/gardener/hack/test-e2e-local.sh @@ -0,0 +1,59 @@ +#!/usr/bin/env bash + +create_failed=yes +delete_failed=yes + +trap shoot_deletion EXIT + +function shoot_deletion { + go test -mod=vendor -timeout=15m ./test/system/shoot_deletion \ + --v -ginkgo.v -ginkgo.progress \ + -kubecfg=$KUBECONFIG \ + -project-namespace=garden-local \ + -shoot-name=e2e-local \ + -skip-accessing-shoot=${SKIP_ACCESSING_SHOOT:-true} + + if [ $? = 0 ] ; then + delete_failed=no + fi + + if [ $create_failed = yes ] || [ $delete_failed = yes ] ; then + exit 1 + fi +} + +go test -mod=vendor -timeout=15m ./test/system/shoot_creation \ + --v -ginkgo.v -ginkgo.progress \ + -kubecfg=$KUBECONFIG \ + -project-namespace=garden-local \ + -shoot-name=e2e-local \ + -annotations=shoot.gardener.cloud/infrastructure-cleanup-wait-period-seconds=0 \ + -k8s-version=1.23.1 \ + -cloud-profile=local \ + -seed=local \ + -region=local \ + -secret-binding=local \ + -provider-type=local \ + -networking-type=local \ + -workers-config-filepath=<(cat < 0 { + for iNdEx := len(m.IgnoreTaints) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.IgnoreTaints[iNdEx]) + copy(dAtA[i:], m.IgnoreTaints[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.IgnoreTaints[iNdEx]))) + i-- + dAtA[i] = 0x52 + } + } if m.MaxGracefulTerminationSeconds != nil { i = encodeVarintGenerated(dAtA, i, uint64(*m.MaxGracefulTerminationSeconds)) i-- @@ -12984,6 +13010,18 @@ func (m *ShootStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.MigrationStartTime != nil { + { + size, err := m.MigrationStartTime.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x7a + } if len(m.AdvertisedAddresses) > 0 { for iNdEx := len(m.AdvertisedAddresses) - 1; iNdEx >= 0; iNdEx-- { { @@ -13993,6 +14031,10 @@ func (m *BackupEntryStatus) Size() (n int) { l = len(*m.SeedName) n += 1 + l + sovGenerated(uint64(l)) } + if m.MigrationStartTime != nil { + l = m.MigrationStartTime.Size() + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -14145,6 +14187,12 @@ func (m *ClusterAutoscaler) Size() (n int) { if m.MaxGracefulTerminationSeconds != nil { n += 1 + sovGenerated(uint64(*m.MaxGracefulTerminationSeconds)) } + if len(m.IgnoreTaints) > 0 { + for _, s := range m.IgnoreTaints { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } + } return n } @@ -16693,6 +16741,10 @@ func (m *ShootStatus) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) } } + if m.MigrationStartTime != nil { + l = m.MigrationStartTime.Size() + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -17115,6 +17167,7 @@ func (this *BackupEntryStatus) String() string { `LastError:` + strings.Replace(this.LastError.String(), "LastError", "LastError", 1) + `,`, `ObservedGeneration:` + fmt.Sprintf("%v", this.ObservedGeneration) + `,`, `SeedName:` + valueToStringGenerated(this.SeedName) + `,`, + `MigrationStartTime:` + strings.Replace(fmt.Sprintf("%v", this.MigrationStartTime), "Time", "v11.Time", 1) + `,`, `}`, }, "") return s @@ -17225,6 +17278,7 @@ func (this *ClusterAutoscaler) String() string { `Expander:` + valueToStringGenerated(this.Expander) + `,`, `MaxNodeProvisionTime:` + strings.Replace(fmt.Sprintf("%v", this.MaxNodeProvisionTime), "Duration", "v11.Duration", 1) + `,`, `MaxGracefulTerminationSeconds:` + valueToStringGenerated(this.MaxGracefulTerminationSeconds) + `,`, + `IgnoreTaints:` + fmt.Sprintf("%v", this.IgnoreTaints) + `,`, `}`, }, "") return s @@ -19043,6 +19097,7 @@ func (this *ShootStatus) String() string { `UID:` + fmt.Sprintf("%v", this.UID) + `,`, `ClusterIdentity:` + valueToStringGenerated(this.ClusterIdentity) + `,`, `AdvertisedAddresses:` + repeatedStringForAdvertisedAddresses + `,`, + `MigrationStartTime:` + strings.Replace(fmt.Sprintf("%v", this.MigrationStartTime), "Time", "v11.Time", 1) + `,`, `}`, }, "") return s @@ -21226,6 +21281,42 @@ func (m *BackupEntryStatus) Unmarshal(dAtA []byte) error { s := string(dAtA[iNdEx:postIndex]) m.SeedName = &s iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MigrationStartTime", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.MigrationStartTime == nil { + m.MigrationStartTime = &v11.Time{} + } + if err := m.MigrationStartTime.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -22376,6 +22467,38 @@ func (m *ClusterAutoscaler) Unmarshal(dAtA []byte) error { } } m.MaxGracefulTerminationSeconds = &v + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field IgnoreTaints", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.IgnoreTaints = append(m.IgnoreTaints, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -42656,6 +42779,42 @@ func (m *ShootStatus) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 15: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MigrationStartTime", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.MigrationStartTime == nil { + m.MigrationStartTime = &v11.Time{} + } + if err := m.MigrationStartTime.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/generated.proto b/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/generated.proto index e66d2f127..483645204 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/generated.proto +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/generated.proto @@ -1,5 +1,5 @@ /* -Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -222,6 +222,10 @@ message BackupEntryStatus { // at the beginning of a create/reconcile operation. It is used when moving the BackupEntry between seeds. // +optional optional string seedName = 4; + + // MigrationStartTime is the time when a migration to a different seed was initiated. + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.Time migrationStartTime = 5; } // CRI contains information about the Container Runtimes. @@ -349,6 +353,10 @@ message ClusterAutoscaler { // MaxGracefulTerminationSeconds is the number of seconds CA waits for pod termination when trying to scale down a node (default: 600). // +optional optional int32 maxGracefulTerminationSeconds = 9; + + // IgnoreTaints specifies a list of taint keys to ignore in node templates when considering to scale a node group. + // +optional + repeated string ignoreTaints = 10; } // ClusterInfo contains information about the Plant cluster @@ -2410,6 +2418,10 @@ message ShootStatus { // +patchMergeKey=name // +patchStrategy=merge repeated ShootAdvertisedAddress advertisedAddresses = 14; + + // MigrationStartTime is the time when a migration to a different seed was initiated. + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.Time migrationStartTime = 15; } // Toleration is a toleration for a seed taint. diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/types_backupentry.go b/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/types_backupentry.go index 88e8cc97e..425f97c6e 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/types_backupentry.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/types_backupentry.go @@ -76,4 +76,7 @@ type BackupEntryStatus struct { // at the beginning of a create/reconcile operation. It is used when moving the BackupEntry between seeds. // +optional SeedName *string `json:"seedName,omitempty" protobuf:"bytes,4,opt,name=seedName"` + // MigrationStartTime is the time when a migration to a different seed was initiated. + // +optional + MigrationStartTime *metav1.Time `json:"migrationStartTime,omitempty" protobuf:"bytes,5,opt,name=migrationStartTime"` } diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/types_common.go b/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/types_common.go index ac9d37873..d16a4695c 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/types_common.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/types_common.go @@ -20,11 +20,15 @@ import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" type ErrorCode string const ( - // ErrorInfraUnauthorized indicates that the last error occurred due to invalid infrastructure credentials. + // ErrorInfraUnauthenticated indicates that the last error occurred due to the client request not being completed because it lacks valid authentication credentials for the requested resource. + // It is classified as a non-retryable error code. + ErrorInfraUnauthenticated ErrorCode = "ERR_INFRA_UNAUTHENTICATED" + // ErrorInfraUnauthorized indicates that the last error occurred due to the server understanding the request but refusing to authorize it. // It is classified as a non-retryable error code. ErrorInfraUnauthorized ErrorCode = "ERR_INFRA_UNAUTHORIZED" // ErrorInfraInsufficientPrivileges indicates that the last error occurred due to insufficient infrastructure privileges. // It is classified as a non-retryable error code. + // This error code is deprecated in favor of ERR_INFRA_UNAUTHORIZED and will be removed in a future version. ErrorInfraInsufficientPrivileges ErrorCode = "ERR_INFRA_INSUFFICIENT_PRIVILEGES" // ErrorInfraQuotaExceeded indicates that the last error occurred due to infrastructure quota limits. // It is classified as a non-retryable error code. diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/types_shoot.go b/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/types_shoot.go index 111e46e64..bb54b2cc4 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/types_shoot.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/types_shoot.go @@ -163,6 +163,9 @@ type ShootStatus struct { // +patchMergeKey=name // +patchStrategy=merge AdvertisedAddresses []ShootAdvertisedAddress `json:"advertisedAddresses,omitempty" patchStrategy:"merge" patchMergeKey:"name" protobuf:"bytes,14,rep,name=advertisedAddresses"` + // MigrationStartTime is the time when a migration to a different seed was initiated. + // +optional + MigrationStartTime *metav1.Time `json:"migrationStartTime,omitempty" protobuf:"bytes,15,opt,name=migrationStartTime"` } // ShootAdvertisedAddress contains information for the shoot's Kube API server. @@ -399,6 +402,9 @@ type ClusterAutoscaler struct { // MaxGracefulTerminationSeconds is the number of seconds CA waits for pod termination when trying to scale down a node (default: 600). // +optional MaxGracefulTerminationSeconds *int32 `json:"maxGracefulTerminationSeconds,omitempty" protobuf:"varint,9,opt,name=maxGracefulTerminationSeconds"` + // IgnoreTaints specifies a list of taint keys to ignore in node templates when considering to scale a node group. + // +optional + IgnoreTaints []string `json:"ignoreTaints,omitempty" protobuf:"bytes,10,opt,name=ignoreTaints"` } // ExpanderMode is type used for Expander values diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/zz_generated.conversion.go b/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/zz_generated.conversion.go index 6c719ebf4..e7ac21dc2 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/zz_generated.conversion.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/zz_generated.conversion.go @@ -2,7 +2,7 @@ // +build !ignore_autogenerated /* -Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -1929,6 +1929,7 @@ func autoConvert_v1alpha1_BackupEntryStatus_To_core_BackupEntryStatus(in *Backup out.LastError = (*core.LastError)(unsafe.Pointer(in.LastError)) out.ObservedGeneration = in.ObservedGeneration out.SeedName = (*string)(unsafe.Pointer(in.SeedName)) + out.MigrationStartTime = (*metav1.Time)(unsafe.Pointer(in.MigrationStartTime)) return nil } @@ -1942,6 +1943,7 @@ func autoConvert_core_BackupEntryStatus_To_v1alpha1_BackupEntryStatus(in *core.B out.LastError = (*LastError)(unsafe.Pointer(in.LastError)) out.ObservedGeneration = in.ObservedGeneration out.SeedName = (*string)(unsafe.Pointer(in.SeedName)) + out.MigrationStartTime = (*metav1.Time)(unsafe.Pointer(in.MigrationStartTime)) return nil } @@ -2092,6 +2094,7 @@ func autoConvert_v1alpha1_ClusterAutoscaler_To_core_ClusterAutoscaler(in *Cluste out.Expander = (*core.ExpanderMode)(unsafe.Pointer(in.Expander)) out.MaxNodeProvisionTime = (*metav1.Duration)(unsafe.Pointer(in.MaxNodeProvisionTime)) out.MaxGracefulTerminationSeconds = (*int32)(unsafe.Pointer(in.MaxGracefulTerminationSeconds)) + out.IgnoreTaints = *(*[]string)(unsafe.Pointer(&in.IgnoreTaints)) return nil } @@ -2110,6 +2113,7 @@ func autoConvert_core_ClusterAutoscaler_To_v1alpha1_ClusterAutoscaler(in *core.C out.Expander = (*ExpanderMode)(unsafe.Pointer(in.Expander)) out.MaxNodeProvisionTime = (*metav1.Duration)(unsafe.Pointer(in.MaxNodeProvisionTime)) out.MaxGracefulTerminationSeconds = (*int32)(unsafe.Pointer(in.MaxGracefulTerminationSeconds)) + out.IgnoreTaints = *(*[]string)(unsafe.Pointer(&in.IgnoreTaints)) return nil } @@ -5369,6 +5373,7 @@ func autoConvert_v1alpha1_ShootStatus_To_core_ShootStatus(in *ShootStatus, out * out.UID = types.UID(in.UID) out.ClusterIdentity = (*string)(unsafe.Pointer(in.ClusterIdentity)) out.AdvertisedAddresses = *(*[]core.ShootAdvertisedAddress)(unsafe.Pointer(&in.AdvertisedAddresses)) + out.MigrationStartTime = (*metav1.Time)(unsafe.Pointer(in.MigrationStartTime)) return nil } @@ -5388,6 +5393,7 @@ func autoConvert_core_ShootStatus_To_v1alpha1_ShootStatus(in *core.ShootStatus, out.UID = types.UID(in.UID) out.ClusterIdentity = (*string)(unsafe.Pointer(in.ClusterIdentity)) out.AdvertisedAddresses = *(*[]ShootAdvertisedAddress)(unsafe.Pointer(&in.AdvertisedAddresses)) + out.MigrationStartTime = (*metav1.Time)(unsafe.Pointer(in.MigrationStartTime)) return nil } diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/zz_generated.deepcopy.go b/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/zz_generated.deepcopy.go index ce11df540..5ce44ee92 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/zz_generated.deepcopy.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/zz_generated.deepcopy.go @@ -2,7 +2,7 @@ // +build !ignore_autogenerated /* -Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -423,6 +423,10 @@ func (in *BackupEntryStatus) DeepCopyInto(out *BackupEntryStatus) { *out = new(string) **out = **in } + if in.MigrationStartTime != nil { + in, out := &in.MigrationStartTime, &out.MigrationStartTime + *out = (*in).DeepCopy() + } return } @@ -643,6 +647,11 @@ func (in *ClusterAutoscaler) DeepCopyInto(out *ClusterAutoscaler) { *out = new(int32) **out = **in } + if in.IgnoreTaints != nil { + in, out := &in.IgnoreTaints, &out.IgnoreTaints + *out = make([]string, len(*in)) + copy(*out, *in) + } return } @@ -4267,6 +4276,10 @@ func (in *ShootStatus) DeepCopyInto(out *ShootStatus) { *out = make([]ShootAdvertisedAddress, len(*in)) copy(*out, *in) } + if in.MigrationStartTime != nil { + in, out := &in.MigrationStartTime, &out.MigrationStartTime + *out = (*in).DeepCopy() + } return } diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/zz_generated.defaults.go b/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/zz_generated.defaults.go index 18dd7f11b..133b2bbee 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/zz_generated.defaults.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/zz_generated.defaults.go @@ -2,7 +2,7 @@ // +build !ignore_autogenerated /* -Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/constants/types_constants.go b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/constants/types_constants.go index d7565155f..c12f97755 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/constants/types_constants.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/constants/types_constants.go @@ -396,6 +396,8 @@ const ( // Gardener will wait for the specified time after the Infrastructure extension object has been deleted to allow // controllers to gracefully cleanup everything (default behaviour is 300s). AnnotationShootInfrastructureCleanupWaitPeriodSeconds = "shoot.gardener.cloud/infrastructure-cleanup-wait-period-seconds" + // AnnotationShootForceRestore is a key for an annotation on a Shoot or BackupEntry resource to trigger a forceful restoration to a different seed. + AnnotationShootForceRestore = "shoot.gardener.cloud/force-restore" // AnnotationReversedVPN moves the vpn-server to the seed. AnnotationReversedVPN = "alpha.featuregates.shoot.gardener.cloud/reversed-vpn" // AnnotationNodeLocalDNS enables a per node dns cache on the shoot cluster. diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/generated.pb.go b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/generated.pb.go index d39ee3fe6..e7fd0cd50 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/generated.pb.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/generated.pb.go @@ -1,5 +1,5 @@ /* -Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -4191,608 +4191,612 @@ func init() { } var fileDescriptor_ca37af0df9a5bbd2 = []byte{ - // 9607 bytes of a gzipped FileDescriptorProto + // 9677 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x7d, 0x6d, 0x6c, 0x24, 0xc9, - 0x75, 0x98, 0x7a, 0xc8, 0x21, 0x87, 0x6f, 0x48, 0x2e, 0x59, 0xfb, 0x71, 0x3c, 0xde, 0xed, 0xce, - 0xaa, 0xf5, 0x81, 0xbd, 0x9c, 0xc4, 0xf5, 0x9d, 0x24, 0x9f, 0xee, 0x4e, 0xa7, 0x3b, 0xce, 0x0c, - 0x77, 0x77, 0xb4, 0x4b, 0xee, 0x5c, 0xcd, 0x72, 0xef, 0xc3, 0xce, 0x45, 0xcd, 0xee, 0xe2, 0xb0, - 0x8f, 0x3d, 0xdd, 0x73, 0xdd, 0x3d, 0x5c, 0x72, 0x15, 0x43, 0xb6, 0x62, 0xd9, 0x51, 0x9c, 0x04, - 0x86, 0x03, 0x47, 0x90, 0xe4, 0xc4, 0x32, 0x0c, 0x43, 0x0e, 0x1c, 0xd8, 0x4e, 0x02, 0x1b, 0x71, - 0x3e, 0x00, 0xc3, 0x46, 0x60, 0x45, 0x48, 0x02, 0xc5, 0x81, 0x60, 0x05, 0x89, 0xa9, 0x88, 0x01, - 0x94, 0x04, 0xc9, 0x8f, 0x04, 0x46, 0x10, 0x60, 0x61, 0x20, 0x46, 0x7d, 0x74, 0x77, 0xf5, 0x17, - 0x39, 0xec, 0x21, 0xa9, 0xbb, 0x5f, 0xe4, 0xd4, 0xab, 0x7a, 0xaf, 0xba, 0x3e, 0x5e, 0xbd, 0xf7, - 0xea, 0xbd, 0x57, 0x50, 0xef, 0x9a, 0xfe, 0xd6, 0x60, 0x63, 0x49, 0x77, 0x7a, 0xd7, 0xbb, 0x9a, - 0x6b, 0x10, 0x9b, 0xb8, 0xd1, 0x3f, 0xfd, 0xed, 0xee, 0x75, 0xad, 0x6f, 0x7a, 0xd7, 0x75, 0xc7, - 0x25, 0xd7, 0x77, 0x9e, 0xd9, 0x20, 0xbe, 0xf6, 0xcc, 0xf5, 0x2e, 0x85, 0x69, 0x3e, 0x31, 0x96, - 0xfa, 0xae, 0xe3, 0x3b, 0xe8, 0xd9, 0x08, 0xc7, 0x52, 0xd0, 0x34, 0xfa, 0xa7, 0xbf, 0xdd, 0x5d, - 0xa2, 0x38, 0x96, 0x28, 0x8e, 0x25, 0x81, 0x63, 0xf1, 0xa3, 0x32, 0x5d, 0xa7, 0xeb, 0x5c, 0x67, - 0xa8, 0x36, 0x06, 0x9b, 0xec, 0x17, 0xfb, 0xc1, 0xfe, 0xe3, 0x24, 0x16, 0x9f, 0xda, 0xfe, 0xa4, - 0xb7, 0x64, 0x3a, 0xb4, 0x33, 0xd7, 0xb5, 0x81, 0xef, 0x78, 0xba, 0x66, 0x99, 0x76, 0xf7, 0xfa, - 0x4e, 0xaa, 0x37, 0x8b, 0xaa, 0x54, 0x55, 0x74, 0xfb, 0xd0, 0x3a, 0xee, 0x86, 0xa6, 0x67, 0xd5, - 0xf9, 0x78, 0x54, 0xa7, 0xa7, 0xe9, 0x5b, 0xa6, 0x4d, 0xdc, 0xbd, 0x60, 0x40, 0xae, 0xbb, 0xc4, - 0x73, 0x06, 0xae, 0x4e, 0x8e, 0xd5, 0xca, 0xbb, 0xde, 0x23, 0xbe, 0x96, 0x45, 0xeb, 0x7a, 0x5e, - 0x2b, 0x77, 0x60, 0xfb, 0x66, 0x2f, 0x4d, 0xe6, 0x47, 0x8f, 0x6a, 0xe0, 0xe9, 0x5b, 0xa4, 0xa7, - 0xa5, 0xda, 0x7d, 0x2c, 0xaf, 0xdd, 0xc0, 0x37, 0xad, 0xeb, 0xa6, 0xed, 0x7b, 0xbe, 0x9b, 0x6c, - 0xa4, 0x3e, 0x0b, 0xe5, 0x65, 0xc3, 0x70, 0x6c, 0xf4, 0x14, 0x4c, 0x12, 0x5b, 0xdb, 0xb0, 0x88, - 0xb1, 0xa0, 0x5c, 0x55, 0xae, 0x55, 0xea, 0xe7, 0xbe, 0xb9, 0x5f, 0x7b, 0xdf, 0xc1, 0x7e, 0x6d, - 0x72, 0x85, 0x17, 0xe3, 0x00, 0xae, 0xfe, 0x62, 0x09, 0x26, 0x58, 0x23, 0x0f, 0xfd, 0x82, 0x02, - 0xe7, 0xb7, 0x07, 0x1b, 0xc4, 0xb5, 0x89, 0x4f, 0xbc, 0xa6, 0xe6, 0x6d, 0x6d, 0x38, 0x9a, 0xcb, - 0x51, 0x54, 0x9f, 0xbd, 0xb9, 0x74, 0xfc, 0xd5, 0xb3, 0x74, 0x3b, 0x8d, 0xae, 0xfe, 0xd8, 0xc1, - 0x7e, 0xed, 0x7c, 0x06, 0x00, 0x67, 0x11, 0x47, 0x3b, 0x30, 0x6d, 0x77, 0x4d, 0x7b, 0xb7, 0x65, - 0x77, 0x5d, 0xe2, 0x79, 0x0b, 0x25, 0xd6, 0x99, 0x57, 0x8a, 0x74, 0x66, 0x4d, 0xc2, 0x53, 0x9f, - 0x3b, 0xd8, 0xaf, 0x4d, 0xcb, 0x25, 0x38, 0x46, 0x47, 0xfd, 0x19, 0x05, 0xce, 0x2d, 0x1b, 0x3d, - 0xd3, 0xf3, 0x4c, 0xc7, 0x6e, 0x5b, 0x83, 0xae, 0x69, 0xa3, 0xab, 0x30, 0x6e, 0x6b, 0x3d, 0xc2, - 0x06, 0x64, 0xaa, 0x3e, 0x2d, 0xc6, 0x74, 0x7c, 0x4d, 0xeb, 0x11, 0xcc, 0x20, 0xe8, 0x55, 0x98, - 0xd0, 0x1d, 0x7b, 0xd3, 0xec, 0x8a, 0x7e, 0x7e, 0x74, 0x89, 0xcf, 0xe3, 0x92, 0x3c, 0x8f, 0xac, - 0x7b, 0x62, 0xfe, 0x97, 0xb0, 0xf6, 0x60, 0x65, 0xd7, 0x27, 0x36, 0x25, 0x53, 0x87, 0x83, 0xfd, - 0xda, 0x44, 0x83, 0x21, 0xc0, 0x02, 0x91, 0x7a, 0x03, 0x2a, 0xcb, 0x16, 0x71, 0x7d, 0xd3, 0xee, - 0xa2, 0x17, 0x60, 0x96, 0xf4, 0x34, 0xd3, 0xc2, 0x44, 0x27, 0xe6, 0x0e, 0x71, 0xbd, 0x05, 0xe5, - 0xea, 0xd8, 0xb5, 0xa9, 0x3a, 0x3a, 0xd8, 0xaf, 0xcd, 0xae, 0xc4, 0x20, 0x38, 0x51, 0x53, 0xfd, - 0x29, 0x05, 0xaa, 0xcb, 0x03, 0xc3, 0xf4, 0x39, 0x7e, 0xe4, 0x42, 0x55, 0xa3, 0x3f, 0xdb, 0x8e, - 0x65, 0xea, 0x7b, 0x62, 0x92, 0x5f, 0x2e, 0x32, 0xae, 0xcb, 0x11, 0x9a, 0xfa, 0xb9, 0x83, 0xfd, - 0x5a, 0x55, 0x2a, 0xc0, 0x32, 0x11, 0x75, 0x0b, 0x64, 0x18, 0x7a, 0x03, 0xa6, 0xf9, 0x47, 0xae, - 0x6a, 0x7d, 0x4c, 0x36, 0x45, 0x1f, 0x3e, 0x20, 0x8d, 0x59, 0x40, 0x68, 0xe9, 0xee, 0xc6, 0xdb, - 0x44, 0xf7, 0x31, 0xd9, 0x24, 0x2e, 0xb1, 0x75, 0xc2, 0xa7, 0xaf, 0x21, 0x35, 0xc6, 0x31, 0x54, - 0xea, 0xf7, 0x14, 0x98, 0x5b, 0xde, 0xd1, 0x4c, 0x4b, 0xdb, 0x30, 0x2d, 0xd3, 0xdf, 0x7b, 0xd3, - 0xb1, 0xc9, 0x10, 0xf3, 0xb7, 0x0e, 0x8f, 0x0d, 0x6c, 0x8d, 0xb7, 0xb3, 0xc8, 0x2a, 0x9f, 0xb1, - 0x7b, 0x7b, 0x7d, 0x42, 0x17, 0x1e, 0x1d, 0xe9, 0x27, 0x0e, 0xf6, 0x6b, 0x8f, 0xad, 0x67, 0x57, - 0xc1, 0x79, 0x6d, 0x11, 0x86, 0x4b, 0x12, 0xe8, 0xbe, 0x63, 0x0d, 0x7a, 0x02, 0xeb, 0x18, 0xc3, - 0xba, 0x78, 0xb0, 0x5f, 0xbb, 0xb4, 0x9e, 0x59, 0x03, 0xe7, 0xb4, 0x54, 0xbf, 0x59, 0x82, 0xe9, - 0xba, 0xa6, 0x6f, 0x0f, 0xfa, 0xf5, 0x81, 0xbe, 0x4d, 0x7c, 0xf4, 0x59, 0xa8, 0x50, 0xb6, 0x65, - 0x68, 0xbe, 0x26, 0x46, 0xf2, 0x47, 0x72, 0x57, 0x1f, 0x9b, 0x44, 0x5a, 0x3b, 0x1a, 0xdb, 0x55, - 0xe2, 0x6b, 0x75, 0x24, 0xc6, 0x04, 0xa2, 0x32, 0x1c, 0x62, 0x45, 0x9b, 0x30, 0xee, 0xf5, 0x89, - 0x2e, 0xd6, 0x76, 0xb3, 0xc8, 0x5a, 0x91, 0x7b, 0xdc, 0xe9, 0x13, 0x3d, 0x9a, 0x05, 0xfa, 0x0b, - 0x33, 0xfc, 0xc8, 0x86, 0x09, 0xcf, 0xd7, 0xfc, 0x01, 0x1d, 0x1e, 0x4a, 0xe9, 0xc6, 0xc8, 0x94, - 0x18, 0xb6, 0xfa, 0xac, 0xa0, 0x35, 0xc1, 0x7f, 0x63, 0x41, 0x45, 0xfd, 0x13, 0x05, 0xe6, 0xe4, - 0xea, 0x77, 0x4c, 0xcf, 0x47, 0x3f, 0x9e, 0x1a, 0xce, 0xa5, 0xe1, 0x86, 0x93, 0xb6, 0x66, 0x83, - 0x39, 0x27, 0xc8, 0x55, 0x82, 0x12, 0x69, 0x28, 0x09, 0x94, 0x4d, 0x9f, 0xf4, 0xf8, 0xb2, 0x2a, - 0xc8, 0xcf, 0xe4, 0x2e, 0xd7, 0x67, 0x04, 0xb1, 0x72, 0x8b, 0xa2, 0xc5, 0x1c, 0xbb, 0xfa, 0x59, - 0xb8, 0x20, 0xd7, 0x6a, 0xbb, 0xce, 0x8e, 0x69, 0x10, 0x97, 0xee, 0x04, 0x7f, 0xaf, 0x9f, 0xda, - 0x09, 0x74, 0x65, 0x61, 0x06, 0x41, 0x1f, 0x86, 0x09, 0x97, 0x74, 0x4d, 0xc7, 0x66, 0xb3, 0x3d, - 0x15, 0x8d, 0x1d, 0x66, 0xa5, 0x58, 0x40, 0xd5, 0xff, 0x5b, 0x8a, 0x8f, 0x1d, 0x9d, 0x46, 0xb4, - 0x03, 0x95, 0xbe, 0x20, 0x25, 0xc6, 0xee, 0xd6, 0xa8, 0x1f, 0x18, 0x74, 0x3d, 0x1a, 0xd5, 0xa0, - 0x04, 0x87, 0xb4, 0x90, 0x09, 0xb3, 0xc1, 0xff, 0x8d, 0x11, 0xd8, 0x30, 0x63, 0xa7, 0xed, 0x18, - 0x22, 0x9c, 0x40, 0x8c, 0xee, 0xc1, 0x94, 0x47, 0x74, 0x97, 0x50, 0x9e, 0x24, 0x96, 0x69, 0x26, - 0xe3, 0xea, 0x04, 0x95, 0x04, 0xe3, 0x9a, 0x17, 0xdd, 0x9f, 0x0a, 0x01, 0x38, 0x42, 0x84, 0xae, - 0x41, 0xc5, 0x23, 0xc4, 0xa0, 0x1c, 0x69, 0x61, 0x9c, 0xcf, 0x0d, 0xfd, 0xd4, 0x8e, 0x28, 0xc3, - 0x21, 0x54, 0xfd, 0xfa, 0x38, 0xa0, 0xf4, 0x12, 0x97, 0x47, 0x80, 0x97, 0x88, 0xf1, 0x1f, 0x65, - 0x04, 0xc4, 0x6e, 0x49, 0x20, 0x46, 0x0f, 0x61, 0xc6, 0xd2, 0x3c, 0xff, 0x6e, 0x9f, 0xca, 0x20, - 0xc1, 0x42, 0xa9, 0x3e, 0xbb, 0x5c, 0x64, 0xa6, 0xef, 0xc8, 0x88, 0xea, 0xf3, 0x07, 0xfb, 0xb5, - 0x99, 0x58, 0x11, 0x8e, 0x93, 0x42, 0x6f, 0xc3, 0x14, 0x2d, 0x58, 0x71, 0x5d, 0xc7, 0x15, 0xa3, - 0xff, 0x52, 0x51, 0xba, 0x0c, 0x49, 0x7d, 0x86, 0xce, 0x49, 0xf8, 0x13, 0x47, 0xe8, 0xd1, 0x67, - 0x00, 0x39, 0x1b, 0x1e, 0x71, 0x77, 0x88, 0x71, 0x93, 0x0b, 0x5c, 0xf4, 0x63, 0xe9, 0xec, 0x8c, - 0xd5, 0x17, 0xc5, 0x6c, 0xa2, 0xbb, 0xa9, 0x1a, 0x38, 0xa3, 0x15, 0xda, 0x06, 0x14, 0x0a, 0x6d, - 0xe1, 0x02, 0x58, 0x28, 0x0f, 0xbf, 0x7c, 0x2e, 0x51, 0x62, 0x37, 0x53, 0x28, 0x70, 0x06, 0x5a, - 0xf5, 0x5f, 0x95, 0xa0, 0xca, 0x97, 0xc8, 0x8a, 0xed, 0xbb, 0x7b, 0x67, 0x70, 0x40, 0x90, 0xd8, - 0x01, 0xd1, 0x28, 0xbe, 0xe7, 0x59, 0x87, 0x73, 0xcf, 0x87, 0x5e, 0xe2, 0x7c, 0x58, 0x19, 0x95, - 0xd0, 0xe1, 0xc7, 0xc3, 0x77, 0x14, 0x38, 0x27, 0xd5, 0x3e, 0x83, 0xd3, 0xc1, 0x88, 0x9f, 0x0e, - 0x2f, 0x8f, 0xf8, 0x7d, 0x39, 0x87, 0x83, 0x13, 0xfb, 0x2c, 0xc6, 0xb8, 0x9f, 0x05, 0xd8, 0x60, - 0xec, 0x64, 0x2d, 0x92, 0x93, 0xc2, 0x29, 0xaf, 0x87, 0x10, 0x2c, 0xd5, 0x8a, 0xf1, 0xac, 0xd2, - 0xa1, 0x3c, 0xeb, 0xff, 0x94, 0x60, 0x3e, 0x35, 0xec, 0x69, 0x3e, 0xa2, 0xfc, 0x90, 0xf8, 0x48, - 0xe9, 0x87, 0xc1, 0x47, 0xc6, 0x0a, 0xf1, 0x91, 0xe1, 0xcf, 0x89, 0x3f, 0x50, 0x60, 0xac, 0x81, - 0x5b, 0xe8, 0xe9, 0x98, 0xec, 0xfb, 0x98, 0x2c, 0xfb, 0x3e, 0xda, 0xaf, 0x4d, 0x36, 0x70, 0x4b, - 0x12, 0x83, 0xff, 0x96, 0x02, 0xf3, 0xba, 0x63, 0xfb, 0x1a, 0x5d, 0xc4, 0x98, 0x1f, 0x10, 0xc1, - 0x62, 0x2c, 0x24, 0xf6, 0x35, 0x12, 0xc8, 0xea, 0x8f, 0x8b, 0x0e, 0xcc, 0x27, 0x21, 0x1e, 0x4e, - 0x53, 0x56, 0xd7, 0x61, 0xaa, 0x61, 0x39, 0x03, 0xa3, 0x65, 0x6f, 0x3a, 0x27, 0x28, 0xbb, 0x7c, - 0x57, 0x81, 0x69, 0x86, 0xb7, 0xed, 0x3a, 0x9b, 0xa6, 0x45, 0xde, 0x1b, 0x22, 0xb4, 0xdc, 0xe3, - 0x3c, 0x16, 0xc9, 0x44, 0x5a, 0xb9, 0xe2, 0x7b, 0x44, 0xa4, 0x95, 0xbb, 0x9c, 0xc3, 0xb5, 0x7e, - 0x71, 0x32, 0xfe, 0x65, 0x8c, 0x6f, 0x5d, 0x83, 0x8a, 0xae, 0xd5, 0x07, 0xb6, 0x61, 0x85, 0xeb, - 0x82, 0xf6, 0xb2, 0xb1, 0xcc, 0xcb, 0x70, 0x08, 0x45, 0x0f, 0x01, 0x22, 0x33, 0x83, 0x98, 0x86, - 0x1b, 0xa3, 0x99, 0x36, 0x3a, 0xc4, 0xa7, 0xda, 0xb9, 0x17, 0x4d, 0x7d, 0x04, 0xc3, 0x12, 0x35, - 0xf4, 0x13, 0x30, 0x23, 0x06, 0xb9, 0xd5, 0xd3, 0xba, 0x42, 0xfb, 0x2b, 0x38, 0x52, 0xab, 0x12, - 0xa2, 0xfa, 0x45, 0x41, 0x78, 0x46, 0x2e, 0xf5, 0x70, 0x9c, 0x1a, 0xda, 0x83, 0xe9, 0x9e, 0xac, - 0xd1, 0x8e, 0x17, 0x3f, 0x5c, 0x24, 0xed, 0xb6, 0x7e, 0x41, 0x10, 0x9f, 0x8e, 0xe9, 0xc2, 0x31, - 0x52, 0x19, 0x82, 0x79, 0xf9, 0xb4, 0x04, 0x73, 0x02, 0x93, 0x7c, 0x7b, 0x7b, 0x0b, 0x13, 0xec, - 0x03, 0x5f, 0x28, 0xf2, 0x81, 0x9c, 0x53, 0x44, 0x76, 0x33, 0xfe, 0xdb, 0xc3, 0x01, 0x6e, 0xb4, - 0x03, 0xd3, 0x94, 0xc7, 0x76, 0x88, 0x45, 0x74, 0xdf, 0x71, 0x17, 0x26, 0x8b, 0xdb, 0xa5, 0x3a, - 0x12, 0x1e, 0x6e, 0xd8, 0x90, 0x4b, 0x70, 0x8c, 0x4e, 0xc8, 0xfd, 0x2a, 0xb9, 0xdc, 0x6f, 0x00, - 0xd5, 0x1d, 0xc9, 0xc2, 0x30, 0xc5, 0x06, 0xe1, 0xd3, 0x45, 0x3a, 0x16, 0x99, 0x1b, 0xea, 0xe7, - 0x05, 0xa1, 0xaa, 0x6c, 0x9a, 0x90, 0xe9, 0xa8, 0xbf, 0x5e, 0x81, 0xf9, 0x86, 0x35, 0xf0, 0x7c, - 0xe2, 0x2e, 0x0b, 0xc3, 0x2f, 0x71, 0xd1, 0x17, 0x14, 0xb8, 0xc4, 0xfe, 0x6d, 0x3a, 0x0f, 0xec, - 0x26, 0xb1, 0xb4, 0xbd, 0xe5, 0x4d, 0x5a, 0xc3, 0x30, 0x8e, 0xc7, 0x81, 0x9a, 0x03, 0x71, 0xa6, - 0x33, 0x53, 0x49, 0x27, 0x13, 0x23, 0xce, 0xa1, 0x84, 0x7e, 0x4e, 0x81, 0xc7, 0x33, 0x40, 0x4d, - 0x62, 0x11, 0x9f, 0x08, 0x1e, 0x70, 0xdc, 0x7e, 0x5c, 0x3e, 0xd8, 0xaf, 0x3d, 0xde, 0xc9, 0x43, - 0x8a, 0xf3, 0xe9, 0xa1, 0xbf, 0xad, 0xc0, 0x62, 0x06, 0xf4, 0x86, 0x66, 0x5a, 0x03, 0x97, 0x08, - 0x91, 0xf6, 0xb8, 0xdd, 0xb9, 0x72, 0xb0, 0x5f, 0x5b, 0xec, 0xe4, 0x62, 0xc5, 0x87, 0x50, 0x44, - 0x9f, 0x87, 0x8b, 0x21, 0x74, 0xdd, 0xb6, 0x09, 0x31, 0x88, 0x71, 0xcf, 0x14, 0x92, 0xc5, 0xf1, - 0xbb, 0xf2, 0xf8, 0xc1, 0x7e, 0xed, 0x62, 0x27, 0x0b, 0x21, 0xce, 0xa6, 0x83, 0xba, 0x70, 0x39, - 0x02, 0xf8, 0xa6, 0x65, 0x3e, 0x64, 0x98, 0xee, 0x6d, 0xb9, 0xc4, 0xdb, 0x72, 0x2c, 0x83, 0x31, - 0x0b, 0xa5, 0xfe, 0xfe, 0x83, 0xfd, 0xda, 0xe5, 0xce, 0x61, 0x15, 0xf1, 0xe1, 0x78, 0x90, 0x01, - 0xd3, 0x9e, 0xae, 0xd9, 0x2d, 0xdb, 0x27, 0xee, 0x8e, 0x66, 0x2d, 0x4c, 0x14, 0xfa, 0x40, 0xbe, - 0x45, 0x25, 0x3c, 0x38, 0x86, 0x15, 0x7d, 0x12, 0x2a, 0x64, 0xb7, 0xaf, 0xd9, 0x06, 0xe1, 0x6c, - 0x61, 0xaa, 0xfe, 0x24, 0x3d, 0x8c, 0x56, 0x44, 0xd9, 0xa3, 0xfd, 0xda, 0x74, 0xf0, 0xff, 0xaa, - 0x63, 0x10, 0x1c, 0xd6, 0x46, 0x7f, 0x15, 0x2e, 0xf4, 0xb4, 0xdd, 0x35, 0xc7, 0x20, 0x8c, 0xc9, - 0x51, 0x9e, 0xc7, 0x26, 0xa2, 0x52, 0xa8, 0x9f, 0x0b, 0x07, 0xfb, 0xb5, 0x0b, 0xab, 0x19, 0xf8, - 0x70, 0x26, 0x15, 0x3a, 0x0d, 0x3d, 0x6d, 0xf7, 0xa6, 0xab, 0xe9, 0x64, 0x73, 0x60, 0xdd, 0x23, - 0x6e, 0xcf, 0xb4, 0x19, 0xa6, 0x0e, 0xd1, 0x1d, 0xdb, 0xa0, 0xac, 0x44, 0xb9, 0x56, 0xe6, 0xd3, - 0xb0, 0x7a, 0x58, 0x45, 0x7c, 0x38, 0x1e, 0xf5, 0x7f, 0x28, 0x50, 0x15, 0xac, 0x82, 0x49, 0x74, - 0x1b, 0x50, 0xd6, 0xe9, 0x89, 0x2e, 0x58, 0xc2, 0x4b, 0x85, 0x25, 0x07, 0x8a, 0x2d, 0x12, 0x1b, - 0x58, 0x11, 0xe6, 0xa8, 0xd1, 0x4e, 0xc6, 0xb9, 0x5f, 0x1f, 0xed, 0xdc, 0x67, 0xd4, 0x8e, 0x38, - 0xf3, 0xd5, 0xfd, 0x31, 0x98, 0x6a, 0x38, 0xb6, 0x61, 0x32, 0xb9, 0xfd, 0x99, 0x98, 0xec, 0x7a, - 0x59, 0xe6, 0xde, 0x8f, 0xf6, 0x6b, 0x33, 0x61, 0x45, 0x89, 0x9d, 0x3f, 0x1f, 0x2a, 0xbb, 0x5c, - 0x98, 0x7d, 0x7f, 0x5c, 0x4b, 0x7d, 0xb4, 0x5f, 0x3b, 0x17, 0x36, 0x8b, 0x2b, 0xae, 0x68, 0x07, - 0x10, 0x55, 0x3f, 0xee, 0xb9, 0x9a, 0xed, 0x71, 0xb4, 0x74, 0x31, 0x71, 0x06, 0xf3, 0x97, 0x86, - 0x5b, 0x4c, 0xb4, 0x45, 0xa4, 0x9d, 0xdc, 0x49, 0x61, 0xc3, 0x19, 0x14, 0xd0, 0xdb, 0x30, 0x4b, - 0x4b, 0xd7, 0xfb, 0x86, 0xe6, 0x13, 0x89, 0x93, 0x1c, 0x87, 0xe6, 0x25, 0x41, 0x73, 0xf6, 0x4e, - 0x0c, 0x13, 0x4e, 0x60, 0xe6, 0xb2, 0xbe, 0xe6, 0x39, 0x36, 0x63, 0x12, 0x31, 0x59, 0x9f, 0x96, - 0x62, 0x01, 0x45, 0x4f, 0xc1, 0x64, 0x8f, 0x78, 0x9e, 0xd6, 0x25, 0x6c, 0xd7, 0x4f, 0x45, 0x47, - 0xfb, 0x2a, 0x2f, 0xc6, 0x01, 0x1c, 0x7d, 0x04, 0xca, 0xba, 0x63, 0x10, 0x6f, 0x61, 0x92, 0x19, - 0xe7, 0x2f, 0xb1, 0xb5, 0x44, 0x0b, 0x1e, 0xed, 0xd7, 0xa6, 0x98, 0x2e, 0x47, 0x7f, 0x61, 0x5e, - 0x49, 0xfd, 0x65, 0x2a, 0x69, 0x27, 0x34, 0x96, 0x21, 0x74, 0x94, 0xb3, 0x33, 0x55, 0xaa, 0x5f, - 0x2a, 0xc1, 0x05, 0xda, 0x43, 0xd7, 0xb1, 0x2c, 0x7a, 0x0a, 0xf5, 0x2d, 0x67, 0xaf, 0x47, 0xec, - 0xb3, 0xb8, 0x31, 0x08, 0xc6, 0xa1, 0x94, 0x3b, 0x0e, 0xbd, 0xd4, 0x38, 0x8c, 0x15, 0x19, 0x87, - 0x70, 0xb9, 0x1c, 0x31, 0x16, 0xff, 0x4d, 0x81, 0x85, 0xac, 0xb1, 0x38, 0x03, 0xfd, 0xa8, 0x17, - 0xd7, 0x8f, 0x6e, 0x15, 0xd5, 0xa3, 0x93, 0x5d, 0xcf, 0xd1, 0x93, 0x7e, 0x50, 0x82, 0x4b, 0x51, - 0xf5, 0x96, 0xed, 0xf9, 0x9a, 0x65, 0x71, 0xeb, 0xc1, 0xe9, 0xcf, 0x7b, 0x3f, 0xa6, 0xe6, 0xae, - 0x8d, 0xf6, 0xa9, 0x72, 0xdf, 0x73, 0x6d, 0x82, 0xbb, 0x09, 0x9b, 0x60, 0xfb, 0x04, 0x69, 0x1e, - 0x6e, 0x1e, 0xfc, 0x9f, 0x0a, 0x2c, 0x66, 0x37, 0x3c, 0x83, 0x45, 0xe5, 0xc4, 0x17, 0xd5, 0x67, - 0x4e, 0xee, 0xab, 0x73, 0x96, 0xd5, 0x3f, 0x2e, 0xe5, 0x7d, 0x2d, 0x53, 0xc4, 0x37, 0xe1, 0x1c, - 0xd5, 0x90, 0x3c, 0x5f, 0x18, 0xaf, 0x8e, 0x77, 0xab, 0x1b, 0x98, 0xa5, 0xce, 0xe1, 0x38, 0x0e, - 0x9c, 0x44, 0x8a, 0xd6, 0x60, 0x92, 0xaa, 0x45, 0x14, 0x7f, 0x69, 0x78, 0xfc, 0x21, 0xcf, 0xef, - 0xf0, 0xb6, 0x38, 0x40, 0x82, 0x7e, 0x1c, 0x66, 0x8c, 0x70, 0x47, 0x1d, 0x71, 0xa5, 0x93, 0xc4, - 0xca, 0xcc, 0x8c, 0x4d, 0xb9, 0x35, 0x8e, 0x23, 0x53, 0xff, 0x5c, 0x81, 0x27, 0x0f, 0x5b, 0x5b, - 0xe8, 0x1d, 0x00, 0x3d, 0x38, 0xc4, 0xf9, 0xa5, 0x7e, 0x51, 0x31, 0x28, 0xc0, 0x12, 0x6d, 0xd0, - 0xb0, 0xc8, 0xc3, 0x12, 0x91, 0x8c, 0x9b, 0xa2, 0xd2, 0x29, 0xdd, 0x14, 0xa9, 0xff, 0x4b, 0x91, - 0x59, 0x91, 0x3c, 0xb7, 0xef, 0x35, 0x56, 0x24, 0xf7, 0x3d, 0xd7, 0xf6, 0xf6, 0x1f, 0x4a, 0x70, - 0x35, 0xbb, 0x89, 0x74, 0xf6, 0xbe, 0x02, 0x13, 0x7d, 0xee, 0x79, 0x31, 0xc6, 0xce, 0xc6, 0x6b, - 0x94, 0xb3, 0x70, 0xbf, 0x88, 0x47, 0xfb, 0xb5, 0xc5, 0x2c, 0x46, 0x2f, 0x3c, 0x2a, 0x44, 0x3b, - 0x64, 0x26, 0x2c, 0x10, 0x5c, 0xc6, 0xfa, 0xd8, 0x90, 0xcc, 0x45, 0xdb, 0x20, 0xd6, 0xd0, 0x46, - 0x87, 0x9f, 0x52, 0x60, 0x36, 0xb6, 0xa2, 0xbd, 0x85, 0x32, 0x5b, 0xa3, 0x85, 0x8c, 0xf4, 0xb1, - 0xad, 0x12, 0x9d, 0xdc, 0xb1, 0x62, 0x0f, 0x27, 0x08, 0x26, 0xd8, 0xac, 0x3c, 0xaa, 0xef, 0x39, - 0x36, 0x2b, 0x77, 0x3e, 0x87, 0xcd, 0xfe, 0x52, 0x29, 0xef, 0x6b, 0x19, 0x9b, 0x7d, 0x00, 0x53, - 0x81, 0x67, 0x5b, 0xc0, 0x2e, 0x6e, 0x8c, 0xda, 0x27, 0x8e, 0x2e, 0xba, 0xa0, 0x0e, 0x4a, 0x3c, - 0x1c, 0xd1, 0x42, 0x3f, 0xad, 0x00, 0x44, 0x13, 0x23, 0x36, 0xd5, 0xbd, 0x93, 0x1b, 0x0e, 0x49, - 0xac, 0x99, 0xa5, 0x5b, 0x5a, 0x5a, 0x14, 0x12, 0x5d, 0xf5, 0xb7, 0x4b, 0x80, 0xd2, 0x7d, 0xa7, - 0xe2, 0xe6, 0xb6, 0x69, 0x1b, 0x49, 0xb1, 0xfb, 0xb6, 0x69, 0x1b, 0x98, 0x41, 0x86, 0x10, 0x48, - 0x5f, 0x82, 0x73, 0x5d, 0xcb, 0xd9, 0xd0, 0x2c, 0x6b, 0x4f, 0x38, 0xcb, 0xb1, 0x1d, 0x5a, 0xa9, - 0x9f, 0xa7, 0x07, 0xd3, 0xcd, 0x38, 0x08, 0x27, 0xeb, 0xa2, 0x3e, 0xcc, 0xb9, 0x54, 0xcd, 0xd5, - 0x4d, 0x8b, 0x29, 0x28, 0xce, 0xc0, 0x2f, 0x68, 0x47, 0xb9, 0x70, 0xb0, 0x5f, 0x9b, 0xc3, 0x09, - 0x5c, 0x38, 0x85, 0x1d, 0x7d, 0x08, 0x26, 0xfb, 0xae, 0xd9, 0xd3, 0xdc, 0x3d, 0xa6, 0x02, 0x55, - 0xea, 0x55, 0x7a, 0xc2, 0xb5, 0x79, 0x11, 0x0e, 0x60, 0xea, 0xd7, 0x14, 0x18, 0x6b, 0xae, 0x75, - 0x90, 0x0a, 0x13, 0x86, 0xd3, 0xd3, 0x4c, 0x5b, 0x8c, 0x12, 0xf3, 0x39, 0x6b, 0xb2, 0x12, 0x2c, - 0x20, 0xa8, 0x0f, 0x53, 0x01, 0x0b, 0x1f, 0xe9, 0x0e, 0xb2, 0xb9, 0xd6, 0x09, 0xfd, 0x36, 0xc2, - 0x75, 0x15, 0x94, 0x78, 0x38, 0x22, 0xa2, 0x6a, 0x30, 0xdf, 0x5c, 0xeb, 0xb4, 0x6c, 0xdd, 0x1a, - 0x18, 0x64, 0x65, 0x97, 0xfd, 0xa1, 0x5f, 0x66, 0xf2, 0x12, 0xe1, 0xe7, 0xc6, 0xbe, 0x4c, 0x54, - 0xc2, 0x01, 0x8c, 0x56, 0x23, 0xbc, 0x85, 0x70, 0xd2, 0x62, 0xd5, 0x04, 0x12, 0x1c, 0xc0, 0xd4, - 0xef, 0x96, 0xa0, 0x2a, 0x75, 0x08, 0x59, 0x30, 0xc9, 0x3f, 0x37, 0xf0, 0x91, 0x58, 0x29, 0xf8, - 0x89, 0xf1, 0x5e, 0x73, 0xea, 0x7c, 0x40, 0x3d, 0x1c, 0x90, 0x90, 0x67, 0xa9, 0x94, 0x3f, 0x4b, - 0x68, 0x09, 0x80, 0x7b, 0x83, 0xb0, 0xab, 0x3d, 0x7e, 0x34, 0xb0, 0x8d, 0xd0, 0x09, 0x4b, 0xb1, - 0x54, 0x03, 0x3d, 0x29, 0xd6, 0x33, 0xbf, 0x04, 0xac, 0x24, 0xd6, 0xf2, 0x26, 0x94, 0x1f, 0x3a, - 0x36, 0xf1, 0x84, 0xb5, 0xfd, 0x84, 0x3e, 0x70, 0x8a, 0x72, 0xab, 0x37, 0x29, 0x5e, 0xcc, 0xd1, - 0xab, 0xbf, 0xa2, 0x00, 0x34, 0x35, 0x5f, 0xe3, 0xc6, 0xe1, 0x21, 0xfc, 0xec, 0x9e, 0x8c, 0x6d, - 0xc3, 0x4a, 0xea, 0xfe, 0x6e, 0xdc, 0x33, 0x1f, 0x06, 0x9f, 0x1f, 0x1e, 0xef, 0x1c, 0x7b, 0xc7, - 0x7c, 0x48, 0x30, 0x83, 0xa3, 0xa7, 0x61, 0x8a, 0xd8, 0xba, 0xbb, 0xd7, 0xf7, 0x89, 0xc1, 0x46, - 0xa0, 0xc2, 0xaf, 0x5f, 0x57, 0x82, 0x42, 0x1c, 0xc1, 0xd5, 0x67, 0x20, 0x2e, 0xa3, 0x1d, 0xdd, - 0x4b, 0x75, 0x07, 0x2a, 0x2b, 0xb6, 0xd1, 0x77, 0x4c, 0xdb, 0x1f, 0xe2, 0x9b, 0x2e, 0xc3, 0xd8, - 0xc0, 0xb5, 0xc4, 0x27, 0x55, 0x45, 0x85, 0xb1, 0x75, 0x7c, 0x07, 0xd3, 0x72, 0xf4, 0x14, 0x4c, - 0xf6, 0x07, 0x6e, 0xdf, 0xf1, 0x82, 0xef, 0x0a, 0x85, 0xd1, 0x36, 0x2f, 0xc6, 0x01, 0x5c, 0x7d, - 0xa4, 0xc0, 0xdc, 0xca, 0x6e, 0xdf, 0x74, 0x99, 0xcf, 0x1f, 0x71, 0xa9, 0xa0, 0x45, 0xdb, 0xef, - 0xf0, 0x7f, 0x45, 0x1f, 0xc2, 0xf6, 0xa2, 0x06, 0x0e, 0xe0, 0x68, 0x13, 0x66, 0x09, 0x6b, 0xce, - 0x38, 0xaa, 0x16, 0xda, 0xb8, 0x8f, 0x63, 0x7f, 0xe1, 0x2e, 0xa5, 0x31, 0x2c, 0x38, 0x81, 0x15, - 0x75, 0x60, 0x56, 0xb7, 0x34, 0xcf, 0x33, 0x37, 0x4d, 0x3d, 0xba, 0xcd, 0x9e, 0xaa, 0x3f, 0x4d, - 0xdb, 0x36, 0x62, 0x90, 0x47, 0xfb, 0xb5, 0x8b, 0xa2, 0x9f, 0x71, 0x00, 0x4e, 0xa0, 0x50, 0xff, - 0x40, 0x81, 0xa9, 0x50, 0xbc, 0x7c, 0x57, 0x19, 0x52, 0xd0, 0x35, 0xa8, 0x18, 0xa6, 0x27, 0x9f, - 0x09, 0xec, 0x96, 0xb1, 0x29, 0xca, 0x70, 0x08, 0x55, 0x3d, 0xa8, 0xdc, 0x14, 0xdb, 0x0a, 0x2d, - 0x42, 0xc9, 0x0c, 0x8e, 0x24, 0x10, 0x1f, 0x50, 0x6a, 0x35, 0x71, 0xc9, 0x34, 0xc2, 0x55, 0x55, - 0xca, 0x5d, 0x55, 0xd2, 0xb4, 0x8f, 0x1d, 0x3e, 0xed, 0xea, 0x6f, 0x2a, 0x50, 0xbd, 0x65, 0x6e, - 0x10, 0x97, 0x5b, 0x5b, 0x19, 0x5f, 0x8c, 0x79, 0x81, 0x57, 0xb3, 0x3c, 0xc0, 0xd1, 0x2e, 0x4c, - 0x79, 0xfa, 0x16, 0x31, 0x06, 0x56, 0x78, 0xc7, 0x5f, 0xc8, 0xd7, 0x5b, 0x22, 0xdd, 0x11, 0xf8, - 0x24, 0x6f, 0xb7, 0x80, 0x02, 0x8e, 0x88, 0xa9, 0x9f, 0x83, 0xf3, 0x19, 0x8d, 0x50, 0x0d, 0xca, - 0x9e, 0xaf, 0xb9, 0xbe, 0x18, 0x33, 0xc6, 0x6e, 0x3a, 0xb4, 0x00, 0xf3, 0x72, 0xf4, 0x38, 0x8c, - 0x11, 0xdb, 0x10, 0x83, 0x36, 0x49, 0x77, 0xd9, 0x8a, 0x6d, 0x60, 0x5a, 0x46, 0xa7, 0xc8, 0x72, - 0x62, 0x8b, 0x91, 0x4d, 0xd1, 0x1d, 0x51, 0x86, 0x43, 0xa8, 0xfa, 0xcf, 0xc6, 0xe1, 0xf2, 0x2d, - 0xc7, 0x35, 0x1f, 0x3a, 0xb6, 0xaf, 0x59, 0x6d, 0xc7, 0x88, 0x6e, 0xad, 0xc4, 0x74, 0x7f, 0x51, - 0x81, 0xc7, 0xf4, 0xfe, 0xa0, 0x65, 0x9b, 0xbe, 0xa9, 0x05, 0x97, 0x09, 0x6d, 0xe2, 0x9a, 0x4e, - 0xd1, 0xcb, 0x2b, 0xe6, 0x3d, 0xdc, 0x68, 0xaf, 0x67, 0xa1, 0xc4, 0x79, 0xb4, 0xd8, 0x1d, 0x9a, - 0xe1, 0x3c, 0xb0, 0x59, 0xe7, 0x3a, 0x3e, 0xf3, 0x68, 0x7e, 0x18, 0x7d, 0x62, 0xc1, 0x3b, 0xb4, - 0x66, 0x26, 0x46, 0x9c, 0x43, 0x09, 0x7d, 0x1e, 0x2e, 0x9a, 0xbc, 0x73, 0x98, 0x68, 0x86, 0x69, - 0x13, 0xcf, 0x63, 0x37, 0x49, 0xa3, 0x5c, 0x12, 0xb5, 0xb2, 0x10, 0xe2, 0x6c, 0x3a, 0xe8, 0x2d, - 0x00, 0x6f, 0xcf, 0xd6, 0xc5, 0xf8, 0x97, 0x0b, 0x51, 0xe5, 0x27, 0x69, 0x88, 0x05, 0x4b, 0x18, - 0xe9, 0x61, 0xe2, 0x3b, 0x16, 0x71, 0x35, 0x5b, 0xe7, 0x26, 0x62, 0x85, 0x1f, 0x26, 0xf7, 0x82, - 0x42, 0x1c, 0xc1, 0xd5, 0x7f, 0xa8, 0xc0, 0xa4, 0x88, 0x14, 0x40, 0x1f, 0x4e, 0x08, 0x54, 0xa1, - 0x9d, 0x28, 0x21, 0x54, 0xed, 0x31, 0x1d, 0x5f, 0x88, 0xac, 0x82, 0x49, 0x15, 0x3a, 0x91, 0x05, - 0xe1, 0x48, 0xfe, 0x8d, 0xe9, 0xfa, 0x81, 0x4c, 0x2c, 0x11, 0x53, 0xbf, 0xae, 0xc0, 0x7c, 0xaa, - 0xd5, 0x10, 0xd2, 0xf2, 0x19, 0x1a, 0xa9, 0xff, 0xa4, 0x0a, 0x2c, 0x28, 0x64, 0xb9, 0xdd, 0xea, - 0x10, 0x77, 0x27, 0xdc, 0x84, 0x7f, 0x43, 0x81, 0xb9, 0xe8, 0x3a, 0x45, 0xf4, 0x42, 0x29, 0xee, - 0x3d, 0x73, 0x3b, 0x81, 0xab, 0xbe, 0x20, 0xbe, 0x7b, 0x2e, 0x09, 0xc1, 0x29, 0xba, 0xe8, 0x4b, - 0x0a, 0xcc, 0x69, 0xf1, 0xa0, 0x90, 0x80, 0x65, 0x16, 0x72, 0x76, 0x4c, 0x04, 0x98, 0x44, 0x7d, - 0x49, 0x00, 0x3c, 0x9c, 0x22, 0x8b, 0x3e, 0x0e, 0xd3, 0x5a, 0xdf, 0x5c, 0x1e, 0x18, 0x26, 0xb1, - 0xf5, 0x30, 0x92, 0x80, 0x69, 0xf2, 0xcb, 0xed, 0x56, 0x58, 0x8e, 0x63, 0xb5, 0xc2, 0xa8, 0x0f, - 0x31, 0x90, 0xe3, 0x23, 0x46, 0x7d, 0x88, 0x31, 0x8c, 0xa2, 0x3e, 0xc4, 0xd0, 0xc9, 0x44, 0xd0, - 0x8f, 0xc1, 0xe3, 0xfc, 0xac, 0xa9, 0x6b, 0x9e, 0xa9, 0x2f, 0x0f, 0xfc, 0x2d, 0x62, 0xfb, 0x81, - 0xc4, 0xc0, 0x55, 0x16, 0x76, 0x9b, 0xbe, 0x92, 0x57, 0x09, 0xe7, 0xb7, 0x47, 0x36, 0x80, 0x63, - 0x1a, 0xba, 0xf8, 0x1e, 0x7e, 0xa1, 0x5b, 0xc8, 0xd9, 0xe1, 0x6e, 0xab, 0xd9, 0x10, 0x9f, 0xc3, - 0xd8, 0x44, 0xf4, 0x1b, 0x4b, 0x14, 0xd0, 0x97, 0x15, 0x98, 0x11, 0x8b, 0x5c, 0xd0, 0x9c, 0x64, - 0xf3, 0xff, 0x66, 0xd1, 0xc5, 0x98, 0x58, 0xf0, 0x4b, 0x58, 0x46, 0xce, 0xdd, 0x37, 0x43, 0xf7, - 0x9e, 0x18, 0x0c, 0xc7, 0xfb, 0x81, 0xfe, 0xae, 0x02, 0x17, 0x3c, 0xe2, 0xee, 0x98, 0x3a, 0x59, - 0xd6, 0x75, 0x67, 0x60, 0x07, 0x93, 0x5c, 0x29, 0xee, 0x81, 0xdf, 0xc9, 0xc0, 0xc7, 0xef, 0x95, - 0xb3, 0x20, 0x38, 0x93, 0x3e, 0x3d, 0xbf, 0xce, 0x3d, 0xd0, 0x7c, 0x7d, 0xab, 0xa1, 0xe9, 0x5b, - 0x4c, 0x7e, 0xe7, 0x57, 0xc9, 0x05, 0x37, 0xcd, 0x6b, 0x71, 0x54, 0x5c, 0x2f, 0x4f, 0x14, 0xe2, - 0x24, 0x41, 0xe4, 0x41, 0xc5, 0x25, 0xef, 0x0c, 0x88, 0xe7, 0x7b, 0x0b, 0xc0, 0x88, 0xb7, 0x46, - 0x9e, 0x31, 0x2c, 0x10, 0x72, 0x19, 0x23, 0xf8, 0x85, 0x43, 0x42, 0xa8, 0x0b, 0x97, 0xf9, 0xca, - 0x5d, 0xb6, 0x1d, 0x7b, 0xaf, 0xe7, 0x0c, 0xbc, 0xc4, 0xea, 0xaf, 0xb2, 0xd5, 0xcf, 0x6e, 0xd4, - 0x57, 0x0e, 0xab, 0x88, 0x0f, 0xc7, 0x83, 0x5e, 0x87, 0x0a, 0xd9, 0x21, 0xb6, 0x7f, 0xef, 0xde, - 0x9d, 0x85, 0xe9, 0x42, 0x47, 0x23, 0xfb, 0x84, 0x15, 0x81, 0x03, 0x87, 0xd8, 0x16, 0x5f, 0x01, - 0x94, 0x5e, 0x91, 0x68, 0x0e, 0xc6, 0xb6, 0x09, 0x0f, 0x1a, 0x9b, 0xc2, 0xf4, 0x5f, 0x74, 0x01, - 0xca, 0x3b, 0x9a, 0x35, 0xe0, 0xa2, 0x6c, 0x05, 0xf3, 0x1f, 0x2f, 0x94, 0x3e, 0xa9, 0xa8, 0xbf, - 0xab, 0xc0, 0xc5, 0xcc, 0x61, 0x43, 0x18, 0x2e, 0x31, 0x47, 0x04, 0x7b, 0x75, 0xe0, 0x6b, 0xbe, - 0x69, 0x77, 0x5b, 0xf6, 0xa6, 0x65, 0x76, 0xb7, 0xb8, 0xe4, 0x57, 0xe6, 0x72, 0xca, 0x6a, 0x66, - 0x0d, 0x9c, 0xd3, 0x12, 0xb5, 0xe0, 0x7c, 0x4f, 0xdb, 0x4d, 0x21, 0x2c, 0x31, 0x84, 0x2c, 0xf4, - 0x70, 0x35, 0x0d, 0xc6, 0x59, 0x6d, 0xd4, 0xaf, 0x96, 0xe1, 0x09, 0xda, 0xf1, 0xe8, 0xc8, 0x5c, - 0xd5, 0x6c, 0xad, 0xfb, 0xee, 0x3c, 0x9a, 0x7e, 0x53, 0x81, 0xc7, 0xb6, 0xb2, 0xc5, 0x59, 0x71, - 0x68, 0xbf, 0x5a, 0x48, 0xa8, 0x3f, 0x4c, 0x42, 0xe6, 0x0b, 0xf7, 0xd0, 0x2a, 0x38, 0xaf, 0x53, - 0xe8, 0x15, 0x98, 0xb3, 0x1d, 0x83, 0x34, 0x5a, 0x4d, 0xbc, 0xaa, 0x79, 0xdb, 0x9d, 0x40, 0xe1, - 0x2f, 0x73, 0xc3, 0xd7, 0x5a, 0x02, 0x86, 0x53, 0xb5, 0xd1, 0x0e, 0xa0, 0xbe, 0x63, 0xac, 0xec, - 0x98, 0x7a, 0xe0, 0x79, 0x50, 0xdc, 0xd8, 0xc6, 0xe2, 0x2a, 0xda, 0x29, 0x6c, 0x38, 0x83, 0x02, - 0x93, 0xc7, 0x69, 0x67, 0x56, 0x1d, 0xdb, 0xf4, 0x1d, 0x97, 0x39, 0xba, 0x8c, 0x24, 0x96, 0xb2, - 0x75, 0xbe, 0x96, 0x89, 0x11, 0xe7, 0x50, 0x52, 0xff, 0xb7, 0x02, 0xe7, 0xe8, 0xb2, 0x68, 0xbb, - 0xce, 0xee, 0xde, 0xbb, 0x71, 0x41, 0x3e, 0x05, 0xe3, 0x3d, 0xc7, 0x08, 0x54, 0xdb, 0x8b, 0x54, - 0xb2, 0x5c, 0x75, 0x0c, 0xf2, 0x88, 0x5b, 0x00, 0x77, 0xf7, 0x98, 0xeb, 0x13, 0xab, 0x22, 0x2b, - 0xaa, 0x63, 0xf9, 0x8a, 0xaa, 0xfa, 0x9f, 0x14, 0x2e, 0x22, 0x06, 0x8a, 0xe2, 0xbb, 0x72, 0x1f, - 0x3e, 0x07, 0x33, 0xb4, 0x6c, 0x55, 0xdb, 0x6d, 0x37, 0xef, 0x3b, 0x56, 0xe0, 0xb5, 0xc3, 0xee, - 0x08, 0x6f, 0xcb, 0x00, 0x1c, 0xaf, 0xa7, 0xfe, 0xda, 0x39, 0x60, 0x15, 0x2c, 0xe2, 0xbf, 0x1b, - 0xbf, 0xeb, 0x19, 0xa8, 0xea, 0xfd, 0x41, 0xe3, 0x46, 0xe7, 0xd5, 0x81, 0xe3, 0x6b, 0xc2, 0x86, - 0xc9, 0xe4, 0xbe, 0x46, 0x7b, 0x3d, 0x28, 0xc6, 0x72, 0x1d, 0xba, 0xc3, 0xf5, 0xfe, 0x40, 0xf0, - 0xcc, 0xb6, 0x7c, 0xd9, 0xc5, 0x76, 0x78, 0xa3, 0xbd, 0x1e, 0x83, 0xe1, 0x54, 0x6d, 0xf4, 0x79, - 0x98, 0x26, 0x62, 0xf3, 0xdd, 0xd2, 0x5c, 0x43, 0xec, 0xed, 0xc2, 0x07, 0x77, 0x38, 0xb4, 0xc1, - 0x8e, 0xe6, 0xe2, 0xf2, 0x8a, 0x44, 0x02, 0xc7, 0x08, 0x32, 0xd1, 0x55, 0xfc, 0xa6, 0x33, 0xe5, - 0x18, 0xc9, 0xcd, 0x5e, 0x16, 0xa2, 0x6b, 0x5e, 0x25, 0x9c, 0xdf, 0x1e, 0xfd, 0x86, 0x02, 0x97, - 0x42, 0xa8, 0x69, 0x9b, 0xbd, 0x41, 0x0f, 0x13, 0xdd, 0xd2, 0xcc, 0x9e, 0x90, 0x63, 0x5f, 0x3b, - 0xb1, 0x0f, 0x8d, 0xa3, 0xe7, 0x0c, 0x27, 0x1b, 0x86, 0x73, 0xba, 0x84, 0xbe, 0xae, 0xc0, 0xd5, - 0x00, 0xd4, 0xa6, 0x9a, 0xe4, 0xc0, 0x25, 0x91, 0xdf, 0x97, 0x18, 0x92, 0xc9, 0x42, 0xfc, 0xef, - 0x83, 0x07, 0xfb, 0xb5, 0xab, 0x2b, 0x47, 0xe0, 0xc6, 0x47, 0x52, 0x97, 0x97, 0x4b, 0xc7, 0xd9, - 0xf4, 0x85, 0xe0, 0x7b, 0x5a, 0xcb, 0x85, 0x92, 0xc0, 0x31, 0x82, 0xe8, 0xb7, 0x14, 0x78, 0x4c, - 0x2e, 0x90, 0x57, 0x0b, 0x97, 0x78, 0x5f, 0x3f, 0xb1, 0xce, 0x24, 0xf0, 0x73, 0xdb, 0x52, 0x0e, - 0x10, 0xe7, 0xf5, 0x8a, 0xb2, 0xde, 0x1e, 0x5b, 0x98, 0x5c, 0x2a, 0x2e, 0x73, 0xd6, 0xcb, 0xd7, - 0xaa, 0x87, 0x03, 0x18, 0x55, 0x36, 0xfb, 0x8e, 0xd1, 0x36, 0x0d, 0xef, 0x8e, 0xd9, 0x33, 0x7d, - 0x26, 0xb7, 0x8e, 0xf1, 0xe1, 0x68, 0x3b, 0x46, 0xbb, 0xd5, 0xe4, 0xe5, 0x38, 0x56, 0x8b, 0xf9, - 0x5d, 0x9b, 0x3d, 0xad, 0x4b, 0xda, 0x03, 0xcb, 0x6a, 0xbb, 0x0e, 0x33, 0x40, 0x34, 0x89, 0x66, - 0x58, 0xa6, 0x4d, 0x0a, 0xca, 0xa9, 0x6c, 0xbb, 0xb5, 0xf2, 0x90, 0xe2, 0x7c, 0x7a, 0x68, 0x09, - 0x60, 0x53, 0x33, 0xad, 0xce, 0x03, 0xad, 0x7f, 0xd7, 0x5e, 0x98, 0x61, 0x0c, 0x8c, 0x69, 0x7a, - 0x37, 0xc2, 0x52, 0x2c, 0xd5, 0xa0, 0xab, 0x89, 0x72, 0x41, 0x4c, 0x78, 0xf4, 0xd5, 0xc2, 0xec, - 0x09, 0xad, 0xa6, 0x00, 0x21, 0x1f, 0xbe, 0xdb, 0x12, 0x09, 0x1c, 0x23, 0x88, 0xbe, 0xa8, 0xc0, - 0xac, 0xb7, 0xe7, 0xf9, 0xa4, 0x17, 0xf6, 0xe1, 0xdc, 0x49, 0xf7, 0x81, 0x99, 0x66, 0x3a, 0x31, - 0x22, 0x38, 0x41, 0x14, 0x69, 0xf0, 0x04, 0x1b, 0xd5, 0x9b, 0x8d, 0x5b, 0x66, 0x77, 0x2b, 0xf4, - 0xa6, 0x6e, 0x13, 0x57, 0x27, 0xb6, 0xbf, 0x30, 0xc7, 0xd6, 0x4d, 0xed, 0x60, 0xbf, 0xf6, 0x44, - 0x2b, 0xbf, 0x1a, 0x3e, 0x0c, 0x07, 0x7a, 0x0b, 0x16, 0x05, 0xf8, 0x8e, 0xf3, 0x20, 0x45, 0x61, - 0x9e, 0x51, 0x60, 0x2e, 0xee, 0xad, 0xdc, 0x5a, 0xf8, 0x10, 0x0c, 0x54, 0x2b, 0xf0, 0x88, 0xcb, - 0x2c, 0xab, 0x24, 0x5c, 0x3c, 0xde, 0x02, 0x62, 0x8b, 0x80, 0x69, 0x05, 0x9d, 0x34, 0x18, 0x67, - 0xb5, 0x51, 0xf7, 0x4b, 0x5c, 0x9d, 0x49, 0x6d, 0x48, 0xf4, 0x12, 0x9c, 0xeb, 0x91, 0x9e, 0xe3, - 0xee, 0x2d, 0x07, 0xf9, 0x1a, 0x84, 0x69, 0x8d, 0x69, 0xa8, 0xab, 0x71, 0x10, 0x4e, 0xd6, 0xa5, - 0xc7, 0x25, 0xfb, 0x82, 0x1b, 0x9d, 0xa8, 0x7d, 0x29, 0x3a, 0x2e, 0x5b, 0x09, 0x18, 0x4e, 0xd5, - 0x46, 0x0d, 0x98, 0x17, 0x65, 0x2d, 0x2a, 0x35, 0x7a, 0x37, 0x5c, 0x12, 0x5c, 0x36, 0x51, 0xf9, - 0x6b, 0xbe, 0x95, 0x04, 0xe2, 0x74, 0x7d, 0xfa, 0x15, 0xf4, 0x87, 0xdc, 0x8b, 0xf1, 0xe8, 0x2b, - 0xd6, 0xe2, 0x20, 0x9c, 0xac, 0x1b, 0x88, 0xf5, 0xb1, 0x2e, 0x94, 0xa3, 0xaf, 0x58, 0x4b, 0xc0, - 0x70, 0xaa, 0xb6, 0xfa, 0x9f, 0xc7, 0xe1, 0x03, 0x43, 0x1c, 0x62, 0xa8, 0x97, 0x3d, 0xdc, 0x47, - 0xb0, 0x94, 0xa5, 0xc0, 0x97, 0x61, 0xe9, 0xd5, 0x81, 0x66, 0xfb, 0xa6, 0xbf, 0x37, 0xe4, 0xf4, - 0xf4, 0x73, 0xa6, 0xe7, 0xf8, 0xf4, 0x86, 0x9d, 0x4e, 0x2f, 0x6f, 0x3a, 0x8f, 0x4f, 0x72, 0xf8, - 0xe9, 0xef, 0x65, 0x4f, 0x7f, 0xc1, 0x51, 0x3d, 0x72, 0xb9, 0xf4, 0x73, 0x96, 0x4b, 0xc1, 0x51, - 0x1d, 0x62, 0x79, 0xfd, 0xe9, 0x38, 0x7c, 0x70, 0x98, 0x03, 0xb5, 0xe0, 0xfa, 0xca, 0x38, 0xb2, - 0x4e, 0x75, 0x7d, 0xe5, 0x39, 0x8e, 0x9c, 0xe2, 0xfa, 0xca, 0x20, 0x79, 0xda, 0xeb, 0x2b, 0x6f, - 0x54, 0x4f, 0x6b, 0x7d, 0xe5, 0x8d, 0xea, 0x10, 0xeb, 0xeb, 0xcf, 0x92, 0xe7, 0x43, 0x78, 0x8e, - 0xb6, 0x60, 0x4c, 0xef, 0x0f, 0x0a, 0x32, 0x29, 0x76, 0xcd, 0xd9, 0x68, 0xaf, 0x63, 0x8a, 0x03, - 0x61, 0x98, 0xe0, 0xeb, 0xa7, 0x20, 0x0b, 0x62, 0x4e, 0x3f, 0x7c, 0x49, 0x62, 0x81, 0x89, 0x0e, - 0x15, 0xe9, 0x6f, 0x91, 0x1e, 0x71, 0x35, 0xab, 0xe3, 0x3b, 0xae, 0xd6, 0x2d, 0xca, 0x6d, 0xd8, - 0x50, 0xad, 0x24, 0x70, 0xe1, 0x14, 0x76, 0x3a, 0x20, 0x7d, 0xd3, 0x28, 0xc8, 0x5f, 0xd8, 0x80, - 0xb4, 0x5b, 0x4d, 0x4c, 0x71, 0xa8, 0x7f, 0x58, 0x01, 0x29, 0x02, 0x87, 0xea, 0x6d, 0x9a, 0x65, - 0x39, 0x0f, 0xda, 0xae, 0xb9, 0x63, 0x5a, 0xa4, 0x4b, 0x8c, 0x30, 0x44, 0xc3, 0x13, 0x97, 0xe1, - 0x4c, 0x90, 0x5c, 0xce, 0xab, 0x84, 0xf3, 0xdb, 0x53, 0xbd, 0x7c, 0x5e, 0x4f, 0x46, 0x3a, 0x8e, - 0x72, 0xa1, 0x97, 0x0a, 0x9b, 0xe4, 0xfb, 0x29, 0x55, 0x8c, 0xd3, 0x64, 0xd1, 0x4f, 0x2a, 0xdc, - 0xe0, 0x10, 0x5a, 0x57, 0xc5, 0x9c, 0xdd, 0x3c, 0xa1, 0xfb, 0x88, 0xc8, 0x72, 0x11, 0xd9, 0x6f, - 0xe3, 0x04, 0xa9, 0x66, 0x78, 0x71, 0x3b, 0xcb, 0x4e, 0x2a, 0x66, 0xf6, 0x6e, 0xd1, 0xae, 0xe4, - 0x18, 0x5e, 0xf9, 0xe5, 0x71, 0x66, 0x05, 0x9c, 0xdd, 0x91, 0x70, 0x94, 0x42, 0xd3, 0x91, 0x60, - 0x02, 0x85, 0x47, 0x29, 0x61, 0x83, 0x8a, 0x46, 0x29, 0x04, 0xe0, 0x38, 0x41, 0xd4, 0x87, 0xa9, - 0xed, 0xc0, 0x5e, 0x27, 0xf4, 0xfb, 0x46, 0x51, 0xea, 0x92, 0xd1, 0x8f, 0x5f, 0x52, 0x87, 0x85, - 0x38, 0x22, 0x82, 0xb6, 0x60, 0x72, 0x9b, 0x33, 0x22, 0xa1, 0x97, 0x2f, 0x8f, 0xac, 0x37, 0x70, - 0xf5, 0x50, 0x14, 0xe1, 0x00, 0xbd, 0xec, 0xa4, 0x52, 0x39, 0xc2, 0x37, 0xe9, 0xab, 0x0a, 0x5c, - 0xdc, 0x21, 0xae, 0x6f, 0xea, 0x49, 0x2b, 0xf5, 0x54, 0x71, 0xdd, 0xe6, 0x7e, 0x16, 0x42, 0xbe, - 0x4c, 0x32, 0x41, 0x38, 0xbb, 0x0b, 0xea, 0x0f, 0x14, 0x48, 0xd9, 0xc2, 0xd0, 0xcf, 0x2b, 0x30, - 0xbd, 0x49, 0x34, 0x7f, 0xe0, 0x92, 0x9b, 0x9a, 0x1f, 0xfa, 0xdb, 0xde, 0x3f, 0x09, 0x13, 0xdc, - 0xd2, 0x0d, 0x09, 0x31, 0xbf, 0xec, 0x0b, 0xc3, 0xe9, 0x65, 0x10, 0x8e, 0xf5, 0x60, 0xf1, 0x65, - 0x98, 0x4f, 0x35, 0x3c, 0xd6, 0x9d, 0xcc, 0xbf, 0x14, 0xa6, 0xd4, 0x64, 0xb6, 0xc5, 0xb7, 0xa0, - 0xac, 0x19, 0x46, 0x98, 0xcb, 0xe9, 0xf9, 0x62, 0x97, 0xda, 0x86, 0xec, 0xd6, 0xcc, 0x7e, 0x62, - 0x8e, 0x16, 0xdd, 0x00, 0xa4, 0xc5, 0x6e, 0xae, 0x56, 0x1d, 0x23, 0xd0, 0x92, 0x98, 0x09, 0x7e, - 0x39, 0x05, 0xc5, 0x19, 0x2d, 0xd4, 0x17, 0x61, 0x36, 0x1e, 0x87, 0x79, 0x0c, 0xf7, 0x38, 0xf5, - 0xaf, 0x2b, 0x80, 0xd2, 0xd9, 0x1b, 0x90, 0x0b, 0x15, 0x51, 0x23, 0x98, 0xe2, 0x42, 0x56, 0xd6, - 0xa4, 0xe3, 0x5e, 0xe4, 0x57, 0x2e, 0x0a, 0x3c, 0x1c, 0xd2, 0x51, 0xff, 0x5c, 0x81, 0x28, 0x59, - 0x0c, 0xfa, 0x04, 0x54, 0x0d, 0xe2, 0xe9, 0xae, 0xd9, 0xf7, 0xa3, 0xef, 0x08, 0x23, 0xef, 0x9b, - 0x11, 0x08, 0xcb, 0xf5, 0x90, 0x0a, 0x13, 0xbe, 0xe6, 0x6d, 0xb7, 0x9a, 0x42, 0x5d, 0x64, 0x87, - 0xfb, 0x3d, 0x56, 0x82, 0x05, 0x24, 0x8a, 0x69, 0x1c, 0x1b, 0x22, 0xa6, 0x11, 0x6d, 0x9e, 0x40, - 0x00, 0x27, 0x3a, 0x3a, 0x78, 0x53, 0xfd, 0xe3, 0x12, 0xc4, 0xf3, 0xf3, 0x14, 0x1d, 0x82, 0x74, - 0xc4, 0x69, 0xe9, 0xd4, 0x22, 0x4e, 0x3f, 0xc2, 0x92, 0xdb, 0xf1, 0x6c, 0xa4, 0xfc, 0xc2, 0x4a, - 0x4e, 0x49, 0xc7, 0x73, 0x89, 0x86, 0x35, 0xd0, 0xf3, 0xcc, 0x99, 0xcd, 0x0f, 0x94, 0xe8, 0x0f, - 0x04, 0xdb, 0xa2, 0x43, 0x0b, 0x1f, 0x89, 0x98, 0xda, 0xf0, 0xfb, 0x59, 0x29, 0xe6, 0x2d, 0xd0, - 0x27, 0x84, 0xef, 0x63, 0x39, 0x16, 0xf7, 0x1b, 0x04, 0x0b, 0xcf, 0xc7, 0x1a, 0x46, 0x0e, 0x91, - 0xea, 0xdf, 0x51, 0x60, 0x52, 0xa4, 0xe2, 0x18, 0xc2, 0x7d, 0x72, 0x13, 0xca, 0x4c, 0x48, 0x1f, - 0x45, 0x7e, 0xe9, 0x6c, 0x39, 0x8e, 0x1f, 0x4b, 0x48, 0xc2, 0x7c, 0xf6, 0xd8, 0xbf, 0x98, 0xa3, - 0x57, 0xbf, 0x36, 0x0e, 0x57, 0x45, 0x95, 0xd4, 0xf1, 0x1c, 0x6e, 0xc1, 0x3d, 0x38, 0x2f, 0x66, - 0xa9, 0xe9, 0x6a, 0x66, 0x78, 0xa5, 0x57, 0x4c, 0xed, 0x12, 0x97, 0xbd, 0x29, 0x74, 0x38, 0x8b, - 0x06, 0x0f, 0xbd, 0x67, 0xc5, 0xb7, 0x88, 0x66, 0xf9, 0x5b, 0x01, 0xed, 0xd2, 0x28, 0xa1, 0xf7, - 0x69, 0x7c, 0x38, 0x93, 0x0a, 0xbb, 0x52, 0x14, 0x80, 0x86, 0x4b, 0x34, 0xf9, 0x3e, 0x73, 0x04, - 0x17, 0xbf, 0xd5, 0x4c, 0x8c, 0x38, 0x87, 0x12, 0xb3, 0x5f, 0x69, 0xbb, 0x4c, 0x1d, 0xc6, 0xc4, - 0x77, 0x4d, 0x96, 0x22, 0x86, 0xae, 0x6f, 0xae, 0xc0, 0xc6, 0x41, 0x38, 0x59, 0x17, 0xbd, 0x00, - 0xb3, 0xec, 0x8a, 0x36, 0x8a, 0x63, 0x2b, 0x47, 0xc9, 0x69, 0xd7, 0x62, 0x10, 0x9c, 0xa8, 0xa9, - 0x7e, 0x43, 0x81, 0x69, 0x79, 0x01, 0x0d, 0xe1, 0x6e, 0x3d, 0x90, 0xd8, 0xf5, 0x08, 0x5e, 0xab, - 0x32, 0xd5, 0x61, 0x38, 0xf6, 0x23, 0x05, 0xce, 0x67, 0xb4, 0x61, 0x97, 0x75, 0x24, 0xc1, 0xfa, - 0x47, 0xb9, 0xac, 0x4b, 0x1d, 0x23, 0xe1, 0x65, 0x5d, 0x12, 0x82, 0x53, 0x74, 0xd1, 0x7d, 0x18, - 0xd3, 0x5d, 0x53, 0x0c, 0xcb, 0x73, 0x85, 0x54, 0x12, 0xdc, 0x8a, 0x7c, 0xd8, 0x1b, 0xb8, 0x85, - 0x29, 0x42, 0xf5, 0x9f, 0x8e, 0x41, 0x55, 0xca, 0xf2, 0x83, 0x56, 0x47, 0xd1, 0x68, 0x23, 0xf4, - 0x81, 0x56, 0xbb, 0x0a, 0x63, 0xdd, 0xfe, 0xa0, 0xa0, 0x4a, 0x1b, 0xa2, 0xbb, 0x49, 0xd1, 0x75, - 0xfb, 0x03, 0x74, 0x3f, 0x54, 0x92, 0x8b, 0xa9, 0xb1, 0xa1, 0x23, 0x67, 0x42, 0x51, 0x0e, 0xd6, - 0xe6, 0x78, 0xee, 0xda, 0xec, 0xc1, 0xa4, 0x27, 0x34, 0xe8, 0x72, 0xf1, 0x0c, 0x53, 0xd2, 0x48, - 0x0b, 0x8d, 0x99, 0x8b, 0xdf, 0x81, 0x42, 0x1d, 0xd0, 0xa0, 0x02, 0xc0, 0x80, 0x39, 0x9e, 0x33, - 0xbd, 0xa2, 0xc2, 0x05, 0x80, 0x75, 0x56, 0x82, 0x05, 0x44, 0xfd, 0xd9, 0x12, 0xa0, 0x34, 0x42, - 0xf4, 0x01, 0x28, 0x33, 0xff, 0x7b, 0xb1, 0xd1, 0xa4, 0xdc, 0x19, 0x9a, 0xe7, 0x61, 0x0e, 0x43, - 0x1d, 0x11, 0x8f, 0x51, 0x6c, 0x62, 0xd8, 0x25, 0xb1, 0xa0, 0x27, 0x05, 0x6f, 0x04, 0x47, 0xd3, - 0x58, 0xee, 0xd1, 0xb4, 0x0e, 0x93, 0x3d, 0xd3, 0x66, 0x8e, 0x21, 0xc5, 0x4c, 0x04, 0xfc, 0x2e, - 0x8b, 0xa3, 0xc0, 0x01, 0x2e, 0xf5, 0x4f, 0x4b, 0x74, 0x11, 0x9b, 0xb6, 0x4f, 0x6c, 0xcd, 0xd6, - 0x09, 0xda, 0x03, 0xd0, 0x06, 0xbe, 0xc3, 0x4f, 0x78, 0xb1, 0x96, 0x5b, 0xc5, 0xe6, 0x2b, 0x44, - 0xba, 0x1c, 0x22, 0xe4, 0x57, 0x4c, 0xd1, 0x6f, 0x2c, 0x11, 0xa3, 0xa4, 0x7d, 0xb3, 0x47, 0x5e, - 0x33, 0x6d, 0xc3, 0x79, 0x20, 0x86, 0x77, 0x54, 0xd2, 0xf7, 0x42, 0x84, 0x9c, 0x74, 0xf4, 0x1b, - 0x4b, 0xc4, 0xd0, 0xeb, 0xb0, 0xc0, 0x12, 0x66, 0xdb, 0x2c, 0x81, 0x9a, 0xe8, 0x9b, 0x63, 0x59, - 0xc1, 0x91, 0x53, 0x61, 0x49, 0x6b, 0x16, 0x1a, 0x39, 0x75, 0x70, 0x6e, 0x6b, 0xf5, 0xb7, 0x14, - 0xb8, 0x98, 0x39, 0x14, 0xe8, 0x26, 0xcc, 0x47, 0x7e, 0x05, 0x32, 0x8f, 0xac, 0x44, 0xf9, 0x00, - 0x6f, 0x27, 0x2b, 0xe0, 0x74, 0x1b, 0xb4, 0x1a, 0xca, 0x09, 0x32, 0x0f, 0x16, 0x4e, 0x09, 0x4f, - 0x08, 0x54, 0x59, 0x6c, 0x1a, 0x67, 0xb5, 0x53, 0x7f, 0x2c, 0xd6, 0xe1, 0x68, 0xc0, 0xe8, 0xee, - 0xd8, 0x20, 0xdd, 0xd0, 0xb3, 0x3b, 0xdc, 0x1d, 0x75, 0x5a, 0x88, 0x39, 0x0c, 0x5d, 0x96, 0xa3, - 0x11, 0x42, 0x2e, 0x14, 0x44, 0x24, 0xa8, 0x3e, 0x80, 0x70, 0xdf, 0x31, 0xed, 0x2e, 0xda, 0x84, - 0x8a, 0x26, 0xb2, 0xb9, 0x8b, 0xa5, 0xf6, 0xa9, 0x42, 0x3a, 0x96, 0xc0, 0xc1, 0xdd, 0xf6, 0x82, - 0x5f, 0x38, 0xc4, 0xad, 0xfe, 0x03, 0x05, 0x2e, 0x51, 0x86, 0x64, 0x04, 0xb1, 0x91, 0x61, 0xb8, - 0xfa, 0x10, 0x47, 0x6b, 0x0f, 0xaa, 0x6e, 0xd4, 0x4c, 0xac, 0xcb, 0x1f, 0x95, 0x43, 0xe1, 0xa5, - 0xa7, 0x1d, 0xa8, 0xd8, 0xd1, 0x70, 0x1d, 0x2f, 0x98, 0x9c, 0x64, 0x74, 0x7c, 0x28, 0xbc, 0x4b, - 0x3d, 0xc1, 0x32, 0x7e, 0xf5, 0x0b, 0x25, 0x80, 0x35, 0xe2, 0x3f, 0x70, 0xdc, 0x6d, 0x3a, 0x44, - 0xef, 0xaa, 0x90, 0x9f, 0x27, 0x61, 0xbc, 0xef, 0x18, 0x9e, 0xe0, 0x52, 0x2c, 0x50, 0x8d, 0xdd, - 0x8c, 0xb3, 0x52, 0x54, 0x83, 0x32, 0x33, 0xfc, 0x8a, 0xa3, 0x80, 0x49, 0xbd, 0x54, 0xd2, 0xf1, - 0x30, 0x2f, 0xe7, 0x79, 0x3a, 0x99, 0x4b, 0xac, 0x27, 0xc4, 0x78, 0x91, 0xa7, 0x93, 0x97, 0xe1, - 0x10, 0xaa, 0x7e, 0x61, 0x1c, 0x62, 0xcf, 0x11, 0x44, 0xaa, 0xb8, 0x72, 0x3a, 0xaa, 0xf8, 0xeb, - 0xb0, 0x60, 0x39, 0x9a, 0x51, 0xd7, 0x2c, 0xba, 0xe8, 0xdd, 0x0e, 0x9f, 0x0e, 0xcd, 0xee, 0x86, - 0xb9, 0xee, 0x19, 0x03, 0xb8, 0x93, 0x53, 0x07, 0xe7, 0xb6, 0x46, 0x7e, 0xf8, 0x08, 0x02, 0xcf, - 0x6f, 0x78, 0x67, 0xd4, 0xc7, 0x1a, 0x96, 0x64, 0x67, 0xe8, 0xf0, 0x54, 0x8e, 0xbf, 0x93, 0x80, - 0x7e, 0x46, 0x81, 0x8b, 0x64, 0xd7, 0x27, 0xae, 0xad, 0x59, 0xf7, 0x5c, 0x6d, 0x73, 0xd3, 0xd4, - 0x85, 0xcf, 0x11, 0x9f, 0x9c, 0xf6, 0xc1, 0x7e, 0xed, 0xe2, 0x4a, 0x56, 0x85, 0x47, 0xfb, 0xb5, - 0x8f, 0xa5, 0xdf, 0x22, 0x09, 0x7c, 0x9f, 0x33, 0x9b, 0xb0, 0xc5, 0x98, 0x4d, 0x6e, 0xf1, 0x79, - 0xa8, 0x1e, 0xc3, 0x55, 0x76, 0x4a, 0x36, 0xcb, 0xfc, 0xd2, 0x04, 0x48, 0x7e, 0xe7, 0xc7, 0xc8, - 0x6a, 0xf9, 0xab, 0x0a, 0x5c, 0xd0, 0x2d, 0x93, 0xd8, 0x7e, 0xc2, 0xc1, 0x98, 0x6f, 0x8c, 0xf5, - 0x42, 0x0e, 0xf1, 0x7d, 0x62, 0xb7, 0x9a, 0x0d, 0xc7, 0xb6, 0x89, 0xee, 0x37, 0x32, 0x90, 0x73, - 0x2d, 0x27, 0x0b, 0x82, 0x33, 0x3b, 0xc3, 0xbe, 0x87, 0x95, 0xb7, 0x9a, 0x72, 0x70, 0x56, 0x43, - 0x94, 0xe1, 0x10, 0x8a, 0x9e, 0x81, 0x6a, 0xd7, 0x75, 0x06, 0x7d, 0xaf, 0xc1, 0xdc, 0xa1, 0xf8, - 0x0c, 0x32, 0x41, 0xe2, 0x66, 0x54, 0x8c, 0xe5, 0x3a, 0xe8, 0xe3, 0x30, 0xcd, 0x7f, 0xb6, 0x5d, - 0xb2, 0x69, 0xee, 0x8a, 0xed, 0xc6, 0x7c, 0x2c, 0x6e, 0x4a, 0xe5, 0x38, 0x56, 0x0b, 0x3d, 0x0d, - 0x53, 0xa6, 0xe7, 0x0d, 0x88, 0xbb, 0x8e, 0xef, 0x88, 0xc4, 0x50, 0xcc, 0xa0, 0xda, 0x0a, 0x0a, - 0x71, 0x04, 0x47, 0xbf, 0xa0, 0xc0, 0xac, 0x4b, 0xde, 0x19, 0x98, 0x2e, 0x31, 0x18, 0x51, 0x4f, - 0x38, 0xff, 0xe3, 0xd1, 0x02, 0x0e, 0x96, 0x70, 0x0c, 0x29, 0x5f, 0xe7, 0xa1, 0x39, 0x22, 0x0e, - 0xc4, 0x89, 0x1e, 0xd0, 0xa1, 0xf2, 0xcc, 0xae, 0x6d, 0xda, 0xdd, 0x65, 0xab, 0xeb, 0x2d, 0x54, - 0xd8, 0xd6, 0xe5, 0x32, 0x57, 0x54, 0x8c, 0xe5, 0x3a, 0xe8, 0x39, 0x98, 0x19, 0x78, 0x74, 0xe5, - 0xf6, 0x08, 0x1f, 0xdf, 0xa9, 0xc8, 0x47, 0x71, 0x5d, 0x06, 0xe0, 0x78, 0x3d, 0xaa, 0xe2, 0x05, - 0x05, 0x62, 0x94, 0x81, 0x87, 0xe8, 0xd2, 0x7e, 0xae, 0xc7, 0x20, 0x38, 0x51, 0x73, 0x71, 0x19, - 0xce, 0x67, 0x7c, 0xe6, 0xb1, 0xb6, 0xc7, 0x37, 0x4a, 0xf0, 0xfe, 0x23, 0x57, 0x25, 0xfa, 0x7b, - 0x0a, 0x54, 0xc9, 0xae, 0xef, 0x6a, 0xa1, 0xc7, 0x24, 0x9d, 0xa2, 0xcd, 0x53, 0xd9, 0x02, 0x4b, - 0x2b, 0x11, 0x21, 0x3e, 0x6d, 0xe1, 0x71, 0x27, 0x41, 0xb0, 0xdc, 0x1f, 0x2a, 0xad, 0xf3, 0x00, - 0x6e, 0xd9, 0x5c, 0x27, 0xb2, 0xb6, 0x0b, 0xc8, 0xe2, 0xa7, 0x61, 0x2e, 0x89, 0xf9, 0x58, 0x23, - 0xf5, 0x4f, 0x4a, 0x50, 0x6e, 0x5b, 0xda, 0x99, 0xe4, 0xf8, 0xfa, 0x2b, 0xb1, 0x04, 0x2b, 0x85, - 0xb2, 0xd6, 0xb0, 0xae, 0xe6, 0xa6, 0x76, 0xea, 0x26, 0x52, 0x3b, 0xbd, 0x5c, 0x9c, 0xc4, 0xe1, - 0x99, 0x9c, 0xfe, 0xb5, 0x02, 0x53, 0xac, 0xde, 0x19, 0x64, 0x14, 0x79, 0x2b, 0x9e, 0x51, 0xe4, - 0xf9, 0xc2, 0xdf, 0x94, 0x93, 0x40, 0xe4, 0x3b, 0xc1, 0xb7, 0xb0, 0x7c, 0x21, 0x6f, 0xc8, 0xaf, - 0x55, 0xf0, 0x8f, 0xb9, 0x96, 0x95, 0xda, 0xe8, 0x8e, 0xa3, 0x6b, 0x56, 0x2a, 0xbf, 0xd1, 0xa1, - 0x4f, 0x56, 0xf4, 0x60, 0x8a, 0x88, 0x20, 0xf9, 0xe0, 0x63, 0x0a, 0x89, 0xb4, 0x41, 0xa4, 0x7d, - 0x44, 0x2e, 0x28, 0xf1, 0x70, 0x44, 0x41, 0xfd, 0x17, 0x25, 0xa8, 0x4a, 0x73, 0xf9, 0xc3, 0xc8, - 0x9c, 0x74, 0x23, 0x33, 0x91, 0x7b, 0x89, 0xb9, 0x44, 0x5e, 0x3a, 0x46, 0x12, 0x77, 0x17, 0xaa, - 0x7a, 0x94, 0x05, 0x73, 0x94, 0xc5, 0x2d, 0x25, 0xd3, 0x14, 0x3e, 0xd9, 0x51, 0x01, 0x96, 0x89, - 0xa8, 0xbf, 0x57, 0x82, 0xc9, 0xb6, 0xeb, 0xd0, 0x09, 0x3e, 0x03, 0xd6, 0xa0, 0xc5, 0x58, 0x43, - 0xb1, 0x7d, 0xcb, 0x3b, 0x9b, 0xcb, 0x1c, 0xcc, 0x04, 0x73, 0x58, 0x1e, 0x85, 0xc8, 0xe1, 0xec, - 0xe1, 0xdf, 0x2a, 0x50, 0x15, 0x35, 0xcf, 0x80, 0x41, 0x7c, 0x36, 0xce, 0x20, 0x5e, 0x1c, 0xe1, - 0xbb, 0x72, 0x58, 0xc4, 0x57, 0x15, 0x98, 0x11, 0x35, 0x56, 0x49, 0x6f, 0x83, 0xb8, 0xe8, 0x06, - 0x4c, 0x7a, 0x03, 0x36, 0x91, 0xe2, 0x83, 0x9e, 0x90, 0x99, 0x84, 0xbb, 0xa1, 0xe9, 0xec, 0x4d, - 0x12, 0x5e, 0x45, 0xca, 0xa6, 0xc6, 0x0b, 0x70, 0xd0, 0x98, 0xaa, 0x70, 0xae, 0x63, 0xa5, 0xd2, - 0x1a, 0x60, 0xc7, 0x22, 0x98, 0x41, 0xa8, 0xe6, 0x44, 0xff, 0x06, 0xf7, 0x51, 0x4c, 0x73, 0xa2, - 0x60, 0x0f, 0xf3, 0x72, 0xf5, 0x8b, 0xe3, 0xe1, 0x60, 0x33, 0x0e, 0x76, 0x0b, 0xa6, 0x74, 0x97, - 0x68, 0x3e, 0x31, 0xea, 0x7b, 0xc3, 0x74, 0x8e, 0x49, 0x71, 0x8d, 0xa0, 0x05, 0x8e, 0x1a, 0x53, - 0x81, 0x49, 0xbe, 0x62, 0x2a, 0x45, 0xb2, 0x65, 0xee, 0xf5, 0xd2, 0xa7, 0xa0, 0xec, 0x3c, 0xb0, - 0x43, 0xdf, 0x8a, 0x43, 0x09, 0xb3, 0x4f, 0xb9, 0x4b, 0x6b, 0x63, 0xde, 0x88, 0xa5, 0x7e, 0x11, - 0x99, 0x3f, 0xb8, 0x20, 0x5b, 0xcd, 0xca, 0xfa, 0x81, 0x2c, 0x98, 0xec, 0xb1, 0x69, 0x18, 0x29, - 0xb9, 0x56, 0x6c, 0x42, 0xe5, 0x24, 0xa7, 0x0c, 0x33, 0x0e, 0x48, 0x50, 0xc1, 0x97, 0x0a, 0x67, - 0x5e, 0x5f, 0xd3, 0x89, 0x2c, 0xf8, 0xae, 0x05, 0x85, 0x38, 0x82, 0xa3, 0x3d, 0xa8, 0xf2, 0xd8, - 0x77, 0xce, 0x65, 0x27, 0x8b, 0xdb, 0x34, 0x45, 0xf7, 0xee, 0x45, 0xd8, 0xf8, 0xd0, 0x4b, 0x05, - 0x58, 0xa6, 0xa5, 0xfe, 0xdc, 0x78, 0xb8, 0x48, 0x05, 0xc7, 0xcf, 0x7e, 0x47, 0x43, 0x29, 0xf4, - 0x8e, 0xc6, 0xc7, 0xa0, 0xdc, 0xdf, 0xd2, 0xbc, 0x60, 0xa5, 0x06, 0x09, 0x79, 0xcb, 0x6d, 0x5a, - 0xf8, 0x68, 0xbf, 0x36, 0x2d, 0x48, 0xb3, 0xdf, 0x98, 0xd7, 0x45, 0x03, 0x38, 0xef, 0xf9, 0x9a, - 0x45, 0x3a, 0xa6, 0xb0, 0x16, 0x79, 0xbe, 0xd6, 0xeb, 0x17, 0xc8, 0xab, 0xcb, 0x1d, 0x8f, 0xd3, - 0xa8, 0x70, 0x16, 0x7e, 0xf4, 0xd3, 0x0a, 0x2c, 0xb0, 0xf2, 0xe5, 0x81, 0xef, 0xf0, 0x5c, 0xe2, - 0x11, 0xf1, 0xe3, 0xdf, 0xcf, 0x32, 0xed, 0xbe, 0x93, 0x83, 0x0f, 0xe7, 0x52, 0x42, 0x9f, 0x83, - 0x8b, 0x96, 0xe6, 0xf9, 0xcb, 0xba, 0x6f, 0xee, 0x98, 0xfe, 0x5e, 0xd4, 0x85, 0xf2, 0xb1, 0xbb, - 0xc0, 0x1c, 0x34, 0xee, 0x64, 0x21, 0xc3, 0xd9, 0x34, 0xd4, 0x3f, 0x53, 0x00, 0xa5, 0x97, 0x10, - 0xb2, 0xa0, 0x62, 0x90, 0x4d, 0x6d, 0x60, 0xf9, 0x81, 0x08, 0x50, 0x28, 0x04, 0x3c, 0x42, 0x19, - 0x71, 0xe6, 0xa6, 0xc0, 0x8b, 0x43, 0x0a, 0xc8, 0x81, 0xa9, 0x07, 0x5b, 0xa6, 0x4f, 0x2c, 0xd3, - 0xf3, 0x05, 0x77, 0x1e, 0x95, 0x5c, 0x28, 0xf3, 0xbc, 0x16, 0x20, 0xc6, 0x11, 0x0d, 0xf5, 0x67, - 0xc7, 0xa0, 0x72, 0x8c, 0xa7, 0xdb, 0x06, 0x80, 0x44, 0xee, 0x07, 0x2a, 0x28, 0x91, 0x51, 0x4c, - 0x64, 0x4c, 0x9c, 0x69, 0xa4, 0x90, 0xe1, 0x0c, 0x02, 0xe8, 0x73, 0x70, 0xc1, 0xb4, 0x37, 0x5d, - 0xcd, 0xf3, 0xdd, 0x81, 0xee, 0x0f, 0x5c, 0x32, 0x4a, 0x3e, 0x5f, 0x66, 0x5a, 0x68, 0x65, 0xa0, - 0xc3, 0x99, 0x44, 0x10, 0x81, 0xc9, 0x07, 0x8e, 0xbb, 0x4d, 0x99, 0xe7, 0x78, 0xf1, 0x57, 0x1f, - 0x5e, 0x63, 0x28, 0x22, 0xae, 0xc9, 0x7f, 0x7b, 0x38, 0xc0, 0xad, 0x7e, 0x4b, 0x81, 0x32, 0x0f, - 0x6e, 0x7b, 0x4f, 0xe8, 0x55, 0xac, 0xab, 0xb9, 0x79, 0x2a, 0xa9, 0xba, 0xc3, 0x6a, 0xbc, 0x47, - 0xd4, 0x1d, 0xd6, 0xd7, 0x1c, 0x59, 0xe6, 0x5b, 0x63, 0xe2, 0x5b, 0x98, 0xb0, 0xd0, 0x82, 0xf3, - 0x42, 0xe8, 0xbd, 0x63, 0x6e, 0x12, 0xba, 0xba, 0x9a, 0xda, 0x9e, 0x27, 0xa2, 0xca, 0x19, 0xd7, - 0x6d, 0xa4, 0xc1, 0x38, 0xab, 0x0d, 0xfa, 0xe7, 0x0a, 0x3d, 0x96, 0x7d, 0xd7, 0xd4, 0x47, 0x4a, - 0xfe, 0x18, 0xf6, 0x6d, 0x69, 0x95, 0x23, 0xe3, 0xd6, 0x82, 0xf5, 0xe8, 0x7c, 0x66, 0xa5, 0x8f, - 0xf6, 0x6b, 0xb5, 0x0c, 0x53, 0x64, 0x60, 0x3a, 0xa7, 0x03, 0xfb, 0x85, 0xef, 0x1d, 0x5a, 0x85, - 0x99, 0xf1, 0x83, 0x1e, 0xa3, 0x5b, 0x50, 0xf6, 0x74, 0xa7, 0x4f, 0x8e, 0x93, 0xce, 0x36, 0x1c, - 0xe0, 0x0e, 0x6d, 0x89, 0x39, 0x82, 0xc5, 0xb7, 0x61, 0x5a, 0xee, 0x79, 0x86, 0x35, 0xa2, 0x29, - 0x5b, 0x23, 0x8e, 0x7d, 0x59, 0x27, 0x5b, 0x2f, 0x7e, 0xbf, 0x04, 0xe2, 0xa9, 0xa6, 0x21, 0x2e, - 0x2b, 0xcc, 0x20, 0xc7, 0xdd, 0x08, 0xcf, 0x53, 0x25, 0x5f, 0x8a, 0x8d, 0xc6, 0x40, 0x4e, 0x73, - 0x87, 0x6c, 0x98, 0xb0, 0xb4, 0x0d, 0x62, 0x05, 0x0f, 0xf7, 0xdc, 0x28, 0xfe, 0xb2, 0x0c, 0x4f, - 0xc0, 0xea, 0x25, 0x4c, 0xda, 0xbc, 0x10, 0x0b, 0x2a, 0x8b, 0xcf, 0x43, 0x55, 0xaa, 0x76, 0x2c, - 0x03, 0xd0, 0x97, 0x15, 0xb8, 0x14, 0x2c, 0x89, 0x78, 0x6e, 0x0c, 0x74, 0x0d, 0x2a, 0x5a, 0xdf, - 0x64, 0x36, 0x51, 0xd9, 0xaa, 0xbc, 0xdc, 0x6e, 0xb1, 0x32, 0x1c, 0x42, 0xd1, 0x47, 0xa0, 0x12, - 0xcc, 0x93, 0x10, 0x90, 0xc2, 0x2d, 0x1e, 0x5e, 0xe6, 0x84, 0x35, 0xd0, 0x87, 0xa4, 0xac, 0x7d, - 0xe5, 0xe8, 0x44, 0x0b, 0x09, 0xf3, 0x7b, 0x5f, 0xf5, 0x4b, 0x63, 0x30, 0xc3, 0x0d, 0x09, 0x75, - 0xd3, 0x36, 0x4c, 0xbb, 0x7b, 0x06, 0xac, 0x34, 0xf6, 0x58, 0x67, 0xe9, 0xa4, 0x1e, 0xeb, 0xbc, - 0x0d, 0x13, 0xef, 0xd0, 0x6d, 0x1d, 0x2c, 0x87, 0xa1, 0x76, 0x57, 0x38, 0xd7, 0x8c, 0x23, 0x78, - 0x58, 0xa0, 0x40, 0x9e, 0xf4, 0x64, 0xea, 0x08, 0x61, 0xce, 0xb1, 0x91, 0x0d, 0x73, 0x6f, 0x4e, - 0x67, 0xbf, 0x97, 0xaa, 0xfe, 0x47, 0x05, 0xe6, 0x63, 0x2d, 0xce, 0xe0, 0x24, 0xd8, 0x8c, 0x9f, - 0x04, 0xcb, 0x23, 0x7f, 0x65, 0xce, 0x89, 0xf0, 0x3c, 0x5c, 0xcc, 0x1c, 0x8c, 0xa3, 0x05, 0x28, - 0xf5, 0xb7, 0x4b, 0x30, 0xde, 0x21, 0xc4, 0x38, 0x83, 0x95, 0xf9, 0x56, 0xec, 0x90, 0xff, 0x54, - 0xe1, 0xe7, 0xa3, 0xf2, 0xcc, 0x23, 0x9b, 0x09, 0xf3, 0xc8, 0xa7, 0x0b, 0x53, 0x38, 0xdc, 0x36, - 0xf2, 0xcb, 0x25, 0x00, 0x5a, 0x8d, 0x3f, 0xef, 0x28, 0x7c, 0x24, 0xa3, 0x07, 0x80, 0xa7, 0xde, - 0x2d, 0xcf, 0xf6, 0xaa, 0xe1, 0xd3, 0x80, 0x63, 0x91, 0xf1, 0x3d, 0xfe, 0x2c, 0x60, 0x9c, 0x5b, - 0x8c, 0x9f, 0x10, 0xb7, 0x50, 0xff, 0x91, 0x02, 0x2c, 0xed, 0x7c, 0x73, 0xad, 0x83, 0x9e, 0x83, - 0x19, 0x93, 0x5f, 0x6d, 0x36, 0xe5, 0xcc, 0x71, 0xec, 0x02, 0xa6, 0x25, 0x03, 0x70, 0xbc, 0x1e, - 0xea, 0x49, 0xe3, 0x3a, 0xc2, 0x23, 0xab, 0xa2, 0x1f, 0x47, 0xf2, 0x87, 0xef, 0x95, 0xe0, 0x5c, - 0xa2, 0xee, 0x10, 0xfa, 0xc7, 0xe9, 0x70, 0x5b, 0x29, 0x5d, 0xef, 0xd8, 0xe9, 0xa7, 0xeb, 0x0d, - 0x33, 0xe7, 0x8e, 0x9f, 0x6e, 0xe6, 0xdc, 0x3f, 0x52, 0x80, 0xbd, 0xda, 0x79, 0x06, 0x8c, 0xf7, - 0x2f, 0xc7, 0x19, 0xef, 0x27, 0x8b, 0x2e, 0x9c, 0x1c, 0x7e, 0xfb, 0x1b, 0x25, 0x60, 0x29, 0xe4, - 0x85, 0x27, 0x87, 0xe4, 0x1c, 0xa1, 0xe4, 0x38, 0x47, 0x5c, 0x15, 0xbe, 0x15, 0x09, 0x2b, 0xa1, - 0xe4, 0x5f, 0xf1, 0x11, 0xc9, 0x7d, 0x62, 0x2c, 0xce, 0x46, 0xd2, 0x2e, 0x14, 0xe8, 0x21, 0xcc, - 0x78, 0x5b, 0x8e, 0xe3, 0x07, 0x2a, 0xbb, 0x98, 0xbb, 0xe5, 0xc2, 0x2e, 0xcd, 0xc1, 0xa7, 0xf0, - 0x8d, 0xd9, 0x91, 0x71, 0xe3, 0x38, 0x29, 0xb4, 0x04, 0xb0, 0x61, 0x39, 0xfa, 0x76, 0xa3, 0xd5, - 0xc4, 0x81, 0xe3, 0x2b, 0x73, 0xbf, 0xaa, 0x87, 0xa5, 0x58, 0xaa, 0xa1, 0xfe, 0xa1, 0xc2, 0x47, - 0xeb, 0x18, 0xdb, 0xea, 0x0c, 0xb9, 0xe4, 0x87, 0x13, 0x5c, 0x32, 0xef, 0x01, 0xd5, 0xdf, 0x13, - 0x5f, 0x11, 0x3e, 0x14, 0xd0, 0x87, 0x19, 0x4b, 0x7e, 0x59, 0x40, 0x2c, 0xe3, 0x42, 0x8f, 0x12, - 0x84, 0x59, 0xef, 0x62, 0xc5, 0x38, 0x4e, 0x80, 0xb2, 0xd2, 0xa0, 0xf3, 0xfc, 0xbd, 0x43, 0xee, - 0xbb, 0xc2, 0x66, 0xac, 0x2d, 0x03, 0x70, 0xbc, 0x9e, 0xfa, 0xf7, 0x4b, 0x70, 0x99, 0xf7, 0x9d, - 0x39, 0x9f, 0x37, 0x49, 0x9f, 0xd8, 0x06, 0xb1, 0xf5, 0x3d, 0x26, 0x2e, 0x1b, 0x4e, 0x17, 0xfd, - 0x35, 0x05, 0x2a, 0xc1, 0xc5, 0x93, 0xf8, 0x90, 0x37, 0x8a, 0xbf, 0xef, 0x98, 0x43, 0x25, 0xbc, - 0xf6, 0xe2, 0x09, 0xd8, 0xc4, 0x2f, 0x1c, 0x12, 0x46, 0x0f, 0xa0, 0xdc, 0x77, 0x9d, 0x8d, 0x40, - 0xad, 0xba, 0x7f, 0xe2, 0x3d, 0x68, 0x53, 0xec, 0x7c, 0x7b, 0xb2, 0x7f, 0x31, 0xa7, 0xa7, 0x62, - 0xf8, 0xd0, 0x50, 0x3d, 0x47, 0x4f, 0x25, 0xf3, 0x0c, 0x87, 0xf6, 0x93, 0x54, 0x0a, 0xa7, 0xbb, - 0xa0, 0x1e, 0xdd, 0x97, 0xe3, 0x20, 0x7c, 0x15, 0x3e, 0x28, 0x21, 0x5c, 0xd9, 0xd5, 0x89, 0xe7, - 0x35, 0xb4, 0xbe, 0xa6, 0x53, 0x95, 0x92, 0x05, 0xde, 0x72, 0x43, 0xef, 0x31, 0x50, 0xfe, 0x7f, - 0x05, 0x6a, 0x12, 0xce, 0x98, 0x03, 0x54, 0xc0, 0x6a, 0xbe, 0xa6, 0x40, 0x55, 0xb3, 0x6d, 0xc7, - 0xd7, 0xe4, 0x7b, 0x47, 0x63, 0xc4, 0xb9, 0xc9, 0x22, 0xb5, 0xb4, 0x1c, 0x91, 0x49, 0x78, 0x18, - 0x48, 0x10, 0x2c, 0xf7, 0x66, 0xf1, 0xd3, 0x30, 0x97, 0x6c, 0x75, 0x2c, 0xe5, 0xb1, 0x01, 0x97, - 0xa4, 0x5e, 0xb1, 0xbb, 0x8c, 0xc6, 0x16, 0xd1, 0xb7, 0xbd, 0xe3, 0x0c, 0x63, 0x9d, 0xca, 0xdf, - 0x21, 0x12, 0x11, 0x07, 0x49, 0xd5, 0xbd, 0xa7, 0x60, 0x72, 0xc7, 0xf4, 0xcc, 0x20, 0x9e, 0x5e, - 0xc2, 0x71, 0x9f, 0x17, 0xe3, 0x00, 0xae, 0xbe, 0x02, 0xe7, 0x65, 0x1c, 0x8c, 0xe3, 0xae, 0x75, - 0x8e, 0xd3, 0x8b, 0x55, 0xb8, 0x2a, 0x61, 0xc8, 0x0c, 0x06, 0x3c, 0x0e, 0xba, 0xaf, 0x55, 0x02, - 0x86, 0x27, 0x22, 0x56, 0x7e, 0x47, 0x81, 0xc7, 0x49, 0xde, 0xaa, 0x13, 0x4c, 0xe3, 0xf5, 0x11, - 0x97, 0x45, 0xee, 0xaa, 0x16, 0xb9, 0xa7, 0xf2, 0xc0, 0x38, 0xbf, 0x67, 0x68, 0x0f, 0xc0, 0x0b, - 0xa7, 0x64, 0x14, 0xcf, 0xe3, 0xcc, 0x39, 0x16, 0x89, 0x96, 0xc3, 0xdf, 0x58, 0x22, 0x86, 0xde, - 0x81, 0x8a, 0x27, 0x66, 0x72, 0x94, 0x58, 0xe5, 0x8c, 0x85, 0x21, 0x9c, 0x2b, 0xc5, 0x2f, 0x1c, - 0x92, 0x41, 0xbf, 0xa2, 0xc0, 0x05, 0x2b, 0x63, 0x73, 0x09, 0x09, 0xa1, 0x73, 0x0a, 0xfb, 0x96, - 0x5b, 0xb0, 0xb3, 0x20, 0x38, 0xb3, 0x2b, 0xe8, 0xd7, 0x72, 0x03, 0x63, 0xcb, 0xc5, 0x1f, 0x59, - 0x39, 0x6a, 0xed, 0x1f, 0x3f, 0x46, 0x16, 0xfd, 0x04, 0x54, 0x9d, 0x88, 0x23, 0x88, 0x48, 0xe6, - 0xcf, 0x8c, 0xd8, 0x39, 0x89, 0xc7, 0xf0, 0xfb, 0x40, 0xa9, 0x00, 0xcb, 0xf4, 0xd0, 0x57, 0x14, - 0x40, 0x46, 0xea, 0xdc, 0x10, 0x57, 0x92, 0xaf, 0x9e, 0xf8, 0xe1, 0xc8, 0x6f, 0x40, 0xd2, 0xe5, - 0x38, 0xa3, 0x13, 0xea, 0x97, 0x27, 0xb9, 0x30, 0xcf, 0x6c, 0xd0, 0x1b, 0x30, 0xb1, 0xc1, 0x94, - 0x61, 0xc1, 0x05, 0x0a, 0x6b, 0xde, 0x5c, 0xa5, 0xe6, 0x9a, 0x2a, 0xff, 0x1f, 0x0b, 0xcc, 0xe8, - 0x4d, 0x18, 0x33, 0xec, 0xe0, 0xe1, 0xae, 0x17, 0x47, 0xd0, 0x04, 0x23, 0xbf, 0x75, 0xba, 0x71, - 0x28, 0x52, 0x64, 0x43, 0xc5, 0x16, 0xf2, 0xaf, 0xd8, 0xa6, 0x85, 0x1f, 0xb7, 0x0e, 0xe5, 0xe8, - 0x50, 0x7a, 0x0f, 0x4a, 0x70, 0x48, 0x83, 0xd2, 0x4b, 0x18, 0xc0, 0x0a, 0xd3, 0x0b, 0xf5, 0xda, - 0xc3, 0x8c, 0x0e, 0x6d, 0x59, 0x4b, 0x2d, 0x0f, 0xaf, 0xa5, 0xce, 0xe4, 0x6a, 0xa8, 0x04, 0x26, - 0x7c, 0x8d, 0xb9, 0x41, 0x4d, 0x14, 0x77, 0x43, 0xa2, 0xfd, 0xbf, 0x47, 0xb1, 0x44, 0x42, 0x37, - 0xfb, 0xe9, 0x61, 0x81, 0x9c, 0x2e, 0x2c, 0xfe, 0xee, 0xb6, 0x58, 0xf4, 0x85, 0x17, 0x16, 0x7f, - 0x4f, 0x85, 0x2f, 0x2c, 0xfe, 0x3f, 0x16, 0x98, 0xd1, 0xdb, 0x54, 0xf1, 0xe2, 0x47, 0x9c, 0xc8, - 0xa2, 0xf7, 0xca, 0x88, 0x5b, 0xcb, 0x0b, 0x3c, 0xdf, 0xf9, 0x2f, 0x1c, 0xe2, 0x47, 0x1b, 0x30, - 0x29, 0x8c, 0x1c, 0x22, 0x05, 0xc0, 0x8b, 0x23, 0x24, 0xc5, 0x0f, 0x9e, 0x08, 0xe2, 0x61, 0xb8, - 0x01, 0x62, 0xf5, 0xdf, 0x4f, 0x71, 0xf3, 0x94, 0x70, 0x21, 0xd8, 0x84, 0x4a, 0x80, 0x6e, 0x94, - 0x28, 0x8c, 0xe0, 0x89, 0x0f, 0xfe, 0x69, 0xc1, 0x2f, 0x1c, 0xe2, 0x46, 0x8d, 0xac, 0x80, 0x97, - 0x28, 0x21, 0xea, 0x70, 0xc1, 0x2e, 0x71, 0x0f, 0xb7, 0xb1, 0xb3, 0xf0, 0x70, 0xcb, 0x76, 0xb1, - 0x18, 0x2f, 0xe4, 0x62, 0xf1, 0x12, 0x9c, 0x0b, 0x1c, 0xd0, 0x0c, 0xc2, 0xae, 0x7a, 0x84, 0x6b, - 0x36, 0x8b, 0x2a, 0x6d, 0xc4, 0x41, 0x38, 0x59, 0x17, 0xfd, 0xbe, 0x02, 0x15, 0x5d, 0x08, 0x30, - 0x62, 0x5f, 0xdd, 0x19, 0xcd, 0x86, 0xb9, 0x14, 0xc8, 0x43, 0x5c, 0x9c, 0xbe, 0x1f, 0xf0, 0x88, - 0xa0, 0xf8, 0x84, 0xee, 0xe0, 0xc2, 0x5e, 0xa3, 0x7f, 0x43, 0x95, 0x05, 0x8b, 0x3d, 0x3c, 0xc2, - 0x82, 0xf4, 0xb8, 0xcf, 0xf8, 0xdd, 0x11, 0xbf, 0x62, 0x39, 0xc2, 0xc8, 0x3f, 0xe4, 0x8d, 0x50, - 0x2f, 0x88, 0x20, 0x27, 0xf4, 0x2d, 0x72, 0xf7, 0xd1, 0xaf, 0x2b, 0xf0, 0x41, 0xee, 0xa8, 0xdf, - 0xa0, 0x02, 0x02, 0x7b, 0xb8, 0x87, 0x44, 0x2f, 0x05, 0x45, 0x0e, 0x21, 0x95, 0x63, 0x3b, 0x84, - 0x5c, 0x3b, 0xd8, 0xaf, 0x7d, 0xb0, 0x31, 0x04, 0x6e, 0x3c, 0x54, 0x0f, 0x16, 0xb7, 0x61, 0x26, - 0x36, 0xd9, 0xa7, 0x79, 0x6b, 0xb9, 0x68, 0xc3, 0x5c, 0x72, 0x4e, 0x4e, 0xf5, 0x96, 0xf4, 0x36, - 0x4c, 0x85, 0x87, 0x05, 0xba, 0x2c, 0x11, 0x8a, 0x0e, 0xf3, 0xdb, 0x64, 0x8f, 0x53, 0xad, 0xc5, - 0x74, 0x3d, 0xae, 0xec, 0xdf, 0xa7, 0x05, 0x02, 0xa1, 0xfa, 0x6d, 0x61, 0xc9, 0xb9, 0x47, 0x7a, - 0x7d, 0x4b, 0xf3, 0xc9, 0x7b, 0xff, 0xea, 0x43, 0xfd, 0xef, 0x0a, 0xe7, 0xf9, 0xe2, 0x51, 0x32, - 0x0d, 0xaa, 0x3d, 0x9e, 0x40, 0x90, 0x45, 0x94, 0x2a, 0xc5, 0x63, 0x59, 0x57, 0x23, 0x34, 0x58, - 0xc6, 0x89, 0x1e, 0xa4, 0x9f, 0xcd, 0xbb, 0x31, 0xda, 0xe1, 0x3c, 0xf4, 0xeb, 0x79, 0x28, 0xdd, - 0x46, 0x7e, 0x71, 0x4c, 0x39, 0xfc, 0xc5, 0xb1, 0xa3, 0xdf, 0xa1, 0x52, 0xff, 0x5f, 0x09, 0x32, - 0xdf, 0x7c, 0x40, 0x2a, 0x4c, 0xf0, 0x08, 0x19, 0xf9, 0x3d, 0x41, 0x1e, 0x3e, 0x83, 0x05, 0x04, - 0xb9, 0x70, 0x41, 0xc4, 0x9f, 0xdc, 0x26, 0x7b, 0xd1, 0x4b, 0x76, 0x62, 0xea, 0x87, 0xf7, 0x44, - 0x67, 0x89, 0xc5, 0x3a, 0x09, 0x4c, 0x38, 0x13, 0x37, 0xba, 0xcb, 0xc3, 0xc1, 0x6c, 0xe3, 0x9e, - 0xb3, 0x4d, 0xec, 0x88, 0x3b, 0x88, 0xe8, 0xd6, 0xc7, 0x83, 0x70, 0xb0, 0x54, 0x05, 0x9c, 0xdd, - 0x0e, 0xed, 0x00, 0xea, 0x69, 0xbb, 0x49, 0x6c, 0x23, 0xa4, 0x9b, 0x5f, 0x4d, 0x61, 0xc3, 0x19, - 0x14, 0x58, 0x2c, 0x07, 0xd3, 0x69, 0xdf, 0x1b, 0x3e, 0x47, 0xac, 0xab, 0xa7, 0x1b, 0xcb, 0xc1, - 0x49, 0x1c, 0x7e, 0x21, 0xf9, 0x06, 0x5c, 0x62, 0xd5, 0x96, 0x0d, 0xa6, 0xc6, 0x7a, 0xc4, 0x58, - 0x36, 0x0c, 0x16, 0x58, 0x39, 0xea, 0x4b, 0x7e, 0xcc, 0x6f, 0x8a, 0xe1, 0x7e, 0x8f, 0xf8, 0x4d, - 0xb1, 0xbe, 0xe6, 0xdc, 0xda, 0xfc, 0x91, 0x02, 0xf3, 0xa9, 0xf4, 0x2d, 0x43, 0x79, 0xdd, 0x9c, - 0xd9, 0x65, 0xc4, 0x87, 0x92, 0x2f, 0xe0, 0x55, 0x33, 0xb3, 0x3a, 0xbd, 0x06, 0x33, 0xb1, 0x4b, - 0x9b, 0x30, 0x74, 0x57, 0xc9, 0x0c, 0xdd, 0x95, 0x23, 0x73, 0x4b, 0x87, 0x46, 0xe6, 0x7e, 0x63, - 0x46, 0x4c, 0x37, 0x53, 0xeb, 0xdf, 0x82, 0x09, 0x16, 0x3f, 0x1b, 0x3c, 0x1a, 0xfa, 0x42, 0xe1, - 0xb8, 0x5c, 0x8f, 0xb3, 0x4a, 0xfe, 0x3f, 0x16, 0x58, 0x51, 0x13, 0xe6, 0x74, 0xcb, 0x19, 0x50, - 0x1d, 0x76, 0xd3, 0xb4, 0xc8, 0x5a, 0xc4, 0x95, 0xc3, 0x04, 0x20, 0x8d, 0x04, 0x1c, 0xa7, 0x5a, - 0x20, 0xcc, 0x0d, 0x03, 0x7c, 0x8f, 0x3d, 0x57, 0xf0, 0xf2, 0x92, 0xa7, 0x58, 0x0c, 0x0d, 0x02, - 0xef, 0x00, 0x90, 0x60, 0xe2, 0x02, 0x2f, 0xcb, 0x97, 0x8a, 0xa5, 0x36, 0x09, 0xa7, 0x3f, 0x60, - 0x46, 0x61, 0x91, 0x87, 0x25, 0x22, 0xc8, 0x85, 0xea, 0x56, 0xf4, 0x40, 0xa0, 0xd0, 0xd2, 0x5f, - 0x1e, 0xf1, 0x71, 0x42, 0x7e, 0x88, 0x4b, 0x05, 0x58, 0x26, 0x82, 0x5c, 0x80, 0x48, 0x07, 0x1b, - 0xe5, 0x41, 0xa9, 0x48, 0xb9, 0x8b, 0xbe, 0x33, 0x2a, 0xc3, 0x12, 0x15, 0x4a, 0xd3, 0x0e, 0x03, - 0xe0, 0x47, 0x51, 0xeb, 0xa3, 0x30, 0xfa, 0x88, 0x66, 0x54, 0x86, 0x25, 0x2a, 0x74, 0x6c, 0x7b, - 0x51, 0xd2, 0x03, 0x21, 0xac, 0xbf, 0x3c, 0x62, 0xf2, 0x09, 0x21, 0x20, 0x45, 0x05, 0x58, 0x26, - 0x82, 0x6c, 0x80, 0x5e, 0x98, 0x0b, 0x41, 0x68, 0xfb, 0x85, 0xbe, 0x33, 0xca, 0xa8, 0xc0, 0x4d, - 0xcd, 0xd1, 0x6f, 0x2c, 0x51, 0x40, 0x6f, 0x4b, 0x36, 0x25, 0x28, 0x2e, 0x66, 0x0e, 0x65, 0x4f, - 0xfa, 0x44, 0x24, 0x6d, 0x55, 0xd9, 0x7e, 0x7d, 0x42, 0x92, 0xb4, 0x1e, 0xed, 0xd7, 0xa6, 0x19, - 0x0f, 0x49, 0x49, 0x5e, 0xd1, 0x55, 0xeb, 0xf4, 0x61, 0x57, 0xad, 0xe8, 0x26, 0xcc, 0x7b, 0xb2, - 0x3b, 0x13, 0x63, 0x0c, 0x33, 0xac, 0x49, 0x98, 0x3b, 0xa3, 0x93, 0xac, 0x80, 0xd3, 0x6d, 0x38, - 0xe3, 0x23, 0x06, 0x6b, 0x3f, 0x2b, 0x33, 0x3e, 0x5e, 0x86, 0x43, 0x28, 0xda, 0x49, 0x3c, 0x30, - 0x7f, 0x6e, 0x54, 0x43, 0xd0, 0x90, 0xaf, 0xcd, 0x7f, 0x4e, 0x7e, 0xdc, 0x7c, 0xae, 0xb8, 0xcf, - 0x6d, 0x76, 0xfe, 0x8b, 0x23, 0x1e, 0x38, 0x1f, 0xc4, 0x43, 0x5d, 0xe6, 0x4f, 0xc4, 0xbd, 0x3f, - 0xbc, 0xb2, 0xcb, 0x0b, 0x73, 0x41, 0x0d, 0x98, 0x27, 0xbb, 0x7d, 0xc7, 0x1b, 0xb8, 0x84, 0xa5, - 0xde, 0x61, 0xd3, 0x83, 0x22, 0x4b, 0xd1, 0x4a, 0x12, 0x88, 0xd3, 0xf5, 0xd5, 0x6f, 0x4d, 0x41, - 0x55, 0x92, 0x8d, 0x7e, 0x18, 0xb1, 0x91, 0x3e, 0x54, 0x75, 0xc7, 0xf6, 0x7c, 0x57, 0x93, 0xe2, - 0x41, 0x47, 0xa4, 0x19, 0x8e, 0x5e, 0x23, 0xc2, 0x8c, 0x65, 0x32, 0x74, 0x9f, 0x87, 0xf6, 0xbc, - 0xb1, 0x13, 0xb0, 0xe7, 0x85, 0xfb, 0x3c, 0xc3, 0xa6, 0xf7, 0x71, 0x80, 0xe0, 0xb8, 0x08, 0x5f, - 0x9d, 0x0e, 0x73, 0x76, 0xb6, 0xbc, 0x5b, 0x21, 0x0c, 0x4b, 0xf5, 0xd0, 0x43, 0x98, 0xb1, 0xe4, - 0x7c, 0x7d, 0xe2, 0x2c, 0x2b, 0xe4, 0x9b, 0x12, 0x4b, 0xfc, 0xc7, 0x3d, 0x1d, 0x62, 0x45, 0x38, - 0x4e, 0x8a, 0x2e, 0x03, 0x2b, 0xc8, 0x31, 0x39, 0x92, 0x6d, 0x3a, 0xcc, 0x54, 0x19, 0x2d, 0x83, - 0xb0, 0xc8, 0xc3, 0x12, 0x91, 0x1c, 0x03, 0xe2, 0x64, 0x21, 0x03, 0xe2, 0x00, 0xce, 0xbb, 0xc4, - 0x77, 0xf7, 0x1a, 0x7b, 0x3a, 0x7b, 0x94, 0xd6, 0xf5, 0x59, 0x82, 0xc7, 0x4a, 0xb1, 0x70, 0x2b, - 0x9c, 0x46, 0x85, 0xb3, 0xf0, 0xc7, 0xf8, 0xe4, 0xd4, 0xa1, 0x7c, 0xf2, 0x13, 0x50, 0xf5, 0x89, - 0xbe, 0x65, 0x9b, 0xba, 0x66, 0xb5, 0x9a, 0x22, 0x25, 0x42, 0xb4, 0xe5, 0x23, 0x10, 0x96, 0xeb, - 0xa1, 0x3a, 0x8c, 0x0d, 0x4c, 0x43, 0x1c, 0x16, 0x3f, 0x12, 0x6a, 0x19, 0xad, 0xe6, 0xa3, 0xfd, - 0xda, 0xfb, 0x23, 0x8b, 0x5c, 0xf8, 0x55, 0xd7, 0xfb, 0xdb, 0xdd, 0xeb, 0xfe, 0x5e, 0x9f, 0x78, - 0x4b, 0xeb, 0xad, 0x26, 0xa6, 0x8d, 0xb3, 0x8c, 0xab, 0xd3, 0xc7, 0x30, 0xae, 0x7e, 0x45, 0x81, - 0xf3, 0x5a, 0x52, 0x41, 0x22, 0xde, 0xc2, 0x4c, 0x71, 0xa6, 0x9b, 0xad, 0x74, 0x45, 0x49, 0x99, - 0x96, 0xd3, 0xe4, 0x70, 0x56, 0x1f, 0xd4, 0x3f, 0x56, 0x84, 0x40, 0x7f, 0x86, 0x26, 0xa9, 0xd3, - 0x56, 0x7f, 0xd5, 0x3b, 0x00, 0xd1, 0x11, 0x30, 0xb2, 0xd1, 0xee, 0x07, 0x65, 0xb8, 0x38, 0xaa, - 0x4b, 0x03, 0x4b, 0x3d, 0xc9, 0x5e, 0x07, 0x5a, 0xde, 0xf4, 0x89, 0x7b, 0xf7, 0xee, 0x6a, 0xf8, - 0x78, 0x4a, 0xc1, 0xdc, 0x97, 0xd1, 0xe3, 0x52, 0x29, 0x8c, 0x38, 0x87, 0x12, 0x3b, 0xfe, 0xc4, - 0x33, 0x0c, 0x58, 0xf3, 0x49, 0x7d, 0xe0, 0x7a, 0xbe, 0x08, 0x24, 0xe0, 0xc7, 0x5f, 0x12, 0x88, - 0xd3, 0xf5, 0x93, 0x48, 0xf8, 0x4b, 0x45, 0xe3, 0xec, 0x25, 0xe7, 0x14, 0x12, 0xfe, 0x5c, 0x51, - 0xba, 0xbe, 0x8c, 0x24, 0x7c, 0xf9, 0x99, 0x31, 0xeb, 0x04, 0x92, 0xe8, 0x59, 0xe8, 0x74, 0x7d, - 0x64, 0xc0, 0x93, 0x2e, 0xd1, 0x9d, 0x5e, 0x8f, 0xd8, 0x06, 0x4f, 0x5a, 0xac, 0xb9, 0x5d, 0xd3, - 0xbe, 0xe1, 0x6a, 0xac, 0xa2, 0x78, 0x5e, 0xfa, 0xea, 0xc1, 0x7e, 0xed, 0x49, 0x7c, 0x48, 0x3d, - 0x7c, 0x28, 0x16, 0xd4, 0x83, 0x73, 0x03, 0x96, 0x58, 0xcd, 0x6d, 0xd9, 0x3e, 0x71, 0x77, 0x34, - 0xab, 0xe0, 0xfb, 0x5b, 0x8c, 0x59, 0xac, 0xc7, 0x51, 0xe1, 0x24, 0x6e, 0xb4, 0x47, 0xf9, 0xb0, - 0xe8, 0x8e, 0x44, 0xb2, 0x52, 0x3c, 0x39, 0x2b, 0x4e, 0xa3, 0xc3, 0x59, 0x34, 0xd4, 0xaf, 0x28, - 0x20, 0x6e, 0x28, 0xa9, 0x56, 0x2f, 0x99, 0x26, 0x2a, 0x09, 0xb3, 0xc4, 0x93, 0xc2, 0x8b, 0xb2, - 0x14, 0x41, 0x25, 0x0f, 0xca, 0x0f, 0x4b, 0x11, 0x2a, 0x53, 0x11, 0x2b, 0xe0, 0x98, 0xa5, 0xd4, - 0x84, 0x4f, 0xc3, 0x14, 0xb1, 0x75, 0x77, 0xaf, 0x1f, 0x9d, 0xf0, 0x33, 0x3c, 0x21, 0x85, 0x28, - 0xc4, 0x11, 0x5c, 0xfd, 0x77, 0x0a, 0x08, 0x0c, 0x2c, 0x25, 0xe6, 0x50, 0x09, 0x15, 0x8f, 0x7e, - 0xf6, 0x3f, 0x4a, 0xe9, 0x38, 0x96, 0x97, 0xd2, 0xf1, 0xb4, 0xf2, 0x23, 0xfe, 0x8e, 0x02, 0xc9, - 0xe7, 0x74, 0xd1, 0x87, 0x60, 0x52, 0x84, 0xbf, 0x8a, 0x20, 0x3a, 0xee, 0x35, 0xcd, 0x8b, 0x70, - 0x00, 0x8b, 0x4b, 0xee, 0x23, 0x44, 0xcb, 0x65, 0x47, 0x2e, 0x1d, 0x2e, 0xb9, 0xab, 0xdf, 0x99, - 0x85, 0x09, 0x1e, 0xb0, 0x49, 0x79, 0x5a, 0x86, 0x7b, 0xde, 0xed, 0xe2, 0x21, 0xa1, 0x05, 0xbc, - 0xf0, 0x62, 0xd9, 0xbb, 0x4a, 0x87, 0x66, 0xef, 0xc2, 0x3c, 0x5d, 0xeb, 0x08, 0xd6, 0x9a, 0x06, - 0x6e, 0x89, 0x17, 0x42, 0x44, 0xaa, 0x56, 0xe4, 0xc7, 0xcc, 0x18, 0xe3, 0xc5, 0x13, 0xd1, 0xf2, - 0x01, 0x90, 0x8c, 0x19, 0xb3, 0x87, 0x18, 0x32, 0xa2, 0x08, 0xb9, 0x72, 0xf1, 0xeb, 0x0f, 0x31, - 0xe4, 0x43, 0x44, 0xc8, 0x85, 0x1b, 0x69, 0x22, 0x77, 0x23, 0x6d, 0xc2, 0xa4, 0xd8, 0x0a, 0x82, - 0x39, 0xbe, 0x38, 0x42, 0x2a, 0x56, 0x29, 0x9f, 0x02, 0x2f, 0xc0, 0x01, 0x72, 0x7a, 0xe2, 0xf6, - 0xb4, 0x5d, 0xb3, 0x37, 0xe8, 0x31, 0x8e, 0x58, 0x96, 0xab, 0xb2, 0x62, 0x1c, 0xc0, 0x59, 0x55, - 0x7e, 0x6b, 0xc4, 0x04, 0x4b, 0xb9, 0xaa, 0x78, 0xe1, 0x2a, 0x80, 0xa3, 0x37, 0xa1, 0xd2, 0xd3, - 0x76, 0x3b, 0x03, 0xb7, 0x4b, 0x84, 0x01, 0x23, 0x5f, 0xe4, 0x19, 0xf8, 0xa6, 0xb5, 0x44, 0xd5, - 0x21, 0xdf, 0x5d, 0x6a, 0xd9, 0xfe, 0x5d, 0xb7, 0xe3, 0xbb, 0x61, 0x8a, 0xc8, 0x55, 0x81, 0x05, - 0x87, 0xf8, 0x90, 0x05, 0xb3, 0x3d, 0x6d, 0x77, 0xdd, 0xd6, 0xc2, 0x87, 0x78, 0xaa, 0x05, 0x29, - 0x30, 0x2b, 0xee, 0x6a, 0x0c, 0x17, 0x4e, 0xe0, 0xce, 0x30, 0x18, 0x4f, 0x9f, 0x96, 0xc1, 0x78, - 0x39, 0xf4, 0xc3, 0xe1, 0x72, 0xec, 0xe3, 0x59, 0xf7, 0x4b, 0x87, 0xfb, 0xd8, 0xbc, 0x15, 0xfa, - 0xd8, 0xcc, 0x16, 0xb7, 0xf2, 0x1e, 0xe2, 0x5f, 0x33, 0x80, 0x2a, 0x15, 0x38, 0x79, 0xa9, 0xb7, - 0x70, 0xae, 0xb8, 0x95, 0xa1, 0x19, 0xa2, 0x91, 0xd2, 0xe4, 0x47, 0xa8, 0xb1, 0x4c, 0x07, 0xdd, - 0xe5, 0x0f, 0xb5, 0x58, 0xc4, 0x8f, 0xaa, 0x30, 0x05, 0x67, 0x8e, 0x1b, 0x92, 0x82, 0x77, 0x55, - 0x52, 0x15, 0x70, 0x76, 0x3b, 0x2a, 0xa2, 0xf2, 0x30, 0x99, 0xf9, 0x28, 0x8d, 0x4b, 0x2c, 0x64, - 0xf6, 0x6f, 0x2a, 0x30, 0xc7, 0x9f, 0x13, 0x6c, 0x38, 0xbd, 0xbe, 0x63, 0x13, 0x3a, 0x2d, 0xa8, - 0xb8, 0xcf, 0x20, 0xe7, 0x0d, 0x9d, 0x04, 0x46, 0x71, 0x31, 0x98, 0x28, 0xc5, 0x29, 0xca, 0xe8, - 0x77, 0x15, 0x58, 0xe8, 0xe5, 0x64, 0xa1, 0x5f, 0x38, 0x5f, 0xdc, 0xcf, 0xf2, 0xa8, 0xcc, 0xf6, - 0xfc, 0x89, 0xd3, 0xa3, 0x6a, 0xe1, 0xdc, 0xbe, 0x8d, 0xea, 0xd2, 0x3d, 0x4a, 0x28, 0xf1, 0xaf, - 0x2a, 0x30, 0x97, 0x3c, 0x04, 0xe4, 0xb7, 0x65, 0x94, 0xd3, 0x7d, 0x5b, 0x46, 0xba, 0xfe, 0x29, - 0x1d, 0x72, 0xfd, 0xf3, 0x12, 0x5c, 0xca, 0x5e, 0x1b, 0x54, 0x22, 0x63, 0x6f, 0x39, 0x09, 0x4d, - 0x28, 0xca, 0x86, 0x4a, 0x0b, 0x31, 0x87, 0xd5, 0x3f, 0xfa, 0xcd, 0xef, 0x5f, 0x79, 0xdf, 0xb7, - 0xbf, 0x7f, 0xe5, 0x7d, 0xdf, 0xfd, 0xfe, 0x95, 0xf7, 0xfd, 0xe4, 0xc1, 0x15, 0xe5, 0x9b, 0x07, - 0x57, 0x94, 0x6f, 0x1f, 0x5c, 0x51, 0xbe, 0x7b, 0x70, 0x45, 0xf9, 0x2f, 0x07, 0x57, 0x94, 0x9f, - 0xff, 0xaf, 0x57, 0xde, 0xf7, 0xe6, 0xa4, 0xe8, 0xf8, 0x5f, 0x04, 0x00, 0x00, 0xff, 0xff, 0x1c, - 0x58, 0xe8, 0x68, 0x8e, 0xb9, 0x00, 0x00, + 0x75, 0xd8, 0xf5, 0x90, 0x43, 0x0e, 0xdf, 0x90, 0x5c, 0xb2, 0xf6, 0xe3, 0x78, 0xbc, 0xdb, 0x9d, + 0x55, 0xeb, 0x4e, 0xd8, 0xcb, 0x49, 0x5c, 0xdf, 0xe9, 0xe4, 0xd3, 0xdd, 0xe9, 0x74, 0xc7, 0x99, + 0xe1, 0xee, 0x8e, 0x76, 0xb9, 0x3b, 0x57, 0xb3, 0xdc, 0xfb, 0xb0, 0x73, 0x51, 0xb3, 0xbb, 0x38, + 0xec, 0x63, 0x4f, 0xf7, 0x5c, 0x77, 0x0f, 0x97, 0x5c, 0xc5, 0x90, 0xad, 0x58, 0x76, 0x14, 0x27, + 0x81, 0xe1, 0xc0, 0x11, 0x24, 0x39, 0xb1, 0x0c, 0xc3, 0x50, 0x02, 0x07, 0xb6, 0x93, 0xc0, 0x46, + 0x9c, 0x2f, 0x18, 0x36, 0x02, 0x2b, 0x46, 0x12, 0x28, 0x0e, 0x04, 0x2b, 0x48, 0x4c, 0x45, 0x0c, + 0xa2, 0x24, 0x48, 0x7e, 0x04, 0x30, 0x82, 0x00, 0x0b, 0x01, 0x31, 0xea, 0xa3, 0xbb, 0xab, 0xbf, + 0xc8, 0x61, 0x0f, 0x49, 0xdd, 0xfd, 0x22, 0xa7, 0x5e, 0xd5, 0x7b, 0xd5, 0xf5, 0xf1, 0xea, 0xbd, + 0x57, 0xef, 0xbd, 0x82, 0x7a, 0xd7, 0xf4, 0x37, 0x07, 0xeb, 0x4b, 0xba, 0xd3, 0xbb, 0xda, 0xd5, + 0x5c, 0x83, 0xd8, 0xc4, 0x8d, 0xfe, 0xe9, 0x6f, 0x75, 0xaf, 0x6a, 0x7d, 0xd3, 0xbb, 0xaa, 0x3b, + 0x2e, 0xb9, 0xba, 0xfd, 0xec, 0x3a, 0xf1, 0xb5, 0x67, 0xaf, 0x76, 0x29, 0x4c, 0xf3, 0x89, 0xb1, + 0xd4, 0x77, 0x1d, 0xdf, 0x41, 0xcf, 0x45, 0x38, 0x96, 0x82, 0xa6, 0xd1, 0x3f, 0xfd, 0xad, 0xee, + 0x12, 0xc5, 0xb1, 0x44, 0x71, 0x2c, 0x09, 0x1c, 0x8b, 0x1f, 0x93, 0xe9, 0x3a, 0x5d, 0xe7, 0x2a, + 0x43, 0xb5, 0x3e, 0xd8, 0x60, 0xbf, 0xd8, 0x0f, 0xf6, 0x1f, 0x27, 0xb1, 0xf8, 0xf4, 0xd6, 0x27, + 0xbd, 0x25, 0xd3, 0xa1, 0x9d, 0xb9, 0xaa, 0x0d, 0x7c, 0xc7, 0xd3, 0x35, 0xcb, 0xb4, 0xbb, 0x57, + 0xb7, 0x53, 0xbd, 0x59, 0x54, 0xa5, 0xaa, 0xa2, 0xdb, 0x07, 0xd6, 0x71, 0xd7, 0x35, 0x3d, 0xab, + 0xce, 0xf3, 0x51, 0x9d, 0x9e, 0xa6, 0x6f, 0x9a, 0x36, 0x71, 0x77, 0x83, 0x01, 0xb9, 0xea, 0x12, + 0xcf, 0x19, 0xb8, 0x3a, 0x39, 0x52, 0x2b, 0xef, 0x6a, 0x8f, 0xf8, 0x5a, 0x16, 0xad, 0xab, 0x79, + 0xad, 0xdc, 0x81, 0xed, 0x9b, 0xbd, 0x34, 0x99, 0x1f, 0x3d, 0xac, 0x81, 0xa7, 0x6f, 0x92, 0x9e, + 0x96, 0x6a, 0xf7, 0xf1, 0xbc, 0x76, 0x03, 0xdf, 0xb4, 0xae, 0x9a, 0xb6, 0xef, 0xf9, 0x6e, 0xb2, + 0x91, 0xfa, 0x1c, 0x94, 0x97, 0x0d, 0xc3, 0xb1, 0xd1, 0xd3, 0x30, 0x49, 0x6c, 0x6d, 0xdd, 0x22, + 0xc6, 0x82, 0x72, 0x59, 0xb9, 0x52, 0xa9, 0x9f, 0xf9, 0xe6, 0x5e, 0xed, 0x91, 0xfd, 0xbd, 0xda, + 0xe4, 0x0a, 0x2f, 0xc6, 0x01, 0x5c, 0xfd, 0xc5, 0x12, 0x4c, 0xb0, 0x46, 0x1e, 0xfa, 0x05, 0x05, + 0xce, 0x6e, 0x0d, 0xd6, 0x89, 0x6b, 0x13, 0x9f, 0x78, 0x4d, 0xcd, 0xdb, 0x5c, 0x77, 0x34, 0x97, + 0xa3, 0xa8, 0x3e, 0x77, 0x7d, 0xe9, 0xe8, 0xab, 0x67, 0xe9, 0x66, 0x1a, 0x5d, 0xfd, 0xd1, 0xfd, + 0xbd, 0xda, 0xd9, 0x0c, 0x00, 0xce, 0x22, 0x8e, 0xb6, 0x61, 0xda, 0xee, 0x9a, 0xf6, 0x4e, 0xcb, + 0xee, 0xba, 0xc4, 0xf3, 0x16, 0x4a, 0xac, 0x33, 0xaf, 0x15, 0xe9, 0xcc, 0x6d, 0x09, 0x4f, 0x7d, + 0x6e, 0x7f, 0xaf, 0x36, 0x2d, 0x97, 0xe0, 0x18, 0x1d, 0xf5, 0x67, 0x14, 0x38, 0xb3, 0x6c, 0xf4, + 0x4c, 0xcf, 0x33, 0x1d, 0xbb, 0x6d, 0x0d, 0xba, 0xa6, 0x8d, 0x2e, 0xc3, 0xb8, 0xad, 0xf5, 0x08, + 0x1b, 0x90, 0xa9, 0xfa, 0xb4, 0x18, 0xd3, 0xf1, 0xdb, 0x5a, 0x8f, 0x60, 0x06, 0x41, 0xaf, 0xc3, + 0x84, 0xee, 0xd8, 0x1b, 0x66, 0x57, 0xf4, 0xf3, 0x63, 0x4b, 0x7c, 0x1e, 0x97, 0xe4, 0x79, 0x64, + 0xdd, 0x13, 0xf3, 0xbf, 0x84, 0xb5, 0xfb, 0x2b, 0x3b, 0x3e, 0xb1, 0x29, 0x99, 0x3a, 0xec, 0xef, + 0xd5, 0x26, 0x1a, 0x0c, 0x01, 0x16, 0x88, 0xd4, 0x6b, 0x50, 0x59, 0xb6, 0x88, 0xeb, 0x9b, 0x76, + 0x17, 0xbd, 0x04, 0xb3, 0xa4, 0xa7, 0x99, 0x16, 0x26, 0x3a, 0x31, 0xb7, 0x89, 0xeb, 0x2d, 0x28, + 0x97, 0xc7, 0xae, 0x4c, 0xd5, 0xd1, 0xfe, 0x5e, 0x6d, 0x76, 0x25, 0x06, 0xc1, 0x89, 0x9a, 0xea, + 0x4f, 0x29, 0x50, 0x5d, 0x1e, 0x18, 0xa6, 0xcf, 0xf1, 0x23, 0x17, 0xaa, 0x1a, 0xfd, 0xd9, 0x76, + 0x2c, 0x53, 0xdf, 0x15, 0x93, 0xfc, 0x6a, 0x91, 0x71, 0x5d, 0x8e, 0xd0, 0xd4, 0xcf, 0xec, 0xef, + 0xd5, 0xaa, 0x52, 0x01, 0x96, 0x89, 0xa8, 0x9b, 0x20, 0xc3, 0xd0, 0x5b, 0x30, 0xcd, 0x3f, 0x72, + 0x55, 0xeb, 0x63, 0xb2, 0x21, 0xfa, 0xf0, 0x61, 0x69, 0xcc, 0x02, 0x42, 0x4b, 0x77, 0xd6, 0xdf, + 0x25, 0xba, 0x8f, 0xc9, 0x06, 0x71, 0x89, 0xad, 0x13, 0x3e, 0x7d, 0x0d, 0xa9, 0x31, 0x8e, 0xa1, + 0x52, 0xbf, 0xab, 0xc0, 0xdc, 0xf2, 0xb6, 0x66, 0x5a, 0xda, 0xba, 0x69, 0x99, 0xfe, 0xee, 0xdb, + 0x8e, 0x4d, 0x86, 0x98, 0xbf, 0x35, 0x78, 0x74, 0x60, 0x6b, 0xbc, 0x9d, 0x45, 0x56, 0xf9, 0x8c, + 0xdd, 0xdd, 0xed, 0x13, 0xba, 0xf0, 0xe8, 0x48, 0x3f, 0xbe, 0xbf, 0x57, 0x7b, 0x74, 0x2d, 0xbb, + 0x0a, 0xce, 0x6b, 0x8b, 0x30, 0x5c, 0x90, 0x40, 0xf7, 0x1c, 0x6b, 0xd0, 0x13, 0x58, 0xc7, 0x18, + 0xd6, 0xc5, 0xfd, 0xbd, 0xda, 0x85, 0xb5, 0xcc, 0x1a, 0x38, 0xa7, 0xa5, 0xfa, 0xcd, 0x12, 0x4c, + 0xd7, 0x35, 0x7d, 0x6b, 0xd0, 0xaf, 0x0f, 0xf4, 0x2d, 0xe2, 0xa3, 0xcf, 0x42, 0x85, 0xb2, 0x2d, + 0x43, 0xf3, 0x35, 0x31, 0x92, 0x3f, 0x92, 0xbb, 0xfa, 0xd8, 0x24, 0xd2, 0xda, 0xd1, 0xd8, 0xae, + 0x12, 0x5f, 0xab, 0x23, 0x31, 0x26, 0x10, 0x95, 0xe1, 0x10, 0x2b, 0xda, 0x80, 0x71, 0xaf, 0x4f, + 0x74, 0xb1, 0xb6, 0x9b, 0x45, 0xd6, 0x8a, 0xdc, 0xe3, 0x4e, 0x9f, 0xe8, 0xd1, 0x2c, 0xd0, 0x5f, + 0x98, 0xe1, 0x47, 0x36, 0x4c, 0x78, 0xbe, 0xe6, 0x0f, 0xe8, 0xf0, 0x50, 0x4a, 0xd7, 0x46, 0xa6, + 0xc4, 0xb0, 0xd5, 0x67, 0x05, 0xad, 0x09, 0xfe, 0x1b, 0x0b, 0x2a, 0xea, 0x9f, 0x28, 0x30, 0x27, + 0x57, 0xbf, 0x65, 0x7a, 0x3e, 0xfa, 0xf1, 0xd4, 0x70, 0x2e, 0x0d, 0x37, 0x9c, 0xb4, 0x35, 0x1b, + 0xcc, 0x39, 0x41, 0xae, 0x12, 0x94, 0x48, 0x43, 0x49, 0xa0, 0x6c, 0xfa, 0xa4, 0xc7, 0x97, 0x55, + 0x41, 0x7e, 0x26, 0x77, 0xb9, 0x3e, 0x23, 0x88, 0x95, 0x5b, 0x14, 0x2d, 0xe6, 0xd8, 0xd5, 0xcf, + 0xc2, 0x39, 0xb9, 0x56, 0xdb, 0x75, 0xb6, 0x4d, 0x83, 0xb8, 0x74, 0x27, 0xf8, 0xbb, 0xfd, 0xd4, + 0x4e, 0xa0, 0x2b, 0x0b, 0x33, 0x08, 0xfa, 0x08, 0x4c, 0xb8, 0xa4, 0x6b, 0x3a, 0x36, 0x9b, 0xed, + 0xa9, 0x68, 0xec, 0x30, 0x2b, 0xc5, 0x02, 0xaa, 0xfe, 0xdf, 0x52, 0x7c, 0xec, 0xe8, 0x34, 0xa2, + 0x6d, 0xa8, 0xf4, 0x05, 0x29, 0x31, 0x76, 0x37, 0x46, 0xfd, 0xc0, 0xa0, 0xeb, 0xd1, 0xa8, 0x06, + 0x25, 0x38, 0xa4, 0x85, 0x4c, 0x98, 0x0d, 0xfe, 0x6f, 0x8c, 0xc0, 0x86, 0x19, 0x3b, 0x6d, 0xc7, + 0x10, 0xe1, 0x04, 0x62, 0x74, 0x17, 0xa6, 0x3c, 0xa2, 0xbb, 0x84, 0xf2, 0x24, 0xb1, 0x4c, 0x33, + 0x19, 0x57, 0x27, 0xa8, 0x24, 0x18, 0xd7, 0xbc, 0xe8, 0xfe, 0x54, 0x08, 0xc0, 0x11, 0x22, 0x74, + 0x05, 0x2a, 0x1e, 0x21, 0x06, 0xe5, 0x48, 0x0b, 0xe3, 0x7c, 0x6e, 0xe8, 0xa7, 0x76, 0x44, 0x19, + 0x0e, 0xa1, 0xea, 0xd7, 0xc7, 0x01, 0xa5, 0x97, 0xb8, 0x3c, 0x02, 0xbc, 0x44, 0x8c, 0xff, 0x28, + 0x23, 0x20, 0x76, 0x4b, 0x02, 0x31, 0x7a, 0x00, 0x33, 0x96, 0xe6, 0xf9, 0x77, 0xfa, 0x54, 0x06, + 0x09, 0x16, 0x4a, 0xf5, 0xb9, 0xe5, 0x22, 0x33, 0x7d, 0x4b, 0x46, 0x54, 0x9f, 0xdf, 0xdf, 0xab, + 0xcd, 0xc4, 0x8a, 0x70, 0x9c, 0x14, 0x7a, 0x17, 0xa6, 0x68, 0xc1, 0x8a, 0xeb, 0x3a, 0xae, 0x18, + 0xfd, 0x57, 0x8a, 0xd2, 0x65, 0x48, 0xea, 0x33, 0x74, 0x4e, 0xc2, 0x9f, 0x38, 0x42, 0x8f, 0x3e, + 0x03, 0xc8, 0x59, 0xf7, 0x88, 0xbb, 0x4d, 0x8c, 0xeb, 0x5c, 0xe0, 0xa2, 0x1f, 0x4b, 0x67, 0x67, + 0xac, 0xbe, 0x28, 0x66, 0x13, 0xdd, 0x49, 0xd5, 0xc0, 0x19, 0xad, 0xd0, 0x16, 0xa0, 0x50, 0x68, + 0x0b, 0x17, 0xc0, 0x42, 0x79, 0xf8, 0xe5, 0x73, 0x81, 0x12, 0xbb, 0x9e, 0x42, 0x81, 0x33, 0xd0, + 0xaa, 0xff, 0xaa, 0x04, 0x55, 0xbe, 0x44, 0x56, 0x6c, 0xdf, 0xdd, 0x3d, 0x85, 0x03, 0x82, 0xc4, + 0x0e, 0x88, 0x46, 0xf1, 0x3d, 0xcf, 0x3a, 0x9c, 0x7b, 0x3e, 0xf4, 0x12, 0xe7, 0xc3, 0xca, 0xa8, + 0x84, 0x0e, 0x3e, 0x1e, 0xbe, 0xad, 0xc0, 0x19, 0xa9, 0xf6, 0x29, 0x9c, 0x0e, 0x46, 0xfc, 0x74, + 0x78, 0x75, 0xc4, 0xef, 0xcb, 0x39, 0x1c, 0x9c, 0xd8, 0x67, 0x31, 0xc6, 0xfd, 0x1c, 0xc0, 0x3a, + 0x63, 0x27, 0xb7, 0x23, 0x39, 0x29, 0x9c, 0xf2, 0x7a, 0x08, 0xc1, 0x52, 0xad, 0x18, 0xcf, 0x2a, + 0x1d, 0xc8, 0xb3, 0xfe, 0xdb, 0x18, 0xcc, 0xa7, 0x86, 0x3d, 0xcd, 0x47, 0x94, 0x1f, 0x12, 0x1f, + 0x29, 0xfd, 0x30, 0xf8, 0xc8, 0x58, 0x21, 0x3e, 0x32, 0xf4, 0x39, 0x81, 0x5c, 0x40, 0x3d, 0xb3, + 0xcb, 0x9b, 0x75, 0x7c, 0xcd, 0xf5, 0xef, 0x9a, 0x3d, 0x22, 0x38, 0xce, 0x5f, 0x18, 0x6e, 0xc9, + 0xd2, 0x16, 0x9c, 0xf1, 0xac, 0xa6, 0x30, 0xe1, 0x0c, 0xec, 0xea, 0xef, 0x2b, 0x30, 0xd6, 0xc0, + 0x2d, 0xf4, 0x4c, 0x4c, 0xde, 0x7e, 0x54, 0x96, 0xb7, 0x1f, 0xee, 0xd5, 0x26, 0x1b, 0xb8, 0x25, + 0x89, 0xde, 0x7f, 0x43, 0x81, 0x79, 0xdd, 0xb1, 0x7d, 0x8d, 0xf6, 0x02, 0xf3, 0x43, 0x29, 0xd8, + 0x00, 0x85, 0x44, 0xcd, 0x46, 0x02, 0x59, 0xfd, 0x31, 0xd1, 0x81, 0xf9, 0x24, 0xc4, 0xc3, 0x69, + 0xca, 0xea, 0x1a, 0x4c, 0x35, 0x2c, 0x67, 0x60, 0xb4, 0xec, 0x0d, 0xe7, 0x18, 0xe5, 0xa5, 0xef, + 0x28, 0x30, 0xcd, 0xf0, 0xb6, 0x5d, 0x67, 0xc3, 0xb4, 0xc8, 0x07, 0x43, 0x6c, 0x97, 0x7b, 0x9c, + 0xc7, 0x96, 0x99, 0x18, 0x2d, 0x57, 0xfc, 0x80, 0x88, 0xd1, 0x72, 0x97, 0x73, 0x38, 0xe5, 0x2f, + 0x4e, 0xc6, 0xbf, 0x8c, 0xf1, 0xca, 0x2b, 0x50, 0xd1, 0xb5, 0xfa, 0xc0, 0x36, 0xac, 0x70, 0x5d, + 0xd0, 0x5e, 0x36, 0x96, 0x79, 0x19, 0x0e, 0xa1, 0xe8, 0x01, 0x40, 0x64, 0xda, 0x10, 0xd3, 0x70, + 0x6d, 0x34, 0x73, 0x4a, 0x87, 0xf8, 0xbe, 0x69, 0x77, 0xbd, 0x68, 0xea, 0x23, 0x18, 0x96, 0xa8, + 0xa1, 0x9f, 0x80, 0x19, 0x31, 0xc8, 0xad, 0x9e, 0xd6, 0x15, 0x1a, 0x67, 0xc1, 0x91, 0x5a, 0x95, + 0x10, 0xd5, 0xcf, 0x0b, 0xc2, 0x33, 0x72, 0xa9, 0x87, 0xe3, 0xd4, 0xd0, 0x2e, 0x4c, 0xf7, 0x64, + 0x2d, 0x7a, 0xbc, 0xf8, 0x81, 0x26, 0x69, 0xd4, 0xf5, 0x73, 0x82, 0xf8, 0x74, 0x4c, 0xff, 0x8e, + 0x91, 0xca, 0x50, 0x06, 0xca, 0x27, 0xa5, 0x0c, 0x10, 0x98, 0xe4, 0xdb, 0xdb, 0x5b, 0x98, 0x60, + 0x1f, 0xf8, 0x52, 0x91, 0x0f, 0xe4, 0x9c, 0x22, 0xb2, 0xd5, 0xf1, 0xdf, 0x1e, 0x0e, 0x70, 0xa3, + 0x6d, 0x98, 0xa6, 0x7c, 0xbd, 0x43, 0x2c, 0xa2, 0xfb, 0x8e, 0xbb, 0x30, 0x59, 0xdc, 0x16, 0xd6, + 0x91, 0xf0, 0x70, 0x63, 0x8a, 0x5c, 0x82, 0x63, 0x74, 0x42, 0xee, 0x57, 0xc9, 0xe5, 0x7e, 0x03, + 0xa8, 0x6e, 0x4b, 0x56, 0x8d, 0x29, 0x36, 0x08, 0x9f, 0x2e, 0xd2, 0xb1, 0xc8, 0xc4, 0x51, 0x3f, + 0x2b, 0x08, 0x55, 0x65, 0x73, 0x88, 0x4c, 0x47, 0xdd, 0xab, 0xc0, 0x7c, 0xc3, 0x1a, 0x78, 0x3e, + 0x71, 0x97, 0x85, 0xb1, 0x99, 0xb8, 0xe8, 0x0b, 0x0a, 0x5c, 0x60, 0xff, 0x36, 0x9d, 0xfb, 0x76, + 0x93, 0x58, 0xda, 0xee, 0xf2, 0x06, 0xad, 0x61, 0x18, 0x47, 0xe3, 0x40, 0xcd, 0x81, 0x90, 0x23, + 0x98, 0x79, 0xa6, 0x93, 0x89, 0x11, 0xe7, 0x50, 0x42, 0x3f, 0xa7, 0xc0, 0x63, 0x19, 0xa0, 0x26, + 0xb1, 0x88, 0x4f, 0x04, 0x0f, 0x38, 0x6a, 0x3f, 0x2e, 0xee, 0xef, 0xd5, 0x1e, 0xeb, 0xe4, 0x21, + 0xc5, 0xf9, 0xf4, 0xd0, 0xdf, 0x54, 0x60, 0x31, 0x03, 0x7a, 0x4d, 0x33, 0xad, 0x81, 0x4b, 0x84, + 0x18, 0x7d, 0xd4, 0xee, 0x5c, 0xda, 0xdf, 0xab, 0x2d, 0x76, 0x72, 0xb1, 0xe2, 0x03, 0x28, 0xa2, + 0xcf, 0xc3, 0xf9, 0x10, 0xba, 0x66, 0xdb, 0x84, 0x18, 0xc4, 0x60, 0x92, 0xc9, 0x78, 0xa1, 0xae, + 0x3c, 0xb6, 0xbf, 0x57, 0x3b, 0xdf, 0xc9, 0x42, 0x88, 0xb3, 0xe9, 0xa0, 0x2e, 0x5c, 0x8c, 0x00, + 0xbe, 0x69, 0x99, 0x0f, 0x18, 0xa6, 0xbb, 0x9b, 0x2e, 0xf1, 0x36, 0x1d, 0xcb, 0x60, 0xcc, 0x42, + 0xa9, 0x7f, 0x68, 0x7f, 0xaf, 0x76, 0xb1, 0x73, 0x50, 0x45, 0x7c, 0x30, 0x1e, 0x64, 0xc0, 0xb4, + 0xa7, 0x6b, 0x76, 0xcb, 0xf6, 0x89, 0xbb, 0xad, 0x59, 0x0b, 0x13, 0x85, 0x3e, 0x90, 0x6f, 0x51, + 0x09, 0x0f, 0x8e, 0x61, 0x45, 0x9f, 0x84, 0x0a, 0xd9, 0xe9, 0x6b, 0xb6, 0x41, 0x38, 0x5b, 0x98, + 0xaa, 0x3f, 0x41, 0x0f, 0xa3, 0x15, 0x51, 0xf6, 0x70, 0xaf, 0x36, 0x1d, 0xfc, 0xbf, 0xea, 0x18, + 0x04, 0x87, 0xb5, 0xd1, 0x5f, 0x86, 0x73, 0x3d, 0x6d, 0xe7, 0xb6, 0x63, 0x10, 0xc6, 0xe4, 0x28, + 0xcf, 0x63, 0x13, 0x51, 0x29, 0xd4, 0xcf, 0x85, 0xfd, 0xbd, 0xda, 0xb9, 0xd5, 0x0c, 0x7c, 0x38, + 0x93, 0x0a, 0x9d, 0x86, 0x9e, 0xb6, 0x73, 0xdd, 0xd5, 0x74, 0xb2, 0x31, 0xb0, 0xee, 0x12, 0xb7, + 0x67, 0xda, 0x5c, 0x9a, 0x24, 0xba, 0x63, 0x1b, 0x94, 0x95, 0x28, 0x57, 0xca, 0x7c, 0x1a, 0x56, + 0x0f, 0xaa, 0x88, 0x0f, 0xc6, 0x83, 0x9e, 0x87, 0x69, 0xb3, 0x6b, 0x3b, 0x2e, 0xb9, 0xab, 0x99, + 0xb6, 0xef, 0x2d, 0x00, 0x33, 0xbc, 0xb2, 0x61, 0x6d, 0x49, 0xe5, 0x38, 0x56, 0x4b, 0xfd, 0x9f, + 0x0a, 0x54, 0x05, 0x83, 0x61, 0x72, 0xe0, 0x3a, 0x94, 0x75, 0x2a, 0x07, 0x08, 0x46, 0xf2, 0x4a, + 0x61, 0x79, 0x83, 0x62, 0x8b, 0x84, 0x0d, 0x56, 0x84, 0x39, 0x6a, 0xb4, 0x9d, 0x21, 0x2d, 0xd4, + 0x47, 0x93, 0x16, 0x18, 0xb5, 0x43, 0x24, 0x05, 0x75, 0x6f, 0x0c, 0xa6, 0x1a, 0x8e, 0x6d, 0x98, + 0x4c, 0xc3, 0x78, 0x36, 0x26, 0xf1, 0x5e, 0x94, 0x79, 0xfe, 0xc3, 0xbd, 0xda, 0x4c, 0x58, 0x51, + 0x3a, 0x04, 0x5e, 0x0c, 0xd5, 0x72, 0x2e, 0x02, 0x7f, 0x28, 0xae, 0x4f, 0x3f, 0xdc, 0xab, 0x9d, + 0x09, 0x9b, 0xc5, 0x55, 0x6c, 0xb4, 0x0d, 0x88, 0x2a, 0x4a, 0x77, 0x5d, 0xcd, 0xf6, 0x38, 0x5a, + 0xba, 0x04, 0xc7, 0x8e, 0xac, 0xa5, 0x84, 0x7a, 0xd4, 0xad, 0x14, 0x36, 0x9c, 0x41, 0x01, 0xbd, + 0x0b, 0xb3, 0xb4, 0x74, 0xad, 0x6f, 0x68, 0x3e, 0x91, 0xf8, 0xcf, 0x91, 0x34, 0x23, 0x41, 0x73, + 0xf6, 0x56, 0x0c, 0x13, 0x4e, 0x60, 0xe6, 0x1a, 0x82, 0xe6, 0x39, 0x36, 0x63, 0x2d, 0x31, 0x0d, + 0x81, 0x96, 0x62, 0x01, 0x45, 0x4f, 0xc3, 0x64, 0x8f, 0x78, 0x9e, 0xd6, 0x25, 0x8c, 0x57, 0x4c, + 0x45, 0x02, 0xc1, 0x2a, 0x2f, 0xc6, 0x01, 0x1c, 0x7d, 0x14, 0xca, 0xba, 0x63, 0x10, 0x6f, 0x61, + 0x92, 0xad, 0xe6, 0x0b, 0x6c, 0x2d, 0xd1, 0x82, 0x87, 0x7b, 0xb5, 0x29, 0xa6, 0x75, 0xd2, 0x5f, + 0x98, 0x57, 0x52, 0x7f, 0x99, 0xca, 0xe7, 0x09, 0x3d, 0x67, 0x08, 0xcd, 0xe6, 0xf4, 0x8c, 0xaa, + 0xea, 0x97, 0x4a, 0x70, 0x8e, 0xf6, 0xd0, 0x75, 0x2c, 0x8b, 0x9e, 0x5d, 0x7d, 0xcb, 0xd9, 0xed, + 0x11, 0xfb, 0x34, 0xee, 0x36, 0x82, 0x71, 0x28, 0xe5, 0x8e, 0x43, 0x2f, 0x35, 0x0e, 0x63, 0x45, + 0xc6, 0x21, 0x5c, 0x2e, 0x87, 0x8c, 0xc5, 0x7f, 0x57, 0x60, 0x21, 0x6b, 0x2c, 0x4e, 0x41, 0xab, + 0xea, 0xc5, 0xb5, 0xaa, 0x1b, 0x45, 0xb5, 0xef, 0x64, 0xd7, 0x73, 0xb4, 0xab, 0xef, 0x97, 0xe0, + 0x42, 0x54, 0xbd, 0x65, 0x7b, 0xbe, 0x66, 0x59, 0xdc, 0xce, 0x71, 0xf2, 0xf3, 0xde, 0x8f, 0x29, + 0xc7, 0xb7, 0x47, 0xfb, 0x54, 0xb9, 0xef, 0xb9, 0xd6, 0xcb, 0x9d, 0x84, 0xf5, 0xb2, 0x7d, 0x8c, + 0x34, 0x0f, 0x36, 0x64, 0xfe, 0x2f, 0x05, 0x16, 0xb3, 0x1b, 0x9e, 0xc2, 0xa2, 0x72, 0xe2, 0x8b, + 0xea, 0x33, 0xc7, 0xf7, 0xd5, 0x39, 0xcb, 0xea, 0x1f, 0x95, 0xf2, 0xbe, 0x96, 0xa9, 0xef, 0x1b, + 0x70, 0x86, 0xea, 0x55, 0x9e, 0x2f, 0xcc, 0x6c, 0x47, 0xbb, 0x7f, 0x0e, 0x8c, 0x59, 0x67, 0x70, + 0x1c, 0x07, 0x4e, 0x22, 0x45, 0xb7, 0x61, 0x92, 0x2a, 0x53, 0x14, 0x7f, 0x69, 0x78, 0xfc, 0x21, + 0xcf, 0xef, 0xf0, 0xb6, 0x38, 0x40, 0x82, 0x7e, 0x1c, 0x66, 0x8c, 0x70, 0x47, 0x1d, 0x72, 0xf9, + 0x94, 0xc4, 0xca, 0x0c, 0xa2, 0x4d, 0xb9, 0x35, 0x8e, 0x23, 0x53, 0x7f, 0xa0, 0xc0, 0x13, 0x07, + 0xad, 0x2d, 0xf4, 0x1e, 0x80, 0x1e, 0x1c, 0xe2, 0xdc, 0xfd, 0xa0, 0xa8, 0x18, 0x14, 0x60, 0x89, + 0x36, 0x68, 0x58, 0xe4, 0x61, 0x89, 0x48, 0xc6, 0x9d, 0x56, 0xe9, 0x84, 0xee, 0xb4, 0xd4, 0xff, + 0xad, 0xc8, 0xac, 0x48, 0x9e, 0xdb, 0x0f, 0x1a, 0x2b, 0x92, 0xfb, 0x9e, 0x6b, 0xb1, 0xfb, 0x0f, + 0x25, 0xb8, 0x9c, 0xdd, 0x44, 0x3a, 0x7b, 0x5f, 0x83, 0x89, 0x3e, 0xf7, 0x11, 0x19, 0x63, 0x67, + 0xe3, 0x15, 0xca, 0x59, 0xb8, 0x07, 0xc7, 0xc3, 0xbd, 0xda, 0x62, 0x16, 0xa3, 0x17, 0xbe, 0x1f, + 0xa2, 0x1d, 0x32, 0x13, 0x76, 0x0b, 0x2e, 0x63, 0x7d, 0x7c, 0x48, 0xe6, 0xa2, 0xad, 0x13, 0x6b, + 0x68, 0x53, 0xc5, 0x4f, 0x29, 0x30, 0x1b, 0x5b, 0xd1, 0xde, 0x42, 0x99, 0xad, 0xd1, 0x42, 0xd7, + 0x09, 0xb1, 0xad, 0x12, 0x9d, 0xdc, 0xb1, 0x62, 0x0f, 0x27, 0x08, 0x26, 0xd8, 0xac, 0x3c, 0xaa, + 0x1f, 0x38, 0x36, 0x2b, 0x77, 0x3e, 0x87, 0xcd, 0xfe, 0x52, 0x29, 0xef, 0x6b, 0x19, 0x9b, 0xbd, + 0x0f, 0x53, 0x81, 0x0f, 0x5e, 0xc0, 0x2e, 0xae, 0x8d, 0xda, 0x27, 0x8e, 0x2e, 0xba, 0x4a, 0x0f, + 0x4a, 0x3c, 0x1c, 0xd1, 0x42, 0x3f, 0xad, 0x00, 0x44, 0x13, 0x23, 0x36, 0xd5, 0xdd, 0xe3, 0x1b, + 0x0e, 0x49, 0xac, 0x99, 0xa5, 0x5b, 0x5a, 0x5a, 0x14, 0x12, 0x5d, 0xf5, 0xb7, 0x4a, 0x80, 0xd2, + 0x7d, 0xa7, 0xe2, 0xe6, 0x96, 0x69, 0x1b, 0x49, 0xb1, 0xfb, 0xa6, 0x69, 0x1b, 0x98, 0x41, 0x86, + 0x10, 0x48, 0x5f, 0x81, 0x33, 0x5d, 0xcb, 0x59, 0xd7, 0x2c, 0x6b, 0x57, 0xb8, 0xf5, 0xb1, 0x1d, + 0x5a, 0xa9, 0x9f, 0xa5, 0x07, 0xd3, 0xf5, 0x38, 0x08, 0x27, 0xeb, 0xa2, 0x3e, 0xcc, 0xb9, 0x54, + 0x39, 0xd6, 0x4d, 0x8b, 0x29, 0x28, 0xce, 0xc0, 0x2f, 0x68, 0x7d, 0x39, 0xb7, 0xbf, 0x57, 0x9b, + 0xc3, 0x09, 0x5c, 0x38, 0x85, 0x1d, 0x3d, 0x05, 0x93, 0x7d, 0xd7, 0xec, 0x69, 0xee, 0x2e, 0x53, + 0x81, 0x2a, 0xf5, 0x2a, 0x3d, 0xe1, 0xda, 0xbc, 0x08, 0x07, 0x30, 0xf5, 0x6b, 0x0a, 0x8c, 0x35, + 0x6f, 0x77, 0x90, 0x0a, 0x13, 0x86, 0xd3, 0xd3, 0x4c, 0x5b, 0x8c, 0x12, 0xf3, 0x8e, 0x6b, 0xb2, + 0x12, 0x2c, 0x20, 0xa8, 0x0f, 0x53, 0x01, 0x0b, 0x1f, 0xe9, 0xb6, 0xb4, 0x79, 0xbb, 0x13, 0x7a, + 0x98, 0x84, 0xeb, 0x2a, 0x28, 0xf1, 0x70, 0x44, 0x44, 0xd5, 0x60, 0xbe, 0x79, 0xbb, 0xd3, 0xb2, + 0x75, 0x6b, 0x60, 0x90, 0x95, 0x1d, 0xf6, 0x87, 0x7e, 0x99, 0xc9, 0x4b, 0x84, 0x47, 0x1e, 0xfb, + 0x32, 0x51, 0x09, 0x07, 0x30, 0x5a, 0x8d, 0xf0, 0x16, 0xc2, 0x9d, 0x8c, 0x55, 0x13, 0x48, 0x70, + 0x00, 0x53, 0xbf, 0x53, 0x82, 0xaa, 0xd4, 0x21, 0x64, 0xc1, 0x24, 0xff, 0xdc, 0xc0, 0x9b, 0x63, + 0xa5, 0xe0, 0x27, 0xc6, 0x7b, 0xcd, 0xa9, 0xf3, 0x01, 0xf5, 0x70, 0x40, 0x42, 0x9e, 0xa5, 0x52, + 0xfe, 0x2c, 0xa1, 0x25, 0x00, 0xee, 0xb7, 0xc2, 0x2e, 0x21, 0xf9, 0xd1, 0xc0, 0x36, 0x42, 0x27, + 0x2c, 0xc5, 0x52, 0x0d, 0xf4, 0x84, 0x58, 0xcf, 0xfc, 0xba, 0xb2, 0x92, 0x58, 0xcb, 0x1b, 0x50, + 0x7e, 0xe0, 0xd8, 0xc4, 0x13, 0x36, 0xfa, 0x63, 0xfa, 0xc0, 0x29, 0xca, 0xad, 0xde, 0xa6, 0x78, + 0x31, 0x47, 0xaf, 0xfe, 0x8a, 0x02, 0xd0, 0xd4, 0x7c, 0x8d, 0x9b, 0x94, 0x87, 0xf0, 0x08, 0x7c, + 0x22, 0xb6, 0x0d, 0x2b, 0xa9, 0x5b, 0xbf, 0x71, 0xcf, 0x7c, 0x10, 0x7c, 0x7e, 0x78, 0xbc, 0x73, + 0xec, 0x1d, 0xf3, 0x01, 0xc1, 0x0c, 0x8e, 0x9e, 0x81, 0x29, 0x62, 0xeb, 0xee, 0x6e, 0xdf, 0x27, + 0x06, 0x1b, 0x81, 0x0a, 0xbf, 0x28, 0x5e, 0x09, 0x0a, 0x71, 0x04, 0x57, 0x9f, 0x85, 0xb8, 0x8c, + 0x76, 0x78, 0x2f, 0xd5, 0x6d, 0xa8, 0xac, 0xd8, 0x46, 0xdf, 0x31, 0x6d, 0x7f, 0x88, 0x6f, 0xba, + 0x08, 0x63, 0x03, 0xd7, 0x12, 0x9f, 0x54, 0x15, 0x15, 0xc6, 0xd6, 0xf0, 0x2d, 0x4c, 0xcb, 0xd1, + 0xd3, 0x30, 0xd9, 0x1f, 0xb8, 0x7d, 0xc7, 0x0b, 0xbe, 0x2b, 0x14, 0x46, 0xdb, 0xbc, 0x18, 0x07, + 0x70, 0xf5, 0xa1, 0x02, 0x73, 0x2b, 0x3b, 0x7d, 0xd3, 0x65, 0xde, 0x89, 0xc4, 0xa5, 0x82, 0x16, + 0x6d, 0xbf, 0xcd, 0xff, 0x15, 0x7d, 0x08, 0xdb, 0x8b, 0x1a, 0x38, 0x80, 0xa3, 0x0d, 0x98, 0x25, + 0xac, 0x39, 0xe3, 0xa8, 0x5a, 0x68, 0x19, 0x3f, 0x8a, 0xfd, 0x85, 0x3b, 0xbf, 0xc6, 0xb0, 0xe0, + 0x04, 0x56, 0xd4, 0x81, 0x59, 0xdd, 0xd2, 0x3c, 0xcf, 0xdc, 0x30, 0xf5, 0xe8, 0xde, 0x7d, 0xaa, + 0xfe, 0x0c, 0x6d, 0xdb, 0x88, 0x41, 0x1e, 0xee, 0xd5, 0xce, 0x8b, 0x7e, 0xc6, 0x01, 0x38, 0x81, + 0x42, 0xfd, 0x7d, 0x05, 0xa6, 0x42, 0xf1, 0xf2, 0x7d, 0x65, 0x48, 0x41, 0x57, 0xa0, 0x62, 0x98, + 0x9e, 0x7c, 0x26, 0xb0, 0xbb, 0xc9, 0xa6, 0x28, 0xc3, 0x21, 0x54, 0xf5, 0xa0, 0x72, 0x5d, 0x6c, + 0x2b, 0xb4, 0x08, 0x25, 0x33, 0x38, 0x92, 0x40, 0x7c, 0x40, 0xa9, 0xd5, 0xc4, 0x25, 0xd3, 0x08, + 0x57, 0x55, 0x29, 0x77, 0x55, 0x49, 0xd3, 0x3e, 0x76, 0xf0, 0xb4, 0xab, 0xbf, 0xa1, 0x40, 0xf5, + 0x86, 0xb9, 0x4e, 0x5c, 0x6e, 0xa3, 0x65, 0x7c, 0x31, 0xe6, 0xaf, 0x5e, 0xcd, 0xf2, 0x55, 0x47, + 0x3b, 0x30, 0xe5, 0xe9, 0x9b, 0xc4, 0x18, 0x58, 0xa1, 0x67, 0x40, 0x21, 0xaf, 0x74, 0x89, 0x74, + 0x47, 0xe0, 0x93, 0xfc, 0xf2, 0x02, 0x0a, 0x38, 0x22, 0xa6, 0x7e, 0x0e, 0xce, 0x66, 0x34, 0x42, + 0x35, 0x28, 0x7b, 0xbe, 0xe6, 0xfa, 0x62, 0xcc, 0x18, 0xbb, 0x61, 0x6e, 0x10, 0x98, 0x97, 0xa3, + 0xc7, 0x60, 0x8c, 0xd8, 0x86, 0x18, 0xb4, 0x49, 0xba, 0xcb, 0x56, 0x6c, 0x03, 0xd3, 0x32, 0x3a, + 0x45, 0x96, 0x13, 0x5b, 0x8c, 0x6c, 0x8a, 0x6e, 0x89, 0x32, 0x1c, 0x42, 0xd5, 0x7f, 0x3a, 0x0e, + 0x17, 0x6f, 0x38, 0xae, 0xf9, 0xc0, 0xb1, 0x7d, 0xcd, 0x6a, 0x3b, 0x46, 0x74, 0xd7, 0x25, 0xa6, + 0xfb, 0x8b, 0x0a, 0x3c, 0xaa, 0xf7, 0x07, 0x2d, 0xdb, 0xf4, 0x4d, 0x2d, 0xb8, 0x82, 0x68, 0x13, + 0xd7, 0x74, 0x8a, 0x5e, 0x79, 0x31, 0x3f, 0xe7, 0x46, 0x7b, 0x2d, 0x0b, 0x25, 0xce, 0xa3, 0xc5, + 0x6e, 0xde, 0x0c, 0xe7, 0xbe, 0xcd, 0x3a, 0xd7, 0xf1, 0x99, 0xef, 0xf5, 0x83, 0xe8, 0x13, 0x0b, + 0xde, 0xbc, 0x35, 0x33, 0x31, 0xe2, 0x1c, 0x4a, 0xe8, 0xf3, 0x70, 0xde, 0xe4, 0x9d, 0xc3, 0x44, + 0x33, 0x4c, 0x9b, 0x78, 0x1e, 0xbb, 0x7f, 0x1a, 0xe5, 0x6a, 0xa9, 0x95, 0x85, 0x10, 0x67, 0xd3, + 0x41, 0xef, 0x00, 0x78, 0xbb, 0xb6, 0x2e, 0xc6, 0xbf, 0x5c, 0x88, 0x2a, 0x3f, 0x49, 0x43, 0x2c, + 0x58, 0xc2, 0x48, 0x0f, 0x13, 0xdf, 0xb1, 0x88, 0xab, 0xd9, 0x3a, 0x37, 0x11, 0x2b, 0xfc, 0x30, + 0xb9, 0x1b, 0x14, 0xe2, 0x08, 0xae, 0xfe, 0x03, 0x05, 0x26, 0x45, 0x4c, 0x03, 0xfa, 0x48, 0x42, + 0xa0, 0x0a, 0xed, 0x44, 0x09, 0xa1, 0x6a, 0x97, 0xe9, 0xf8, 0x42, 0x64, 0x15, 0x4c, 0xaa, 0xd0, + 0x89, 0x2c, 0x08, 0x47, 0xf2, 0x6f, 0x4c, 0xd7, 0x0f, 0x64, 0x62, 0x89, 0x98, 0xfa, 0x75, 0x05, + 0xe6, 0x53, 0xad, 0x86, 0x90, 0x96, 0x4f, 0xd1, 0x48, 0xfd, 0x27, 0x55, 0x60, 0xe1, 0x2b, 0xcb, + 0xed, 0x56, 0x87, 0xb8, 0xdb, 0xe1, 0x26, 0xfc, 0x6b, 0x0a, 0xcc, 0x45, 0xd7, 0x29, 0xa2, 0x17, + 0x4a, 0x71, 0x9f, 0x9b, 0x9b, 0x09, 0x5c, 0xf5, 0x05, 0xf1, 0xdd, 0x73, 0x49, 0x08, 0x4e, 0xd1, + 0x45, 0x5f, 0x52, 0x60, 0x4e, 0x8b, 0x87, 0xaf, 0x04, 0x2c, 0xb3, 0x90, 0x5b, 0x66, 0x22, 0x14, + 0x26, 0xea, 0x4b, 0x02, 0xe0, 0xe1, 0x14, 0x59, 0xf4, 0x3c, 0x4c, 0x6b, 0x7d, 0x73, 0x79, 0x60, + 0x98, 0xc4, 0xd6, 0xc3, 0x98, 0x07, 0xa6, 0xc9, 0x2f, 0xb7, 0x5b, 0x61, 0x39, 0x8e, 0xd5, 0x0a, + 0xe3, 0x53, 0xc4, 0x40, 0x8e, 0x8f, 0x18, 0x9f, 0x22, 0xc6, 0x30, 0x8a, 0x4f, 0x11, 0x43, 0x27, + 0x13, 0x41, 0x3f, 0x06, 0x8f, 0xf1, 0xb3, 0xa6, 0xae, 0x79, 0xa6, 0xbe, 0x3c, 0xf0, 0x37, 0x89, + 0xed, 0x07, 0x12, 0x03, 0x57, 0x59, 0xd8, 0x1d, 0xfc, 0x4a, 0x5e, 0x25, 0x9c, 0xdf, 0x1e, 0xd9, + 0x00, 0x8e, 0x69, 0xe8, 0xe2, 0x7b, 0xf8, 0x35, 0x70, 0x21, 0x17, 0x89, 0x3b, 0xad, 0x66, 0x43, + 0x7c, 0x0e, 0x63, 0x13, 0xd1, 0x6f, 0x2c, 0x51, 0x40, 0x5f, 0x56, 0x60, 0x46, 0x2c, 0x72, 0x41, + 0x73, 0x92, 0xcd, 0xff, 0xdb, 0x45, 0x17, 0x63, 0x62, 0xc1, 0x2f, 0x61, 0x19, 0x39, 0x77, 0x34, + 0x0d, 0x9d, 0x82, 0x62, 0x30, 0x1c, 0xef, 0x07, 0xfa, 0xdb, 0x0a, 0x9c, 0xf3, 0x88, 0xbb, 0x6d, + 0xea, 0x64, 0x59, 0xd7, 0x9d, 0x81, 0x1d, 0x4c, 0x72, 0xa5, 0x78, 0xac, 0x40, 0x27, 0x03, 0x1f, + 0xbf, 0x8d, 0xce, 0x82, 0xe0, 0x4c, 0xfa, 0xf4, 0xfc, 0x3a, 0x73, 0x5f, 0xf3, 0xf5, 0xcd, 0x86, + 0xa6, 0x6f, 0x32, 0xf9, 0x9d, 0x5f, 0x40, 0x17, 0xdc, 0x34, 0x6f, 0xc4, 0x51, 0x71, 0xbd, 0x3c, + 0x51, 0x88, 0x93, 0x04, 0x91, 0x07, 0x15, 0x97, 0xbc, 0x37, 0x20, 0x1e, 0xbb, 0xa5, 0xa6, 0xc4, + 0x5b, 0x23, 0xcf, 0x18, 0x16, 0x08, 0xb9, 0x8c, 0x11, 0xfc, 0xc2, 0x21, 0x21, 0xd4, 0x85, 0x8b, + 0x7c, 0xe5, 0x2e, 0xdb, 0x8e, 0xbd, 0xdb, 0x73, 0x06, 0x5e, 0x62, 0xf5, 0x57, 0xd9, 0xea, 0x67, + 0xf7, 0xf0, 0x2b, 0x07, 0x55, 0xc4, 0x07, 0xe3, 0x41, 0x6f, 0x42, 0x85, 0x6c, 0x13, 0xdb, 0xbf, + 0x7b, 0xf7, 0xd6, 0xc2, 0x74, 0xa1, 0xa3, 0x91, 0x7d, 0xc2, 0x8a, 0xc0, 0x81, 0x43, 0x6c, 0x8b, + 0xaf, 0x01, 0x4a, 0xaf, 0x48, 0x34, 0x07, 0x63, 0x5b, 0x84, 0x87, 0xb7, 0x4d, 0x61, 0xfa, 0x2f, + 0x3a, 0x07, 0xe5, 0x6d, 0xcd, 0x1a, 0x70, 0x51, 0xb6, 0x82, 0xf9, 0x8f, 0x97, 0x4a, 0x9f, 0x54, + 0xd4, 0xdf, 0x51, 0xe0, 0x7c, 0xe6, 0xb0, 0x21, 0x0c, 0x17, 0x98, 0xfb, 0x82, 0xbd, 0x3a, 0xf0, + 0x35, 0xdf, 0xb4, 0xbb, 0x2d, 0x7b, 0xc3, 0x32, 0xbb, 0x9b, 0x5c, 0xf2, 0x2b, 0x73, 0x39, 0x65, + 0x35, 0xb3, 0x06, 0xce, 0x69, 0x89, 0x5a, 0x70, 0xb6, 0xa7, 0xed, 0xa4, 0x10, 0x96, 0x18, 0x42, + 0x16, 0x24, 0xb9, 0x9a, 0x06, 0xe3, 0xac, 0x36, 0xea, 0x57, 0xcb, 0xf0, 0x38, 0xed, 0x78, 0x74, + 0x64, 0xae, 0x6a, 0xb6, 0xd6, 0x7d, 0x7f, 0x1e, 0x4d, 0xbf, 0xa1, 0xc0, 0xa3, 0x9b, 0xd9, 0xe2, + 0xac, 0x38, 0xb4, 0x5f, 0x2f, 0x24, 0xd4, 0x1f, 0x24, 0x21, 0xf3, 0x85, 0x7b, 0x60, 0x15, 0x9c, + 0xd7, 0x29, 0xf4, 0x1a, 0xcc, 0xd9, 0x8e, 0x41, 0x1a, 0xad, 0x26, 0x5e, 0xd5, 0xbc, 0xad, 0x4e, + 0xa0, 0xf0, 0x97, 0xb9, 0xe1, 0xeb, 0x76, 0x02, 0x86, 0x53, 0xb5, 0xd1, 0x36, 0xa0, 0xbe, 0x63, + 0xac, 0x6c, 0x9b, 0x7a, 0xe0, 0x79, 0x50, 0xdc, 0xd8, 0xc6, 0x1c, 0xb1, 0xdb, 0x29, 0x6c, 0x38, + 0x83, 0x02, 0x93, 0xc7, 0x69, 0x67, 0x56, 0x1d, 0xdb, 0xf4, 0x1d, 0x97, 0xb9, 0xc7, 0x8c, 0x24, + 0x96, 0xb2, 0x75, 0x7e, 0x3b, 0x13, 0x23, 0xce, 0xa1, 0xa4, 0xfe, 0x1f, 0x05, 0xce, 0xd0, 0x65, + 0xd1, 0x76, 0x9d, 0x9d, 0xdd, 0xf7, 0xe3, 0x82, 0x7c, 0x1a, 0xc6, 0x7b, 0x8e, 0x11, 0xa8, 0xb6, + 0xe7, 0xa9, 0x64, 0xb9, 0xea, 0x18, 0xe4, 0x21, 0xb7, 0x00, 0xee, 0xec, 0x32, 0x87, 0x29, 0x56, + 0x45, 0x56, 0x54, 0xc7, 0xf2, 0x15, 0x55, 0xf5, 0x3f, 0x29, 0x5c, 0x44, 0x0c, 0x14, 0xc5, 0xf7, + 0xe5, 0x3e, 0x7c, 0x01, 0x66, 0x68, 0xd9, 0xaa, 0xb6, 0xd3, 0x6e, 0xde, 0x73, 0xac, 0xc0, 0x6b, + 0x87, 0xdd, 0x11, 0xde, 0x94, 0x01, 0x38, 0x5e, 0x4f, 0xfd, 0xb5, 0x33, 0xc0, 0x2a, 0x58, 0xc4, + 0x7f, 0x3f, 0x7e, 0xd7, 0xb3, 0x50, 0xd5, 0xfb, 0x83, 0xc6, 0xb5, 0xce, 0xeb, 0x03, 0xc7, 0xd7, + 0x84, 0x0d, 0x93, 0xc9, 0x7d, 0x8d, 0xf6, 0x5a, 0x50, 0x8c, 0xe5, 0x3a, 0x74, 0x87, 0xeb, 0xfd, + 0x81, 0xe0, 0x99, 0x6d, 0xf9, 0xb2, 0x8b, 0xed, 0xf0, 0x46, 0x7b, 0x2d, 0x06, 0xc3, 0xa9, 0xda, + 0xe8, 0xf3, 0x30, 0x4d, 0xc4, 0xe6, 0xbb, 0xa1, 0xb9, 0x86, 0xd8, 0xdb, 0x85, 0x0f, 0xee, 0x70, + 0x68, 0x83, 0x1d, 0xcd, 0xc5, 0xe5, 0x15, 0x89, 0x04, 0x8e, 0x11, 0x64, 0xa2, 0xab, 0xf8, 0x4d, + 0x67, 0xca, 0x31, 0x92, 0x9b, 0xbd, 0x2c, 0x44, 0xd7, 0xbc, 0x4a, 0x38, 0xbf, 0x3d, 0xfa, 0x75, + 0x05, 0x2e, 0x84, 0x50, 0xd3, 0x36, 0x7b, 0x83, 0x1e, 0x26, 0xba, 0xa5, 0x99, 0x3d, 0x21, 0xc7, + 0xbe, 0x71, 0x6c, 0x1f, 0x1a, 0x47, 0xcf, 0x19, 0x4e, 0x36, 0x0c, 0xe7, 0x74, 0x09, 0x7d, 0x5d, + 0x81, 0xcb, 0x01, 0xa8, 0x4d, 0x35, 0xc9, 0x81, 0x4b, 0x22, 0xbf, 0x2f, 0x31, 0x24, 0x93, 0x85, + 0xf8, 0xdf, 0x93, 0xfb, 0x7b, 0xb5, 0xcb, 0x2b, 0x87, 0xe0, 0xc6, 0x87, 0x52, 0x97, 0x97, 0x4b, + 0xc7, 0xd9, 0xf0, 0x85, 0xe0, 0x7b, 0x52, 0xcb, 0x85, 0x92, 0xc0, 0x31, 0x82, 0xe8, 0x37, 0x15, + 0x78, 0x54, 0x2e, 0x90, 0x57, 0x0b, 0x97, 0x78, 0xdf, 0x3c, 0xb6, 0xce, 0x24, 0xf0, 0x73, 0xdb, + 0x52, 0x0e, 0x10, 0xe7, 0xf5, 0x8a, 0xb2, 0xde, 0x1e, 0x5b, 0x98, 0x5c, 0x2a, 0x2e, 0x73, 0xd6, + 0xcb, 0xd7, 0xaa, 0x87, 0x03, 0x18, 0x55, 0x36, 0xfb, 0x8e, 0xd1, 0x36, 0x0d, 0xef, 0x96, 0xd9, + 0x33, 0x7d, 0x26, 0xb7, 0x8e, 0xf1, 0xe1, 0x68, 0x3b, 0x46, 0xbb, 0xd5, 0xe4, 0xe5, 0x38, 0x56, + 0x8b, 0x79, 0x6b, 0x9b, 0x3d, 0xad, 0x4b, 0xda, 0x03, 0xcb, 0x6a, 0xbb, 0x0e, 0x33, 0x40, 0x34, + 0x89, 0x66, 0x58, 0xa6, 0x4d, 0x0a, 0xca, 0xa9, 0x6c, 0xbb, 0xb5, 0xf2, 0x90, 0xe2, 0x7c, 0x7a, + 0x68, 0x09, 0x60, 0x43, 0x33, 0xad, 0xce, 0x7d, 0xad, 0x7f, 0xc7, 0x5e, 0x98, 0x61, 0x0c, 0x8c, + 0x69, 0x7a, 0xd7, 0xc2, 0x52, 0x2c, 0xd5, 0xa0, 0xab, 0x89, 0x72, 0x41, 0x4c, 0x78, 0x9c, 0xd8, + 0xc2, 0xec, 0x31, 0xad, 0xa6, 0x00, 0x21, 0x1f, 0xbe, 0x9b, 0x12, 0x09, 0x1c, 0x23, 0x88, 0xbe, + 0xa8, 0xc0, 0xac, 0xb7, 0xeb, 0xf9, 0xa4, 0x17, 0xf6, 0xe1, 0xcc, 0x71, 0xf7, 0x81, 0x99, 0x66, + 0x3a, 0x31, 0x22, 0x38, 0x41, 0x14, 0x69, 0xf0, 0x38, 0x1b, 0xd5, 0xeb, 0x8d, 0x1b, 0x66, 0x77, + 0x33, 0xf4, 0xc1, 0x6e, 0x13, 0x57, 0x27, 0xb6, 0xbf, 0x30, 0xc7, 0xd6, 0x4d, 0x6d, 0x7f, 0xaf, + 0xf6, 0x78, 0x2b, 0xbf, 0x1a, 0x3e, 0x08, 0x07, 0x7a, 0x07, 0x16, 0x05, 0xf8, 0x96, 0x73, 0x3f, + 0x45, 0x61, 0x9e, 0x51, 0x60, 0x8e, 0xf1, 0xad, 0xdc, 0x5a, 0xf8, 0x00, 0x0c, 0x54, 0x2b, 0xf0, + 0x88, 0xcb, 0x2c, 0xab, 0x24, 0x5c, 0x3c, 0xde, 0x02, 0x62, 0x8b, 0x80, 0x69, 0x05, 0x9d, 0x34, + 0x18, 0x67, 0xb5, 0x51, 0xf7, 0x4a, 0x5c, 0x9d, 0x49, 0x6d, 0x48, 0xf4, 0x0a, 0x9c, 0xe9, 0x91, + 0x9e, 0xe3, 0xee, 0x2e, 0x07, 0x99, 0x25, 0x84, 0x69, 0x8d, 0x69, 0xa8, 0xab, 0x71, 0x10, 0x4e, + 0xd6, 0xa5, 0xc7, 0x25, 0xfb, 0x82, 0x6b, 0x9d, 0xa8, 0x7d, 0x29, 0x3a, 0x2e, 0x5b, 0x09, 0x18, + 0x4e, 0xd5, 0x46, 0x0d, 0x98, 0x17, 0x65, 0x2d, 0x2a, 0x35, 0x7a, 0xd7, 0x5c, 0x12, 0x5c, 0x36, + 0x51, 0xf9, 0x6b, 0xbe, 0x95, 0x04, 0xe2, 0x74, 0x7d, 0xfa, 0x15, 0xf4, 0x87, 0xdc, 0x8b, 0xf1, + 0xe8, 0x2b, 0x6e, 0xc7, 0x41, 0x38, 0x59, 0x37, 0x10, 0xeb, 0x63, 0x5d, 0x28, 0x47, 0x5f, 0x71, + 0x3b, 0x01, 0xc3, 0xa9, 0xda, 0xea, 0x7f, 0x1e, 0x87, 0x0f, 0x0f, 0x71, 0x88, 0xa1, 0x5e, 0xf6, + 0x70, 0x1f, 0xc2, 0x52, 0x96, 0x02, 0x5f, 0x86, 0xa5, 0xd7, 0x07, 0x9a, 0xed, 0x9b, 0xfe, 0xee, + 0x90, 0xd3, 0xd3, 0xcf, 0x99, 0x9e, 0xa3, 0xd3, 0x1b, 0x76, 0x3a, 0xbd, 0xbc, 0xe9, 0x3c, 0x3a, + 0xc9, 0xe1, 0xa7, 0xbf, 0x97, 0x3d, 0xfd, 0x05, 0x47, 0xf5, 0xd0, 0xe5, 0xd2, 0xcf, 0x59, 0x2e, + 0x05, 0x47, 0x75, 0x88, 0xe5, 0xf5, 0xa7, 0xe3, 0xf0, 0xe4, 0x30, 0x07, 0x6a, 0xc1, 0xf5, 0x95, + 0x71, 0x64, 0x9d, 0xe8, 0xfa, 0xca, 0x73, 0x1c, 0x39, 0xc1, 0xf5, 0x95, 0x41, 0xf2, 0xa4, 0xd7, + 0x57, 0xde, 0xa8, 0x9e, 0xd4, 0xfa, 0xca, 0x1b, 0xd5, 0x21, 0xd6, 0xd7, 0x9f, 0x25, 0xcf, 0x87, + 0xf0, 0x1c, 0x6d, 0xc1, 0x98, 0xde, 0x1f, 0x14, 0x64, 0x52, 0xec, 0x9a, 0xb3, 0xd1, 0x5e, 0xc3, + 0x14, 0x07, 0xc2, 0x30, 0xc1, 0xd7, 0x4f, 0x41, 0x16, 0xc4, 0x9c, 0x7e, 0xf8, 0x92, 0xc4, 0x02, + 0x13, 0x1d, 0x2a, 0xd2, 0xdf, 0x24, 0x3d, 0xe2, 0x6a, 0x56, 0xc7, 0x77, 0x5c, 0xad, 0x5b, 0x94, + 0xdb, 0xb0, 0xa1, 0x5a, 0x49, 0xe0, 0xc2, 0x29, 0xec, 0x74, 0x40, 0xfa, 0xa6, 0x51, 0x90, 0xbf, + 0xb0, 0x01, 0x69, 0xb7, 0x9a, 0x98, 0xe2, 0x50, 0xff, 0xa0, 0x02, 0x52, 0x04, 0x0e, 0xd5, 0xdb, + 0x34, 0xcb, 0x72, 0xee, 0xb7, 0x5d, 0x73, 0xdb, 0xb4, 0x48, 0x97, 0x18, 0x61, 0x88, 0x86, 0x27, + 0x2e, 0xc3, 0x99, 0x20, 0xb9, 0x9c, 0x57, 0x09, 0xe7, 0xb7, 0xa7, 0x7a, 0xf9, 0xbc, 0x9e, 0x8c, + 0x8f, 0x1c, 0xe5, 0x42, 0x2f, 0x15, 0x6c, 0xc9, 0xf7, 0x53, 0xaa, 0x18, 0xa7, 0xc9, 0xa2, 0x9f, + 0x54, 0xb8, 0xc1, 0x21, 0xb4, 0xae, 0x8a, 0x39, 0xbb, 0x7e, 0x4c, 0xf7, 0x11, 0x91, 0xe5, 0x22, + 0xb2, 0xdf, 0xc6, 0x09, 0x52, 0xcd, 0xf0, 0xfc, 0x56, 0x96, 0x9d, 0x54, 0xcc, 0xec, 0x9d, 0xa2, + 0x5d, 0xc9, 0x31, 0xbc, 0xf2, 0xcb, 0xe3, 0xcc, 0x0a, 0x38, 0xbb, 0x23, 0xe1, 0x28, 0x85, 0xa6, + 0x23, 0xc1, 0x04, 0x0a, 0x8f, 0x52, 0xc2, 0x06, 0x15, 0x8d, 0x52, 0x08, 0xc0, 0x71, 0x82, 0xa8, + 0x0f, 0x53, 0x5b, 0x81, 0xbd, 0x4e, 0xe8, 0xf7, 0x8d, 0xa2, 0xd4, 0x25, 0xa3, 0x1f, 0xbf, 0xa4, + 0x0e, 0x0b, 0x71, 0x44, 0x04, 0x6d, 0xc2, 0xe4, 0x16, 0x67, 0x44, 0x42, 0x2f, 0x5f, 0x1e, 0x59, + 0x6f, 0xe0, 0xea, 0xa1, 0x28, 0xc2, 0x01, 0x7a, 0xd9, 0x49, 0xa5, 0x72, 0x88, 0x6f, 0xd2, 0x57, + 0x15, 0x38, 0xbf, 0x4d, 0x5c, 0xdf, 0xd4, 0x93, 0x56, 0xea, 0xa9, 0xe2, 0xba, 0xcd, 0xbd, 0x2c, + 0x84, 0x7c, 0x99, 0x64, 0x82, 0x70, 0x76, 0x17, 0xd4, 0xef, 0x2b, 0x90, 0xb2, 0x85, 0xa1, 0x9f, + 0x57, 0x60, 0x7a, 0x83, 0x68, 0xfe, 0xc0, 0x25, 0xd7, 0x35, 0x3f, 0xf4, 0xb7, 0xbd, 0x77, 0x1c, + 0x26, 0xb8, 0xa5, 0x6b, 0x12, 0x62, 0x7e, 0xd9, 0x17, 0x06, 0xe1, 0xcb, 0x20, 0x1c, 0xeb, 0xc1, + 0xe2, 0xab, 0x30, 0x9f, 0x6a, 0x78, 0xa4, 0x3b, 0x99, 0x7f, 0x21, 0x4c, 0xa9, 0xc9, 0xbc, 0x90, + 0xef, 0x40, 0x59, 0x33, 0x8c, 0x30, 0xeb, 0xd4, 0x8b, 0xc5, 0x2e, 0xb5, 0x0d, 0xd9, 0xad, 0x99, + 0xfd, 0xc4, 0x1c, 0x2d, 0xba, 0x06, 0x48, 0x8b, 0xdd, 0x5c, 0xad, 0x3a, 0x46, 0xa0, 0x25, 0x31, + 0x13, 0xfc, 0x72, 0x0a, 0x8a, 0x33, 0x5a, 0xa8, 0x2f, 0xc3, 0x6c, 0x3c, 0x0e, 0xf3, 0x08, 0xee, + 0x71, 0xea, 0x5f, 0x55, 0x00, 0xa5, 0x73, 0x3e, 0x20, 0x17, 0x2a, 0xa2, 0x46, 0x30, 0xc5, 0x85, + 0xac, 0xac, 0x49, 0xc7, 0xbd, 0xc8, 0xaf, 0x5c, 0x14, 0x78, 0x38, 0xa4, 0xa3, 0xfe, 0x40, 0x81, + 0x28, 0xad, 0x0d, 0xfa, 0x04, 0x54, 0x0d, 0xe2, 0xe9, 0xae, 0xd9, 0xf7, 0xa3, 0xef, 0x08, 0xe3, + 0xf5, 0x9b, 0x11, 0x08, 0xcb, 0xf5, 0x90, 0x0a, 0x13, 0xbe, 0xe6, 0x6d, 0xb5, 0x9a, 0x42, 0x5d, + 0x64, 0x87, 0xfb, 0x5d, 0x56, 0x82, 0x05, 0x24, 0x8a, 0x69, 0x1c, 0x1b, 0x22, 0xa6, 0x11, 0x6d, + 0x1c, 0x43, 0x00, 0x27, 0x3a, 0x3c, 0x78, 0x53, 0xfd, 0xe3, 0x12, 0xc4, 0x33, 0x09, 0x15, 0x1d, + 0x82, 0x74, 0xc4, 0x69, 0xe9, 0xc4, 0x22, 0x4e, 0x3f, 0xca, 0xd2, 0xf0, 0xf1, 0xbc, 0xa9, 0xfc, + 0xc2, 0x4a, 0x4e, 0x9e, 0xc7, 0xb3, 0x9e, 0x86, 0x35, 0xd0, 0x8b, 0xcc, 0x99, 0xcd, 0x0f, 0x94, + 0xe8, 0x0f, 0x07, 0xdb, 0xa2, 0x43, 0x0b, 0x1f, 0x8a, 0x98, 0xda, 0xf0, 0xfb, 0x59, 0x29, 0xe6, + 0x2d, 0xd0, 0x27, 0x84, 0xef, 0x63, 0x39, 0x16, 0xf7, 0x1b, 0x04, 0x0b, 0xcf, 0xc7, 0x1a, 0x46, + 0x0e, 0x91, 0xea, 0xdf, 0x52, 0x60, 0x52, 0x24, 0xf0, 0x18, 0xc2, 0x7d, 0x72, 0x03, 0xca, 0x4c, + 0x48, 0x1f, 0x45, 0x7e, 0xe9, 0x6c, 0x3a, 0x8e, 0x1f, 0x4b, 0x63, 0xc2, 0x7c, 0xf6, 0xd8, 0xbf, + 0x98, 0xa3, 0x57, 0xbf, 0x36, 0x0e, 0x97, 0x45, 0x95, 0xd4, 0xf1, 0x1c, 0x6e, 0xc1, 0x5d, 0x38, + 0x2b, 0x66, 0xa9, 0xe9, 0x6a, 0x66, 0x78, 0xa5, 0x57, 0x4c, 0xed, 0x12, 0x97, 0xbd, 0x29, 0x74, + 0x38, 0x8b, 0x06, 0x0f, 0xd8, 0x67, 0xc5, 0x37, 0x88, 0x66, 0xf9, 0x9b, 0x01, 0xed, 0xd2, 0x28, + 0x01, 0xfb, 0x69, 0x7c, 0x38, 0x93, 0x0a, 0xbb, 0x52, 0x14, 0x80, 0x86, 0x4b, 0x34, 0xf9, 0x3e, + 0x73, 0x04, 0x17, 0xbf, 0xd5, 0x4c, 0x8c, 0x38, 0x87, 0x12, 0xb3, 0x5f, 0x69, 0x3b, 0x4c, 0x1d, + 0xc6, 0xc4, 0x77, 0x4d, 0x96, 0x58, 0x86, 0xae, 0x6f, 0xae, 0xc0, 0xc6, 0x41, 0x38, 0x59, 0x17, + 0xbd, 0x04, 0xb3, 0xec, 0x8a, 0x36, 0x8a, 0x63, 0x2b, 0x47, 0x69, 0x74, 0x6f, 0xc7, 0x20, 0x38, + 0x51, 0x53, 0xfd, 0x86, 0x02, 0xd3, 0xf2, 0x02, 0x1a, 0xc2, 0xdd, 0x7a, 0x20, 0xb1, 0xeb, 0x11, + 0xbc, 0x56, 0x65, 0xaa, 0xc3, 0x70, 0xec, 0x87, 0x0a, 0x9c, 0xcd, 0x68, 0xc3, 0x2e, 0xeb, 0x48, + 0x82, 0xf5, 0x8f, 0x72, 0x59, 0x97, 0x3a, 0x46, 0xc2, 0xcb, 0xba, 0x24, 0x04, 0xa7, 0xe8, 0xa2, + 0x7b, 0x30, 0xa6, 0xbb, 0xa6, 0x18, 0x96, 0x17, 0x0a, 0xa9, 0x24, 0xb8, 0x15, 0xf9, 0xb0, 0x37, + 0x70, 0x0b, 0x53, 0x84, 0xea, 0x3f, 0x19, 0x83, 0xaa, 0x94, 0x1b, 0x08, 0xad, 0x8e, 0xa2, 0xd1, + 0x46, 0xe8, 0x03, 0xad, 0x76, 0x15, 0xc6, 0xba, 0xfd, 0x41, 0x41, 0x95, 0x36, 0x44, 0x77, 0x9d, + 0xa2, 0xeb, 0xf6, 0x07, 0xe8, 0x5e, 0xa8, 0x24, 0x17, 0x53, 0x63, 0x43, 0x47, 0xce, 0x84, 0xa2, + 0x1c, 0xac, 0xcd, 0xf1, 0xdc, 0xb5, 0xd9, 0x83, 0x49, 0x4f, 0x68, 0xd0, 0xe5, 0xe2, 0x79, 0xa9, + 0xa4, 0x91, 0x16, 0x1a, 0x33, 0x17, 0xbf, 0x03, 0x85, 0x3a, 0xa0, 0x41, 0x05, 0x80, 0x01, 0x73, + 0x3c, 0x67, 0x7a, 0x45, 0x85, 0x0b, 0x00, 0x6b, 0xac, 0x04, 0x0b, 0x88, 0xfa, 0xb3, 0x25, 0x40, + 0x69, 0x84, 0xe8, 0xc3, 0x50, 0x66, 0xfe, 0xf7, 0x62, 0xa3, 0x49, 0xb9, 0x33, 0x34, 0xcf, 0xc3, + 0x1c, 0x86, 0x3a, 0x22, 0x1e, 0xa3, 0xd8, 0xc4, 0xb0, 0x4b, 0x62, 0x41, 0x4f, 0x0a, 0xde, 0x08, + 0x8e, 0xa6, 0xb1, 0xdc, 0xa3, 0x69, 0x0d, 0x26, 0x7b, 0xa6, 0xcd, 0x1c, 0x43, 0x8a, 0x99, 0x08, + 0xf8, 0x5d, 0x16, 0x47, 0x81, 0x03, 0x5c, 0xea, 0x9f, 0x96, 0xe8, 0x22, 0x36, 0x6d, 0x9f, 0xd8, + 0x9a, 0xad, 0x13, 0xb4, 0x0b, 0xa0, 0x0d, 0x7c, 0x87, 0x9f, 0xf0, 0x62, 0x2d, 0xb7, 0x8a, 0xcd, + 0x57, 0x88, 0x74, 0x39, 0x44, 0xc8, 0xaf, 0x98, 0xa2, 0xdf, 0x58, 0x22, 0x46, 0x49, 0xfb, 0x66, + 0x8f, 0xbc, 0x61, 0xda, 0x86, 0x73, 0x5f, 0x0c, 0xef, 0xa8, 0xa4, 0xef, 0x86, 0x08, 0x39, 0xe9, + 0xe8, 0x37, 0x96, 0x88, 0xa1, 0x37, 0x61, 0x81, 0xa5, 0xf6, 0xb6, 0x59, 0xda, 0x35, 0xd1, 0x37, + 0xc7, 0xb2, 0x82, 0x23, 0xa7, 0xc2, 0x52, 0xdd, 0x2c, 0x34, 0x72, 0xea, 0xe0, 0xdc, 0xd6, 0xea, + 0x6f, 0x2a, 0x70, 0x3e, 0x73, 0x28, 0xd0, 0x75, 0x98, 0x8f, 0xfc, 0x0a, 0x64, 0x1e, 0x59, 0x89, + 0xb2, 0x08, 0xde, 0x4c, 0x56, 0xc0, 0xe9, 0x36, 0x68, 0x35, 0x94, 0x13, 0x64, 0x1e, 0x2c, 0x9c, + 0x12, 0x1e, 0x17, 0xa8, 0xb2, 0xd8, 0x34, 0xce, 0x6a, 0xa7, 0xfe, 0x58, 0xac, 0xc3, 0xd1, 0x80, + 0xd1, 0xdd, 0xb1, 0x4e, 0xba, 0xa1, 0x67, 0x77, 0xb8, 0x3b, 0xea, 0xb4, 0x10, 0x73, 0x18, 0xba, + 0x28, 0x47, 0x23, 0x84, 0x5c, 0x28, 0x88, 0x48, 0x50, 0x7d, 0x00, 0xe1, 0xbe, 0x63, 0xda, 0x5d, + 0xb4, 0x01, 0x15, 0x4d, 0xe4, 0x9d, 0x17, 0x4b, 0xed, 0x53, 0x85, 0x74, 0x2c, 0x81, 0x83, 0xbb, + 0xed, 0x05, 0xbf, 0x70, 0x88, 0x5b, 0xfd, 0xfb, 0x0a, 0x5c, 0xa0, 0x0c, 0xc9, 0x08, 0x62, 0x23, + 0xc3, 0x70, 0xf5, 0x21, 0x8e, 0xd6, 0x1e, 0x54, 0xdd, 0xa8, 0x99, 0x58, 0x97, 0x3f, 0x2a, 0x87, + 0xc2, 0x4b, 0x8f, 0x50, 0x50, 0xb1, 0xa3, 0xe1, 0x3a, 0x5e, 0x30, 0x39, 0xc9, 0xe8, 0xf8, 0x50, + 0x78, 0x97, 0x7a, 0x82, 0x65, 0xfc, 0xea, 0x17, 0x4a, 0x00, 0xb7, 0x89, 0x7f, 0xdf, 0x71, 0xb7, + 0xe8, 0x10, 0xbd, 0xaf, 0x42, 0x7e, 0x9e, 0x80, 0xf1, 0xbe, 0x63, 0x78, 0x82, 0x4b, 0xb1, 0x40, + 0x35, 0x76, 0x33, 0xce, 0x4a, 0x51, 0x0d, 0xca, 0xcc, 0xf0, 0x2b, 0x8e, 0x02, 0x26, 0xf5, 0x52, + 0x49, 0xc7, 0xc3, 0xbc, 0x9c, 0x67, 0x14, 0x65, 0x2e, 0xb1, 0x9e, 0x10, 0xe3, 0x45, 0x46, 0x51, + 0x5e, 0x86, 0x43, 0xa8, 0xfa, 0x85, 0x71, 0x88, 0x3d, 0x9c, 0x10, 0xa9, 0xe2, 0xca, 0xc9, 0xa8, + 0xe2, 0x6f, 0xc2, 0x82, 0xe5, 0x68, 0x46, 0x5d, 0xb3, 0xe8, 0xa2, 0x77, 0x3b, 0x7c, 0x3a, 0x34, + 0xbb, 0x1b, 0x66, 0xe5, 0x67, 0x0c, 0xe0, 0x56, 0x4e, 0x1d, 0x9c, 0xdb, 0x1a, 0xf9, 0xe1, 0x73, + 0x0d, 0x3c, 0x2b, 0xe2, 0xad, 0x51, 0x9f, 0x95, 0x58, 0x92, 0x9d, 0xa1, 0xc3, 0x53, 0x39, 0xfe, + 0xa2, 0x03, 0xfa, 0x19, 0x05, 0xce, 0x93, 0x1d, 0x9f, 0xb8, 0xb6, 0x66, 0xdd, 0x75, 0xb5, 0x8d, + 0x0d, 0x53, 0x17, 0x3e, 0x47, 0x7c, 0x72, 0xda, 0xfb, 0x7b, 0xb5, 0xf3, 0x2b, 0x59, 0x15, 0x1e, + 0xee, 0xd5, 0x3e, 0x9e, 0x7e, 0x35, 0x25, 0xf0, 0x7d, 0xce, 0x6c, 0xc2, 0x16, 0x63, 0x36, 0xb9, + 0xc5, 0x17, 0xa1, 0x7a, 0x04, 0x57, 0xd9, 0x29, 0xd9, 0x2c, 0xf3, 0x4b, 0x13, 0x20, 0xf9, 0x9d, + 0x1f, 0x21, 0x17, 0xe6, 0xaf, 0x2a, 0x70, 0x4e, 0xb7, 0x4c, 0x62, 0xfb, 0x09, 0x07, 0x63, 0xbe, + 0x31, 0xd6, 0x0a, 0x39, 0xc4, 0xf7, 0x89, 0xdd, 0x6a, 0x36, 0x1c, 0xdb, 0x26, 0xba, 0xdf, 0xc8, + 0x40, 0xce, 0xb5, 0x9c, 0x2c, 0x08, 0xce, 0xec, 0x0c, 0xfb, 0x1e, 0x56, 0xde, 0x6a, 0xca, 0xc1, + 0x59, 0x0d, 0x51, 0x86, 0x43, 0x28, 0x7a, 0x16, 0xaa, 0x5d, 0xd7, 0x19, 0xf4, 0xbd, 0x06, 0x73, + 0x87, 0xe2, 0x33, 0xc8, 0x04, 0x89, 0xeb, 0x51, 0x31, 0x96, 0xeb, 0xa0, 0xe7, 0x61, 0x9a, 0xff, + 0x6c, 0xbb, 0x64, 0xc3, 0xdc, 0x11, 0xdb, 0x8d, 0xf9, 0x58, 0x5c, 0x97, 0xca, 0x71, 0xac, 0x16, + 0x7a, 0x06, 0xa6, 0x4c, 0xcf, 0x1b, 0x10, 0x77, 0x0d, 0xdf, 0x12, 0x89, 0xa1, 0x98, 0x41, 0xb5, + 0x15, 0x14, 0xe2, 0x08, 0x8e, 0x7e, 0x41, 0x81, 0x59, 0x97, 0xbc, 0x37, 0x30, 0x5d, 0x62, 0x30, + 0xa2, 0x9e, 0x70, 0xfe, 0xc7, 0xa3, 0x05, 0x1c, 0x2c, 0xe1, 0x18, 0x52, 0xbe, 0xce, 0x43, 0x73, + 0x44, 0x1c, 0x88, 0x13, 0x3d, 0xa0, 0x43, 0xe5, 0x99, 0x5d, 0xdb, 0xb4, 0xbb, 0xcb, 0x56, 0xd7, + 0x5b, 0xa8, 0xb0, 0xad, 0xcb, 0x65, 0xae, 0xa8, 0x18, 0xcb, 0x75, 0xd0, 0x0b, 0x30, 0x33, 0xf0, + 0xe8, 0xca, 0xed, 0x11, 0x3e, 0xbe, 0x53, 0x91, 0x8f, 0xe2, 0x9a, 0x0c, 0xc0, 0xf1, 0x7a, 0x54, + 0xc5, 0x0b, 0x0a, 0xc4, 0x28, 0x03, 0x0f, 0xd1, 0xa5, 0xfd, 0x5c, 0x8b, 0x41, 0x70, 0xa2, 0xe6, + 0xe2, 0x32, 0x9c, 0xcd, 0xf8, 0xcc, 0x23, 0x6d, 0x8f, 0x6f, 0x94, 0xe0, 0x43, 0x87, 0xae, 0x4a, + 0xf4, 0x77, 0x14, 0xa8, 0x92, 0x1d, 0xdf, 0xd5, 0x42, 0x8f, 0x49, 0x3a, 0x45, 0x1b, 0x27, 0xb2, + 0x05, 0x96, 0x56, 0x22, 0x42, 0x7c, 0xda, 0xc2, 0xe3, 0x4e, 0x82, 0x60, 0xb9, 0x3f, 0x54, 0x5a, + 0xe7, 0x01, 0xdc, 0xb2, 0xb9, 0x4e, 0xe4, 0x97, 0x17, 0x90, 0xc5, 0x4f, 0xc3, 0x5c, 0x12, 0xf3, + 0x91, 0x46, 0xea, 0x1f, 0x97, 0xa0, 0xdc, 0xb6, 0xb4, 0x53, 0xc9, 0xf1, 0xf5, 0x97, 0x62, 0x09, + 0x56, 0x0a, 0x65, 0xad, 0x61, 0x5d, 0xcd, 0x4d, 0xed, 0xd4, 0x4d, 0xa4, 0x76, 0x7a, 0xb5, 0x38, + 0x89, 0x83, 0x33, 0x39, 0xfd, 0x6b, 0x05, 0xa6, 0x58, 0xbd, 0x53, 0xc8, 0x28, 0xf2, 0x4e, 0x3c, + 0xa3, 0xc8, 0x8b, 0x85, 0xbf, 0x29, 0x27, 0x81, 0xc8, 0xb7, 0x83, 0x6f, 0x61, 0xf9, 0x42, 0xde, + 0x92, 0xdf, 0xd5, 0xe0, 0x1f, 0x73, 0x25, 0x2b, 0xb5, 0xd1, 0x2d, 0x47, 0xd7, 0xac, 0x54, 0x7e, + 0xa3, 0x03, 0x1f, 0xd7, 0xe8, 0xc1, 0x14, 0x11, 0x41, 0xf2, 0xc1, 0xc7, 0x14, 0x12, 0x69, 0x83, + 0x48, 0xfb, 0x88, 0x5c, 0x50, 0xe2, 0xe1, 0x88, 0x82, 0xfa, 0xcf, 0x4b, 0x50, 0x95, 0xe6, 0xf2, + 0x87, 0x91, 0x39, 0xe9, 0x5a, 0x66, 0xca, 0xf9, 0x12, 0x73, 0x89, 0xbc, 0x70, 0x84, 0x74, 0xf3, + 0x2e, 0x54, 0xf5, 0x28, 0x0b, 0xe6, 0x28, 0x8b, 0x5b, 0x4a, 0xa6, 0x29, 0x7c, 0xb2, 0xa3, 0x02, + 0x2c, 0x13, 0x51, 0x7f, 0xb7, 0x04, 0x93, 0x6d, 0xd7, 0xa1, 0x13, 0x7c, 0x0a, 0xac, 0x41, 0x8b, + 0xb1, 0x86, 0x62, 0xfb, 0x96, 0x77, 0x36, 0x97, 0x39, 0x98, 0x09, 0xe6, 0xb0, 0x3c, 0x0a, 0x91, + 0x83, 0xd9, 0xc3, 0xbf, 0x55, 0xa0, 0x2a, 0x6a, 0x9e, 0x02, 0x83, 0xf8, 0x6c, 0x9c, 0x41, 0xbc, + 0x3c, 0xc2, 0x77, 0xe5, 0xb0, 0x88, 0xaf, 0x2a, 0x30, 0x23, 0x6a, 0xac, 0x92, 0xde, 0x3a, 0x71, + 0xd1, 0x35, 0x98, 0xf4, 0x06, 0x6c, 0x22, 0xc5, 0x07, 0x3d, 0x2e, 0x33, 0x09, 0x77, 0x5d, 0xd3, + 0xd9, 0xeb, 0x29, 0xbc, 0x8a, 0x94, 0x4d, 0x8d, 0x17, 0xe0, 0xa0, 0x31, 0x55, 0xe1, 0x5c, 0xc7, + 0x4a, 0xa5, 0x35, 0xc0, 0x8e, 0x45, 0x30, 0x83, 0x50, 0xcd, 0x89, 0xfe, 0x0d, 0xee, 0xa3, 0x98, + 0xe6, 0x44, 0xc1, 0x1e, 0xe6, 0xe5, 0xea, 0x17, 0xc7, 0xc3, 0xc1, 0x66, 0x1c, 0xec, 0x06, 0x4c, + 0xe9, 0x2e, 0xd1, 0x7c, 0x62, 0xd4, 0x77, 0x87, 0xe9, 0x1c, 0x93, 0xe2, 0x1a, 0x41, 0x0b, 0x1c, + 0x35, 0xa6, 0x02, 0x93, 0x7c, 0xc5, 0x54, 0x8a, 0x64, 0xcb, 0xdc, 0xeb, 0xa5, 0x4f, 0x41, 0xd9, + 0xb9, 0x6f, 0x87, 0xbe, 0x15, 0x07, 0x12, 0x66, 0x9f, 0x72, 0x87, 0xd6, 0xc6, 0xbc, 0x11, 0x4b, + 0xfd, 0x22, 0x32, 0x7f, 0x70, 0x41, 0xb6, 0x9a, 0x95, 0xf5, 0x03, 0x59, 0x30, 0xd9, 0x63, 0xd3, + 0x30, 0x52, 0x72, 0xad, 0xd8, 0x84, 0xca, 0x49, 0x4e, 0x19, 0x66, 0x1c, 0x90, 0xa0, 0x82, 0x2f, + 0x15, 0xce, 0xbc, 0xbe, 0xa6, 0x13, 0x59, 0xf0, 0xbd, 0x1d, 0x14, 0xe2, 0x08, 0x8e, 0x76, 0xa1, + 0xca, 0x63, 0xdf, 0x39, 0x97, 0x9d, 0x2c, 0x6e, 0xd3, 0x14, 0xdd, 0xbb, 0x1b, 0x61, 0xe3, 0x43, + 0x2f, 0x15, 0x60, 0x99, 0x96, 0xfa, 0x73, 0xe3, 0xe1, 0x22, 0x15, 0x1c, 0x3f, 0xfb, 0xc5, 0x0f, + 0xa5, 0xd0, 0x8b, 0x1f, 0x1f, 0x87, 0x72, 0x7f, 0x53, 0xf3, 0x82, 0x95, 0x1a, 0x24, 0xe4, 0x2d, + 0xb7, 0x69, 0xe1, 0xc3, 0xbd, 0xda, 0xb4, 0x20, 0xcd, 0x7e, 0x63, 0x5e, 0x17, 0x0d, 0xe0, 0xac, + 0xe7, 0x6b, 0x16, 0xe9, 0x98, 0xc2, 0x5a, 0xe4, 0xf9, 0x5a, 0xaf, 0x5f, 0x20, 0xaf, 0x2e, 0x77, + 0x3c, 0x4e, 0xa3, 0xc2, 0x59, 0xf8, 0xd1, 0x4f, 0x2b, 0xb0, 0xc0, 0xca, 0x97, 0x07, 0xbe, 0xc3, + 0x33, 0x90, 0x47, 0xc4, 0x8f, 0x7e, 0x3f, 0xcb, 0xb4, 0xfb, 0x4e, 0x0e, 0x3e, 0x9c, 0x4b, 0x09, + 0x7d, 0x0e, 0xce, 0x5b, 0x9a, 0xe7, 0x2f, 0xeb, 0xbe, 0xb9, 0x6d, 0xfa, 0xbb, 0x51, 0x17, 0x8e, + 0xfe, 0xfa, 0x09, 0x73, 0xd0, 0xb8, 0x95, 0x85, 0x0c, 0x67, 0xd3, 0x50, 0xff, 0x4c, 0x01, 0x94, + 0x5e, 0x42, 0xc8, 0x82, 0x8a, 0x41, 0x36, 0xb4, 0x81, 0xe5, 0x07, 0x22, 0x40, 0xa1, 0x10, 0xf0, + 0x08, 0x65, 0xc4, 0x99, 0x9b, 0x02, 0x2f, 0x0e, 0x29, 0x20, 0x07, 0xa6, 0xee, 0x6f, 0x9a, 0x3e, + 0xb1, 0x4c, 0xcf, 0x17, 0xdc, 0x79, 0x54, 0x72, 0xa1, 0xcc, 0xf3, 0x46, 0x80, 0x18, 0x47, 0x34, + 0xd4, 0x9f, 0x1d, 0x83, 0xca, 0x11, 0x1e, 0x99, 0x1b, 0x00, 0x12, 0xb9, 0x1f, 0xa8, 0xa0, 0x44, + 0x46, 0x31, 0x91, 0x31, 0x71, 0xa6, 0x91, 0x42, 0x86, 0x33, 0x08, 0xa0, 0xcf, 0xc1, 0x39, 0xd3, + 0xde, 0x70, 0x35, 0xcf, 0x77, 0x07, 0xba, 0x3f, 0x70, 0xc9, 0x28, 0xf9, 0x7c, 0x99, 0x69, 0xa1, + 0x95, 0x81, 0x0e, 0x67, 0x12, 0x41, 0x04, 0x26, 0xef, 0x3b, 0xee, 0x16, 0x65, 0x9e, 0xe3, 0xc5, + 0xdf, 0x8a, 0x78, 0x83, 0xa1, 0x88, 0xb8, 0x26, 0xff, 0xed, 0xe1, 0x00, 0xb7, 0xfa, 0x47, 0x0a, + 0x94, 0x79, 0x70, 0xdb, 0x07, 0x42, 0xaf, 0x62, 0x5d, 0xcd, 0xcd, 0x53, 0x49, 0xd5, 0x1d, 0x56, + 0xe3, 0x03, 0xa2, 0xee, 0xb0, 0xbe, 0xe6, 0xc8, 0x32, 0x7f, 0x34, 0x26, 0xbe, 0x85, 0x09, 0x0b, + 0x2d, 0x38, 0x2b, 0x84, 0xde, 0x5b, 0xe6, 0x06, 0xa1, 0xab, 0xab, 0xa9, 0xed, 0x7a, 0x22, 0xaa, + 0x9c, 0x71, 0xdd, 0x46, 0x1a, 0x8c, 0xb3, 0xda, 0xa0, 0x7f, 0xa6, 0xd0, 0x63, 0xd9, 0x77, 0x4d, + 0x7d, 0xa4, 0xe4, 0x8f, 0x61, 0xdf, 0x96, 0x56, 0x39, 0x32, 0x6e, 0x2d, 0x58, 0x8b, 0xce, 0x67, + 0x56, 0xfa, 0x70, 0xaf, 0x56, 0xcb, 0x30, 0x45, 0x06, 0xa6, 0x73, 0x3a, 0xb0, 0x5f, 0xf8, 0xee, + 0x81, 0x55, 0x98, 0x19, 0x3f, 0xe8, 0x31, 0xba, 0x01, 0x65, 0x4f, 0x77, 0xfa, 0xe4, 0x28, 0xe9, + 0x6c, 0xc3, 0x01, 0xee, 0xd0, 0x96, 0x98, 0x23, 0x58, 0x7c, 0x17, 0xa6, 0xe5, 0x9e, 0x67, 0x58, + 0x23, 0x9a, 0xb2, 0x35, 0xe2, 0xc8, 0x97, 0x75, 0xb2, 0xf5, 0xe2, 0xf7, 0x4a, 0x20, 0x1e, 0x78, + 0x1a, 0xe2, 0xb2, 0xc2, 0x0c, 0x72, 0xdc, 0x8d, 0xf0, 0xa8, 0x55, 0xf2, 0x4d, 0xdb, 0x68, 0x0c, + 0xe4, 0x34, 0x77, 0xc8, 0x86, 0x09, 0x4b, 0x5b, 0x27, 0x56, 0xf0, 0xdc, 0xcf, 0xb5, 0xe2, 0xef, + 0xd1, 0xf0, 0x04, 0xac, 0x5e, 0xc2, 0xa4, 0xcd, 0x0b, 0xb1, 0xa0, 0xb2, 0xf8, 0x22, 0x54, 0xa5, + 0x6a, 0x47, 0x32, 0x00, 0x7d, 0x59, 0x81, 0x0b, 0xc1, 0x92, 0x88, 0xe7, 0xc6, 0x40, 0x57, 0xa0, + 0xa2, 0xf5, 0x4d, 0x66, 0x13, 0x95, 0xad, 0xca, 0xcb, 0xed, 0x16, 0x2b, 0xc3, 0x21, 0x14, 0x7d, + 0x14, 0x2a, 0xc1, 0x3c, 0x09, 0x01, 0x29, 0xdc, 0xe2, 0xe1, 0x65, 0x4e, 0x58, 0x03, 0x3d, 0x25, + 0x65, 0xed, 0x2b, 0x47, 0x27, 0x5a, 0x48, 0x98, 0xdf, 0xfb, 0xaa, 0x5f, 0x1a, 0x83, 0x19, 0x6e, + 0x48, 0xa8, 0x9b, 0xb6, 0x61, 0xda, 0xdd, 0x53, 0x60, 0xa5, 0xb1, 0x67, 0x45, 0x4b, 0xc7, 0xf5, + 0xac, 0xe8, 0x4d, 0x98, 0x78, 0x8f, 0x6e, 0xeb, 0x60, 0x39, 0x0c, 0xb5, 0xbb, 0xc2, 0xb9, 0x66, + 0x1c, 0xc1, 0xc3, 0x02, 0x05, 0xf2, 0xa4, 0xc7, 0x5d, 0x47, 0x08, 0x73, 0x8e, 0x8d, 0x6c, 0x98, + 0x7b, 0x73, 0x3a, 0xfb, 0x65, 0x57, 0xf5, 0x3f, 0x2a, 0x30, 0x1f, 0x6b, 0x71, 0x0a, 0x27, 0xc1, + 0x46, 0xfc, 0x24, 0x58, 0x1e, 0xf9, 0x2b, 0x73, 0x4e, 0x84, 0x17, 0xe1, 0x7c, 0xe6, 0x60, 0x1c, + 0x2e, 0x40, 0xa9, 0xbf, 0x55, 0x82, 0xf1, 0x0e, 0x21, 0xc6, 0x29, 0xac, 0xcc, 0x77, 0x62, 0x87, + 0xfc, 0xa7, 0x0a, 0x3f, 0x3a, 0x95, 0x67, 0x1e, 0xd9, 0x48, 0x98, 0x47, 0x3e, 0x5d, 0x98, 0xc2, + 0xc1, 0xb6, 0x91, 0x5f, 0x2e, 0x01, 0xd0, 0x6a, 0xfc, 0x21, 0x4a, 0xe1, 0x23, 0x19, 0x3d, 0x55, + 0x3c, 0xf5, 0x7e, 0x79, 0x60, 0x58, 0x0d, 0x1f, 0x14, 0x1c, 0x8b, 0x8c, 0xef, 0xf1, 0xc7, 0x04, + 0xe3, 0xdc, 0x62, 0xfc, 0x98, 0xb8, 0x85, 0xfa, 0x0f, 0x15, 0x60, 0x69, 0xe7, 0x9b, 0xb7, 0x3b, + 0xe8, 0x05, 0x98, 0x31, 0xf9, 0xd5, 0x66, 0x53, 0xce, 0x1c, 0xc7, 0x2e, 0x60, 0x5a, 0x32, 0x00, + 0xc7, 0xeb, 0xa1, 0x9e, 0x34, 0xae, 0x23, 0x3c, 0x07, 0x2b, 0xfa, 0x71, 0x28, 0x7f, 0xf8, 0x6e, + 0x09, 0xce, 0x24, 0xea, 0x0e, 0xa1, 0x7f, 0x9c, 0x0c, 0xb7, 0x95, 0xd2, 0xf5, 0x8e, 0x9d, 0x7c, + 0xba, 0xde, 0x30, 0x73, 0xee, 0xf8, 0xc9, 0x66, 0xce, 0xfd, 0x43, 0x05, 0xd8, 0xfb, 0xa2, 0xa7, + 0xc0, 0x78, 0xff, 0x62, 0x9c, 0xf1, 0x7e, 0xb2, 0xe8, 0xc2, 0xc9, 0xe1, 0xb7, 0xbf, 0x5e, 0x02, + 0x96, 0x42, 0x5e, 0x78, 0x72, 0x48, 0xce, 0x11, 0x4a, 0x8e, 0x73, 0xc4, 0x65, 0xe1, 0x5b, 0x91, + 0xb0, 0x12, 0x4a, 0xfe, 0x15, 0x1f, 0x95, 0xdc, 0x27, 0xc6, 0xe2, 0x6c, 0x24, 0xed, 0x42, 0x81, + 0x1e, 0xc0, 0x8c, 0xb7, 0xe9, 0x38, 0x7e, 0xa0, 0xb2, 0x8b, 0xb9, 0x5b, 0x2e, 0xec, 0xd2, 0x1c, + 0x7c, 0x0a, 0xdf, 0x98, 0x1d, 0x19, 0x37, 0x8e, 0x93, 0x42, 0x4b, 0x00, 0xeb, 0x96, 0xa3, 0x6f, + 0x35, 0x5a, 0x4d, 0x1c, 0x38, 0xbe, 0x32, 0xf7, 0xab, 0x7a, 0x58, 0x8a, 0xa5, 0x1a, 0xea, 0x1f, + 0x28, 0x7c, 0xb4, 0x8e, 0xb0, 0xad, 0x4e, 0x91, 0x4b, 0x7e, 0x24, 0xc1, 0x25, 0xf3, 0x9e, 0x5d, + 0xfd, 0x5d, 0xf1, 0x15, 0xe1, 0x43, 0x01, 0x7d, 0x98, 0xb1, 0xe4, 0x97, 0x05, 0xc4, 0x32, 0x2e, + 0xf4, 0x28, 0x41, 0x98, 0xf5, 0x2e, 0x56, 0x8c, 0xe3, 0x04, 0x28, 0x2b, 0x0d, 0x3a, 0xcf, 0x5f, + 0x49, 0xe4, 0xbe, 0x2b, 0x6c, 0xc6, 0xda, 0x32, 0x00, 0xc7, 0xeb, 0xa9, 0x7f, 0xb7, 0x04, 0x17, + 0x79, 0xdf, 0x99, 0xf3, 0x79, 0x93, 0xf4, 0x89, 0x6d, 0x10, 0x5b, 0xdf, 0x65, 0xe2, 0xb2, 0xe1, + 0x74, 0xd1, 0x5f, 0x51, 0xa0, 0x12, 0x5c, 0x3c, 0x89, 0x0f, 0x79, 0xab, 0xf8, 0xab, 0x90, 0x39, + 0x54, 0xc2, 0x6b, 0x2f, 0x9e, 0x80, 0x4d, 0xfc, 0xc2, 0x21, 0x61, 0x74, 0x1f, 0xca, 0x7d, 0xd7, + 0x59, 0x0f, 0xd4, 0xaa, 0x7b, 0xc7, 0xde, 0x83, 0x36, 0xc5, 0xce, 0xb7, 0x27, 0xfb, 0x17, 0x73, + 0x7a, 0x2a, 0x86, 0xa7, 0x86, 0xea, 0x39, 0x7a, 0x3a, 0x99, 0x67, 0x38, 0xb4, 0x9f, 0xa4, 0x52, + 0x38, 0xdd, 0x01, 0xf5, 0xf0, 0xbe, 0x1c, 0x05, 0xe1, 0xeb, 0xf0, 0xa4, 0x84, 0x70, 0x65, 0x47, + 0x27, 0x9e, 0xd7, 0xd0, 0xfa, 0x9a, 0x4e, 0x55, 0x4a, 0x16, 0x78, 0xcb, 0x0d, 0xbd, 0x47, 0x40, + 0xf9, 0xff, 0x15, 0xa8, 0x49, 0x38, 0x63, 0x0e, 0x50, 0x01, 0xab, 0xf9, 0x9a, 0x02, 0x55, 0xcd, + 0xb6, 0x1d, 0x5f, 0x93, 0xef, 0x1d, 0x8d, 0x11, 0xe7, 0x26, 0x8b, 0xd4, 0xd2, 0x72, 0x44, 0x26, + 0xe1, 0x61, 0x20, 0x41, 0xb0, 0xdc, 0x9b, 0xc5, 0x4f, 0xc3, 0x5c, 0xb2, 0xd5, 0x91, 0x94, 0xc7, + 0x06, 0x5c, 0x90, 0x7a, 0xc5, 0xee, 0x32, 0x1a, 0x9b, 0x44, 0xdf, 0xf2, 0x8e, 0x32, 0x8c, 0x75, + 0x2a, 0x7f, 0x87, 0x48, 0x44, 0x1c, 0x24, 0x55, 0xf7, 0x9e, 0x86, 0xc9, 0x6d, 0xd3, 0x33, 0x83, + 0x78, 0x7a, 0x09, 0xc7, 0x3d, 0x5e, 0x8c, 0x03, 0xb8, 0xfa, 0x1a, 0x9c, 0x95, 0x71, 0x30, 0x8e, + 0x7b, 0xbb, 0x73, 0x94, 0x5e, 0xac, 0xc2, 0x65, 0x09, 0x43, 0x66, 0x30, 0xe0, 0x51, 0xd0, 0x7d, + 0xad, 0x12, 0x30, 0x3c, 0x11, 0xb1, 0xf2, 0xdb, 0x0a, 0x3c, 0x46, 0xf2, 0x56, 0x9d, 0x60, 0x1a, + 0x6f, 0x8e, 0xb8, 0x2c, 0x72, 0x57, 0xb5, 0xc8, 0x3d, 0x95, 0x07, 0xc6, 0xf9, 0x3d, 0x43, 0xbb, + 0x00, 0x5e, 0x38, 0x25, 0xa3, 0x78, 0x1e, 0x67, 0xce, 0xb1, 0x48, 0xb4, 0x1c, 0xfe, 0xc6, 0x12, + 0x31, 0xf4, 0x1e, 0x54, 0x3c, 0x31, 0x93, 0xa3, 0xc4, 0x2a, 0x67, 0x2c, 0x0c, 0xe1, 0x5c, 0x29, + 0x7e, 0xe1, 0x90, 0x0c, 0xfa, 0x15, 0x05, 0xce, 0x59, 0x19, 0x9b, 0x4b, 0x48, 0x08, 0x9d, 0x13, + 0xd8, 0xb7, 0xdc, 0x82, 0x9d, 0x05, 0xc1, 0x99, 0x5d, 0x41, 0xbf, 0x96, 0x1b, 0x18, 0x5b, 0x2e, + 0xfe, 0xc8, 0xca, 0x61, 0x6b, 0xff, 0xe8, 0x31, 0xb2, 0xe8, 0x27, 0xa0, 0xea, 0x44, 0x1c, 0x41, + 0x44, 0x32, 0x7f, 0x66, 0xc4, 0xce, 0x49, 0x3c, 0x86, 0xdf, 0x07, 0x4a, 0x05, 0x58, 0xa6, 0x87, + 0xbe, 0xa2, 0x00, 0x32, 0x52, 0xe7, 0x86, 0xb8, 0x92, 0x7c, 0xfd, 0xd8, 0x0f, 0x47, 0x7e, 0x03, + 0x92, 0x2e, 0xc7, 0x19, 0x9d, 0x50, 0xbf, 0x3c, 0xc9, 0x85, 0x79, 0x66, 0x83, 0x5e, 0x87, 0x89, + 0x75, 0xa6, 0x0c, 0x0b, 0x2e, 0x50, 0x58, 0xf3, 0xe6, 0x2a, 0x35, 0xd7, 0x54, 0xf9, 0xff, 0x58, + 0x60, 0x46, 0x6f, 0xc3, 0x98, 0x61, 0x07, 0x0f, 0x77, 0xbd, 0x3c, 0x82, 0x26, 0x18, 0xf9, 0xad, + 0xd3, 0x8d, 0x43, 0x91, 0x22, 0x1b, 0x2a, 0xb6, 0x90, 0x7f, 0xc5, 0x36, 0x2d, 0xfc, 0x24, 0x76, + 0x28, 0x47, 0x87, 0xd2, 0x7b, 0x50, 0x82, 0x43, 0x1a, 0x94, 0x5e, 0xc2, 0x00, 0x56, 0x98, 0x5e, + 0xa8, 0xd7, 0x1e, 0x64, 0x74, 0x68, 0xcb, 0x5a, 0x6a, 0x79, 0x78, 0x2d, 0x75, 0x26, 0x57, 0x43, + 0x25, 0x30, 0xe1, 0xf3, 0x67, 0x70, 0x27, 0x8a, 0xbb, 0x21, 0xd1, 0xfe, 0xb3, 0x67, 0x72, 0x23, + 0xa1, 0x5b, 0xbc, 0xa1, 0x2b, 0x90, 0xd3, 0x85, 0xc5, 0x5f, 0xeb, 0x16, 0x8b, 0xbe, 0xf0, 0xc2, + 0xe2, 0xef, 0xa9, 0xf0, 0x85, 0xc5, 0xff, 0xc7, 0x02, 0x33, 0x7a, 0x97, 0x2a, 0x5e, 0xfc, 0x88, + 0x13, 0x59, 0xf4, 0x5e, 0x1b, 0x71, 0x6b, 0x79, 0x81, 0xe7, 0x3b, 0xff, 0x85, 0x43, 0xfc, 0x68, + 0x1d, 0x26, 0x85, 0x91, 0x43, 0xa4, 0x00, 0x78, 0x79, 0x84, 0xa4, 0xf8, 0xc1, 0x13, 0x41, 0x3c, + 0x0c, 0x37, 0x40, 0xac, 0xfe, 0xfb, 0x29, 0x6e, 0x9e, 0x12, 0x2e, 0x04, 0x1b, 0x50, 0x09, 0xd0, + 0x8d, 0x12, 0x85, 0x11, 0x3c, 0xf1, 0xc1, 0x3f, 0x2d, 0xf8, 0x85, 0x43, 0xdc, 0xa8, 0x91, 0x15, + 0xf0, 0x12, 0x25, 0x44, 0x1d, 0x2e, 0xd8, 0x25, 0xee, 0xe1, 0x36, 0x76, 0x1a, 0x1e, 0x6e, 0xd9, + 0x2e, 0x16, 0xe3, 0x85, 0x5c, 0x2c, 0x5e, 0x81, 0x33, 0x81, 0x03, 0x9a, 0x41, 0xd8, 0x55, 0x8f, + 0x70, 0xcd, 0x66, 0x51, 0xa5, 0x8d, 0x38, 0x08, 0x27, 0xeb, 0xa2, 0xdf, 0x53, 0xa0, 0xa2, 0x0b, + 0x01, 0x46, 0xec, 0xab, 0x5b, 0xa3, 0xd9, 0x30, 0x97, 0x02, 0x79, 0x88, 0x8b, 0xd3, 0xf7, 0x02, + 0x1e, 0x11, 0x14, 0x1f, 0xd3, 0x1d, 0x5c, 0xd8, 0x6b, 0xf4, 0x6f, 0xa8, 0xb2, 0x60, 0xb1, 0x87, + 0x47, 0x58, 0x90, 0x1e, 0xf7, 0x19, 0xbf, 0x33, 0xe2, 0x57, 0x2c, 0x47, 0x18, 0xf9, 0x87, 0xbc, + 0x15, 0xea, 0x05, 0x11, 0xe4, 0x98, 0xbe, 0x45, 0xee, 0x3e, 0xfa, 0x7b, 0x0a, 0x3c, 0xc9, 0x1d, + 0xf5, 0x1b, 0x54, 0x40, 0x60, 0x0f, 0xf7, 0x90, 0xe8, 0xa5, 0xa0, 0xc8, 0x21, 0xa4, 0x72, 0x64, + 0x87, 0x90, 0x2b, 0xfb, 0x7b, 0xb5, 0x27, 0x1b, 0x43, 0xe0, 0xc6, 0x43, 0xf5, 0x60, 0x71, 0x0b, + 0x66, 0x62, 0x93, 0x7d, 0x92, 0xb7, 0x96, 0x8b, 0x36, 0xcc, 0x25, 0xe7, 0xe4, 0x44, 0x6f, 0x49, + 0x6f, 0xc2, 0x54, 0x78, 0x58, 0xa0, 0x8b, 0x12, 0xa1, 0xe8, 0x30, 0xbf, 0x49, 0x76, 0x39, 0xd5, + 0x5a, 0x4c, 0xd7, 0xe3, 0xca, 0xfe, 0x3d, 0x5a, 0x20, 0x10, 0xaa, 0xdf, 0x12, 0x96, 0x9c, 0xbb, + 0xa4, 0xd7, 0xb7, 0x34, 0x9f, 0x7c, 0xf0, 0xaf, 0x3e, 0xd4, 0xff, 0xa1, 0x70, 0x9e, 0x2f, 0x1e, + 0x25, 0xd3, 0xa0, 0xda, 0xe3, 0x09, 0x04, 0x59, 0x44, 0xa9, 0x52, 0x3c, 0x96, 0x75, 0x35, 0x42, + 0x83, 0x65, 0x9c, 0xe8, 0x7e, 0xfa, 0xd9, 0xbc, 0x6b, 0xa3, 0x1d, 0xce, 0x43, 0xbf, 0x9e, 0x87, + 0xd2, 0x6d, 0xe4, 0x17, 0xc7, 0x94, 0x83, 0x5f, 0x1c, 0x3b, 0xfc, 0x1d, 0x2a, 0xf5, 0xff, 0x95, + 0x20, 0xf3, 0xcd, 0x07, 0xa4, 0xc2, 0x04, 0x8f, 0x90, 0x91, 0xdf, 0x13, 0xe4, 0xe1, 0x33, 0x58, + 0x40, 0x90, 0x0b, 0xe7, 0x44, 0xfc, 0xc9, 0x4d, 0xb2, 0x1b, 0xbd, 0x64, 0x27, 0xa6, 0x7e, 0x78, + 0x4f, 0x74, 0x96, 0x58, 0xac, 0x93, 0xc0, 0x84, 0x33, 0x71, 0xa3, 0x3b, 0x3c, 0x1c, 0xcc, 0x36, + 0xee, 0x3a, 0x5b, 0xc4, 0x8e, 0xb8, 0x83, 0x88, 0x6e, 0x7d, 0x2c, 0x08, 0x07, 0x4b, 0x55, 0xc0, + 0xd9, 0xed, 0xd0, 0x36, 0xa0, 0x9e, 0xb6, 0x93, 0xc4, 0x36, 0x42, 0xba, 0xf9, 0xd5, 0x14, 0x36, + 0x9c, 0x41, 0x81, 0xc5, 0x72, 0x30, 0x9d, 0xf6, 0x83, 0xe1, 0x73, 0xc4, 0xba, 0x7a, 0xb2, 0xb1, + 0x1c, 0x9c, 0xc4, 0xc1, 0x17, 0x92, 0x6f, 0xc1, 0x05, 0x56, 0x6d, 0xd9, 0x60, 0x6a, 0xac, 0x47, + 0x8c, 0x65, 0xc3, 0x60, 0x81, 0x95, 0xa3, 0xbe, 0xe4, 0xc7, 0xfc, 0xa6, 0x18, 0xee, 0x0f, 0x88, + 0xdf, 0x14, 0xeb, 0x6b, 0xce, 0xad, 0xcd, 0x1f, 0x2a, 0x30, 0x9f, 0x4a, 0xdf, 0x32, 0x94, 0xd7, + 0xcd, 0xa9, 0x5d, 0x46, 0x3c, 0x95, 0x7c, 0x01, 0xaf, 0x9a, 0x99, 0xd5, 0xe9, 0x0d, 0x98, 0x89, + 0x5d, 0xda, 0x84, 0xa1, 0xbb, 0x4a, 0x66, 0xe8, 0xae, 0x1c, 0x99, 0x5b, 0x3a, 0x30, 0x32, 0xf7, + 0x1b, 0x33, 0x62, 0xba, 0x99, 0x5a, 0xff, 0x0e, 0x4c, 0xb0, 0xf8, 0xd9, 0xe0, 0xd1, 0xd0, 0x97, + 0x0a, 0xc7, 0xe5, 0x7a, 0x9c, 0x55, 0xf2, 0xff, 0xb1, 0xc0, 0x8a, 0x9a, 0x30, 0xa7, 0x5b, 0xce, + 0x80, 0xea, 0xb0, 0x1b, 0xa6, 0x45, 0x6e, 0x47, 0x5c, 0x39, 0x4c, 0x00, 0xd2, 0x48, 0xc0, 0x71, + 0xaa, 0x05, 0xc2, 0xdc, 0x30, 0xc0, 0xf7, 0xd8, 0x0b, 0x05, 0x2f, 0x2f, 0x79, 0x8a, 0xc5, 0xd0, + 0x20, 0xf0, 0x1e, 0x00, 0x09, 0x26, 0x2e, 0xf0, 0xb2, 0x7c, 0xa5, 0x58, 0x6a, 0x93, 0x70, 0xfa, + 0x03, 0x66, 0x14, 0x16, 0x79, 0x58, 0x22, 0x82, 0x5c, 0xa8, 0x6e, 0x46, 0x0f, 0x04, 0x0a, 0x2d, + 0xfd, 0xd5, 0x11, 0x1f, 0x27, 0xe4, 0x87, 0xb8, 0x54, 0x80, 0x65, 0x22, 0xc8, 0x05, 0x88, 0x74, + 0xb0, 0x51, 0x1e, 0x94, 0x8a, 0x94, 0xbb, 0xe8, 0x3b, 0xa3, 0x32, 0x2c, 0x51, 0xa1, 0x34, 0xed, + 0x30, 0x00, 0x7e, 0x14, 0xb5, 0x3e, 0x0a, 0xa3, 0x8f, 0x68, 0x46, 0x65, 0x58, 0xa2, 0x42, 0xc7, + 0xb6, 0x17, 0x25, 0x3d, 0x10, 0xc2, 0xfa, 0xab, 0x23, 0x26, 0x9f, 0x10, 0x02, 0x52, 0x54, 0x80, + 0x65, 0x22, 0xc8, 0x06, 0xe8, 0x85, 0xb9, 0x10, 0x84, 0xb6, 0x5f, 0xe8, 0x3b, 0xa3, 0x8c, 0x0a, + 0xdc, 0xd4, 0x1c, 0xfd, 0xc6, 0x12, 0x05, 0xf4, 0xae, 0x64, 0x53, 0x82, 0xe2, 0x62, 0xe6, 0x50, + 0xf6, 0xa4, 0x4f, 0x44, 0xd2, 0x56, 0x95, 0xed, 0xd7, 0xc7, 0x25, 0x49, 0xeb, 0xe1, 0x5e, 0x6d, + 0x9a, 0xf1, 0x90, 0x94, 0xe4, 0x15, 0x5d, 0xb5, 0x4e, 0x1f, 0x74, 0xd5, 0x8a, 0xae, 0xc3, 0xbc, + 0x27, 0xbb, 0x33, 0x31, 0xc6, 0x30, 0xc3, 0x9a, 0x84, 0xb9, 0x33, 0x3a, 0xc9, 0x0a, 0x38, 0xdd, + 0x86, 0x33, 0x3e, 0x62, 0xb0, 0xf6, 0xb3, 0x32, 0xe3, 0xe3, 0x65, 0x38, 0x84, 0xa2, 0xed, 0xc4, + 0x03, 0xf3, 0x67, 0x46, 0x35, 0x04, 0x0d, 0xf9, 0xda, 0xfc, 0xe7, 0xe4, 0xc7, 0xcd, 0xe7, 0x8a, + 0xfb, 0xdc, 0x66, 0xe7, 0xbf, 0x38, 0xe4, 0x81, 0xf3, 0x41, 0x3c, 0xd4, 0x65, 0xfe, 0x58, 0xdc, + 0xfb, 0xc3, 0x2b, 0xbb, 0xbc, 0x30, 0x17, 0xd4, 0x80, 0x79, 0xb2, 0xd3, 0x77, 0xbc, 0x81, 0x4b, + 0x58, 0xea, 0x1d, 0x36, 0x3d, 0x28, 0xb2, 0x14, 0xad, 0x24, 0x81, 0x38, 0x5d, 0x5f, 0xfd, 0x97, + 0x00, 0x55, 0x49, 0x36, 0xfa, 0x61, 0xc4, 0x46, 0xfa, 0x50, 0xd5, 0x1d, 0xdb, 0xf3, 0x5d, 0x4d, + 0x8a, 0x07, 0x1d, 0x91, 0x66, 0x38, 0x7a, 0x8d, 0x08, 0x33, 0x96, 0xc9, 0xd0, 0x7d, 0x1e, 0xda, + 0xf3, 0xc6, 0x8e, 0xc1, 0x9e, 0x17, 0xee, 0xf3, 0x0c, 0x9b, 0xde, 0xf3, 0x00, 0xc1, 0x71, 0x11, + 0xbe, 0x3a, 0x1d, 0xe6, 0xec, 0x6c, 0x79, 0x37, 0x42, 0x18, 0x96, 0xea, 0xa1, 0x07, 0x30, 0x63, + 0xc9, 0xf9, 0xfa, 0xc4, 0x59, 0x56, 0xc8, 0x37, 0x25, 0x96, 0xf8, 0x8f, 0x7b, 0x3a, 0xc4, 0x8a, + 0x70, 0x9c, 0x14, 0x5d, 0x06, 0x56, 0x90, 0x63, 0x72, 0x24, 0xdb, 0x74, 0x98, 0xa9, 0x32, 0x5a, + 0x06, 0x61, 0x91, 0x87, 0x25, 0x22, 0x39, 0x06, 0xc4, 0xc9, 0x42, 0x06, 0xc4, 0x01, 0x9c, 0x75, + 0x89, 0xef, 0xee, 0x36, 0x76, 0x75, 0xf6, 0x28, 0xad, 0xeb, 0xb3, 0x04, 0x8f, 0x95, 0x62, 0xe1, + 0x56, 0x38, 0x8d, 0x0a, 0x67, 0xe1, 0x8f, 0xf1, 0xc9, 0xa9, 0x03, 0xf9, 0xe4, 0x27, 0xa0, 0xea, + 0x13, 0x7d, 0xd3, 0x36, 0x75, 0xcd, 0x6a, 0x35, 0x45, 0x4a, 0x84, 0x68, 0xcb, 0x47, 0x20, 0x2c, + 0xd7, 0x43, 0x75, 0x18, 0x1b, 0x98, 0x86, 0x38, 0x2c, 0x7e, 0x24, 0xd4, 0x32, 0x5a, 0xcd, 0x87, + 0x7b, 0xb5, 0x0f, 0x45, 0x16, 0xb9, 0xf0, 0xab, 0xae, 0xf6, 0xb7, 0xba, 0x57, 0xfd, 0xdd, 0x3e, + 0xf1, 0x96, 0xd6, 0x5a, 0x4d, 0x4c, 0x1b, 0x67, 0x19, 0x57, 0xa7, 0x8f, 0x60, 0x5c, 0xfd, 0x8a, + 0x02, 0x67, 0xb5, 0xa4, 0x82, 0x44, 0xbc, 0x85, 0x99, 0xe2, 0x4c, 0x37, 0x5b, 0xe9, 0x8a, 0x92, + 0x32, 0x2d, 0xa7, 0xc9, 0xe1, 0xac, 0x3e, 0x20, 0x17, 0x50, 0xcf, 0xec, 0x86, 0x69, 0x31, 0xc5, + 0xac, 0xcf, 0x1e, 0x3d, 0xad, 0x27, 0x53, 0xb5, 0x53, 0x98, 0x70, 0x06, 0x76, 0xf5, 0x8f, 0x15, + 0xa1, 0x44, 0x9c, 0xa2, 0x19, 0xec, 0xa4, 0x55, 0x6e, 0xf5, 0x16, 0x40, 0x74, 0xec, 0x8c, 0x6c, + 0x28, 0xfc, 0x7e, 0x19, 0xce, 0x8f, 0xea, 0x46, 0xc1, 0xd2, 0x5d, 0xb2, 0x17, 0x89, 0x96, 0x37, + 0x7c, 0xe2, 0xde, 0xb9, 0xb3, 0x1a, 0x3e, 0xd8, 0x52, 0x30, 0xdf, 0x66, 0xf4, 0xa0, 0x55, 0x0a, + 0x23, 0xce, 0xa1, 0xc4, 0x8e, 0x5c, 0xf1, 0xf4, 0x03, 0xd6, 0x7c, 0x52, 0x1f, 0xb8, 0x9e, 0x2f, + 0x82, 0x17, 0xf8, 0x91, 0x9b, 0x04, 0xe2, 0x74, 0xfd, 0x24, 0x12, 0xfe, 0x3a, 0xd2, 0x38, 0x7b, + 0x3d, 0x3a, 0x85, 0x84, 0x3f, 0x91, 0x94, 0xae, 0x2f, 0x23, 0x09, 0x5f, 0x9b, 0x66, 0x07, 0x44, + 0x02, 0x49, 0xf4, 0x14, 0x75, 0xba, 0x3e, 0x32, 0xe0, 0x09, 0x97, 0xe8, 0x4e, 0xaf, 0x47, 0x6c, + 0x83, 0x27, 0x4a, 0xd6, 0xdc, 0xae, 0x69, 0x5f, 0x73, 0x35, 0x56, 0x51, 0x3c, 0x69, 0x7d, 0x79, + 0x7f, 0xaf, 0xf6, 0x04, 0x3e, 0xa0, 0x1e, 0x3e, 0x10, 0x0b, 0xea, 0xc1, 0x99, 0x01, 0x4b, 0xe6, + 0xe6, 0xb6, 0x6c, 0x9f, 0xb8, 0xdb, 0x9a, 0x55, 0xf0, 0xcd, 0x2f, 0xc6, 0xa0, 0xd6, 0xe2, 0xa8, + 0x70, 0x12, 0x37, 0xda, 0xa5, 0xbc, 0x5f, 0x74, 0x47, 0x22, 0x59, 0x29, 0x9e, 0x10, 0x16, 0xa7, + 0xd1, 0xe1, 0x2c, 0x1a, 0xea, 0x57, 0x14, 0x10, 0xb7, 0xa2, 0xe8, 0x89, 0x98, 0x39, 0xa4, 0x92, + 0x30, 0x85, 0x3c, 0x21, 0x3c, 0x37, 0x4b, 0x11, 0x54, 0xf2, 0xda, 0xfc, 0x88, 0x14, 0x15, 0x33, + 0x15, 0xb1, 0x02, 0x8e, 0x59, 0x4a, 0x87, 0xf8, 0x0c, 0x4c, 0x11, 0x5b, 0x77, 0x77, 0xfb, 0x91, + 0x54, 0x31, 0xc3, 0x93, 0x60, 0x88, 0x42, 0x1c, 0xc1, 0xd5, 0x7f, 0xa7, 0x80, 0xc0, 0xc0, 0xd2, + 0x70, 0x0e, 0x95, 0xc4, 0xf1, 0x50, 0x13, 0xaf, 0x94, 0x46, 0x72, 0x2c, 0x2f, 0x8d, 0xe4, 0x49, + 0xe5, 0x64, 0xfc, 0x6d, 0x05, 0x92, 0x4f, 0xf8, 0xa2, 0xa7, 0x60, 0x52, 0x84, 0xdc, 0x8a, 0xc0, + 0x3d, 0xee, 0xa9, 0xcd, 0x8b, 0x70, 0x00, 0x8b, 0x6b, 0x0b, 0x23, 0x44, 0xe8, 0x65, 0x47, 0x4b, + 0x1d, 0xac, 0x2d, 0xa8, 0xdf, 0x9e, 0x85, 0x09, 0x1e, 0x24, 0x4a, 0x79, 0x5a, 0x86, 0x4b, 0xe0, + 0xcd, 0xe2, 0x61, 0xa8, 0x05, 0x3c, 0xff, 0x62, 0x19, 0xc3, 0x4a, 0x07, 0x66, 0x0c, 0xc3, 0x3c, + 0x45, 0xec, 0x08, 0x16, 0xa2, 0x06, 0x6e, 0x89, 0x57, 0x49, 0x44, 0x7a, 0x58, 0xe4, 0xc7, 0x4c, + 0x27, 0xe3, 0xc5, 0x93, 0xdf, 0xf2, 0x01, 0x90, 0x0c, 0x28, 0xb3, 0x07, 0x18, 0x4f, 0xa2, 0xa8, + 0xbc, 0x72, 0xf1, 0x2b, 0x17, 0x31, 0xe4, 0x43, 0x44, 0xe5, 0x85, 0x1b, 0x69, 0x22, 0x77, 0x23, + 0x6d, 0xc0, 0xa4, 0xd8, 0x0a, 0x82, 0x39, 0xbe, 0x3c, 0x42, 0xfa, 0x57, 0x29, 0x87, 0x03, 0x2f, + 0xc0, 0x01, 0x72, 0x7a, 0xe2, 0xf6, 0xb4, 0x1d, 0xb3, 0x37, 0xe8, 0x31, 0x8e, 0x58, 0x96, 0xab, + 0xb2, 0x62, 0x1c, 0xc0, 0x59, 0x55, 0x7e, 0x53, 0xc5, 0x84, 0x59, 0xb9, 0xaa, 0x78, 0x55, 0x2b, + 0x80, 0xa3, 0xb7, 0xa1, 0xd2, 0xd3, 0x76, 0x3a, 0x03, 0xb7, 0x4b, 0x84, 0xd1, 0x24, 0x5f, 0xe4, + 0x19, 0xf8, 0xa6, 0xb5, 0x44, 0x55, 0x30, 0xdf, 0x5d, 0x6a, 0xd9, 0xfe, 0x1d, 0xb7, 0xe3, 0xbb, + 0x61, 0x5a, 0xca, 0x55, 0x81, 0x05, 0x87, 0xf8, 0x90, 0x05, 0xb3, 0x3d, 0x6d, 0x67, 0xcd, 0xd6, + 0xc2, 0xc7, 0x7f, 0xaa, 0x05, 0x29, 0x30, 0xcb, 0xf1, 0x6a, 0x0c, 0x17, 0x4e, 0xe0, 0xce, 0x30, + 0x52, 0x4f, 0x9f, 0x94, 0x91, 0x7a, 0x39, 0xf4, 0xfd, 0xe1, 0xb2, 0xf3, 0x63, 0x59, 0x77, 0x5a, + 0x07, 0xfb, 0xf5, 0xbc, 0x13, 0xfa, 0xf5, 0xcc, 0x16, 0xb7, 0x2c, 0x1f, 0xe0, 0xd3, 0x33, 0x80, + 0x2a, 0x15, 0x38, 0x79, 0xa9, 0xb7, 0x70, 0xa6, 0xb8, 0x65, 0xa3, 0x19, 0xa2, 0x91, 0x52, 0xf3, + 0x47, 0xa8, 0xb1, 0x4c, 0x07, 0xdd, 0xe1, 0x8f, 0xc3, 0x58, 0xc4, 0x8f, 0xaa, 0x30, 0xa5, 0x6a, + 0x8e, 0x1b, 0xaf, 0x82, 0xb7, 0x5c, 0x52, 0x15, 0x70, 0x76, 0x3b, 0x2a, 0xa2, 0xf2, 0xd0, 0x9c, + 0xf9, 0x28, 0x75, 0x4c, 0x2c, 0x4c, 0xf7, 0xaf, 0x2b, 0x30, 0xc7, 0x9f, 0x30, 0x6c, 0x38, 0xbd, + 0xbe, 0x63, 0x13, 0x3a, 0x2d, 0xa8, 0xb8, 0x9f, 0x22, 0xe7, 0x0d, 0x9d, 0x04, 0x46, 0x71, 0x19, + 0x99, 0x28, 0xc5, 0x29, 0xca, 0xe8, 0x77, 0x14, 0x58, 0xe8, 0xe5, 0x64, 0xbe, 0x5f, 0x38, 0x5b, + 0xdc, 0xb7, 0xf3, 0xb0, 0x6c, 0xfa, 0xfc, 0x59, 0xd5, 0xc3, 0x6a, 0xe1, 0xdc, 0xbe, 0x8d, 0xea, + 0x46, 0x3e, 0x4a, 0xf8, 0xf2, 0xaf, 0x2a, 0x30, 0x97, 0x3c, 0x04, 0xe4, 0xf7, 0x6c, 0x94, 0x93, + 0x7d, 0xcf, 0x46, 0xba, 0x72, 0x2a, 0x1d, 0x70, 0xe5, 0xf4, 0x0a, 0x5c, 0xc8, 0x5e, 0x1b, 0x54, + 0x22, 0x63, 0xef, 0x47, 0x09, 0x4d, 0x28, 0xca, 0xc0, 0x4a, 0x0b, 0x31, 0x87, 0xd5, 0x3f, 0xf6, + 0xcd, 0xef, 0x5d, 0x7a, 0xe4, 0x5b, 0xdf, 0xbb, 0xf4, 0xc8, 0x77, 0xbe, 0x77, 0xe9, 0x91, 0x9f, + 0xdc, 0xbf, 0xa4, 0x7c, 0x73, 0xff, 0x92, 0xf2, 0xad, 0xfd, 0x4b, 0xca, 0x77, 0xf6, 0x2f, 0x29, + 0xff, 0x65, 0xff, 0x92, 0xf2, 0xf3, 0xff, 0xf5, 0xd2, 0x23, 0x6f, 0x4f, 0x8a, 0x8e, 0xff, 0x79, + 0x00, 0x00, 0x00, 0xff, 0xff, 0xa3, 0x4c, 0xef, 0x49, 0xac, 0xba, 0x00, 0x00, } func (m *Addon) Marshal() (dAtA []byte, err error) { @@ -5485,6 +5489,18 @@ func (m *BackupEntryStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.MigrationStartTime != nil { + { + size, err := m.MigrationStartTime.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + } if m.SeedName != nil { i -= len(*m.SeedName) copy(dAtA[i:], *m.SeedName) @@ -5832,6 +5848,15 @@ func (m *ClusterAutoscaler) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.IgnoreTaints) > 0 { + for iNdEx := len(m.IgnoreTaints) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.IgnoreTaints[iNdEx]) + copy(dAtA[i:], m.IgnoreTaints[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.IgnoreTaints[iNdEx]))) + i-- + dAtA[i] = 0x52 + } + } if m.MaxGracefulTerminationSeconds != nil { i = encodeVarintGenerated(dAtA, i, uint64(*m.MaxGracefulTerminationSeconds)) i-- @@ -12177,6 +12202,18 @@ func (m *ShootStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.MigrationStartTime != nil { + { + size, err := m.MigrationStartTime.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x72 + } if len(m.AdvertisedAddresses) > 0 { for iNdEx := len(m.AdvertisedAddresses) - 1; iNdEx >= 0; iNdEx-- { { @@ -13217,6 +13254,10 @@ func (m *BackupEntryStatus) Size() (n int) { l = len(*m.SeedName) n += 1 + l + sovGenerated(uint64(l)) } + if m.MigrationStartTime != nil { + l = m.MigrationStartTime.Size() + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -13369,6 +13410,12 @@ func (m *ClusterAutoscaler) Size() (n int) { if m.MaxGracefulTerminationSeconds != nil { n += 1 + sovGenerated(uint64(*m.MaxGracefulTerminationSeconds)) } + if len(m.IgnoreTaints) > 0 { + for _, s := range m.IgnoreTaints { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } + } return n } @@ -15724,6 +15771,10 @@ func (m *ShootStatus) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) } } + if m.MigrationStartTime != nil { + l = m.MigrationStartTime.Size() + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -16159,6 +16210,7 @@ func (this *BackupEntryStatus) String() string { `LastError:` + strings.Replace(this.LastError.String(), "LastError", "LastError", 1) + `,`, `ObservedGeneration:` + fmt.Sprintf("%v", this.ObservedGeneration) + `,`, `SeedName:` + valueToStringGenerated(this.SeedName) + `,`, + `MigrationStartTime:` + strings.Replace(fmt.Sprintf("%v", this.MigrationStartTime), "Time", "v11.Time", 1) + `,`, `}`, }, "") return s @@ -16269,6 +16321,7 @@ func (this *ClusterAutoscaler) String() string { `Expander:` + valueToStringGenerated(this.Expander) + `,`, `MaxNodeProvisionTime:` + strings.Replace(fmt.Sprintf("%v", this.MaxNodeProvisionTime), "Duration", "v11.Duration", 1) + `,`, `MaxGracefulTerminationSeconds:` + valueToStringGenerated(this.MaxGracefulTerminationSeconds) + `,`, + `IgnoreTaints:` + fmt.Sprintf("%v", this.IgnoreTaints) + `,`, `}`, }, "") return s @@ -17934,6 +17987,7 @@ func (this *ShootStatus) String() string { `UID:` + fmt.Sprintf("%v", this.UID) + `,`, `ClusterIdentity:` + valueToStringGenerated(this.ClusterIdentity) + `,`, `AdvertisedAddresses:` + repeatedStringForAdvertisedAddresses + `,`, + `MigrationStartTime:` + strings.Replace(fmt.Sprintf("%v", this.MigrationStartTime), "Time", "v11.Time", 1) + `,`, `}`, }, "") return s @@ -20128,6 +20182,42 @@ func (m *BackupEntryStatus) Unmarshal(dAtA []byte) error { s := string(dAtA[iNdEx:postIndex]) m.SeedName = &s iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MigrationStartTime", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.MigrationStartTime == nil { + m.MigrationStartTime = &v11.Time{} + } + if err := m.MigrationStartTime.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -21278,6 +21368,38 @@ func (m *ClusterAutoscaler) Unmarshal(dAtA []byte) error { } } m.MaxGracefulTerminationSeconds = &v + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field IgnoreTaints", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.IgnoreTaints = append(m.IgnoreTaints, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -40228,6 +40350,42 @@ func (m *ShootStatus) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 14: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MigrationStartTime", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.MigrationStartTime == nil { + m.MigrationStartTime = &v11.Time{} + } + if err := m.MigrationStartTime.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/generated.proto b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/generated.proto index 0d2282382..c3f8f506b 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/generated.proto +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/generated.proto @@ -1,5 +1,5 @@ /* -Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -221,6 +221,10 @@ message BackupEntryStatus { // at the beginning of a create/reconcile operation. It is used when moving the BackupEntry between seeds. // +optional optional string seedName = 4; + + // MigrationStartTime is the time when a migration to a different seed was initiated. + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.Time migrationStartTime = 5; } // CRI contains information about the Container Runtimes. @@ -348,6 +352,10 @@ message ClusterAutoscaler { // MaxGracefulTerminationSeconds is the number of seconds CA waits for pod termination when trying to scale down a node (default: 600). // +optional optional int32 maxGracefulTerminationSeconds = 9; + + // IgnoreTaints specifies a list of taint keys to ignore in node templates when considering to scale a node group. + // +optional + repeated string ignoreTaints = 10; } // ClusterInfo contains information about the Plant cluster @@ -2267,6 +2275,10 @@ message ShootStatus { // +patchMergeKey=name // +patchStrategy=merge repeated ShootAdvertisedAddress advertisedAddresses = 13; + + // MigrationStartTime is the time when a migration to a different seed was initiated. + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.Time migrationStartTime = 14; } // ShootTemplate is a template for creating a Shoot object. diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/helper/errors.go b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/helper/errors.go index 3c57a1cb9..6b06ab659 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/helper/errors.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/helper/errors.go @@ -52,10 +52,10 @@ func (e *ErrorWithCodes) Error() string { } var ( - unauthorizedRegexp = regexp.MustCompile(`(?i)(Unauthorized|InvalidClientTokenId|InvalidAuthenticationTokenTenant|SignatureDoesNotMatch|Authentication failed|AuthFailure|AuthorizationFailed|invalid character|invalid_grant|invalid_client|Authorization Profile was not found|cannot fetch token|no active subscriptions|InvalidAccessKeyId|InvalidSecretAccessKey|query returned no results|UnauthorizedOperation|not authorized|InvalidSubscriptionId)`) - quotaExceededRegexp = regexp.MustCompile(`(?i)((?:^|[^t]|(?:[^s]|^)t|(?:[^e]|^)st|(?:[^u]|^)est|(?:[^q]|^)uest|(?:[^e]|^)quest|(?:[^r]|^)equest)LimitExceeded|Quotas|Quota.*exceeded|exceeded quota|Quota has been met|QUOTA_EXCEEDED|Maximum number of ports exceeded|ZONE_RESOURCE_POOL_EXHAUSTED_WITH_DETAILS)`) + unauthenticatedRegexp = regexp.MustCompile(`(?i)(InvalidAuthenticationTokenTenant|Authentication failed|AuthFailure|invalid character|invalid_client|query returned no results|InvalidAccessKeyId|cannot fetch token|InvalidSecretAccessKey|InvalidSubscriptionId)`) + unauthorizedRegexp = regexp.MustCompile(`(?i)(Unauthorized|InvalidClientTokenId|SignatureDoesNotMatch|AuthorizationFailed|invalid_grant|Authorization Profile was not found|no active subscriptions|UnauthorizedOperation|not authorized|AccessDenied|OperationNotAllowed|Error 403)`) + quotaExceededRegexp = regexp.MustCompile(`(?i)((?:^|[^t]|(?:[^s]|^)t|(?:[^e]|^)st|(?:[^u]|^)est|(?:[^q]|^)uest|(?:[^e]|^)quest|(?:[^r]|^)equest)LimitExceeded|Quotas|Quota.*exceeded|exceeded quota|Quota has been met|QUOTA_EXCEEDED|Maximum number of ports exceeded|ZONE_RESOURCE_POOL_EXHAUSTED_WITH_DETAILS|VolumeSizeExceedsAvailableQuota)`) rateLimitsExceededRegexp = regexp.MustCompile(`(?i)(RequestLimitExceeded|Throttling|Too many requests)`) - insufficientPrivilegesRegexp = regexp.MustCompile(`(?i)(AccessDenied|OperationNotAllowed|Error 403)`) dependenciesRegexp = regexp.MustCompile(`(?i)(PendingVerification|Access Not Configured|accessNotConfigured|DependencyViolation|OptInRequired|DeleteConflict|Conflict|inactive billing state|ReadOnlyDisabledSubscription|is already being used|InUseSubnetCannotBeDeleted|VnetInUse|InUseRouteTableCannotBeDeleted|timeout while waiting for state to become|InvalidCidrBlock|already busy for|InsufficientFreeAddressesInSubnet|InternalServerError|internalerror|internal server error|A resource with the ID|VnetAddressSpaceCannotChangeDueToPeerings|InternalBillingError|There are not enough hosts available)`) retryableDependenciesRegexp = regexp.MustCompile(`(?i)(RetryableError)`) resourcesDepletedRegexp = regexp.MustCompile(`(?i)(not available in the current hardware cluster|InsufficientInstanceCapacity|SkuNotAvailable|ZonalAllocationFailed|out of stock)`) @@ -92,10 +92,11 @@ func DetermineErrorCodes(err error) []gardencorev1beta1.ErrorCode { codes = sets.NewString() knownCodes = map[gardencorev1beta1.ErrorCode]func(string) bool{ + gardencorev1beta1.ErrorInfraUnauthenticated: unauthenticatedRegexp.MatchString, gardencorev1beta1.ErrorInfraUnauthorized: unauthorizedRegexp.MatchString, + gardencorev1beta1.ErrorInfraInsufficientPrivileges: unauthorizedRegexp.MatchString, gardencorev1beta1.ErrorInfraQuotaExceeded: quotaExceededRegexp.MatchString, gardencorev1beta1.ErrorInfraRateLimitsExceeded: rateLimitsExceededRegexp.MatchString, - gardencorev1beta1.ErrorInfraInsufficientPrivileges: insufficientPrivilegesRegexp.MatchString, gardencorev1beta1.ErrorInfraDependencies: dependenciesRegexp.MatchString, gardencorev1beta1.ErrorRetryableInfraDependencies: retryableDependenciesRegexp.MatchString, gardencorev1beta1.ErrorInfraResourcesDepleted: resourcesDepletedRegexp.MatchString, @@ -262,7 +263,8 @@ func LastErrorWithTaskID(description string, taskID string, codes ...gardencorev func HasNonRetryableErrorCode(lastErrors ...gardencorev1beta1.LastError) bool { for _, lastError := range lastErrors { for _, code := range lastError.Codes { - if code == gardencorev1beta1.ErrorInfraUnauthorized || + if code == gardencorev1beta1.ErrorInfraUnauthenticated || + code == gardencorev1beta1.ErrorInfraUnauthorized || code == gardencorev1beta1.ErrorInfraInsufficientPrivileges || code == gardencorev1beta1.ErrorInfraDependencies || code == gardencorev1beta1.ErrorInfraQuotaExceeded || diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/types_backupentry.go b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/types_backupentry.go index b88e30009..bade121b6 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/types_backupentry.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/types_backupentry.go @@ -76,4 +76,7 @@ type BackupEntryStatus struct { // at the beginning of a create/reconcile operation. It is used when moving the BackupEntry between seeds. // +optional SeedName *string `json:"seedName,omitempty" protobuf:"bytes,4,opt,name=seedName"` + // MigrationStartTime is the time when a migration to a different seed was initiated. + // +optional + MigrationStartTime *metav1.Time `json:"migrationStartTime,omitempty" protobuf:"bytes,5,opt,name=migrationStartTime"` } diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/types_common.go b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/types_common.go index 8d1765a31..dd5d10460 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/types_common.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/types_common.go @@ -20,11 +20,15 @@ import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" type ErrorCode string const ( - // ErrorInfraUnauthorized indicates that the last error occurred due to invalid infrastructure credentials. + // ErrorInfraUnauthenticated indicates that the last error occurred due to the client request not being completed because it lacks valid authentication credentials for the requested resource. + // It is classified as a non-retryable error code. + ErrorInfraUnauthenticated ErrorCode = "ERR_INFRA_UNAUTHENTICATED" + // ErrorInfraUnauthorized indicates that the last error occurred due to the server understanding the request but refusing to authorize it. // It is classified as a non-retryable error code. ErrorInfraUnauthorized ErrorCode = "ERR_INFRA_UNAUTHORIZED" // ErrorInfraInsufficientPrivileges indicates that the last error occurred due to insufficient infrastructure privileges. // It is classified as a non-retryable error code. + // This error code is deprecated in favor of ERR_INFRA_UNAUTHORIZED and will be removed in a future version. ErrorInfraInsufficientPrivileges ErrorCode = "ERR_INFRA_INSUFFICIENT_PRIVILEGES" // ErrorInfraQuotaExceeded indicates that the last error occurred due to infrastructure quota limits. // It is classified as a non-retryable error code. diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/types_shoot.go b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/types_shoot.go index 48e531688..a1231b130 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/types_shoot.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/types_shoot.go @@ -175,6 +175,9 @@ type ShootStatus struct { // +patchMergeKey=name // +patchStrategy=merge AdvertisedAddresses []ShootAdvertisedAddress `json:"advertisedAddresses,omitempty" patchStrategy:"merge" patchMergeKey:"name" protobuf:"bytes,13,rep,name=advertisedAddresses"` + // MigrationStartTime is the time when a migration to a different seed was initiated. + // +optional + MigrationStartTime *metav1.Time `json:"migrationStartTime,omitempty" protobuf:"bytes,14,opt,name=migrationStartTime"` } // ShootAdvertisedAddress contains information for the shoot's Kube API server. @@ -411,6 +414,9 @@ type ClusterAutoscaler struct { // MaxGracefulTerminationSeconds is the number of seconds CA waits for pod termination when trying to scale down a node (default: 600). // +optional MaxGracefulTerminationSeconds *int32 `json:"maxGracefulTerminationSeconds,omitempty" protobuf:"varint,9,opt,name=maxGracefulTerminationSeconds"` + // IgnoreTaints specifies a list of taint keys to ignore in node templates when considering to scale a node group. + // +optional + IgnoreTaints []string `json:"ignoreTaints,omitempty" protobuf:"bytes,10,opt,name=ignoreTaints"` } // ExpanderMode is type used for Expander values diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/zz_generated.conversion.go b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/zz_generated.conversion.go index deee67e10..8452c377c 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/zz_generated.conversion.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/zz_generated.conversion.go @@ -2,7 +2,7 @@ // +build !ignore_autogenerated /* -Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -1828,6 +1828,7 @@ func autoConvert_v1beta1_BackupEntryStatus_To_core_BackupEntryStatus(in *BackupE out.LastError = (*core.LastError)(unsafe.Pointer(in.LastError)) out.ObservedGeneration = in.ObservedGeneration out.SeedName = (*string)(unsafe.Pointer(in.SeedName)) + out.MigrationStartTime = (*metav1.Time)(unsafe.Pointer(in.MigrationStartTime)) return nil } @@ -1841,6 +1842,7 @@ func autoConvert_core_BackupEntryStatus_To_v1beta1_BackupEntryStatus(in *core.Ba out.LastError = (*LastError)(unsafe.Pointer(in.LastError)) out.ObservedGeneration = in.ObservedGeneration out.SeedName = (*string)(unsafe.Pointer(in.SeedName)) + out.MigrationStartTime = (*metav1.Time)(unsafe.Pointer(in.MigrationStartTime)) return nil } @@ -1991,6 +1993,7 @@ func autoConvert_v1beta1_ClusterAutoscaler_To_core_ClusterAutoscaler(in *Cluster out.Expander = (*core.ExpanderMode)(unsafe.Pointer(in.Expander)) out.MaxNodeProvisionTime = (*metav1.Duration)(unsafe.Pointer(in.MaxNodeProvisionTime)) out.MaxGracefulTerminationSeconds = (*int32)(unsafe.Pointer(in.MaxGracefulTerminationSeconds)) + out.IgnoreTaints = *(*[]string)(unsafe.Pointer(&in.IgnoreTaints)) return nil } @@ -2009,6 +2012,7 @@ func autoConvert_core_ClusterAutoscaler_To_v1beta1_ClusterAutoscaler(in *core.Cl out.Expander = (*ExpanderMode)(unsafe.Pointer(in.Expander)) out.MaxNodeProvisionTime = (*metav1.Duration)(unsafe.Pointer(in.MaxNodeProvisionTime)) out.MaxGracefulTerminationSeconds = (*int32)(unsafe.Pointer(in.MaxGracefulTerminationSeconds)) + out.IgnoreTaints = *(*[]string)(unsafe.Pointer(&in.IgnoreTaints)) return nil } @@ -5002,6 +5006,7 @@ func autoConvert_v1beta1_ShootStatus_To_core_ShootStatus(in *ShootStatus, out *c out.UID = types.UID(in.UID) out.ClusterIdentity = (*string)(unsafe.Pointer(in.ClusterIdentity)) out.AdvertisedAddresses = *(*[]core.ShootAdvertisedAddress)(unsafe.Pointer(&in.AdvertisedAddresses)) + out.MigrationStartTime = (*metav1.Time)(unsafe.Pointer(in.MigrationStartTime)) return nil } @@ -5026,6 +5031,7 @@ func autoConvert_core_ShootStatus_To_v1beta1_ShootStatus(in *core.ShootStatus, o out.UID = types.UID(in.UID) out.ClusterIdentity = (*string)(unsafe.Pointer(in.ClusterIdentity)) out.AdvertisedAddresses = *(*[]ShootAdvertisedAddress)(unsafe.Pointer(&in.AdvertisedAddresses)) + out.MigrationStartTime = (*metav1.Time)(unsafe.Pointer(in.MigrationStartTime)) return nil } diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/zz_generated.deepcopy.go b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/zz_generated.deepcopy.go index 56b414f5c..92ae1993d 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/zz_generated.deepcopy.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/zz_generated.deepcopy.go @@ -2,7 +2,7 @@ // +build !ignore_autogenerated /* -Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -422,6 +422,10 @@ func (in *BackupEntryStatus) DeepCopyInto(out *BackupEntryStatus) { *out = new(string) **out = **in } + if in.MigrationStartTime != nil { + in, out := &in.MigrationStartTime, &out.MigrationStartTime + *out = (*in).DeepCopy() + } return } @@ -642,6 +646,11 @@ func (in *ClusterAutoscaler) DeepCopyInto(out *ClusterAutoscaler) { *out = new(int32) **out = **in } + if in.IgnoreTaints != nil { + in, out := &in.IgnoreTaints, &out.IgnoreTaints + *out = make([]string, len(*in)) + copy(*out, *in) + } return } @@ -3945,6 +3954,10 @@ func (in *ShootStatus) DeepCopyInto(out *ShootStatus) { *out = make([]ShootAdvertisedAddress, len(*in)) copy(*out, *in) } + if in.MigrationStartTime != nil { + in, out := &in.MigrationStartTime, &out.MigrationStartTime + *out = (*in).DeepCopy() + } return } diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/zz_generated.defaults.go b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/zz_generated.defaults.go index d39428bb7..c0681ade3 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/zz_generated.defaults.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/zz_generated.defaults.go @@ -2,7 +2,7 @@ // +build !ignore_autogenerated /* -Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/validation/shoot.go b/vendor/github.com/gardener/gardener/pkg/apis/core/validation/shoot.go index 5e880dd2e..5183def73 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/validation/shoot.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/validation/shoot.go @@ -790,7 +790,7 @@ func validateKubernetes(kubernetes core.Kubernetes, dockerConfigured bool, fldPa } if clusterAutoscaler := kubernetes.ClusterAutoscaler; clusterAutoscaler != nil { - allErrs = append(allErrs, ValidateClusterAutoscaler(*clusterAutoscaler, fldPath.Child("clusterAutoscaler"))...) + allErrs = append(allErrs, ValidateClusterAutoscaler(*clusterAutoscaler, kubernetes.Version, fldPath.Child("clusterAutoscaler"))...) } if verticalPodAutoscaler := kubernetes.VerticalPodAutoscaler; verticalPodAutoscaler != nil { allErrs = append(allErrs, ValidateVerticalPodAutoscaler(*verticalPodAutoscaler, fldPath.Child("verticalPodAutoscaler"))...) @@ -857,7 +857,7 @@ func ValidateWatchCacheSizes(sizes *core.WatchCacheSizes, fldPath *field.Path) f } // ValidateClusterAutoscaler validates the given ClusterAutoscaler fields. -func ValidateClusterAutoscaler(autoScaler core.ClusterAutoscaler, fldPath *field.Path) field.ErrorList { +func ValidateClusterAutoscaler(autoScaler core.ClusterAutoscaler, k8sVersion string, fldPath *field.Path) field.ErrorList { allErrs := field.ErrorList{} if threshold := autoScaler.ScaleDownUtilizationThreshold; threshold != nil { if *threshold < 0.0 { @@ -878,6 +878,16 @@ func ValidateClusterAutoscaler(autoScaler core.ClusterAutoscaler, fldPath *field allErrs = append(allErrs, field.NotSupported(fldPath.Child("expander"), *expander, availableClusterAutoscalerExpanderModes.List())) } + if ignoreTaints := autoScaler.IgnoreTaints; ignoreTaints != nil { + k8sVersionIs116OrGreater, _ := versionutils.CompareVersions(k8sVersion, ">=", "1.16") + + if k8sVersionIs116OrGreater { + allErrs = append(allErrs, validateClusterAutoscalerIgnoreTaints(ignoreTaints, fldPath.Child("ignoreTaints"))...) + } else { + allErrs = append(allErrs, field.Invalid(fldPath.Child("ignoreTaints"), autoScaler.IgnoreTaints, "ignoreTaints cannot be specified for kubernetes version < 1.16")) + } + } + return allErrs } @@ -1290,6 +1300,24 @@ func validateKubeletConfigReserved(reserved *core.KubeletConfigReserved, fldPath return allErrs } +func validateClusterAutoscalerIgnoreTaints(ignoredTaints []string, fldPath *field.Path) field.ErrorList { + allErrs := field.ErrorList{} + taintKeySet := make(map[string]struct{}) + + for index, taint := range ignoredTaints { + // validate the taint key + allErrs = append(allErrs, metav1validation.ValidateLabelName(taint, fldPath.Index(index))...) + + // validate if taint key is duplicate + if _, ok := taintKeySet[taint]; ok { + allErrs = append(allErrs, field.Duplicate(fldPath.Index(index), taint)) + continue + } + taintKeySet[taint] = struct{}{} + } + return allErrs +} + // https://github.com/kubernetes/kubernetes/blob/ee9079f8ec39914ff8975b5390749771b9303ea4/pkg/apis/core/validation/validation.go#L4057-L4089 func validateTaints(taints []corev1.Taint, fldPath *field.Path) field.ErrorList { allErrors := field.ErrorList{} diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/zz_generated.deepcopy.go b/vendor/github.com/gardener/gardener/pkg/apis/core/zz_generated.deepcopy.go index 31aa562d5..24f6015cb 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/zz_generated.deepcopy.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/zz_generated.deepcopy.go @@ -2,7 +2,7 @@ // +build !ignore_autogenerated /* -Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -422,6 +422,10 @@ func (in *BackupEntryStatus) DeepCopyInto(out *BackupEntryStatus) { *out = new(string) **out = **in } + if in.MigrationStartTime != nil { + in, out := &in.MigrationStartTime, &out.MigrationStartTime + *out = (*in).DeepCopy() + } return } @@ -642,6 +646,11 @@ func (in *ClusterAutoscaler) DeepCopyInto(out *ClusterAutoscaler) { *out = new(int32) **out = **in } + if in.IgnoreTaints != nil { + in, out := &in.IgnoreTaints, &out.IgnoreTaints + *out = make([]string, len(*in)) + copy(*out, *in) + } return } @@ -4292,6 +4301,10 @@ func (in *ShootStatus) DeepCopyInto(out *ShootStatus) { *out = make([]ShootAdvertisedAddress, len(*in)) copy(*out, *in) } + if in.MigrationStartTime != nil { + in, out := &in.MigrationStartTime, &out.MigrationStartTime + *out = (*in).DeepCopy() + } return } diff --git a/vendor/github.com/gardener/gardener/pkg/apis/extensions/v1alpha1/types_dnsrecord.go b/vendor/github.com/gardener/gardener/pkg/apis/extensions/v1alpha1/types_dnsrecord.go index b58f3aecc..231132569 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/extensions/v1alpha1/types_dnsrecord.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/extensions/v1alpha1/types_dnsrecord.go @@ -110,3 +110,9 @@ const ( // DNSRecordTypeTXT specifies that the DNSRecord is of type TXT. DNSRecordTypeTXT DNSRecordType = "TXT" ) + +const ( + // ConditionTypeCreated specifies the condition type "Created" used as marker if record creation + // on infrastructure was performed successfully at least once. + ConditionTypeCreated = "Created" +) diff --git a/vendor/github.com/gardener/gardener/pkg/apis/extensions/v1alpha1/zz_generated.deepcopy.go b/vendor/github.com/gardener/gardener/pkg/apis/extensions/v1alpha1/zz_generated.deepcopy.go index df523f78b..21c7352cc 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/extensions/v1alpha1/zz_generated.deepcopy.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/extensions/v1alpha1/zz_generated.deepcopy.go @@ -2,7 +2,7 @@ // +build !ignore_autogenerated /* -Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/github.com/gardener/gardener/pkg/apis/operations/v1alpha1/generated.pb.go b/vendor/github.com/gardener/gardener/pkg/apis/operations/v1alpha1/generated.pb.go index 2254ac253..1e8328ca7 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/operations/v1alpha1/generated.pb.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/operations/v1alpha1/generated.pb.go @@ -1,5 +1,5 @@ /* -Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/github.com/gardener/gardener/pkg/apis/operations/v1alpha1/generated.proto b/vendor/github.com/gardener/gardener/pkg/apis/operations/v1alpha1/generated.proto index 506f833c7..7e98772e5 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/operations/v1alpha1/generated.proto +++ b/vendor/github.com/gardener/gardener/pkg/apis/operations/v1alpha1/generated.proto @@ -1,5 +1,5 @@ /* -Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/github.com/gardener/gardener/pkg/apis/operations/v1alpha1/zz_generated.conversion.go b/vendor/github.com/gardener/gardener/pkg/apis/operations/v1alpha1/zz_generated.conversion.go index cb2cbe81d..98477e435 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/operations/v1alpha1/zz_generated.conversion.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/operations/v1alpha1/zz_generated.conversion.go @@ -2,7 +2,7 @@ // +build !ignore_autogenerated /* -Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/github.com/gardener/gardener/pkg/apis/operations/v1alpha1/zz_generated.deepcopy.go b/vendor/github.com/gardener/gardener/pkg/apis/operations/v1alpha1/zz_generated.deepcopy.go index f719e1ce0..5c7c80d1a 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/operations/v1alpha1/zz_generated.deepcopy.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/operations/v1alpha1/zz_generated.deepcopy.go @@ -2,7 +2,7 @@ // +build !ignore_autogenerated /* -Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/github.com/gardener/gardener/pkg/apis/operations/v1alpha1/zz_generated.defaults.go b/vendor/github.com/gardener/gardener/pkg/apis/operations/v1alpha1/zz_generated.defaults.go index fe2d0232f..f31795e55 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/operations/v1alpha1/zz_generated.defaults.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/operations/v1alpha1/zz_generated.defaults.go @@ -2,7 +2,7 @@ // +build !ignore_autogenerated /* -Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/github.com/gardener/gardener/pkg/apis/operations/zz_generated.deepcopy.go b/vendor/github.com/gardener/gardener/pkg/apis/operations/zz_generated.deepcopy.go index 65d1e46c6..e9763bcf6 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/operations/zz_generated.deepcopy.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/operations/zz_generated.deepcopy.go @@ -2,7 +2,7 @@ // +build !ignore_autogenerated /* -Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/github.com/gardener/gardener/pkg/apis/resources/v1alpha1/zz_generated.deepcopy.go b/vendor/github.com/gardener/gardener/pkg/apis/resources/v1alpha1/zz_generated.deepcopy.go index d4fbd3ef4..a1ecf194c 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/resources/v1alpha1/zz_generated.deepcopy.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/resources/v1alpha1/zz_generated.deepcopy.go @@ -2,7 +2,7 @@ // +build !ignore_autogenerated /* -Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/github.com/gardener/gardener/pkg/apis/seedmanagement/v1alpha1/generated.pb.go b/vendor/github.com/gardener/gardener/pkg/apis/seedmanagement/v1alpha1/generated.pb.go index d9d5a55e6..f41eeb543 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/seedmanagement/v1alpha1/generated.pb.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/seedmanagement/v1alpha1/generated.pb.go @@ -1,5 +1,5 @@ /* -Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/github.com/gardener/gardener/pkg/apis/seedmanagement/v1alpha1/generated.proto b/vendor/github.com/gardener/gardener/pkg/apis/seedmanagement/v1alpha1/generated.proto index b3491ba38..901cf960e 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/seedmanagement/v1alpha1/generated.proto +++ b/vendor/github.com/gardener/gardener/pkg/apis/seedmanagement/v1alpha1/generated.proto @@ -1,5 +1,5 @@ /* -Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/github.com/gardener/gardener/pkg/apis/seedmanagement/v1alpha1/zz_generated.conversion.go b/vendor/github.com/gardener/gardener/pkg/apis/seedmanagement/v1alpha1/zz_generated.conversion.go index fe86bebd6..3989df583 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/seedmanagement/v1alpha1/zz_generated.conversion.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/seedmanagement/v1alpha1/zz_generated.conversion.go @@ -2,7 +2,7 @@ // +build !ignore_autogenerated /* -Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/github.com/gardener/gardener/pkg/apis/seedmanagement/v1alpha1/zz_generated.deepcopy.go b/vendor/github.com/gardener/gardener/pkg/apis/seedmanagement/v1alpha1/zz_generated.deepcopy.go index 686ae1c56..cd3376eff 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/seedmanagement/v1alpha1/zz_generated.deepcopy.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/seedmanagement/v1alpha1/zz_generated.deepcopy.go @@ -2,7 +2,7 @@ // +build !ignore_autogenerated /* -Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/github.com/gardener/gardener/pkg/apis/seedmanagement/v1alpha1/zz_generated.defaults.go b/vendor/github.com/gardener/gardener/pkg/apis/seedmanagement/v1alpha1/zz_generated.defaults.go index 38b2b03c8..51c6b6699 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/seedmanagement/v1alpha1/zz_generated.defaults.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/seedmanagement/v1alpha1/zz_generated.defaults.go @@ -2,7 +2,7 @@ // +build !ignore_autogenerated /* -Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/github.com/gardener/gardener/pkg/apis/seedmanagement/zz_generated.deepcopy.go b/vendor/github.com/gardener/gardener/pkg/apis/seedmanagement/zz_generated.deepcopy.go index 1e30dac48..b790657b5 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/seedmanagement/zz_generated.deepcopy.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/seedmanagement/zz_generated.deepcopy.go @@ -2,7 +2,7 @@ // +build !ignore_autogenerated /* -Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/github.com/gardener/gardener/pkg/apis/settings/v1alpha1/generated.pb.go b/vendor/github.com/gardener/gardener/pkg/apis/settings/v1alpha1/generated.pb.go index 410f640c4..6f0c179a8 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/settings/v1alpha1/generated.pb.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/settings/v1alpha1/generated.pb.go @@ -1,5 +1,5 @@ /* -Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/github.com/gardener/gardener/pkg/apis/settings/v1alpha1/generated.proto b/vendor/github.com/gardener/gardener/pkg/apis/settings/v1alpha1/generated.proto index 947035b8c..35196225d 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/settings/v1alpha1/generated.proto +++ b/vendor/github.com/gardener/gardener/pkg/apis/settings/v1alpha1/generated.proto @@ -1,5 +1,5 @@ /* -Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/github.com/gardener/gardener/pkg/apis/settings/v1alpha1/zz_generated.conversion.go b/vendor/github.com/gardener/gardener/pkg/apis/settings/v1alpha1/zz_generated.conversion.go index 21a8b70dd..c5b4e23a6 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/settings/v1alpha1/zz_generated.conversion.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/settings/v1alpha1/zz_generated.conversion.go @@ -2,7 +2,7 @@ // +build !ignore_autogenerated /* -Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/github.com/gardener/gardener/pkg/apis/settings/v1alpha1/zz_generated.deepcopy.go b/vendor/github.com/gardener/gardener/pkg/apis/settings/v1alpha1/zz_generated.deepcopy.go index 0d8e85a6d..e9271028d 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/settings/v1alpha1/zz_generated.deepcopy.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/settings/v1alpha1/zz_generated.deepcopy.go @@ -2,7 +2,7 @@ // +build !ignore_autogenerated /* -Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/github.com/gardener/gardener/pkg/apis/settings/v1alpha1/zz_generated.defaults.go b/vendor/github.com/gardener/gardener/pkg/apis/settings/v1alpha1/zz_generated.defaults.go index 032fed8b9..c404a374a 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/settings/v1alpha1/zz_generated.defaults.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/settings/v1alpha1/zz_generated.defaults.go @@ -2,7 +2,7 @@ // +build !ignore_autogenerated /* -Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/github.com/gardener/gardener/pkg/apis/settings/zz_generated.deepcopy.go b/vendor/github.com/gardener/gardener/pkg/apis/settings/zz_generated.deepcopy.go index e5eb9aa82..c9fa3a126 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/settings/zz_generated.deepcopy.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/settings/zz_generated.deepcopy.go @@ -2,7 +2,7 @@ // +build !ignore_autogenerated /* -Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/backupbucket.go b/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/backupbucket.go index 1ef0fbc5d..c41e6d79e 100644 --- a/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/backupbucket.go +++ b/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/backupbucket.go @@ -1,5 +1,5 @@ /* -Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/backupentry.go b/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/backupentry.go index b2ed6868c..9c88e57d9 100644 --- a/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/backupentry.go +++ b/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/backupentry.go @@ -1,5 +1,5 @@ /* -Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/cloudprofile.go b/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/cloudprofile.go index 6721fa190..4759bda9d 100644 --- a/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/cloudprofile.go +++ b/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/cloudprofile.go @@ -1,5 +1,5 @@ /* -Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/controllerdeployment.go b/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/controllerdeployment.go index dc5a55075..559d08ae3 100644 --- a/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/controllerdeployment.go +++ b/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/controllerdeployment.go @@ -1,5 +1,5 @@ /* -Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/controllerinstallation.go b/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/controllerinstallation.go index b873af531..165e579bf 100644 --- a/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/controllerinstallation.go +++ b/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/controllerinstallation.go @@ -1,5 +1,5 @@ /* -Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/controllerregistration.go b/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/controllerregistration.go index 39acc404a..e8f90929c 100644 --- a/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/controllerregistration.go +++ b/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/controllerregistration.go @@ -1,5 +1,5 @@ /* -Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/expansion_generated.go b/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/expansion_generated.go index 07d30207e..756c17300 100644 --- a/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/expansion_generated.go +++ b/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/expansion_generated.go @@ -1,5 +1,5 @@ /* -Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/exposureclass.go b/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/exposureclass.go index fe48821ef..b55114201 100644 --- a/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/exposureclass.go +++ b/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/exposureclass.go @@ -1,5 +1,5 @@ /* -Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/plant.go b/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/plant.go index 00feab542..c8d74042a 100644 --- a/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/plant.go +++ b/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/plant.go @@ -1,5 +1,5 @@ /* -Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/project.go b/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/project.go index f5dc3952d..597d22ccb 100644 --- a/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/project.go +++ b/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/project.go @@ -1,5 +1,5 @@ /* -Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/quota.go b/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/quota.go index 71deacca8..643f9b81c 100644 --- a/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/quota.go +++ b/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/quota.go @@ -1,5 +1,5 @@ /* -Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/secretbinding.go b/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/secretbinding.go index 40f30fea0..186abc424 100644 --- a/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/secretbinding.go +++ b/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/secretbinding.go @@ -1,5 +1,5 @@ /* -Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/seed.go b/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/seed.go index a2c6f8648..70f7c9fb5 100644 --- a/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/seed.go +++ b/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/seed.go @@ -1,5 +1,5 @@ /* -Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/shoot.go b/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/shoot.go index 9ee704ab5..35077112c 100644 --- a/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/shoot.go +++ b/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/shoot.go @@ -1,5 +1,5 @@ /* -Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/shootextensionstatus.go b/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/shootextensionstatus.go index 1196390a1..7ba0343ea 100644 --- a/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/shootextensionstatus.go +++ b/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/shootextensionstatus.go @@ -1,5 +1,5 @@ /* -Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/shootstate.go b/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/shootstate.go index 53b2fea50..a8e373f64 100644 --- a/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/shootstate.go +++ b/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/shootstate.go @@ -1,5 +1,5 @@ /* -Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/github.com/gardener/gardener/pkg/client/kubernetes/cache/cache.go b/vendor/github.com/gardener/gardener/pkg/client/kubernetes/cache/cache.go index 813ef7bb3..56063c9a0 100644 --- a/vendor/github.com/gardener/gardener/pkg/client/kubernetes/cache/cache.go +++ b/vendor/github.com/gardener/gardener/pkg/client/kubernetes/cache/cache.go @@ -101,13 +101,13 @@ func (c *aggregator) Start(ctx context.Context) error { go func(gvk schema.GroupVersionKind, cache runtimecache.Cache) { err := cache.Start(ctx) if err != nil { - logf.Log.Error(err, "cache failed to start", "gvk", gvk.String()) + logf.Log.Error(err, "Cache failed to start", "gvk", gvk.String()) } }(gvk, cache) } go func() { if err := c.fallbackCache.Start(ctx); err != nil { - logf.Log.Error(err, "fallback cache failed to start") + logf.Log.Error(err, "Fallback cache failed to start") } }() <-ctx.Done() diff --git a/vendor/github.com/gardener/gardener/pkg/client/kubernetes/client.go b/vendor/github.com/gardener/gardener/pkg/client/kubernetes/client.go index 994085af2..4fab7cddc 100644 --- a/vendor/github.com/gardener/gardener/pkg/client/kubernetes/client.go +++ b/vendor/github.com/gardener/gardener/pkg/client/kubernetes/client.go @@ -247,6 +247,7 @@ var supportedKubernetesVersions = []string{ "1.20", "1.21", "1.22", + "1.23", } func checkIfSupportedKubernetesVersion(gitVersion string) error { diff --git a/vendor/github.com/gardener/gardener/pkg/client/kubernetes/clientmap/internal/shoot_clientmap.go b/vendor/github.com/gardener/gardener/pkg/client/kubernetes/clientmap/internal/shoot_clientmap.go index e171c4172..484f6eff3 100644 --- a/vendor/github.com/gardener/gardener/pkg/client/kubernetes/clientmap/internal/shoot_clientmap.go +++ b/vendor/github.com/gardener/gardener/pkg/client/kubernetes/clientmap/internal/shoot_clientmap.go @@ -115,7 +115,7 @@ func (f *ShootClientSetFactory) secretName(seedNamespace string) string { // load balancer of the shoot API server. addr, err := LookupHost(fmt.Sprintf("%s.%s.svc", v1beta1constants.DeploymentNameKubeAPIServer, seedNamespace)) if err != nil { - f.log.Info("service DNS name lookup of kube-apiserver failed, falling back to external kubeconfig", "error", err) + f.log.Info("Service DNS name lookup of kube-apiserver failed, falling back to external kubeconfig", "error", err) } else if len(addr) > 0 { secretName = v1beta1constants.SecretNameGardenerInternal } diff --git a/vendor/github.com/gardener/gardener/pkg/client/kubernetes/scaling.go b/vendor/github.com/gardener/gardener/pkg/client/kubernetes/scaling.go index 2bd159921..1275e1458 100644 --- a/vendor/github.com/gardener/gardener/pkg/client/kubernetes/scaling.go +++ b/vendor/github.com/gardener/gardener/pkg/client/kubernetes/scaling.go @@ -19,7 +19,6 @@ import ( "fmt" "time" - druidv1alpha1 "github.com/gardener/etcd-druid/api/v1alpha1" "github.com/gardener/gardener/pkg/utils/retry" appsv1 "k8s.io/api/apps/v1" @@ -40,18 +39,6 @@ func ScaleStatefulSet(ctx context.Context, c client.Client, key client.ObjectKey return scaleResource(ctx, c, statefulset, replicas) } -// ScaleEtcd scales a Etcd resource. -func ScaleEtcd(ctx context.Context, c client.Client, key client.ObjectKey, replicas int) error { - etcd := &druidv1alpha1.Etcd{ - ObjectMeta: metav1.ObjectMeta{ - Name: key.Name, - Namespace: key.Namespace, - }, - } - - return scaleResource(ctx, c, etcd, int32(replicas)) -} - // ScaleDeployment scales a Deployment. func ScaleDeployment(ctx context.Context, c client.Client, key client.ObjectKey, replicas int32) error { deployment := &appsv1.Deployment{ diff --git a/vendor/github.com/gardener/gardener/pkg/client/kubernetes/types.go b/vendor/github.com/gardener/gardener/pkg/client/kubernetes/types.go index 364ccbeb4..9574ecec1 100644 --- a/vendor/github.com/gardener/gardener/pkg/client/kubernetes/types.go +++ b/vendor/github.com/gardener/gardener/pkg/client/kubernetes/types.go @@ -20,6 +20,7 @@ import ( druidv1alpha1 "github.com/gardener/etcd-druid/api/v1alpha1" dnsv1alpha1 "github.com/gardener/external-dns-management/pkg/apis/dns/v1alpha1" hvpav1alpha1 "github.com/gardener/hvpa-controller/api/v1alpha1" + volumesnapshotv1beta1 "github.com/kubernetes-csi/external-snapshotter/v2/pkg/apis/volumesnapshot/v1beta1" istionetworkingv1alpha3 "istio.io/client-go/pkg/apis/networking/v1alpha3" istionetworkingv1beta1 "istio.io/client-go/pkg/apis/networking/v1beta1" apiextensionsscheme "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/scheme" @@ -123,6 +124,7 @@ func init() { apiregistrationscheme.AddToScheme, autoscalingv1beta2.AddToScheme, metricsv1beta1.AddToScheme, + volumesnapshotv1beta1.AddToScheme, ) utilruntime.Must(shootSchemeBuilder.AddToScheme(ShootScheme)) diff --git a/vendor/github.com/gardener/gardener/pkg/client/seedmanagement/clientset/versioned/clientset.go b/vendor/github.com/gardener/gardener/pkg/client/seedmanagement/clientset/versioned/clientset.go index dbfbaa5a8..90b7bdb49 100644 --- a/vendor/github.com/gardener/gardener/pkg/client/seedmanagement/clientset/versioned/clientset.go +++ b/vendor/github.com/gardener/gardener/pkg/client/seedmanagement/clientset/versioned/clientset.go @@ -1,5 +1,5 @@ /* -Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/github.com/gardener/gardener/pkg/client/seedmanagement/clientset/versioned/doc.go b/vendor/github.com/gardener/gardener/pkg/client/seedmanagement/clientset/versioned/doc.go index 32d852285..07fd438a3 100644 --- a/vendor/github.com/gardener/gardener/pkg/client/seedmanagement/clientset/versioned/doc.go +++ b/vendor/github.com/gardener/gardener/pkg/client/seedmanagement/clientset/versioned/doc.go @@ -1,5 +1,5 @@ /* -Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/github.com/gardener/gardener/pkg/client/seedmanagement/clientset/versioned/scheme/doc.go b/vendor/github.com/gardener/gardener/pkg/client/seedmanagement/clientset/versioned/scheme/doc.go index 7d4fb776b..2cf237a21 100644 --- a/vendor/github.com/gardener/gardener/pkg/client/seedmanagement/clientset/versioned/scheme/doc.go +++ b/vendor/github.com/gardener/gardener/pkg/client/seedmanagement/clientset/versioned/scheme/doc.go @@ -1,5 +1,5 @@ /* -Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/github.com/gardener/gardener/pkg/client/seedmanagement/clientset/versioned/scheme/register.go b/vendor/github.com/gardener/gardener/pkg/client/seedmanagement/clientset/versioned/scheme/register.go index cc1a9dd2d..de7774846 100644 --- a/vendor/github.com/gardener/gardener/pkg/client/seedmanagement/clientset/versioned/scheme/register.go +++ b/vendor/github.com/gardener/gardener/pkg/client/seedmanagement/clientset/versioned/scheme/register.go @@ -1,5 +1,5 @@ /* -Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/github.com/gardener/gardener/pkg/client/seedmanagement/clientset/versioned/typed/seedmanagement/v1alpha1/doc.go b/vendor/github.com/gardener/gardener/pkg/client/seedmanagement/clientset/versioned/typed/seedmanagement/v1alpha1/doc.go index 828c8ebe1..2b30c0387 100644 --- a/vendor/github.com/gardener/gardener/pkg/client/seedmanagement/clientset/versioned/typed/seedmanagement/v1alpha1/doc.go +++ b/vendor/github.com/gardener/gardener/pkg/client/seedmanagement/clientset/versioned/typed/seedmanagement/v1alpha1/doc.go @@ -1,5 +1,5 @@ /* -Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/github.com/gardener/gardener/pkg/client/seedmanagement/clientset/versioned/typed/seedmanagement/v1alpha1/generated_expansion.go b/vendor/github.com/gardener/gardener/pkg/client/seedmanagement/clientset/versioned/typed/seedmanagement/v1alpha1/generated_expansion.go index 3c36750cc..247a9f612 100644 --- a/vendor/github.com/gardener/gardener/pkg/client/seedmanagement/clientset/versioned/typed/seedmanagement/v1alpha1/generated_expansion.go +++ b/vendor/github.com/gardener/gardener/pkg/client/seedmanagement/clientset/versioned/typed/seedmanagement/v1alpha1/generated_expansion.go @@ -1,5 +1,5 @@ /* -Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/github.com/gardener/gardener/pkg/client/seedmanagement/clientset/versioned/typed/seedmanagement/v1alpha1/managedseed.go b/vendor/github.com/gardener/gardener/pkg/client/seedmanagement/clientset/versioned/typed/seedmanagement/v1alpha1/managedseed.go index 0c8039896..c95710a48 100644 --- a/vendor/github.com/gardener/gardener/pkg/client/seedmanagement/clientset/versioned/typed/seedmanagement/v1alpha1/managedseed.go +++ b/vendor/github.com/gardener/gardener/pkg/client/seedmanagement/clientset/versioned/typed/seedmanagement/v1alpha1/managedseed.go @@ -1,5 +1,5 @@ /* -Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/github.com/gardener/gardener/pkg/client/seedmanagement/clientset/versioned/typed/seedmanagement/v1alpha1/managedseedset.go b/vendor/github.com/gardener/gardener/pkg/client/seedmanagement/clientset/versioned/typed/seedmanagement/v1alpha1/managedseedset.go index fc42c4b14..2ddaba90f 100644 --- a/vendor/github.com/gardener/gardener/pkg/client/seedmanagement/clientset/versioned/typed/seedmanagement/v1alpha1/managedseedset.go +++ b/vendor/github.com/gardener/gardener/pkg/client/seedmanagement/clientset/versioned/typed/seedmanagement/v1alpha1/managedseedset.go @@ -1,5 +1,5 @@ /* -Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/github.com/gardener/gardener/pkg/client/seedmanagement/clientset/versioned/typed/seedmanagement/v1alpha1/seedmanagement_client.go b/vendor/github.com/gardener/gardener/pkg/client/seedmanagement/clientset/versioned/typed/seedmanagement/v1alpha1/seedmanagement_client.go index bed5ce440..e1058eb0e 100644 --- a/vendor/github.com/gardener/gardener/pkg/client/seedmanagement/clientset/versioned/typed/seedmanagement/v1alpha1/seedmanagement_client.go +++ b/vendor/github.com/gardener/gardener/pkg/client/seedmanagement/clientset/versioned/typed/seedmanagement/v1alpha1/seedmanagement_client.go @@ -1,5 +1,5 @@ /* -Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/github.com/gardener/gardener/pkg/controllerutils/patch.go b/vendor/github.com/gardener/gardener/pkg/controllerutils/patch.go index edadbbf52..96e990646 100644 --- a/vendor/github.com/gardener/gardener/pkg/controllerutils/patch.go +++ b/vendor/github.com/gardener/gardener/pkg/controllerutils/patch.go @@ -16,10 +16,8 @@ package controllerutils import ( "context" - "reflect" apierrors "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/util/wait" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" ) @@ -133,49 +131,3 @@ func createOrGetAndPatch(ctx context.Context, c client.Client, obj client.Object return controllerutil.OperationResultCreated, nil } - -// TryPatch tries to apply the given transformation function onto the given object, and to patch it afterwards with optimistic locking. -// It retries the patch with an exponential backoff. -// Deprecated: This function is deprecated and will be removed in a future version. Please don't consider using it. -// See https://github.com/gardener/gardener/blob/master/docs/development/kubernetes-clients.md#dont-retry-on-conflict -// for more information. -func TryPatch(ctx context.Context, backoff wait.Backoff, c client.Client, obj client.Object, transform func() error) error { - return tryPatch(ctx, backoff, c, obj, c.Patch, transform) -} - -// TryPatchStatus tries to apply the given transformation function onto the given object, and to patch its -// status afterwards with optimistic locking. It retries the status patch with an exponential backoff. -// Deprecated: This function is deprecated and will be removed in a future version. Please don't consider using it. -// See https://github.com/gardener/gardener/blob/master/docs/development/kubernetes-clients.md#dont-retry-on-conflict -// for more information. -func TryPatchStatus(ctx context.Context, backoff wait.Backoff, c client.Client, obj client.Object, transform func() error) error { - return tryPatch(ctx, backoff, c, obj, c.Status().Patch, transform) -} - -func tryPatch(ctx context.Context, backoff wait.Backoff, c client.Client, obj client.Object, patchFunc func(context.Context, client.Object, client.Patch, ...client.PatchOption) error, transform func() error) error { - resetCopy := obj.DeepCopyObject() - return exponentialBackoff(ctx, backoff, func() (bool, error) { - if err := c.Get(ctx, client.ObjectKeyFromObject(obj), obj); err != nil { - return false, err - } - beforeTransform := obj.DeepCopyObject().(client.Object) - if err := transform(); err != nil { - return false, err - } - - if reflect.DeepEqual(obj, beforeTransform) { - return true, nil - } - - patch := client.MergeFromWithOptions(beforeTransform, client.MergeFromWithOptimisticLock{}) - - if err := patchFunc(ctx, obj, patch); err != nil { - if apierrors.IsConflict(err) { - reflect.ValueOf(obj).Elem().Set(reflect.ValueOf(resetCopy).Elem()) - return false, nil - } - return false, err - } - return true, nil - }) -} diff --git a/vendor/github.com/gardener/gardener/pkg/controllerutils/predicate/has_finalizer.go b/vendor/github.com/gardener/gardener/pkg/controllerutils/predicate/has_finalizer.go deleted file mode 100644 index 45794123b..000000000 --- a/vendor/github.com/gardener/gardener/pkg/controllerutils/predicate/has_finalizer.go +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright (c) 2020 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package predicate - -import ( - "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" - "sigs.k8s.io/controller-runtime/pkg/event" - "sigs.k8s.io/controller-runtime/pkg/predicate" -) - -// HasFinalizer returns a predicate that detects if the object has the given finalizer -// This is used to not requeue all secrets in the cluster (which might be quite a lot), -// but only requeue secrets from create/update events with the controller's finalizer. -// This is to ensure, that we properly remove the finalizer in case we missed an important -// update event for a ManagedResource. -func HasFinalizer(finalizer string) predicate.Predicate { - return predicate.Funcs{ - CreateFunc: func(e event.CreateEvent) bool { - // Create event is emitted on start-up, when the cache is populated from a complete list call for the first time. - // We should enqueue all secrets, which have the controller's finalizer in order to remove it in case we missed - // an important update event to a ManagedResource during downtime. - return controllerutil.ContainsFinalizer(e.Object, finalizer) - }, - UpdateFunc: func(e event.UpdateEvent) bool { - // We only need to check MetaNew. If the finalizer was in MetaOld and is not in MetaNew, it is already - // removed and we don't need to reconcile the secret. - return controllerutil.ContainsFinalizer(e.ObjectNew, finalizer) - }, - DeleteFunc: func(e event.DeleteEvent) bool { - // If the secret is already deleted, all finalizers are already gone and we don't need to reconcile it. - return false - }, - GenericFunc: func(e event.GenericEvent) bool { - return false - }, - } -} diff --git a/vendor/github.com/gardener/gardener/pkg/controllerutils/predicate/has_name.go b/vendor/github.com/gardener/gardener/pkg/controllerutils/predicate/has_name.go deleted file mode 100644 index f4865435c..000000000 --- a/vendor/github.com/gardener/gardener/pkg/controllerutils/predicate/has_name.go +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package predicate - -import ( - "sigs.k8s.io/controller-runtime/pkg/event" - "sigs.k8s.io/controller-runtime/pkg/predicate" -) - -// HasName returns a predicate that matches the given name of a resource. -func HasName(name string) predicate.Predicate { - return FromMapper(MapperFunc(func(e event.GenericEvent) bool { - return e.Object.GetName() == name - }), CreateTrigger, UpdateNewTrigger, DeleteTrigger, GenericTrigger) -} diff --git a/vendor/github.com/gardener/gardener/pkg/controllerutils/predicate/has_operation_annotation.go b/vendor/github.com/gardener/gardener/pkg/controllerutils/predicate/has_operation_annotation.go deleted file mode 100644 index 9db2fe572..000000000 --- a/vendor/github.com/gardener/gardener/pkg/controllerutils/predicate/has_operation_annotation.go +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package predicate - -import ( - v1beta1constants "github.com/gardener/gardener/pkg/apis/core/v1beta1/constants" - - "sigs.k8s.io/controller-runtime/pkg/event" - "sigs.k8s.io/controller-runtime/pkg/predicate" -) - -// HasOperationAnnotation is a predicate for the operation annotation. -func HasOperationAnnotation() predicate.Predicate { - return FromMapper(MapperFunc(func(e event.GenericEvent) bool { - return e.Object.GetAnnotations()[v1beta1constants.GardenerOperation] == v1beta1constants.GardenerOperationReconcile || - e.Object.GetAnnotations()[v1beta1constants.GardenerOperation] == v1beta1constants.GardenerOperationRestore || - e.Object.GetAnnotations()[v1beta1constants.GardenerOperation] == v1beta1constants.GardenerOperationMigrate - }), CreateTrigger, UpdateNewTrigger, GenericTrigger) -} diff --git a/vendor/github.com/gardener/gardener/pkg/controllerutils/predicate/or.go b/vendor/github.com/gardener/gardener/pkg/controllerutils/predicate/or.go new file mode 100644 index 000000000..7e07feaa3 --- /dev/null +++ b/vendor/github.com/gardener/gardener/pkg/controllerutils/predicate/or.go @@ -0,0 +1,77 @@ +// Copyright (c) 2022 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package predicate + +import ( + "sigs.k8s.io/controller-runtime/pkg/event" + "sigs.k8s.io/controller-runtime/pkg/predicate" + "sigs.k8s.io/controller-runtime/pkg/runtime/inject" +) + +// Or returns a composite predicate that implements a logical OR of the predicates passed to it. +// TODO: This is a copy of "sigs.k8s.io/controller-runtime/pkg/predicate.Or" with the addition of the InjectFunc. +// Delete this code once the upstream library supports the InjectFunc as well. +func Or(predicates ...predicate.Predicate) predicate.Predicate { + return or{predicates} +} + +type or struct { + predicates []predicate.Predicate +} + +func (o or) InjectFunc(f inject.Func) error { + for _, p := range o.predicates { + if err := f(p); err != nil { + return err + } + } + return nil +} + +func (o or) Create(e event.CreateEvent) bool { + for _, p := range o.predicates { + if p.Create(e) { + return true + } + } + return false +} + +func (o or) Update(e event.UpdateEvent) bool { + for _, p := range o.predicates { + if p.Update(e) { + return true + } + } + return false +} + +func (o or) Delete(e event.DeleteEvent) bool { + for _, p := range o.predicates { + if p.Delete(e) { + return true + } + } + return false +} + +func (o or) Generic(e event.GenericEvent) bool { + for _, p := range o.predicates { + if p.Generic(e) { + return true + } + } + return false +} diff --git a/vendor/github.com/gardener/gardener/pkg/controllerutils/seedfilter.go b/vendor/github.com/gardener/gardener/pkg/controllerutils/seedfilter.go index 5d08790c2..c2af072ab 100644 --- a/vendor/github.com/gardener/gardener/pkg/controllerutils/seedfilter.go +++ b/vendor/github.com/gardener/gardener/pkg/controllerutils/seedfilter.go @@ -19,6 +19,7 @@ import ( gardencorev1beta1 "github.com/gardener/gardener/pkg/apis/core/v1beta1" gardencorev1beta1constants "github.com/gardener/gardener/pkg/apis/core/v1beta1/constants" + gardencorev1beta1helper "github.com/gardener/gardener/pkg/apis/core/v1beta1/helper" operationsv1alpha1 "github.com/gardener/gardener/pkg/apis/operations/v1alpha1" seedmanagementv1alpha1 "github.com/gardener/gardener/pkg/apis/seedmanagement/v1alpha1" "github.com/gardener/gardener/pkg/gardenlet/apis/config" @@ -28,7 +29,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client" ) -// SeedFilterFunc returns a filtering func for the seeds. +// SeedFilterFunc returns a filtering func for seeds. func SeedFilterFunc(seedName string) func(obj interface{}) bool { return func(obj interface{}) bool { seed, ok := obj.(*gardencorev1beta1.Seed) @@ -40,7 +41,7 @@ func SeedFilterFunc(seedName string) func(obj interface{}) bool { } } -// ShootFilterFunc returns a filtering func for the seeds. +// ShootFilterFunc returns a filtering func for shoots. func ShootFilterFunc(seedName string) func(obj interface{}) bool { return func(obj interface{}) bool { shoot, ok := obj.(*gardencorev1beta1.Shoot) @@ -59,12 +60,39 @@ func ShootFilterFunc(seedName string) func(obj interface{}) bool { } } +// ShootMigrationFilterFunc returns a filtering func for shoots that are being migrated to a different seed. +func ShootMigrationFilterFunc(ctx context.Context, c client.Reader, seedName string) func(obj interface{}) bool { + return func(obj interface{}) bool { + shoot, ok := obj.(*gardencorev1beta1.Shoot) + if !ok { + return false + } + + return ShootIsBeingMigratedToSeed(ctx, c, shoot, seedName) + } +} + // ShootIsManagedByThisGardenlet checks if the given shoot is managed by this gardenlet by comparing it with the seed name from the GardenletConfiguration. func ShootIsManagedByThisGardenlet(shoot *gardencorev1beta1.Shoot, gc *config.GardenletConfiguration) bool { - return *shoot.Spec.SeedName == confighelper.SeedNameFromSeedConfig(gc.SeedConfig) + seedName := confighelper.SeedNameFromSeedConfig(gc.SeedConfig) + + return shoot.Spec.SeedName != nil && *shoot.Spec.SeedName == seedName +} + +// ShootIsBeingMigratedToSeed checks if the given shoot is currently being migrated to the seed with the given name, +// and the source seed has ownerChecks enabled (as it is a prerequisite to successfully force restore a shoot to a different seed). +func ShootIsBeingMigratedToSeed(ctx context.Context, c client.Reader, shoot *gardencorev1beta1.Shoot, seedName string) bool { + if shoot.Spec.SeedName != nil && shoot.Status.SeedName != nil && *shoot.Spec.SeedName != *shoot.Status.SeedName && *shoot.Spec.SeedName == seedName { + seed := &gardencorev1beta1.Seed{} + if err := c.Get(ctx, kutil.Key(*shoot.Status.SeedName), seed); err != nil { + return false + } + return gardencorev1beta1helper.SeedSettingOwnerChecksEnabled(seed.Spec.Settings) + } + return false } -// ControllerInstallationFilterFunc returns a filtering func for the seeds. +// ControllerInstallationFilterFunc returns a filtering func for ControllerInstallations. func ControllerInstallationFilterFunc(seedName string) func(obj interface{}) bool { return func(obj interface{}) bool { controllerInstallation, ok := obj.(*gardencorev1beta1.ControllerInstallation) @@ -76,7 +104,7 @@ func ControllerInstallationFilterFunc(seedName string) func(obj interface{}) boo } } -// BackupBucketFilterFunc returns a filtering func for the seeds. +// BackupBucketFilterFunc returns a filtering func for BackupBuckets. func BackupBucketFilterFunc(seedName string) func(obj interface{}) bool { return func(obj interface{}) bool { backupBucket, ok := obj.(*gardencorev1beta1.BackupBucket) @@ -91,7 +119,7 @@ func BackupBucketFilterFunc(seedName string) func(obj interface{}) bool { } } -// BackupEntryFilterFunc returns a filtering func for the seeds. +// BackupEntryFilterFunc returns a filtering func for BackupEntries. func BackupEntryFilterFunc(seedName string) func(obj interface{}) bool { return func(obj interface{}) bool { backupEntry, ok := obj.(*gardencorev1beta1.BackupEntry) @@ -110,6 +138,18 @@ func BackupEntryFilterFunc(seedName string) func(obj interface{}) bool { } } +// BackupEntryMigrationFilterFunc returns a filtering func for backup entries that are being migrated to a different seed. +func BackupEntryMigrationFilterFunc(ctx context.Context, c client.Reader, seedName string) func(obj interface{}) bool { + return func(obj interface{}) bool { + backupEntry, ok := obj.(*gardencorev1beta1.BackupEntry) + if !ok { + return false + } + + return BackupEntryIsBeingMigratedToSeed(ctx, c, backupEntry, seedName) + } +} + // BackupEntryIsManagedByThisGardenlet checks if the given BackupEntry is managed by this gardenlet by comparing it with the seed name from the GardenletConfiguration. func BackupEntryIsManagedByThisGardenlet(backupEntry *gardencorev1beta1.BackupEntry, gc *config.GardenletConfiguration) bool { seedName := confighelper.SeedNameFromSeedConfig(gc.SeedConfig) @@ -117,7 +157,20 @@ func BackupEntryIsManagedByThisGardenlet(backupEntry *gardencorev1beta1.BackupEn return backupEntry.Spec.SeedName != nil && *backupEntry.Spec.SeedName == seedName } -// BastionFilterFunc returns a filtering func for the seeds. +// BackupEntryIsBeingMigratedToSeed checks if the given BackupEntry is currently being migrated to the seed with the given name, +// and the source seed has ownerChecks enabled (as it is a prerequisite to successfully force restore a shoot to a different seed). +func BackupEntryIsBeingMigratedToSeed(ctx context.Context, c client.Reader, backupEntry *gardencorev1beta1.BackupEntry, seedName string) bool { + if backupEntry.Spec.SeedName != nil && backupEntry.Status.SeedName != nil && *backupEntry.Spec.SeedName != *backupEntry.Status.SeedName && *backupEntry.Spec.SeedName == seedName { + seed := &gardencorev1beta1.Seed{} + if err := c.Get(ctx, kutil.Key(*backupEntry.Status.SeedName), seed); err != nil { + return false + } + return gardencorev1beta1helper.SeedSettingOwnerChecksEnabled(seed.Spec.Settings) + } + return false +} + +// BastionFilterFunc returns a filtering func for Bastions. func BastionFilterFunc(seedName string) func(obj interface{}) bool { return func(obj interface{}) bool { bastion, ok := obj.(*operationsv1alpha1.Bastion) diff --git a/vendor/github.com/gardener/gardener/pkg/controllerutils/update.go b/vendor/github.com/gardener/gardener/pkg/controllerutils/update.go index 23c5c5018..628d1cf45 100644 --- a/vendor/github.com/gardener/gardener/pkg/controllerutils/update.go +++ b/vendor/github.com/gardener/gardener/pkg/controllerutils/update.go @@ -17,14 +17,11 @@ package controllerutils import ( "context" "fmt" - "reflect" - "time" apiequality "k8s.io/apimachinery/pkg/api/equality" apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/util/wait" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" ) @@ -82,79 +79,3 @@ func TypedCreateOrUpdate(ctx context.Context, c client.Client, scheme *runtime.S return controllerutil.OperationResultUpdated, c.Update(ctx, obj) } - -// TryUpdate tries to apply the given transformation function onto the given object, and to update it afterwards. -// It retries the update with an exponential backoff. -// Deprecated: This function is deprecated and will be removed in a future version. Please don't consider using it. -// See https://github.com/gardener/gardener/blob/master/docs/development/kubernetes-clients.md#dont-retry-on-conflict -// for more information. -func TryUpdate(ctx context.Context, backoff wait.Backoff, c client.Client, obj client.Object, transform func() error) error { - return tryUpdate(ctx, backoff, c, obj, c.Update, transform) -} - -// TryUpdateStatus tries to apply the given transformation function onto the given object, and to update its -// status afterwards. It retries the status update with an exponential backoff. -// Deprecated: This function is deprecated and will be removed in a future version. Please don't consider using it. -// See https://github.com/gardener/gardener/blob/master/docs/development/kubernetes-clients.md#dont-retry-on-conflict -// for more information. -func TryUpdateStatus(ctx context.Context, backoff wait.Backoff, c client.Client, obj client.Object, transform func() error) error { - return tryUpdate(ctx, backoff, c, obj, c.Status().Update, transform) -} - -func tryUpdate(ctx context.Context, backoff wait.Backoff, c client.Client, obj client.Object, updateFunc func(context.Context, client.Object, ...client.UpdateOption) error, transform func() error) error { - resetCopy := obj.DeepCopyObject() - return exponentialBackoff(ctx, backoff, func() (bool, error) { - if err := c.Get(ctx, client.ObjectKeyFromObject(obj), obj); err != nil { - return false, err - } - - beforeTransform := obj.DeepCopyObject() - if err := transform(); err != nil { - return false, err - } - - if reflect.DeepEqual(obj, beforeTransform) { - return true, nil - } - - if err := updateFunc(ctx, obj); err != nil { - if apierrors.IsConflict(err) { - // In case of a conflict we are resetting the obj to its original version, as it was - // passed to the function, to ensure that, on the next iteration the - // equality check of the obj recieved from the server and the object after - // its transformation would be valid. Otherwise the obj would be with mutated - // fields in result of the transform function from previous iteration. - reflect.ValueOf(obj).Elem().Set(reflect.ValueOf(resetCopy).Elem()) - return false, nil - } - return false, err - } - return true, nil - }) -} - -func exponentialBackoff(ctx context.Context, backoff wait.Backoff, condition wait.ConditionFunc) error { - duration := backoff.Duration - - for i := 0; i < backoff.Steps; i++ { - if ok, err := condition(); err != nil || ok { - return err - } - - select { - case <-ctx.Done(): - return ctx.Err() - default: - adjusted := duration - if backoff.Jitter > 0.0 { - adjusted = wait.Jitter(duration, backoff.Jitter) - } - time.Sleep(adjusted) - duration = time.Duration(float64(duration) * backoff.Factor) - } - - i++ - } - - return wait.ErrWaitTimeout -} diff --git a/vendor/github.com/gardener/gardener/pkg/controllerutils/worker.go b/vendor/github.com/gardener/gardener/pkg/controllerutils/worker.go index c2e604ad8..859a054a8 100644 --- a/vendor/github.com/gardener/gardener/pkg/controllerutils/worker.go +++ b/vendor/github.com/gardener/gardener/pkg/controllerutils/worker.go @@ -102,9 +102,9 @@ func worker(ctx context.Context, queue workqueue.RateLimitingInterface, resource req, err := requestFromKey(key) if err != nil { if controllerLogger != nil { - controllerLogger.Error(err, "cannot obtain request from key") + controllerLogger.Error(err, "Cannot obtain request from key") } else { - logger.Logger.WithError(err).Error("cannot obtain request from key") + logger.Logger.WithError(err).Error("Cannot obtain request from key") } queue.Forget(key) return false @@ -124,7 +124,7 @@ func worker(ctx context.Context, queue workqueue.RateLimitingInterface, resource if reconcileLogger != nil { // resource type is not added to logger here. Ideally, each controller sets WithName and it is clear from // which controller the error log comes. - reconcileLogger.Error(err, "error reconciling request") + reconcileLogger.Error(err, "Error reconciling request") } else { logger.Logger.Infof("Error syncing %s %v: %v", resourceType, key, err) } diff --git a/vendor/github.com/gardener/gardener/pkg/features/features.go b/vendor/github.com/gardener/gardener/pkg/features/features.go index b2ae5c439..52ec4ade9 100644 --- a/vendor/github.com/gardener/gardener/pkg/features/features.go +++ b/vendor/github.com/gardener/gardener/pkg/features/features.go @@ -85,11 +85,13 @@ const ( // AdminKubeconfigRequest enables the AdminKubeconfigRequest endpoint on shoot resources. // owner: @petersutter // alpha: v1.24.0 + // beta: v1.39.0 AdminKubeconfigRequest featuregate.Feature = "AdminKubeconfigRequest" // UseDNSRecords enables using DNSRecords resources for Gardener DNS records instead of DNSProvider and DNSEntry resources. // owner: @stoyanr // alpha: v1.27.0 + // beta: v1.39.0 UseDNSRecords featuregate.Feature = "UseDNSRecords" // RotateSSHKeypairOnMaintenance enables SSH keypair rotation in the maintenance controller of the gardener-controller-manager. @@ -120,4 +122,11 @@ const ( // owner: @ialidzhikov // alpha: v1.38.0 SecretBindingProviderValidation featuregate.Feature = "SecretBindingProviderValidation" + + // ForceRestore enables forcing the shoot's restoration to the destination seed during control plane migration + // if the preparation for migration in the source seed is not finished after a certain grace period + // and is considered unlikely to succeed ("bad case" scenario). + // owner: @stoyanr + // alpha: v1.39.0 + ForceRestore featuregate.Feature = "ForceRestore" ) diff --git a/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/helper/helpers.go b/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/helper/helpers.go index e872e6cf4..eb736dccc 100644 --- a/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/helper/helpers.go +++ b/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/helper/helpers.go @@ -18,6 +18,7 @@ import ( "fmt" gardencore "github.com/gardener/gardener/pkg/apis/core" + gardencorehelper "github.com/gardener/gardener/pkg/apis/core/helper" gardencorev1beta1 "github.com/gardener/gardener/pkg/apis/core/v1beta1" "github.com/gardener/gardener/pkg/gardenlet/apis/config" configv1alpha1 "github.com/gardener/gardener/pkg/gardenlet/apis/config/v1alpha1" @@ -36,6 +37,14 @@ func SeedNameFromSeedConfig(seedConfig *config.SeedConfig) string { return seedConfig.SeedTemplate.Name } +// OwnerChecksEnabledInSeedConfig returns true if the given seed config is nil or the 'ownerChecks' setting is enabled. +func OwnerChecksEnabledInSeedConfig(seedConfig *config.SeedConfig) bool { + if seedConfig == nil { + return true + } + return gardencorehelper.SeedSettingOwnerChecksEnabled(seedConfig.Spec.Settings) +} + // StaleExtensionHealthChecksThreshold returns nil if the given config is nil or the check // for stale health checks is not enabled. Otherwise it returns the threshold from the given config. func StaleExtensionHealthChecksThreshold(c *config.StaleExtensionHealthChecks) *metav1.Duration { diff --git a/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/types.go b/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/types.go index f776966df..94e96388b 100644 --- a/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/types.go +++ b/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/types.go @@ -114,6 +114,8 @@ type GardenletControllerConfiguration struct { BackupBucket *BackupBucketControllerConfiguration // BackupEntry defines the configuration of the BackupEntry controller. BackupEntry *BackupEntryControllerConfiguration + // BackupEntryMigration defines the configuration of the BackupEntryMigration controller. + BackupEntryMigration *BackupEntryMigrationControllerConfiguration // Bastion defines the configuration of the Bastion controller. Bastion *BastionControllerConfiguration // ControllerInstallation defines the configuration of the ControllerInstallation controller. @@ -128,6 +130,8 @@ type GardenletControllerConfiguration struct { Shoot *ShootControllerConfiguration // ShootCare defines the configuration of the ShootCare controller. ShootCare *ShootCareControllerConfiguration + // ShootMigration defines the configuration of the ShootMigration controller. + ShootMigration *ShootMigrationControllerConfiguration // ShootStateSync defines the configuration of the ShootState controller. ShootStateSync *ShootStateSyncControllerConfiguration // SeedAPIServerNetworkPolicy defines the configuration of the SeedAPIServerNetworkPolicy controller. @@ -156,6 +160,21 @@ type BackupEntryControllerConfiguration struct { DeletionGracePeriodShootPurposes []gardencore.ShootPurpose } +// BackupEntryMigrationControllerConfiguration defines the configuration of the BackupEntryMigration +// controller. +type BackupEntryMigrationControllerConfiguration struct { + // ConcurrentSyncs is the number of workers used for the controller to work on + // events. + ConcurrentSyncs *int + // SyncPeriod is the duration how often the existing resources are reconciled. + // It is only relevant for backup entries that are currently being migrated. + SyncPeriod *metav1.Duration + // GracePeriod is the period to wait before forcing the restoration after the migration has started. + GracePeriod *metav1.Duration + // LastOperationStaleDuration is the duration to consider the last operation stale after it was last updated. + LastOperationStaleDuration *metav1.Duration +} + // BastionControllerConfiguration defines the configuration of the Bastion // controller. type BastionControllerConfiguration struct { @@ -249,6 +268,21 @@ type ShootCareControllerConfiguration struct { ConditionThresholds []ConditionThreshold } +// ShootMigrationControllerConfiguration defines the configuration of the ShootMigration +// controller. +type ShootMigrationControllerConfiguration struct { + // ConcurrentSyncs is the number of workers used for the controller to work on + // events. + ConcurrentSyncs *int + // SyncPeriod is the duration how often the existing resources are reconciled. + // It is only relevant for shoots that are currently being migrated. + SyncPeriod *metav1.Duration + // GracePeriod is the period to wait before forcing the restoration after the migration has started. + GracePeriod *metav1.Duration + // LastOperationStaleDuration is the duration to consider the last operation stale after it was last updated. + LastOperationStaleDuration *metav1.Duration +} + // StaleExtensionHealthChecks defines the configuration of the check for stale extension health checks. type StaleExtensionHealthChecks struct { // Enabled specifies whether the check for stale extensions health checks is enabled. diff --git a/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/v1alpha1/defaults.go b/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/v1alpha1/defaults.go index 01c8b7f68..588e804cf 100644 --- a/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/v1alpha1/defaults.go +++ b/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/v1alpha1/defaults.go @@ -57,6 +57,9 @@ func SetDefaults_GardenletConfiguration(obj *GardenletConfiguration) { if obj.Controllers.BackupEntry == nil { obj.Controllers.BackupEntry = &BackupEntryControllerConfiguration{} } + if obj.Controllers.BackupEntryMigration == nil { + obj.Controllers.BackupEntryMigration = &BackupEntryMigrationControllerConfiguration{} + } if obj.Controllers.Bastion == nil { obj.Controllers.Bastion = &BastionControllerConfiguration{} } @@ -78,6 +81,9 @@ func SetDefaults_GardenletConfiguration(obj *GardenletConfiguration) { if obj.Controllers.ShootCare == nil { obj.Controllers.ShootCare = &ShootCareControllerConfiguration{} } + if obj.Controllers.ShootMigration == nil { + obj.Controllers.ShootMigration = &ShootMigrationControllerConfiguration{} + } if obj.Controllers.ShootStateSync == nil { obj.Controllers.ShootStateSync = &ShootStateSyncControllerConfiguration{} } @@ -194,6 +200,29 @@ func SetDefaults_BackupEntryControllerConfiguration(obj *BackupEntryControllerCo } } +// SetDefaults_BackupEntryMigrationControllerConfiguration sets defaults for the backup entry migration controller. +func SetDefaults_BackupEntryMigrationControllerConfiguration(obj *BackupEntryMigrationControllerConfiguration) { + if obj.ConcurrentSyncs == nil { + v := 5 + obj.ConcurrentSyncs = &v + } + + if obj.SyncPeriod == nil { + v := metav1.Duration{Duration: time.Minute} + obj.SyncPeriod = &v + } + + if obj.GracePeriod == nil { + v := metav1.Duration{Duration: 10 * time.Minute} + obj.GracePeriod = &v + } + + if obj.LastOperationStaleDuration == nil { + v := metav1.Duration{Duration: 2 * time.Minute} + obj.LastOperationStaleDuration = &v + } +} + // SetDefaults_BastionControllerConfiguration sets defaults for the backup bucket controller. func SetDefaults_BastionControllerConfiguration(obj *BastionControllerConfiguration) { if obj.ConcurrentSyncs == nil { @@ -304,6 +333,29 @@ func SetDefaults_ShootCareControllerConfiguration(obj *ShootCareControllerConfig } } +// SetDefaults_ShootMigrationControllerConfiguration sets defaults for the shoot migration controller. +func SetDefaults_ShootMigrationControllerConfiguration(obj *ShootMigrationControllerConfiguration) { + if obj.ConcurrentSyncs == nil { + v := 5 + obj.ConcurrentSyncs = &v + } + + if obj.SyncPeriod == nil { + v := metav1.Duration{Duration: time.Minute} + obj.SyncPeriod = &v + } + + if obj.GracePeriod == nil { + v := metav1.Duration{Duration: 2 * time.Hour} + obj.GracePeriod = &v + } + + if obj.LastOperationStaleDuration == nil { + v := metav1.Duration{Duration: 10 * time.Minute} + obj.LastOperationStaleDuration = &v + } +} + // SetDefaults_StaleExtensionHealthChecks sets defaults for the stale extension health checks. func SetDefaults_StaleExtensionHealthChecks(obj *StaleExtensionHealthChecks) { if obj.Threshold == nil { diff --git a/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/v1alpha1/types.go b/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/v1alpha1/types.go index 7b163cc29..04a26d1c7 100644 --- a/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/v1alpha1/types.go +++ b/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/v1alpha1/types.go @@ -139,6 +139,9 @@ type GardenletControllerConfiguration struct { // BackupEntry defines the configuration of the BackupEntry controller. // +optional BackupEntry *BackupEntryControllerConfiguration `json:"backupEntry,omitempty"` + // BackupEntryMigration defines the configuration of the BackupEntryMigration controller. + // +optional + BackupEntryMigration *BackupEntryMigrationControllerConfiguration `json:"backupEntryMigration,omitempty"` // Bastion defines the configuration of the Bastion controller. // +optional Bastion *BastionControllerConfiguration `json:"bastion,omitempty"` @@ -160,6 +163,9 @@ type GardenletControllerConfiguration struct { // ShootCare defines the configuration of the ShootCare controller. // +optional ShootCare *ShootCareControllerConfiguration `json:"shootCare,omitempty"` + // ShootMigration defines the configuration of the ShootMigration controller. + // +optional + ShootMigration *ShootMigrationControllerConfiguration `json:"shootMigration,omitempty"` // ShootStateSync defines the configuration of the ShootState controller // +optional ShootStateSync *ShootStateSyncControllerConfiguration `json:"shootStateSync,omitempty"` @@ -195,6 +201,25 @@ type BackupEntryControllerConfiguration struct { DeletionGracePeriodShootPurposes []gardencorev1beta1.ShootPurpose `json:"deletionGracePeriodShootPurposes,omitempty"` } +// BackupEntryMigrationControllerConfiguration defines the configuration of the BackupEntryMigration +// controller. +type BackupEntryMigrationControllerConfiguration struct { + // ConcurrentSyncs is the number of workers used for the controller to work on + // events. + // +optional + ConcurrentSyncs *int `json:"concurrentSyncs,omitempty"` + // SyncPeriod is the duration how often the existing resources are reconciled. + // It is only relevant for backup entries that are currently being migrated. + // +optional + SyncPeriod *metav1.Duration `json:"syncPeriod,omitempty"` + // GracePeriod is the period to wait before forcing the restoration after the migration has started. + // +optional + GracePeriod *metav1.Duration `json:"gracePeriod,omitempty"` + // LastOperationStaleDuration is the duration to consider the last operation stale after it was last updated. + // +optional + LastOperationStaleDuration *metav1.Duration `json:"lastOperationStaleDuration,omitempty"` +} + // BastionControllerConfiguration defines the configuration of the Bastion // controller. type BastionControllerConfiguration struct { @@ -308,6 +333,25 @@ type ShootCareControllerConfiguration struct { ConditionThresholds []ConditionThreshold `json:"conditionThresholds,omitempty"` } +// ShootMigrationControllerConfiguration defines the configuration of the ShootMigration +// controller. +type ShootMigrationControllerConfiguration struct { + // ConcurrentSyncs is the number of workers used for the controller to work on + // events. + // +optional + ConcurrentSyncs *int `json:"concurrentSyncs,omitempty"` + // SyncPeriod is the duration how often the existing resources are reconciled. + // +optional + SyncPeriod *metav1.Duration `json:"syncPeriod,omitempty"` + // GracePeriod is the period to wait before forcing the restoration after the migration has started. + // It is only relevant for shoots that are currently being migrated. + // +optional + GracePeriod *metav1.Duration `json:"gracePeriod,omitempty"` + // LastOperationStaleDuration is the duration to consider the last operation stale after it was last updated. + // +optional + LastOperationStaleDuration *metav1.Duration `json:"lastOperationStaleDuration,omitempty"` +} + // StaleExtensionHealthChecks defines the configuration of the check for stale extension health checks. type StaleExtensionHealthChecks struct { // Enabled specifies whether the check for stale extensions health checks is enabled. diff --git a/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/v1alpha1/zz_generated.conversion.go b/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/v1alpha1/zz_generated.conversion.go index 94688b462..55c72cb02 100644 --- a/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/v1alpha1/zz_generated.conversion.go +++ b/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/v1alpha1/zz_generated.conversion.go @@ -2,7 +2,7 @@ // +build !ignore_autogenerated /* -Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -73,6 +73,16 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } + if err := s.AddGeneratedConversionFunc((*BackupEntryMigrationControllerConfiguration)(nil), (*config.BackupEntryMigrationControllerConfiguration)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha1_BackupEntryMigrationControllerConfiguration_To_config_BackupEntryMigrationControllerConfiguration(a.(*BackupEntryMigrationControllerConfiguration), b.(*config.BackupEntryMigrationControllerConfiguration), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*config.BackupEntryMigrationControllerConfiguration)(nil), (*BackupEntryMigrationControllerConfiguration)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_config_BackupEntryMigrationControllerConfiguration_To_v1alpha1_BackupEntryMigrationControllerConfiguration(a.(*config.BackupEntryMigrationControllerConfiguration), b.(*BackupEntryMigrationControllerConfiguration), scope) + }); err != nil { + return err + } if err := s.AddGeneratedConversionFunc((*BastionControllerConfiguration)(nil), (*config.BastionControllerConfiguration)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1alpha1_BastionControllerConfiguration_To_config_BastionControllerConfiguration(a.(*BastionControllerConfiguration), b.(*config.BastionControllerConfiguration), scope) }); err != nil { @@ -403,6 +413,16 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } + if err := s.AddGeneratedConversionFunc((*ShootMigrationControllerConfiguration)(nil), (*config.ShootMigrationControllerConfiguration)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha1_ShootMigrationControllerConfiguration_To_config_ShootMigrationControllerConfiguration(a.(*ShootMigrationControllerConfiguration), b.(*config.ShootMigrationControllerConfiguration), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*config.ShootMigrationControllerConfiguration)(nil), (*ShootMigrationControllerConfiguration)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_config_ShootMigrationControllerConfiguration_To_v1alpha1_ShootMigrationControllerConfiguration(a.(*config.ShootMigrationControllerConfiguration), b.(*ShootMigrationControllerConfiguration), scope) + }); err != nil { + return err + } if err := s.AddGeneratedConversionFunc((*ShootMonitoringConfig)(nil), (*config.ShootMonitoringConfig)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1alpha1_ShootMonitoringConfig_To_config_ShootMonitoringConfig(a.(*ShootMonitoringConfig), b.(*config.ShootMonitoringConfig), scope) }); err != nil { @@ -536,6 +556,32 @@ func Convert_config_BackupEntryControllerConfiguration_To_v1alpha1_BackupEntryCo return autoConvert_config_BackupEntryControllerConfiguration_To_v1alpha1_BackupEntryControllerConfiguration(in, out, s) } +func autoConvert_v1alpha1_BackupEntryMigrationControllerConfiguration_To_config_BackupEntryMigrationControllerConfiguration(in *BackupEntryMigrationControllerConfiguration, out *config.BackupEntryMigrationControllerConfiguration, s conversion.Scope) error { + out.ConcurrentSyncs = (*int)(unsafe.Pointer(in.ConcurrentSyncs)) + out.SyncPeriod = (*v1.Duration)(unsafe.Pointer(in.SyncPeriod)) + out.GracePeriod = (*v1.Duration)(unsafe.Pointer(in.GracePeriod)) + out.LastOperationStaleDuration = (*v1.Duration)(unsafe.Pointer(in.LastOperationStaleDuration)) + return nil +} + +// Convert_v1alpha1_BackupEntryMigrationControllerConfiguration_To_config_BackupEntryMigrationControllerConfiguration is an autogenerated conversion function. +func Convert_v1alpha1_BackupEntryMigrationControllerConfiguration_To_config_BackupEntryMigrationControllerConfiguration(in *BackupEntryMigrationControllerConfiguration, out *config.BackupEntryMigrationControllerConfiguration, s conversion.Scope) error { + return autoConvert_v1alpha1_BackupEntryMigrationControllerConfiguration_To_config_BackupEntryMigrationControllerConfiguration(in, out, s) +} + +func autoConvert_config_BackupEntryMigrationControllerConfiguration_To_v1alpha1_BackupEntryMigrationControllerConfiguration(in *config.BackupEntryMigrationControllerConfiguration, out *BackupEntryMigrationControllerConfiguration, s conversion.Scope) error { + out.ConcurrentSyncs = (*int)(unsafe.Pointer(in.ConcurrentSyncs)) + out.SyncPeriod = (*v1.Duration)(unsafe.Pointer(in.SyncPeriod)) + out.GracePeriod = (*v1.Duration)(unsafe.Pointer(in.GracePeriod)) + out.LastOperationStaleDuration = (*v1.Duration)(unsafe.Pointer(in.LastOperationStaleDuration)) + return nil +} + +// Convert_config_BackupEntryMigrationControllerConfiguration_To_v1alpha1_BackupEntryMigrationControllerConfiguration is an autogenerated conversion function. +func Convert_config_BackupEntryMigrationControllerConfiguration_To_v1alpha1_BackupEntryMigrationControllerConfiguration(in *config.BackupEntryMigrationControllerConfiguration, out *BackupEntryMigrationControllerConfiguration, s conversion.Scope) error { + return autoConvert_config_BackupEntryMigrationControllerConfiguration_To_v1alpha1_BackupEntryMigrationControllerConfiguration(in, out, s) +} + func autoConvert_v1alpha1_BastionControllerConfiguration_To_config_BastionControllerConfiguration(in *BastionControllerConfiguration, out *config.BastionControllerConfiguration, s conversion.Scope) error { out.ConcurrentSyncs = (*int)(unsafe.Pointer(in.ConcurrentSyncs)) return nil @@ -989,6 +1035,7 @@ func Convert_config_GardenletConfiguration_To_v1alpha1_GardenletConfiguration(in func autoConvert_v1alpha1_GardenletControllerConfiguration_To_config_GardenletControllerConfiguration(in *GardenletControllerConfiguration, out *config.GardenletControllerConfiguration, s conversion.Scope) error { out.BackupBucket = (*config.BackupBucketControllerConfiguration)(unsafe.Pointer(in.BackupBucket)) out.BackupEntry = (*config.BackupEntryControllerConfiguration)(unsafe.Pointer(in.BackupEntry)) + out.BackupEntryMigration = (*config.BackupEntryMigrationControllerConfiguration)(unsafe.Pointer(in.BackupEntryMigration)) out.Bastion = (*config.BastionControllerConfiguration)(unsafe.Pointer(in.Bastion)) out.ControllerInstallation = (*config.ControllerInstallationControllerConfiguration)(unsafe.Pointer(in.ControllerInstallation)) out.ControllerInstallationCare = (*config.ControllerInstallationCareControllerConfiguration)(unsafe.Pointer(in.ControllerInstallationCare)) @@ -996,6 +1043,7 @@ func autoConvert_v1alpha1_GardenletControllerConfiguration_To_config_GardenletCo out.Seed = (*config.SeedControllerConfiguration)(unsafe.Pointer(in.Seed)) out.Shoot = (*config.ShootControllerConfiguration)(unsafe.Pointer(in.Shoot)) out.ShootCare = (*config.ShootCareControllerConfiguration)(unsafe.Pointer(in.ShootCare)) + out.ShootMigration = (*config.ShootMigrationControllerConfiguration)(unsafe.Pointer(in.ShootMigration)) out.ShootStateSync = (*config.ShootStateSyncControllerConfiguration)(unsafe.Pointer(in.ShootStateSync)) out.SeedAPIServerNetworkPolicy = (*config.SeedAPIServerNetworkPolicyControllerConfiguration)(unsafe.Pointer(in.SeedAPIServerNetworkPolicy)) out.ManagedSeed = (*config.ManagedSeedControllerConfiguration)(unsafe.Pointer(in.ManagedSeed)) @@ -1010,6 +1058,7 @@ func Convert_v1alpha1_GardenletControllerConfiguration_To_config_GardenletContro func autoConvert_config_GardenletControllerConfiguration_To_v1alpha1_GardenletControllerConfiguration(in *config.GardenletControllerConfiguration, out *GardenletControllerConfiguration, s conversion.Scope) error { out.BackupBucket = (*BackupBucketControllerConfiguration)(unsafe.Pointer(in.BackupBucket)) out.BackupEntry = (*BackupEntryControllerConfiguration)(unsafe.Pointer(in.BackupEntry)) + out.BackupEntryMigration = (*BackupEntryMigrationControllerConfiguration)(unsafe.Pointer(in.BackupEntryMigration)) out.Bastion = (*BastionControllerConfiguration)(unsafe.Pointer(in.Bastion)) out.ControllerInstallation = (*ControllerInstallationControllerConfiguration)(unsafe.Pointer(in.ControllerInstallation)) out.ControllerInstallationCare = (*ControllerInstallationCareControllerConfiguration)(unsafe.Pointer(in.ControllerInstallationCare)) @@ -1017,6 +1066,7 @@ func autoConvert_config_GardenletControllerConfiguration_To_v1alpha1_GardenletCo out.Seed = (*SeedControllerConfiguration)(unsafe.Pointer(in.Seed)) out.Shoot = (*ShootControllerConfiguration)(unsafe.Pointer(in.Shoot)) out.ShootCare = (*ShootCareControllerConfiguration)(unsafe.Pointer(in.ShootCare)) + out.ShootMigration = (*ShootMigrationControllerConfiguration)(unsafe.Pointer(in.ShootMigration)) out.ShootStateSync = (*ShootStateSyncControllerConfiguration)(unsafe.Pointer(in.ShootStateSync)) out.SeedAPIServerNetworkPolicy = (*SeedAPIServerNetworkPolicyControllerConfiguration)(unsafe.Pointer(in.SeedAPIServerNetworkPolicy)) out.ManagedSeed = (*ManagedSeedControllerConfiguration)(unsafe.Pointer(in.ManagedSeed)) @@ -1512,6 +1562,32 @@ func Convert_config_ShootControllerConfiguration_To_v1alpha1_ShootControllerConf return autoConvert_config_ShootControllerConfiguration_To_v1alpha1_ShootControllerConfiguration(in, out, s) } +func autoConvert_v1alpha1_ShootMigrationControllerConfiguration_To_config_ShootMigrationControllerConfiguration(in *ShootMigrationControllerConfiguration, out *config.ShootMigrationControllerConfiguration, s conversion.Scope) error { + out.ConcurrentSyncs = (*int)(unsafe.Pointer(in.ConcurrentSyncs)) + out.SyncPeriod = (*v1.Duration)(unsafe.Pointer(in.SyncPeriod)) + out.GracePeriod = (*v1.Duration)(unsafe.Pointer(in.GracePeriod)) + out.LastOperationStaleDuration = (*v1.Duration)(unsafe.Pointer(in.LastOperationStaleDuration)) + return nil +} + +// Convert_v1alpha1_ShootMigrationControllerConfiguration_To_config_ShootMigrationControllerConfiguration is an autogenerated conversion function. +func Convert_v1alpha1_ShootMigrationControllerConfiguration_To_config_ShootMigrationControllerConfiguration(in *ShootMigrationControllerConfiguration, out *config.ShootMigrationControllerConfiguration, s conversion.Scope) error { + return autoConvert_v1alpha1_ShootMigrationControllerConfiguration_To_config_ShootMigrationControllerConfiguration(in, out, s) +} + +func autoConvert_config_ShootMigrationControllerConfiguration_To_v1alpha1_ShootMigrationControllerConfiguration(in *config.ShootMigrationControllerConfiguration, out *ShootMigrationControllerConfiguration, s conversion.Scope) error { + out.ConcurrentSyncs = (*int)(unsafe.Pointer(in.ConcurrentSyncs)) + out.SyncPeriod = (*v1.Duration)(unsafe.Pointer(in.SyncPeriod)) + out.GracePeriod = (*v1.Duration)(unsafe.Pointer(in.GracePeriod)) + out.LastOperationStaleDuration = (*v1.Duration)(unsafe.Pointer(in.LastOperationStaleDuration)) + return nil +} + +// Convert_config_ShootMigrationControllerConfiguration_To_v1alpha1_ShootMigrationControllerConfiguration is an autogenerated conversion function. +func Convert_config_ShootMigrationControllerConfiguration_To_v1alpha1_ShootMigrationControllerConfiguration(in *config.ShootMigrationControllerConfiguration, out *ShootMigrationControllerConfiguration, s conversion.Scope) error { + return autoConvert_config_ShootMigrationControllerConfiguration_To_v1alpha1_ShootMigrationControllerConfiguration(in, out, s) +} + func autoConvert_v1alpha1_ShootMonitoringConfig_To_config_ShootMonitoringConfig(in *ShootMonitoringConfig, out *config.ShootMonitoringConfig, s conversion.Scope) error { out.RemoteWrite = (*config.RemoteWriteMonitoringConfig)(unsafe.Pointer(in.RemoteWrite)) out.ExternalLabels = *(*map[string]string)(unsafe.Pointer(&in.ExternalLabels)) diff --git a/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/v1alpha1/zz_generated.deepcopy.go b/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/v1alpha1/zz_generated.deepcopy.go index ae672af80..5f7a3bfb7 100644 --- a/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/v1alpha1/zz_generated.deepcopy.go +++ b/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/v1alpha1/zz_generated.deepcopy.go @@ -2,7 +2,7 @@ // +build !ignore_autogenerated /* -Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -118,6 +118,42 @@ func (in *BackupEntryControllerConfiguration) DeepCopy() *BackupEntryControllerC return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *BackupEntryMigrationControllerConfiguration) DeepCopyInto(out *BackupEntryMigrationControllerConfiguration) { + *out = *in + if in.ConcurrentSyncs != nil { + in, out := &in.ConcurrentSyncs, &out.ConcurrentSyncs + *out = new(int) + **out = **in + } + if in.SyncPeriod != nil { + in, out := &in.SyncPeriod, &out.SyncPeriod + *out = new(v1.Duration) + **out = **in + } + if in.GracePeriod != nil { + in, out := &in.GracePeriod, &out.GracePeriod + *out = new(v1.Duration) + **out = **in + } + if in.LastOperationStaleDuration != nil { + in, out := &in.LastOperationStaleDuration, &out.LastOperationStaleDuration + *out = new(v1.Duration) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BackupEntryMigrationControllerConfiguration. +func (in *BackupEntryMigrationControllerConfiguration) DeepCopy() *BackupEntryMigrationControllerConfiguration { + if in == nil { + return nil + } + out := new(BackupEntryMigrationControllerConfiguration) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *BastionControllerConfiguration) DeepCopyInto(out *BastionControllerConfiguration) { *out = *in @@ -540,6 +576,11 @@ func (in *GardenletControllerConfiguration) DeepCopyInto(out *GardenletControlle *out = new(BackupEntryControllerConfiguration) (*in).DeepCopyInto(*out) } + if in.BackupEntryMigration != nil { + in, out := &in.BackupEntryMigration, &out.BackupEntryMigration + *out = new(BackupEntryMigrationControllerConfiguration) + (*in).DeepCopyInto(*out) + } if in.Bastion != nil { in, out := &in.Bastion, &out.Bastion *out = new(BastionControllerConfiguration) @@ -575,6 +616,11 @@ func (in *GardenletControllerConfiguration) DeepCopyInto(out *GardenletControlle *out = new(ShootCareControllerConfiguration) (*in).DeepCopyInto(*out) } + if in.ShootMigration != nil { + in, out := &in.ShootMigration, &out.ShootMigration + *out = new(ShootMigrationControllerConfiguration) + (*in).DeepCopyInto(*out) + } if in.ShootStateSync != nil { in, out := &in.ShootStateSync, &out.ShootStateSync *out = new(ShootStateSyncControllerConfiguration) @@ -1105,6 +1151,42 @@ func (in *ShootControllerConfiguration) DeepCopy() *ShootControllerConfiguration return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ShootMigrationControllerConfiguration) DeepCopyInto(out *ShootMigrationControllerConfiguration) { + *out = *in + if in.ConcurrentSyncs != nil { + in, out := &in.ConcurrentSyncs, &out.ConcurrentSyncs + *out = new(int) + **out = **in + } + if in.SyncPeriod != nil { + in, out := &in.SyncPeriod, &out.SyncPeriod + *out = new(v1.Duration) + **out = **in + } + if in.GracePeriod != nil { + in, out := &in.GracePeriod, &out.GracePeriod + *out = new(v1.Duration) + **out = **in + } + if in.LastOperationStaleDuration != nil { + in, out := &in.LastOperationStaleDuration, &out.LastOperationStaleDuration + *out = new(v1.Duration) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ShootMigrationControllerConfiguration. +func (in *ShootMigrationControllerConfiguration) DeepCopy() *ShootMigrationControllerConfiguration { + if in == nil { + return nil + } + out := new(ShootMigrationControllerConfiguration) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ShootMonitoringConfig) DeepCopyInto(out *ShootMonitoringConfig) { *out = *in diff --git a/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/v1alpha1/zz_generated.defaults.go b/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/v1alpha1/zz_generated.defaults.go index 636c6022e..db487fb6a 100644 --- a/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/v1alpha1/zz_generated.defaults.go +++ b/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/v1alpha1/zz_generated.defaults.go @@ -2,7 +2,7 @@ // +build !ignore_autogenerated /* -Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -51,6 +51,9 @@ func SetObjectDefaults_GardenletConfiguration(in *GardenletConfiguration) { if in.Controllers.BackupEntry != nil { SetDefaults_BackupEntryControllerConfiguration(in.Controllers.BackupEntry) } + if in.Controllers.BackupEntryMigration != nil { + SetDefaults_BackupEntryMigrationControllerConfiguration(in.Controllers.BackupEntryMigration) + } if in.Controllers.Bastion != nil { SetDefaults_BastionControllerConfiguration(in.Controllers.Bastion) } @@ -75,6 +78,9 @@ func SetObjectDefaults_GardenletConfiguration(in *GardenletConfiguration) { SetDefaults_StaleExtensionHealthChecks(in.Controllers.ShootCare.StaleExtensionHealthChecks) } } + if in.Controllers.ShootMigration != nil { + SetDefaults_ShootMigrationControllerConfiguration(in.Controllers.ShootMigration) + } if in.Controllers.ShootStateSync != nil { SetDefaults_ShootStateSyncControllerConfiguration(in.Controllers.ShootStateSync) } diff --git a/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/zz_generated.deepcopy.go b/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/zz_generated.deepcopy.go index 4e43debd6..6d035390a 100644 --- a/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/zz_generated.deepcopy.go +++ b/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/zz_generated.deepcopy.go @@ -2,7 +2,7 @@ // +build !ignore_autogenerated /* -Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +Copyright (c) SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -118,6 +118,42 @@ func (in *BackupEntryControllerConfiguration) DeepCopy() *BackupEntryControllerC return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *BackupEntryMigrationControllerConfiguration) DeepCopyInto(out *BackupEntryMigrationControllerConfiguration) { + *out = *in + if in.ConcurrentSyncs != nil { + in, out := &in.ConcurrentSyncs, &out.ConcurrentSyncs + *out = new(int) + **out = **in + } + if in.SyncPeriod != nil { + in, out := &in.SyncPeriod, &out.SyncPeriod + *out = new(v1.Duration) + **out = **in + } + if in.GracePeriod != nil { + in, out := &in.GracePeriod, &out.GracePeriod + *out = new(v1.Duration) + **out = **in + } + if in.LastOperationStaleDuration != nil { + in, out := &in.LastOperationStaleDuration, &out.LastOperationStaleDuration + *out = new(v1.Duration) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BackupEntryMigrationControllerConfiguration. +func (in *BackupEntryMigrationControllerConfiguration) DeepCopy() *BackupEntryMigrationControllerConfiguration { + if in == nil { + return nil + } + out := new(BackupEntryMigrationControllerConfiguration) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *BastionControllerConfiguration) DeepCopyInto(out *BastionControllerConfiguration) { *out = *in @@ -540,6 +576,11 @@ func (in *GardenletControllerConfiguration) DeepCopyInto(out *GardenletControlle *out = new(BackupEntryControllerConfiguration) (*in).DeepCopyInto(*out) } + if in.BackupEntryMigration != nil { + in, out := &in.BackupEntryMigration, &out.BackupEntryMigration + *out = new(BackupEntryMigrationControllerConfiguration) + (*in).DeepCopyInto(*out) + } if in.Bastion != nil { in, out := &in.Bastion, &out.Bastion *out = new(BastionControllerConfiguration) @@ -575,6 +616,11 @@ func (in *GardenletControllerConfiguration) DeepCopyInto(out *GardenletControlle *out = new(ShootCareControllerConfiguration) (*in).DeepCopyInto(*out) } + if in.ShootMigration != nil { + in, out := &in.ShootMigration, &out.ShootMigration + *out = new(ShootMigrationControllerConfiguration) + (*in).DeepCopyInto(*out) + } if in.ShootStateSync != nil { in, out := &in.ShootStateSync, &out.ShootStateSync *out = new(ShootStateSyncControllerConfiguration) @@ -1105,6 +1151,42 @@ func (in *ShootControllerConfiguration) DeepCopy() *ShootControllerConfiguration return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ShootMigrationControllerConfiguration) DeepCopyInto(out *ShootMigrationControllerConfiguration) { + *out = *in + if in.ConcurrentSyncs != nil { + in, out := &in.ConcurrentSyncs, &out.ConcurrentSyncs + *out = new(int) + **out = **in + } + if in.SyncPeriod != nil { + in, out := &in.SyncPeriod, &out.SyncPeriod + *out = new(v1.Duration) + **out = **in + } + if in.GracePeriod != nil { + in, out := &in.GracePeriod, &out.GracePeriod + *out = new(v1.Duration) + **out = **in + } + if in.LastOperationStaleDuration != nil { + in, out := &in.LastOperationStaleDuration, &out.LastOperationStaleDuration + *out = new(v1.Duration) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ShootMigrationControllerConfiguration. +func (in *ShootMigrationControllerConfiguration) DeepCopy() *ShootMigrationControllerConfiguration { + if in == nil { + return nil + } + out := new(ShootMigrationControllerConfiguration) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ShootMonitoringConfig) DeepCopyInto(out *ShootMonitoringConfig) { *out = *in diff --git a/vendor/github.com/gardener/gardener/pkg/gardenlet/features/features.go b/vendor/github.com/gardener/gardener/pkg/gardenlet/features/features.go index cdae3bf88..419fe9e4a 100644 --- a/vendor/github.com/gardener/gardener/pkg/gardenlet/features/features.go +++ b/vendor/github.com/gardener/gardener/pkg/gardenlet/features/features.go @@ -33,9 +33,10 @@ var ( features.CachedRuntimeClients: {Default: true, PreRelease: featuregate.Beta}, features.SeedKubeScheduler: {Default: false, PreRelease: featuregate.Alpha}, features.ReversedVPN: {Default: false, PreRelease: featuregate.Alpha}, - features.UseDNSRecords: {Default: false, PreRelease: featuregate.Alpha}, + features.UseDNSRecords: {Default: true, PreRelease: featuregate.Beta}, features.DenyInvalidExtensionResources: {Default: false, PreRelease: featuregate.Alpha}, features.CopyEtcdBackupsDuringControlPlaneMigration: {Default: false, PreRelease: featuregate.Alpha}, + features.ForceRestore: {Default: false, PreRelease: featuregate.Alpha}, } ) diff --git a/vendor/github.com/gardener/gardener/pkg/logger/logrus.go b/vendor/github.com/gardener/gardener/pkg/logger/logrus.go index 6dbf6b5b6..04ed470be 100644 --- a/vendor/github.com/gardener/gardener/pkg/logger/logrus.go +++ b/vendor/github.com/gardener/gardener/pkg/logger/logrus.go @@ -76,6 +76,7 @@ func NewLogger(logLevel string, format string) *logrus.Logger { } // NewNopLogger instantiates a new logger that logs to ioutil.Discard. +// Deprecated: use logr for new code! func NewNopLogger() *logrus.Logger { logger := logrus.New() logger.Out = io.Discard @@ -83,6 +84,7 @@ func NewNopLogger() *logrus.Logger { } // AddWriter returns a logger that uses the tests writer (e.g., GingkoWriter) as output channel +// Deprecated: use logr for new code! func AddWriter(logger *logrus.Logger, writer io.Writer) *logrus.Logger { logger.Out = writer return logger @@ -92,12 +94,14 @@ func AddWriter(logger *logrus.Logger, writer io.Writer) *logrus.Logger { // and the project in the Garden cluster to the output. If an is provided it will be printed for every // log message. // Example output: time="2017-06-08T13:00:49+02:00" level=info msg="Creating namespace in seed cluster" shoot=core/crazy-botany. +// Deprecated: use logr for new code! func NewShootLogger(logger logrus.FieldLogger, shoot, project string) *logrus.Entry { return logger.WithField("shoot", fmt.Sprintf("%s/%s", project, shoot)) } // NewFieldLogger extends an existing logrus logger and adds the provided additional field. // Example output: time="2017-06-08T13:00:49+02:00" level=info msg="something" =. +// Deprecated: use logr for new code! func NewFieldLogger(logger logrus.FieldLogger, fieldKey, fieldValue string) *logrus.Entry { return logger.WithField(fieldKey, fieldValue) } diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/addons.go b/vendor/github.com/gardener/gardener/pkg/operation/botanist/addons.go index 06b161a4e..9495e896c 100644 --- a/vendor/github.com/gardener/gardener/pkg/operation/botanist/addons.go +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/addons.go @@ -18,7 +18,6 @@ import ( "context" "fmt" "path/filepath" - "strconv" "strings" "github.com/gardener/gardener/charts" @@ -31,6 +30,7 @@ import ( "github.com/gardener/gardener/pkg/operation/botanist/component" "github.com/gardener/gardener/pkg/operation/botanist/component/extensions/dns" extensionsdnsrecord "github.com/gardener/gardener/pkg/operation/botanist/component/extensions/dnsrecord" + "github.com/gardener/gardener/pkg/operation/botanist/component/nodelocaldns" "github.com/gardener/gardener/pkg/operation/common" "github.com/gardener/gardener/pkg/utils/imagevector" kutil "github.com/gardener/gardener/pkg/utils/kubernetes" @@ -296,9 +296,6 @@ func (b *Botanist) generateCoreAddonsChart(ctx context.Context) (*chartrenderer. "podNetwork": b.Shoot.Networks.Pods.String(), "vpaEnabled": b.Shoot.WantsVerticalPodAutoscaler, } - nodeLocalDNSConfig = map[string]interface{}{ - "domain": gardencorev1beta1.DefaultDomain, - } podSecurityPolicies = map[string]interface{}{ "allowPrivilegedContainers": *b.Shoot.GetInfo().Spec.Kubernetes.AllowPrivilegedContainers, @@ -336,10 +333,9 @@ func (b *Botanist) generateCoreAddonsChart(ctx context.Context) (*chartrenderer. "maintenanceBegin": b.Shoot.GetInfo().Spec.Maintenance.TimeWindow.Begin, "maintenanceEnd": b.Shoot.GetInfo().Spec.Maintenance.TimeWindow.End, } - nodeExporterConfig = map[string]interface{}{} - blackboxExporterConfig = map[string]interface{}{} - nodeProblemDetectorConfig = map[string]interface{}{} - networkPolicyConfig = netpol.ShootNetworkPolicyValues{ + nodeExporterConfig = map[string]interface{}{} + blackboxExporterConfig = map[string]interface{}{} + networkPolicyConfig = netpol.ShootNetworkPolicyValues{ Enabled: true, NodeLocalDNS: netpol.NodeLocalDNSValues{ Enabled: b.Shoot.NodeLocalDNSEnabled, @@ -351,16 +347,7 @@ func (b *Botanist) generateCoreAddonsChart(ctx context.Context) (*chartrenderer. ) if b.Shoot.IPVSEnabled() { - networkPolicyConfig.NodeLocalDNS.KubeDNSClusterIP = common.NodeLocalIPVSAddress - } - - if b.APIServerSNIEnabled() { - nodeProblemDetectorConfig["env"] = []interface{}{ - map[string]interface{}{ - "name": "KUBERNETES_SERVICE_HOST", - "value": kasFQDN, - }, - } + networkPolicyConfig.NodeLocalDNS.KubeDNSClusterIP = nodelocaldns.IPVSAddress } if vpaSecret := b.LoadSecret(common.VPASecretName); vpaSecret != nil { @@ -448,35 +435,6 @@ func (b *Botanist) generateCoreAddonsChart(ctx context.Context) (*chartrenderer. } shootInfo["extensions"] = strings.Join(extensions, ",") - // The node-local-dns interface cannot bind the kube-dns cluster IP since the interface - // used for IPVS load-balancing already uses this address. - if b.Shoot.IPVSEnabled() { - nodeLocalDNSConfig["clusterDNS"] = b.Shoot.Networks.CoreDNS.String() - } else { - nodeLocalDNSConfig["dnsServer"] = b.Shoot.Networks.CoreDNS.String() - } - - nodeLocalDNSForceTcpToClusterDNS := true - if forceTcp, err := strconv.ParseBool(b.Shoot.GetInfo().Annotations[v1beta1constants.AnnotationNodeLocalDNSForceTcpToClusterDns]); err == nil { - nodeLocalDNSForceTcpToClusterDNS = forceTcp - } - nodeLocalDNSConfig["forceTcpToClusterDNS"] = nodeLocalDNSForceTcpToClusterDNS - nodeLocalDNSForceTcpToUpstreamDNS := true - if forceTcp, err := strconv.ParseBool(b.Shoot.GetInfo().Annotations[v1beta1constants.AnnotationNodeLocalDNSForceTcpToUpstreamDns]); err == nil { - nodeLocalDNSForceTcpToUpstreamDNS = forceTcp - } - nodeLocalDNSConfig["forceTcpToUpstreamDNS"] = nodeLocalDNSForceTcpToUpstreamDNS - - nodelocalDNS, err := b.InjectShootShootImages(nodeLocalDNSConfig, charts.ImageNameNodeLocalDns) - if err != nil { - return nil, err - } - - nodeProblemDetector, err := b.InjectShootShootImages(nodeProblemDetectorConfig, charts.ImageNameNodeProblemDetector) - if err != nil { - return nil, err - } - kubeProxy, err := b.InjectShootShootImages(kubeProxyConfig, charts.ImageNameAlpine) if err != nil { return nil, err @@ -516,7 +474,7 @@ func (b *Botanist) generateCoreAddonsChart(ctx context.Context) (*chartrenderer. "global": global, "coredns": common.GenerateAddonConfig(nil, true), "vpn-shoot": common.GenerateAddonConfig(nil, true), - "node-local-dns": common.GenerateAddonConfig(nodelocalDNS, b.Shoot.NodeLocalDNSEnabled), + "node-local-dns": common.GenerateAddonConfig(nil, b.Shoot.NodeLocalDNSEnabled), "kube-apiserver-kubelet": common.GenerateAddonConfig(nil, true), "apiserver-proxy": common.GenerateAddonConfig(apiserverProxy, b.APIServerSNIEnabled()), "kube-proxy": common.GenerateAddonConfig(kubeProxy, kubeProxyEnabled), @@ -525,7 +483,7 @@ func (b *Botanist) generateCoreAddonsChart(ctx context.Context) (*chartrenderer. "blackbox-exporter": blackboxExporter, }, b.Shoot.Purpose != gardencorev1beta1.ShootPurposeTesting), "network-policies": networkPolicyConfig, - "node-problem-detector": common.GenerateAddonConfig(nodeProblemDetector, true), + "node-problem-detector": common.GenerateAddonConfig(nil, true), "podsecuritypolicies": common.GenerateAddonConfig(podSecurityPolicies, true), "shoot-info": common.GenerateAddonConfig(shootInfo, true), "vertical-pod-autoscaler": common.GenerateAddonConfig(verticalPodAutoscaler, b.Shoot.WantsVerticalPodAutoscaler), diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/botanist.go b/vendor/github.com/gardener/gardener/pkg/operation/botanist/botanist.go index 656662626..311b77c6e 100644 --- a/vendor/github.com/gardener/gardener/pkg/operation/botanist/botanist.go +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/botanist.go @@ -151,6 +151,10 @@ func New(ctx context.Context, o *operation.Operation) (*Botanist, error) { if err != nil { return nil, err } + o.Shoot.Components.SystemComponents.NodeLocalDNS, err = b.DefaultNodeLocalDNS() + if err != nil { + return nil, err + } o.Shoot.Components.SystemComponents.MetricsServer, err = b.DefaultMetricsServer() if err != nil { return nil, err @@ -159,11 +163,13 @@ func New(ctx context.Context, o *operation.Operation) (*Botanist, error) { if err != nil { return nil, err } - + o.Shoot.Components.SystemComponents.NodeProblemDetector, err = b.DefaultNodeProblemDetector() + if err != nil { + return nil, err + } // other components o.Shoot.Components.SourceBackupEntry = b.SourceBackupEntry() o.Shoot.Components.BackupEntry = b.DefaultCoreBackupEntry() - o.Shoot.Components.DependencyWatchdogAccess = b.DefaultDependencyWatchdogAccess() o.Shoot.Components.GardenerAccess = b.DefaultGardenerAccess() o.Shoot.Components.NetworkPolicies, err = b.DefaultNetworkPolicies(sniPhase) if err != nil { diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/cleanup.go b/vendor/github.com/gardener/gardener/pkg/operation/botanist/cleanup.go index 8442cc75d..fd8982a77 100644 --- a/vendor/github.com/gardener/gardener/pkg/operation/botanist/cleanup.go +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/cleanup.go @@ -27,6 +27,7 @@ import ( "github.com/gardener/gardener/pkg/utils/retry" "github.com/gardener/gardener/pkg/utils/version" + volumesnapshotv1beta1 "github.com/kubernetes-csi/external-snapshotter/v2/pkg/apis/volumesnapshot/v1beta1" admissionregistrationv1 "k8s.io/api/admissionregistration/v1" admissionregistrationv1beta1 "k8s.io/api/admissionregistration/v1beta1" appsv1 "k8s.io/api/apps/v1" @@ -156,6 +157,12 @@ var ( // PersistentVolumeClaimCleanOption is the delete selector for PersistentVolumeClaims. PersistentVolumeClaimCleanOption = utilclient.ListWith{&NoCleanupPreventionListOption} + // VolumeSnapshotCleanOption is the delete selector for VolumeSnapshots. + VolumeSnapshotCleanOption = utilclient.ListWith{&NoCleanupPreventionListOption} + + // VolumeSnapshotContentCleanOption is the delete selector for VolumeSnapshotContents. + VolumeSnapshotContentCleanOption = utilclient.ListWith{&NoCleanupPreventionListOption} + // NamespaceErrorToleration are the errors to be tolerated during deletion. NamespaceErrorToleration = utilclient.TolerateErrors{apierrors.IsConflict} ) @@ -179,7 +186,7 @@ func (b *Botanist) CleanWebhooks(ctx context.Context) error { var ( c = b.K8sShootClient.Client() ensurer = utilclient.GoneBeforeEnsurer(b.Shoot.GetInfo().GetDeletionTimestamp().Time) - ops = utilclient.NewCleanOps(utilclient.DefaultCleaner(), ensurer) + ops = utilclient.NewCleanOps(ensurer, utilclient.DefaultCleaner()) ) cleanOptions, err := b.getCleanOptions(GracePeriodFiveMinutes, FinalizeAfterFiveMinutes, v1beta1constants.AnnotationShootCleanupWebhooksFinalizeGracePeriodSeconds, 1) @@ -203,10 +210,9 @@ func (b *Botanist) CleanWebhooks(ctx context.Context) error { // CleanExtendedAPIs removes API extensions like CRDs and API services from the Shoot cluster. func (b *Botanist) CleanExtendedAPIs(ctx context.Context) error { var ( - c = b.K8sShootClient.Client() - ensurer = utilclient.GoneBeforeEnsurer(b.Shoot.GetInfo().GetDeletionTimestamp().Time) - defaultOps = utilclient.NewCleanOps(utilclient.DefaultCleaner(), ensurer) - crdCleanOps = utilclient.NewCleanOps(utilclient.DefaultCleaner(), ensurer) + c = b.K8sShootClient.Client() + ensurer = utilclient.GoneBeforeEnsurer(b.Shoot.GetInfo().GetDeletionTimestamp().Time) + ops = utilclient.NewCleanOps(ensurer, utilclient.DefaultCleaner()) ) cleanOptions, err := b.getCleanOptions(GracePeriodFiveMinutes, FinalizeAfterOneHour, v1beta1constants.AnnotationShootCleanupExtendedAPIsFinalizeGracePeriodSeconds, 0.1) @@ -221,8 +227,8 @@ func (b *Botanist) CleanExtendedAPIs(ctx context.Context) error { } return flow.Parallel( - cleanResourceFn(defaultOps, c, &apiregistrationv1.APIServiceList{}, APIServiceCleanOption, cleanOptions), - cleanResourceFn(crdCleanOps, c, crdList, CustomResourceDefinitionCleanOption, cleanOptions), + cleanResourceFn(ops, c, &apiregistrationv1.APIServiceList{}, APIServiceCleanOption, cleanOptions), + cleanResourceFn(ops, c, crdList, CustomResourceDefinitionCleanOption, cleanOptions), )(ctx) } @@ -232,9 +238,11 @@ func (b *Botanist) CleanExtendedAPIs(ctx context.Context) error { // It will return an error in case it has not finished yet, and nil if all resources are gone. func (b *Botanist) CleanKubernetesResources(ctx context.Context) error { var ( - c = b.K8sShootClient.Client() - ensurer = utilclient.GoneBeforeEnsurer(b.Shoot.GetInfo().GetDeletionTimestamp().Time) - ops = utilclient.NewCleanOps(utilclient.DefaultCleaner(), ensurer) + c = b.K8sShootClient.Client() + ensurer = utilclient.GoneBeforeEnsurer(b.Shoot.GetInfo().GetDeletionTimestamp().Time) + cleaner = utilclient.DefaultCleaner() + ops = utilclient.NewCleanOps(ensurer, cleaner) + snapshotContentOps = utilclient.NewCleanOps(ensurer, cleaner, utilclient.DefaultVolumeSnapshotContentCleaner()) ) cleanOptions, err := b.getCleanOptions(GracePeriodFiveMinutes, FinalizeAfterFiveMinutes, v1beta1constants.AnnotationShootCleanupKubernetesResourcesFinalizeGracePeriodSeconds, 1) @@ -242,10 +250,17 @@ func (b *Botanist) CleanKubernetesResources(ctx context.Context) error { return err } + snapshotCleanOptions, err := b.getCleanOptions(GracePeriodFiveMinutes, FinalizeAfterOneHour, v1beta1constants.AnnotationShootCleanupKubernetesResourcesFinalizeGracePeriodSeconds, 0.5) + if err != nil { + return err + } + if metav1.HasAnnotation(b.Shoot.GetInfo().ObjectMeta, v1beta1constants.AnnotationShootSkipCleanup) { return flow.Parallel( cleanResourceFn(ops, c, &corev1.ServiceList{}, ServiceCleanOption, cleanOptions), cleanResourceFn(ops, c, &corev1.PersistentVolumeClaimList{}, PersistentVolumeClaimCleanOption, cleanOptions), + cleanResourceFn(ops, c, &volumesnapshotv1beta1.VolumeSnapshotList{}, VolumeSnapshotContentCleanOption, cleanOptions), + cleanResourceFn(ops, c, &volumesnapshotv1beta1.VolumeSnapshotContentList{}, VolumeSnapshotContentCleanOption, cleanOptions), )(ctx) } @@ -266,6 +281,10 @@ func (b *Botanist) CleanKubernetesResources(ctx context.Context) error { cleanResourceFn(ops, c, &corev1.ServiceList{}, ServiceCleanOption, cleanOptions), cleanResourceFn(ops, c, &appsv1.StatefulSetList{}, StatefulSetCleanOption, cleanOptions), cleanResourceFn(ops, c, &corev1.PersistentVolumeClaimList{}, PersistentVolumeClaimCleanOption, cleanOptions), + // Cleaning up VolumeSnapshots can take a longer time if many snapshots were taken. + // Hence, we only finalize these objects after 1h. + cleanResourceFn(ops, c, &volumesnapshotv1beta1.VolumeSnapshotList{}, VolumeSnapshotContentCleanOption, snapshotCleanOptions), + cleanResourceFn(snapshotContentOps, c, &volumesnapshotv1beta1.VolumeSnapshotContentList{}, VolumeSnapshotContentCleanOption, snapshotCleanOptions), )(ctx) } @@ -275,7 +294,7 @@ func (b *Botanist) CleanShootNamespaces(ctx context.Context) error { var ( c = b.K8sShootClient.Client() namespaceCleaner = utilclient.NewNamespaceCleaner(b.K8sShootClient.Kubernetes().CoreV1().Namespaces()) - namespaceCleanOps = utilclient.NewCleanOps(namespaceCleaner, utilclient.DefaultGoneEnsurer()) + namespaceCleanOps = utilclient.NewCleanOps(utilclient.DefaultGoneEnsurer(), namespaceCleaner) ) cleanOptions, err := b.getCleanOptions(ZeroGracePeriod, FinalizeAfterFiveMinutes, v1beta1constants.AnnotationShootCleanupNamespaceResourcesFinalizeGracePeriodSeconds, 0) diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/clusterautoscaler/cluster_autoscaler.go b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/clusterautoscaler/cluster_autoscaler.go index cf9696af6..8ae1d276d 100644 --- a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/clusterautoscaler/cluster_autoscaler.go +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/clusterautoscaler/cluster_autoscaler.go @@ -359,6 +359,10 @@ func (c *clusterAutoscaler) computeCommand() []string { fmt.Sprintf("--scan-interval=%s", c.config.ScanInterval.Duration), ) + for _, taint := range c.config.IgnoreTaints { + command = append(command, fmt.Sprintf("--ignore-taint=%s", taint)) + } + for _, machineDeployment := range c.machineDeployments { command = append(command, fmt.Sprintf("--nodes=%d:%d:%s.%s", machineDeployment.Minimum, machineDeployment.Maximum, c.namespace, machineDeployment.Name)) } diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/coredns/coredns.go b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/coredns/coredns.go index 5d8ca42d9..2a17e76eb 100644 --- a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/coredns/coredns.go +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/coredns/coredns.go @@ -504,6 +504,8 @@ import custom/*.server }, } + // TODO: Switch to autoscaling/v2 for v1.23+ clusters as soon as we have revendored the k8s.io/* libraries with + // v0.23.0 or above. horizontalPodAutoscaler = &autoscalingv2beta1.HorizontalPodAutoscaler{ ObjectMeta: metav1.ObjectMeta{ Name: "coredns", diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/dependencywatchdog/access.go b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/dependencywatchdog/access.go deleted file mode 100644 index e02969f71..000000000 --- a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/dependencywatchdog/access.go +++ /dev/null @@ -1,96 +0,0 @@ -// Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package dependencywatchdog - -import ( - "context" - - "github.com/gardener/gardener/pkg/operation/botanist/component" - gutil "github.com/gardener/gardener/pkg/utils/gardener" - kutil "github.com/gardener/gardener/pkg/utils/kubernetes" - - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - clientcmdv1 "k8s.io/client-go/tools/clientcmd/api/v1" - "sigs.k8s.io/controller-runtime/pkg/client" -) - -const ( - // ExternalProbeSecretName is the name of the kubecfg secret with internal DNS for external access. - ExternalProbeSecretName = gutil.SecretNamePrefixShootAccess + "dependency-watchdog-external-probe" - // InternalProbeSecretName is the name of the kubecfg secret with cluster IP access. - InternalProbeSecretName = gutil.SecretNamePrefixShootAccess + "dependency-watchdog-internal-probe" -) - -// NewAccess creates a new instance of the deployer for shoot cluster access for the dependency-watchdog. -func NewAccess( - client client.Client, - namespace string, - values AccessValues, -) AccessInterface { - return &dependencyWatchdogAccess{ - client: client, - namespace: namespace, - values: values, - } -} - -// AccessInterface contains functions for deploying access credentials for shoot clusters. -type AccessInterface interface { - component.Deployer - SetCACertificate([]byte) -} - -type dependencyWatchdogAccess struct { - client client.Client - namespace string - values AccessValues -} - -// AccessValues contains configurations for the component. -type AccessValues struct { - // ServerOutOfCluster is the out-of-cluster address of a kube-apiserver. - ServerOutOfCluster string - // ServerInCluster is the in-cluster address of a kube-apiserver. - ServerInCluster string - - caCertificate []byte -} - -func (d *dependencyWatchdogAccess) Deploy(ctx context.Context) error { - for name, server := range map[string]string{ - InternalProbeSecretName: d.values.ServerInCluster, - ExternalProbeSecretName: d.values.ServerOutOfCluster, - } { - var ( - shootAccessSecret = gutil.NewShootAccessSecret(name, d.namespace).WithNameOverride(name) - kubeconfig = kutil.NewKubeconfig(d.namespace, server, d.values.caCertificate, clientcmdv1.AuthInfo{Token: ""}) - ) - - if err := shootAccessSecret.WithKubeconfig(kubeconfig).Reconcile(ctx, d.client); err != nil { - return err - } - } - - // TODO(rfranzke): Remove in a future release. - return kutil.DeleteObjects(ctx, d.client, - &corev1.Secret{ObjectMeta: metav1.ObjectMeta{Name: "dependency-watchdog-internal-probe", Namespace: d.namespace}}, - &corev1.Secret{ObjectMeta: metav1.ObjectMeta{Name: "dependency-watchdog-external-probe", Namespace: d.namespace}}, - ) -} - -func (d *dependencyWatchdogAccess) Destroy(_ context.Context) error { return nil } - -func (d *dependencyWatchdogAccess) SetCACertificate(caCert []byte) { d.values.caCertificate = caCert } diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/dependencywatchdog/bootstrap.go b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/dependencywatchdog/dependency_watchdog.go similarity index 78% rename from vendor/github.com/gardener/gardener/pkg/operation/botanist/component/dependencywatchdog/bootstrap.go rename to vendor/github.com/gardener/gardener/pkg/operation/botanist/component/dependencywatchdog/dependency_watchdog.go index a35102435..f4799c40e 100644 --- a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/dependencywatchdog/bootstrap.go +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/dependencywatchdog/dependency_watchdog.go @@ -50,14 +50,17 @@ const ( // RoleProbe is a constant for the 'probe' role of the dependency-watchdog. RoleProbe Role = "probe" + // UserName is the user name for client certificates of the dependency-watchdog. + UserName = "gardener.cloud:system:dependency-watchdog" + name = "dependency-watchdog" volumeName = "config" volumeMountPath = "/etc/dependency-watchdog/config" configFileName = "dep-config.yaml" ) -// BootstrapperValues contains dependency-watchdog values. -type BootstrapperValues struct { +// Values contains dependency-watchdog values. +type Values struct { Role Role ValuesEndpoint ValuesProbe @@ -74,42 +77,42 @@ type ValuesProbe struct { ProbeDependantsList scalerapi.ProbeDependantsList } -// NewBootstrapper creates a new instance of DeployWaiter for the dependency-watchdog. -func NewBootstrapper( +// New creates a new instance of DeployWaiter for the dependency-watchdog. +func New( client client.Client, namespace string, - values BootstrapperValues, + values Values, ) component.DeployWaiter { - return &bootstrapper{ + return &dependencyWatchdog{ client: client, namespace: namespace, values: values, } } -type bootstrapper struct { +type dependencyWatchdog struct { client client.Client namespace string - values BootstrapperValues + values Values } -func (b *bootstrapper) Deploy(ctx context.Context) error { +func (d *dependencyWatchdog) Deploy(ctx context.Context) error { var ( config string vpaMinAllowedMemory string err error ) - switch b.values.Role { + switch d.values.Role { case RoleEndpoint: - config, err = restarterapi.Encode(&b.values.ValuesEndpoint.ServiceDependants) + config, err = restarterapi.Encode(&d.values.ValuesEndpoint.ServiceDependants) if err != nil { return err } vpaMinAllowedMemory = "25Mi" case RoleProbe: - config, err = scalerapi.Encode(&b.values.ValuesProbe.ProbeDependantsList) + config, err = scalerapi.Encode(&d.values.ValuesProbe.ProbeDependantsList) if err != nil { return err } @@ -118,9 +121,9 @@ func (b *bootstrapper) Deploy(ctx context.Context) error { configMap := &corev1.ConfigMap{ ObjectMeta: metav1.ObjectMeta{ - Name: b.name() + "-config", - Namespace: b.namespace, - Labels: map[string]string{v1beta1constants.LabelApp: b.name()}, + Name: d.name() + "-config", + Namespace: d.namespace, + Labels: map[string]string{v1beta1constants.LabelApp: d.name()}, }, Data: map[string]string{configFileName: config}, } @@ -131,22 +134,22 @@ func (b *bootstrapper) Deploy(ctx context.Context) error { serviceAccount = &corev1.ServiceAccount{ ObjectMeta: metav1.ObjectMeta{ - Name: b.name(), - Namespace: b.namespace, + Name: d.name(), + Namespace: d.namespace, }, AutomountServiceAccountToken: pointer.Bool(false), } clusterRole = &rbacv1.ClusterRole{ ObjectMeta: metav1.ObjectMeta{ - Name: fmt.Sprintf("gardener.cloud:%s:cluster-role", b.name()), + Name: fmt.Sprintf("gardener.cloud:%s:cluster-role", d.name()), }, - Rules: b.clusterRoleRules(), + Rules: d.clusterRoleRules(), } clusterRoleBinding = &rbacv1.ClusterRoleBinding{ ObjectMeta: metav1.ObjectMeta{ - Name: fmt.Sprintf("gardener.cloud:%s:cluster-role-binding", b.name()), + Name: fmt.Sprintf("gardener.cloud:%s:cluster-role-binding", d.name()), }, RoleRef: rbacv1.RoleRef{ APIGroup: rbacv1.GroupName, @@ -162,8 +165,8 @@ func (b *bootstrapper) Deploy(ctx context.Context) error { role = &rbacv1.Role{ ObjectMeta: metav1.ObjectMeta{ - Name: fmt.Sprintf("gardener.cloud:%s:role", b.name()), - Namespace: b.namespace, + Name: fmt.Sprintf("gardener.cloud:%s:role", d.name()), + Namespace: d.namespace, }, Rules: []rbacv1.PolicyRule{ { @@ -176,8 +179,8 @@ func (b *bootstrapper) Deploy(ctx context.Context) error { roleBinding = &rbacv1.RoleBinding{ ObjectMeta: metav1.ObjectMeta{ - Name: fmt.Sprintf("gardener.cloud:%s:role-binding", b.name()), - Namespace: b.namespace, + Name: fmt.Sprintf("gardener.cloud:%s:role-binding", d.name()), + Namespace: d.namespace, }, RoleRef: rbacv1.RoleRef{ APIGroup: rbacv1.GroupName, @@ -193,30 +196,26 @@ func (b *bootstrapper) Deploy(ctx context.Context) error { deployment = &appsv1.Deployment{ ObjectMeta: metav1.ObjectMeta{ - Name: b.name(), - Namespace: b.namespace, - Labels: b.getLabels(), + Name: d.name(), + Namespace: d.namespace, + Labels: d.getLabels(), }, Spec: appsv1.DeploymentSpec{ Replicas: pointer.Int32(1), RevisionHistoryLimit: pointer.Int32(2), - Selector: &metav1.LabelSelector{MatchLabels: b.getLabels()}, + Selector: &metav1.LabelSelector{MatchLabels: d.getLabels()}, Template: corev1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ - Annotations: map[string]string{ - // TODO(rfranzke): Remove in a future release. - "security.gardener.cloud/trigger": "rollout", - }, - Labels: b.podLabels(), + Labels: d.podLabels(), }, Spec: corev1.PodSpec{ ServiceAccountName: serviceAccount.Name, TerminationGracePeriodSeconds: pointer.Int64(5), Containers: []corev1.Container{{ Name: name, - Image: b.values.Image, + Image: d.values.Image, ImagePullPolicy: corev1.PullIfNotPresent, - Command: b.containerCommand(), + Command: d.containerCommand(), Ports: []corev1.ContainerPort{{ Name: "metrics", ContainerPort: 9643, @@ -256,8 +255,8 @@ func (b *bootstrapper) Deploy(ctx context.Context) error { updateMode = autoscalingv1beta2.UpdateModeAuto vpa = &autoscalingv1beta2.VerticalPodAutoscaler{ ObjectMeta: metav1.ObjectMeta{ - Name: b.name() + "-vpa", - Namespace: b.namespace, + Name: d.name() + "-vpa", + Namespace: d.namespace, }, Spec: autoscalingv1beta2.VerticalPodAutoscalerSpec{ TargetRef: &autoscalingv1.CrossVersionObjectReference{ @@ -297,41 +296,41 @@ func (b *bootstrapper) Deploy(ctx context.Context) error { return err } - return managedresources.CreateForSeed(ctx, b.client, b.namespace, b.name(), false, resources) + return managedresources.CreateForSeed(ctx, d.client, d.namespace, d.name(), false, resources) } -func (b *bootstrapper) Destroy(ctx context.Context) error { - return managedresources.DeleteForSeed(ctx, b.client, b.namespace, b.name()) +func (d *dependencyWatchdog) Destroy(ctx context.Context) error { + return managedresources.DeleteForSeed(ctx, d.client, d.namespace, d.name()) } // TimeoutWaitForManagedResource is the timeout used while waiting for the ManagedResources to become healthy // or deleted. var TimeoutWaitForManagedResource = 2 * time.Minute -func (b *bootstrapper) Wait(ctx context.Context) error { +func (d *dependencyWatchdog) Wait(ctx context.Context) error { timeoutCtx, cancel := context.WithTimeout(ctx, TimeoutWaitForManagedResource) defer cancel() - return managedresources.WaitUntilHealthy(timeoutCtx, b.client, b.namespace, b.name()) + return managedresources.WaitUntilHealthy(timeoutCtx, d.client, d.namespace, d.name()) } -func (b *bootstrapper) WaitCleanup(ctx context.Context) error { +func (d *dependencyWatchdog) WaitCleanup(ctx context.Context) error { timeoutCtx, cancel := context.WithTimeout(ctx, TimeoutWaitForManagedResource) defer cancel() - return managedresources.WaitUntilDeleted(timeoutCtx, b.client, b.namespace, b.name()) + return managedresources.WaitUntilDeleted(timeoutCtx, d.client, d.namespace, d.name()) } -func (b *bootstrapper) name() string { - return fmt.Sprintf("%s-%s", name, b.values.Role) +func (d *dependencyWatchdog) name() string { + return fmt.Sprintf("%s-%s", name, d.values.Role) } -func (b *bootstrapper) getLabels() map[string]string { - return map[string]string{v1beta1constants.LabelRole: b.name()} +func (d *dependencyWatchdog) getLabels() map[string]string { + return map[string]string{v1beta1constants.LabelRole: d.name()} } -func (b *bootstrapper) clusterRoleRules() []rbacv1.PolicyRule { - switch b.values.Role { +func (d *dependencyWatchdog) clusterRoleRules() []rbacv1.PolicyRule { + switch d.values.Role { case RoleEndpoint: return []rbacv1.PolicyRule{ { @@ -369,16 +368,16 @@ func (b *bootstrapper) clusterRoleRules() []rbacv1.PolicyRule { return nil } -func (b *bootstrapper) podLabels() map[string]string { - switch b.values.Role { +func (d *dependencyWatchdog) podLabels() map[string]string { + switch d.values.Role { case RoleEndpoint: - return utils.MergeStringMaps(b.getLabels(), map[string]string{ + return utils.MergeStringMaps(d.getLabels(), map[string]string{ v1beta1constants.LabelNetworkPolicyToDNS: v1beta1constants.LabelNetworkPolicyAllowed, v1beta1constants.LabelNetworkPolicyToSeedAPIServer: v1beta1constants.LabelNetworkPolicyAllowed, }) case RoleProbe: - return utils.MergeStringMaps(b.getLabels(), map[string]string{ + return utils.MergeStringMaps(d.getLabels(), map[string]string{ v1beta1constants.LabelNetworkPolicyToDNS: v1beta1constants.LabelNetworkPolicyAllowed, v1beta1constants.LabelNetworkPolicyToSeedAPIServer: v1beta1constants.LabelNetworkPolicyAllowed, v1beta1constants.LabelNetworkPolicyToAllShootAPIServers: v1beta1constants.LabelNetworkPolicyAllowed, @@ -390,13 +389,13 @@ func (b *bootstrapper) podLabels() map[string]string { return nil } -func (b *bootstrapper) containerCommand() []string { - switch b.values.Role { +func (d *dependencyWatchdog) containerCommand() []string { + switch d.values.Role { case RoleEndpoint: return []string{ "/usr/local/bin/dependency-watchdog", fmt.Sprintf("--config-file=%s/%s", volumeMountPath, configFileName), - "--deployed-namespace=" + b.namespace, + "--deployed-namespace=" + d.namespace, "--watch-duration=5m", } @@ -405,7 +404,7 @@ func (b *bootstrapper) containerCommand() []string { "/usr/local/bin/dependency-watchdog", "probe", fmt.Sprintf("--config-file=%s/%s", volumeMountPath, configFileName), - "--deployed-namespace=" + b.namespace, + "--deployed-namespace=" + d.namespace, "--qps=20.0", "--burst=100", "--v=4", diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/etcd/etcd.go b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/etcd/etcd.go index f7556296f..b65cbdc17 100644 --- a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/etcd/etcd.go +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/etcd/etcd.go @@ -29,6 +29,7 @@ import ( "github.com/gardener/gardener/pkg/utils" gutil "github.com/gardener/gardener/pkg/utils/gardener" kutil "github.com/gardener/gardener/pkg/utils/kubernetes" + "github.com/gardener/gardener/pkg/utils/kubernetes/health" hvpav1alpha1 "github.com/gardener/hvpa-controller/api/v1alpha1" "github.com/sirupsen/logrus" @@ -113,6 +114,8 @@ type Interface interface { Get(context.Context) (*druidv1alpha1.Etcd, error) // SetOwnerCheckConfig sets the owner check configuration. SetOwnerCheckConfig(config *OwnerCheckConfig) + // Scale scales the etcd resource to the given replica count. + Scale(context.Context, int) error } // New creates a new instance of DeployWaiter for the Etcd. @@ -616,6 +619,36 @@ func (e *etcd) SetOwnerCheckConfig(ownerCheckConfig *OwnerCheckConfig) { e.ownerCheckConfig = ownerCheckConfig } +func (e *etcd) Scale(ctx context.Context, replicas int) error { + etcdObj := &druidv1alpha1.Etcd{} + if err := e.client.Get(ctx, client.ObjectKeyFromObject(e.etcd), etcdObj); err != nil { + return err + } + + if expectedTimestamp, ok := e.etcd.Annotations[v1beta1constants.GardenerTimestamp]; ok { + if err := health.ObjectHasAnnotationWithValue(v1beta1constants.GardenerTimestamp, expectedTimestamp)(etcdObj); err != nil { + return err + } + } + + if _, ok := etcdObj.Annotations[v1beta1constants.GardenerOperation]; ok { + return fmt.Errorf("etcd object still has operation annotation set") + } + + patch := client.MergeFrom(etcdObj.DeepCopy()) + if e.etcd.Annotations == nil { + etcdObj.SetAnnotations(make(map[string]string)) + } + + etcdObj.Annotations[v1beta1constants.GardenerOperation] = v1beta1constants.GardenerOperationReconcile + etcdObj.Annotations[v1beta1constants.GardenerTimestamp] = TimeNow().UTC().String() + etcdObj.Spec.Replicas = replicas + + e.etcd = etcdObj + + return e.client.Patch(ctx, etcdObj, patch) +} + func (e *etcd) podLabelSelector() labels.Selector { app, _ := labels.NewRequirement(v1beta1constants.LabelApp, selection.Equals, []string{LabelAppValue}) role, _ := labels.NewRequirement(v1beta1constants.LabelRole, selection.Equals, []string{e.role}) diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/operatingsystemconfig/downloader/downloader.go b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/operatingsystemconfig/downloader/downloader.go index f72fdc924..6b7711f6c 100644 --- a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/operatingsystemconfig/downloader/downloader.go +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/operatingsystemconfig/downloader/downloader.go @@ -20,7 +20,9 @@ import ( "strconv" "text/template" + v1beta1constants "github.com/gardener/gardener/pkg/apis/core/v1beta1/constants" extensionsv1alpha1 "github.com/gardener/gardener/pkg/apis/extensions/v1alpha1" + resourcesv1alpha1 "github.com/gardener/gardener/pkg/apis/resources/v1alpha1" "github.com/gardener/gardener/pkg/client/kubernetes" "github.com/gardener/gardener/pkg/operation/botanist/component/extensions/operatingsystemconfig/original/components/docker" "github.com/gardener/gardener/pkg/utils" @@ -58,7 +60,7 @@ const ( Name = "cloud-config-downloader" // UnitName is the name of the cloud-config-downloader service. UnitName = Name + ".service" - // SecretName is a constant for the secret name for the cloud-config-downloader's kubeconfig secret. + // SecretName is a constant for the secret name for the cloud-config-downloader's shoot access secret. SecretName = Name // UnitRestartSeconds is the number of seconds after which the cloud-config-downloader unit will be restarted. UnitRestartSeconds = 30 @@ -94,7 +96,9 @@ const ( // PathCredentialsClientKey is a constant for a path containing the 'client private key' credentials part for the // download. PathCredentialsClientKey = PathCredentialsDirectory + "/client.key" - // PathBootstrapToken is the path of a file on the shoot worker nodes in which the the bootstrap token for the kubelet + // PathCredentialsToken is a constant for a path containing the shoot access 'token' for the cloud-config-downloader. + PathCredentialsToken = PathCredentialsDirectory + "/token" + // PathBootstrapToken is the path of a file on the shoot worker nodes in which the bootstrap token for the kubelet // bootstrap is stored. PathBootstrapToken = PathCredentialsDirectory + "/bootstrap-token" // BootstrapTokenPlaceholder is the token that is expected to be replaced by the worker controller with the actual token @@ -118,13 +122,17 @@ func Config(cloudConfigUserDataSecretName, apiServerURL string) ([]extensionsv1a var ccdScript bytes.Buffer if err := tpl.Execute(&ccdScript, map[string]string{ "secretName": cloudConfigUserDataSecretName, + "tokenSecretName": Name, "pathCredentialsServer": PathCredentialsServer, "pathCredentialsCACert": PathCredentialsCACert, "pathCredentialsClientCert": PathCredentialsClientCert, "pathCredentialsClientKey": PathCredentialsClientKey, + "pathCredentialsToken": PathCredentialsToken, + "pathBootstrapToken": PathBootstrapToken, "pathDownloadedChecksum": PathDownloadedCloudConfigChecksum, "annotationChecksum": AnnotationKeyChecksum, "dataKeyScript": DataKeyScript, + "dataKeyToken": resourcesv1alpha1.DataKeyToken, }); err != nil { return nil, nil, err } @@ -165,31 +173,11 @@ WantedBy=multi-user.target`), Permissions: pointer.Int32(0644), Content: extensionsv1alpha1.FileContent{ SecretRef: &extensionsv1alpha1.FileContentSecretRef{ - Name: SecretName, + Name: v1beta1constants.SecretNameCACluster, DataKey: secrets.DataKeyCertificateCA, }, }, }, - { - Path: PathCredentialsClientCert, - Permissions: pointer.Int32(0644), - Content: extensionsv1alpha1.FileContent{ - SecretRef: &extensionsv1alpha1.FileContentSecretRef{ - Name: SecretName, - DataKey: secrets.ControlPlaneSecretDataKeyCertificatePEM(SecretName), - }, - }, - }, - { - Path: PathCredentialsClientKey, - Permissions: pointer.Int32(0644), - Content: extensionsv1alpha1.FileContent{ - SecretRef: &extensionsv1alpha1.FileContentSecretRef{ - Name: SecretName, - DataKey: secrets.ControlPlaneSecretDataKeyPrivateKey(SecretName), - }, - }, - }, { Path: PathCCDScript, Permissions: pointer.Int32(0744), @@ -229,7 +217,7 @@ func GenerateRBACResourcesData(secretNames []string) (map[string][]byte, error) { APIGroups: []string{""}, Resources: []string{"secrets"}, - ResourceNames: secretNames, + ResourceNames: append(secretNames, Name), Verbs: []string{"get"}, }, }, @@ -245,10 +233,22 @@ func GenerateRBACResourcesData(secretNames []string) (map[string][]byte, error) Kind: "Role", Name: role.Name, }, - Subjects: []rbacv1.Subject{{ - Kind: rbacv1.UserKind, - Name: SecretName, - }}, + Subjects: []rbacv1.Subject{ + // TODO(rfranzke): Delete this subject in a future release. + { + Kind: rbacv1.UserKind, + Name: "cloud-config-downloader", + }, + { + Kind: rbacv1.GroupKind, + Name: bootstraptokenapi.BootstrapDefaultGroup, + }, + { + Kind: rbacv1.ServiceAccountKind, + Name: Name, + Namespace: metav1.NamespaceSystem, + }, + }, } clusterRoleBindingNodeBootstrapper = &rbacv1.ClusterRoleBinding{ diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/operatingsystemconfig/downloader/templates/scripts/download-cloud-config.tpl.sh b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/operatingsystemconfig/downloader/templates/scripts/download-cloud-config.tpl.sh index 98989fea1..172b5ba2a 100644 --- a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/operatingsystemconfig/downloader/templates/scripts/download-cloud-config.tpl.sh +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/operatingsystemconfig/downloader/templates/scripts/download-cloud-config.tpl.sh @@ -6,30 +6,75 @@ set -o pipefail { SECRET_NAME="{{ .secretName }}" +TOKEN_SECRET_NAME="{{ .tokenSecretName }}" -PATH_CLOUDCONFIG_DOWNLOADER_SERVER="{{ .pathCredentialsServer }}" -PATH_CLOUDCONFIG_DOWNLOADER_CA_CERT="{{ .pathCredentialsCACert }}" PATH_CLOUDCONFIG_DOWNLOADER_CLIENT_CERT="{{ .pathCredentialsClientCert }}" PATH_CLOUDCONFIG_DOWNLOADER_CLIENT_KEY="{{ .pathCredentialsClientKey }}" -PATH_CLOUDCONFIG_CHECKSUM="{{ .pathDownloadedChecksum }}" +PATH_BOOTSTRAP_TOKEN="{{ .pathBootstrapToken }}" +PATH_CLOUDCONFIG_DOWNLOADER_TOKEN="{{ .pathCredentialsToken }}" -if ! SECRET="$(wget \ - -qO- \ - --header "Accept: application/yaml" \ - --ca-certificate "$PATH_CLOUDCONFIG_DOWNLOADER_CA_CERT" \ - --certificate "$PATH_CLOUDCONFIG_DOWNLOADER_CLIENT_CERT" \ - --private-key "$PATH_CLOUDCONFIG_DOWNLOADER_CLIENT_KEY" \ - "$(cat "$PATH_CLOUDCONFIG_DOWNLOADER_SERVER")/api/v1/namespaces/kube-system/secrets/$SECRET_NAME")"; then +function readSecret() { + wget \ + -qO- \ + --header "Accept: application/yaml" \ + --ca-certificate "{{ .pathCredentialsCACert }}" \ + "${@:2}" "$(cat "{{ .pathCredentialsServer }}")/api/v1/namespaces/kube-system/secrets/$1" +} + +function readSecretWithToken() { + readSecret "$1" "--header=Authorization: Bearer $2" +} + +function readSecretWithClientCertificate() { + readSecret "$1" "--certificate=$PATH_CLOUDCONFIG_DOWNLOADER_CLIENT_CERT" "--private-key=$PATH_CLOUDCONFIG_DOWNLOADER_CLIENT_KEY" +} + +function extractDataKeyFromSecret() { + echo "$1" | sed -rn "s/ $2: (.*)/\1/p" | base64 -d +} +# download shoot access token for cloud-config-downloader +if [[ -f "$PATH_CLOUDCONFIG_DOWNLOADER_TOKEN" ]]; then + if ! SECRET="$(readSecretWithToken "$TOKEN_SECRET_NAME" "$(cat "$PATH_CLOUDCONFIG_DOWNLOADER_TOKEN")")"; then + echo "Could not retrieve the shoot access secret with name $TOKEN_SECRET_NAME with existing token" + exit 1 + fi +else + if [[ -f "$PATH_BOOTSTRAP_TOKEN" ]]; then + if ! SECRET="$(readSecretWithToken "$TOKEN_SECRET_NAME" "$(cat "$PATH_BOOTSTRAP_TOKEN")")"; then + echo "Could not retrieve the shoot access secret with name $TOKEN_SECRET_NAME with bootstrap token" + exit 1 + fi + else + if ! SECRET="$(readSecretWithClientCertificate "$TOKEN_SECRET_NAME")"; then + echo "Could not retrieve the shoot access secret with name $TOKEN_SECRET_NAME with client certificate" + exit 1 + fi + fi +fi + +TOKEN="$(extractDataKeyFromSecret "$SECRET" "{{ .dataKeyToken }}")" +if [[ -z "$TOKEN" ]]; then + echo "Token in shoot access secret $TOKEN_SECRET_NAME is empty" + exit 1 +fi +echo "$TOKEN" > "$PATH_CLOUDCONFIG_DOWNLOADER_TOKEN" + +# download and run the cloud config execution script +if ! SECRET="$(readSecretWithToken "$SECRET_NAME" "$TOKEN")"; then echo "Could not retrieve the cloud config script in secret with name $SECRET_NAME" exit 1 fi +# delete legacy credentials from disk +# TODO(rfranzke): Delete in future release. +rm -f "$PATH_CLOUDCONFIG_DOWNLOADER_CLIENT_CERT" "$PATH_CLOUDCONFIG_DOWNLOADER_CLIENT_KEY" + CHECKSUM="$(echo "$SECRET" | sed -rn 's/ {{ .annotationChecksum | replace "/" "\\/" }}: (.*)/\1/p' | sed -e 's/^"//' -e 's/"$//')" -echo "$CHECKSUM" > "$PATH_CLOUDCONFIG_CHECKSUM" +echo "$CHECKSUM" > "{{ .pathDownloadedChecksum }}" -SCRIPT="$(echo "$SECRET" | sed -rn 's/ {{ .dataKeyScript }}: (.*)/\1/p')" -echo "$SCRIPT" | base64 -d | bash +SCRIPT="$(extractDataKeyFromSecret "$SECRET" "{{ .dataKeyScript }}")" +echo "$SCRIPT" | bash exit $? } diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/operatingsystemconfig/operatingsystemconfig.go b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/operatingsystemconfig/operatingsystemconfig.go index 42c49b686..e0fb69bac 100644 --- a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/operatingsystemconfig/operatingsystemconfig.go +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/operatingsystemconfig/operatingsystemconfig.go @@ -33,6 +33,7 @@ import ( "github.com/gardener/gardener/pkg/operation/botanist/component/extensions/operatingsystemconfig/original/components" "github.com/gardener/gardener/pkg/utils" "github.com/gardener/gardener/pkg/utils/flow" + gutil "github.com/gardener/gardener/pkg/utils/gardener" "github.com/gardener/gardener/pkg/utils/imagevector" kutil "github.com/gardener/gardener/pkg/utils/kubernetes" @@ -195,30 +196,44 @@ type Data struct { // Deploy uses the client to create or update the OperatingSystemConfig custom resources. func (o *operatingSystemConfig) Deploy(ctx context.Context) error { - fns := o.forEachWorkerPoolAndPurposeTaskFn(func(ctx context.Context, osc *extensionsv1alpha1.OperatingSystemConfig, worker gardencorev1beta1.Worker, purpose extensionsv1alpha1.OperatingSystemConfigPurpose) error { - d, err := o.newDeployer(osc, worker, purpose) - if err != nil { - return err - } - _, err = d.deploy(ctx, v1beta1constants.GardenerOperationReconcile) + return o.reconcile(ctx, func(d deployer) error { + _, err := d.deploy(ctx, v1beta1constants.GardenerOperationReconcile) return err }) - - return flow.Parallel(fns...)(ctx) } // Restore uses the seed client and the ShootState to create the OperatingSystemConfig custom resources in the Shoot // namespace in the Seed and restore its state. func (o *operatingSystemConfig) Restore(ctx context.Context, shootState *v1alpha1.ShootState) error { + return o.reconcile(ctx, func(d deployer) error { + return extensions.RestoreExtensionWithDeployFunction(ctx, o.client, shootState, extensionsv1alpha1.OperatingSystemConfigResource, d.deploy) + }) +} + +func (o *operatingSystemConfig) reconcile(ctx context.Context, reconcileFn func(deployer) error) error { + if err := gutil. + NewShootAccessSecret(downloader.SecretName, o.values.Namespace). + WithTargetSecret(downloader.SecretName, metav1.NamespaceSystem). + WithTokenExpirationDuration("2160h"). + Reconcile(ctx, o.client); err != nil { + return err + } + fns := o.forEachWorkerPoolAndPurposeTaskFn(func(ctx context.Context, osc *extensionsv1alpha1.OperatingSystemConfig, worker gardencorev1beta1.Worker, purpose extensionsv1alpha1.OperatingSystemConfigPurpose) error { d, err := o.newDeployer(osc, worker, purpose) if err != nil { return err } - return extensions.RestoreExtensionWithDeployFunction(ctx, o.client, shootState, extensionsv1alpha1.OperatingSystemConfigResource, d.deploy) + + return reconcileFn(d) }) - return flow.Parallel(fns...)(ctx) + if err := flow.Parallel(fns...)(ctx); err != nil { + return err + } + + // TODO(rfranzke): Remove in a future release. + return kutil.DeleteObject(ctx, o.client, &corev1.Secret{ObjectMeta: metav1.ObjectMeta{Name: "cloud-config-downloader", Namespace: o.values.Namespace}}) } // Wait waits until the OperatingSystemConfig CRD is ready (deployed or restored). It also reads the produced secret @@ -662,6 +677,7 @@ func (d *deployer) deploy(ctx context.Context, operation string) (extensionsv1al _, err = controllerutils.GetAndCreateOrMergePatch(ctx, d.client, d.osc, func() error { metav1.SetMetaDataAnnotation(&d.osc.ObjectMeta, v1beta1constants.GardenerOperation, operation) metav1.SetMetaDataAnnotation(&d.osc.ObjectMeta, v1beta1constants.GardenerTimestamp, TimeNow().UTC().String()) + metav1.SetMetaDataLabel(&d.osc.ObjectMeta, v1beta1constants.LabelWorkerPool, d.worker.Name) d.osc.Spec.Type = d.worker.Machine.Image.Name d.osc.Spec.ProviderConfig = d.worker.Machine.Image.ProviderConfig diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/operatingsystemconfig/original/components/kubelet/config.go b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/operatingsystemconfig/original/components/kubelet/config.go index 342593071..dcbb2016f 100644 --- a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/operatingsystemconfig/original/components/kubelet/config.go +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/extensions/operatingsystemconfig/original/components/kubelet/config.go @@ -51,7 +51,7 @@ func Config(kubernetesVersion *semver.Version, clusterDNSAddress, clusterDomain CacheUnauthorizedTTL: metav1.Duration{Duration: 30 * time.Second}, }, }, - CgroupDriver: "cgroupfs", + CgroupDriver: "systemd", CgroupRoot: "/", CgroupsPerQOS: pointer.Bool(true), ClusterDNS: []string{clusterDNSAddress}, @@ -103,6 +103,10 @@ func Config(kubernetesVersion *semver.Version, clusterDNSAddress, clusterDomain config.VolumePluginDir = pathVolumePluginDirectory } + if version.ConstraintK8sLessEqual122.Check(kubernetesVersion) { + config.CgroupDriver = "cgroupfs" + } + return config } diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/gardenerkubescheduler/gardener_kube_scheduler.go b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/gardenerkubescheduler/gardener_kube_scheduler.go index 8c7c89149..30ad7d337 100644 --- a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/gardenerkubescheduler/gardener_kube_scheduler.go +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/gardenerkubescheduler/gardener_kube_scheduler.go @@ -20,7 +20,19 @@ import ( "fmt" "time" + v1beta1constants "github.com/gardener/gardener/pkg/apis/core/v1beta1/constants" + "github.com/gardener/gardener/pkg/client/kubernetes" + "github.com/gardener/gardener/pkg/controllerutils" + "github.com/gardener/gardener/pkg/operation/botanist/component" + "github.com/gardener/gardener/pkg/operation/botanist/component/gardenerkubescheduler/configurator" "github.com/gardener/gardener/pkg/resourcemanager/controller/garbagecollector/references" + "github.com/gardener/gardener/pkg/utils" + "github.com/gardener/gardener/pkg/utils/imagevector" + kutil "github.com/gardener/gardener/pkg/utils/kubernetes" + "github.com/gardener/gardener/pkg/utils/managedresources" + "github.com/gardener/gardener/pkg/utils/version" + + "github.com/Masterminds/semver" admissionv1 "k8s.io/api/admission/v1" admissionv1beta1 "k8s.io/api/admission/v1beta1" admissionregistrationv1 "k8s.io/api/admissionregistration/v1" @@ -37,16 +49,6 @@ import ( autoscalingv1beta2 "k8s.io/autoscaler/vertical-pod-autoscaler/pkg/apis/autoscaling.k8s.io/v1beta2" "k8s.io/utils/pointer" "sigs.k8s.io/controller-runtime/pkg/client" - - v1beta1constants "github.com/gardener/gardener/pkg/apis/core/v1beta1/constants" - "github.com/gardener/gardener/pkg/client/kubernetes" - "github.com/gardener/gardener/pkg/controllerutils" - "github.com/gardener/gardener/pkg/operation/botanist/component" - "github.com/gardener/gardener/pkg/operation/botanist/component/gardenerkubescheduler/configurator" - "github.com/gardener/gardener/pkg/utils" - "github.com/gardener/gardener/pkg/utils/imagevector" - kutil "github.com/gardener/gardener/pkg/utils/kubernetes" - "github.com/gardener/gardener/pkg/utils/managedresources" ) const ( @@ -69,6 +71,7 @@ func New( client client.Client, namespace string, image *imagevector.Image, + version *semver.Version, config configurator.Configurator, webhookClientConfig *admissionregistrationv1.WebhookClientConfig, ) ( @@ -88,10 +91,10 @@ func New( } s := &kubeScheduler{ - client: client, - namespace: namespace, - image: image, - + client: client, + namespace: namespace, + image: image, + version: version, config: config, webhookClientConfig: webhookClientConfig, } @@ -103,6 +106,7 @@ type kubeScheduler struct { client client.Client namespace string image *imagevector.Image + version *semver.Version config configurator.Configurator webhookClientConfig *admissionregistrationv1.WebhookClientConfig } @@ -468,11 +472,16 @@ func (k *kubeScheduler) WaitCleanup(ctx context.Context) error { } func (k *kubeScheduler) command(port int32) []string { - return []string{ + command := []string{ "/usr/local/bin/kube-scheduler", fmt.Sprintf("--config=%s/%s", volumeMountPathConfig, dataKeyComponentConfig), fmt.Sprintf("--secure-port=%d", port), - "--port=0", "--v=2", } + + if version.ConstraintK8sLessEqual122.Check(k.version) { + command = append(command, "--port=0") + } + + return command } diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/gardenerkubescheduler/gardener_kube_scheduler_bootstrap.go b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/gardenerkubescheduler/gardener_kube_scheduler_bootstrap.go index 8549e4af6..237aeebfc 100644 --- a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/gardenerkubescheduler/gardener_kube_scheduler_bootstrap.go +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/gardenerkubescheduler/gardener_kube_scheduler_bootstrap.go @@ -130,6 +130,7 @@ func Bootstrap( c, Name, image, + seedVersion, config, &admissionregistrationv1.WebhookClientConfig{ Service: &admissionregistrationv1.ServiceReference{ diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/kubeapiserver/dependency_watchdog.go b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/kubeapiserver/dependency_watchdog.go index b101282dd..8fe03b1f3 100644 --- a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/kubeapiserver/dependency_watchdog.go +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/kubeapiserver/dependency_watchdog.go @@ -16,7 +16,6 @@ package kubeapiserver import ( v1beta1constants "github.com/gardener/gardener/pkg/apis/core/v1beta1/constants" - "github.com/gardener/gardener/pkg/operation/botanist/component/dependencywatchdog" restarterapi "github.com/gardener/dependency-watchdog/pkg/restarter/api" scalerapi "github.com/gardener/dependency-watchdog/pkg/scaler/api" @@ -26,6 +25,13 @@ import ( "k8s.io/utils/pointer" ) +const ( + // DependencyWatchdogExternalProbeSecretName is the name of the kubecfg secret with internal DNS for external access. + DependencyWatchdogExternalProbeSecretName = "dependency-watchdog-external-probe" + // DependencyWatchdogInternalProbeSecretName is the name of the kubecfg secret with cluster IP access. + DependencyWatchdogInternalProbeSecretName = "dependency-watchdog-internal-probe" +) + // DependencyWatchdogEndpointConfiguration returns the configuration for the dependency watchdog (endpoint role) // ensuring that its dependant pods are restarted as soon as it recovers from a crash loop. func DependencyWatchdogEndpointConfiguration() (map[string]restarterapi.Service, error) { @@ -60,8 +66,8 @@ func DependencyWatchdogProbeConfiguration() ([]scalerapi.ProbeDependants, error) return []scalerapi.ProbeDependants{{ Name: "shoot-" + v1beta1constants.DeploymentNameKubeAPIServer, Probe: &scalerapi.ProbeConfig{ - External: &scalerapi.ProbeDetails{KubeconfigSecretName: dependencywatchdog.ExternalProbeSecretName}, - Internal: &scalerapi.ProbeDetails{KubeconfigSecretName: dependencywatchdog.InternalProbeSecretName}, + External: &scalerapi.ProbeDetails{KubeconfigSecretName: DependencyWatchdogExternalProbeSecretName}, + Internal: &scalerapi.ProbeDetails{KubeconfigSecretName: DependencyWatchdogInternalProbeSecretName}, PeriodSeconds: pointer.Int32(30), }, DependantScales: []*scalerapi.DependantScaleDetails{{ diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/kubeapiserver/horizontalpodautoscaler.go b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/kubeapiserver/horizontalpodautoscaler.go index 0689579c0..d94c83e8a 100644 --- a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/kubeapiserver/horizontalpodautoscaler.go +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/kubeapiserver/horizontalpodautoscaler.go @@ -33,6 +33,8 @@ const ( hpaTargetAverageUtilizationMemory int32 = 80 ) +// TODO: Switch to autoscaling/v2 for v1.23+ clusters as soon as we have revendored the k8s.io/* libraries with +// v0.23.0 or above. func (k *kubeAPIServer) emptyHorizontalPodAutoscaler() *autoscalingv2beta1.HorizontalPodAutoscaler { return &autoscalingv2beta1.HorizontalPodAutoscaler{ObjectMeta: metav1.ObjectMeta{Name: v1beta1constants.DeploymentNameKubeAPIServer, Namespace: k.namespace}} } diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/kubeapiserver/monitoring.go b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/kubeapiserver/monitoring.go index c3ac4a8c5..cf0621a01 100644 --- a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/kubeapiserver/monitoring.go +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/kubeapiserver/monitoring.go @@ -113,7 +113,7 @@ const ( # Some verbs excluded because they are expected to be long-lasting: # WATCHLIST is long-poll, CONNECT is "kubectl exec". - alert: KubeApiServerLatency - expr: histogram_quantile(0.99, sum without (instance,resource) (rate(` + monitoringMetricApiserverRequestDurationSecondsBucket + `{subresource!="log",verb!~"CONNECT|WATCHLIST|WATCH|PROXY proxy"}[5m]))) > 3 + expr: histogram_quantile(0.99, sum without (instance,resource) (rate(` + monitoringMetricApiserverRequestDurationSecondsBucket + `{subresource!~"log|portforward|exec",verb!~"CONNECT|WATCHLIST|WATCH|PROXY proxy"}[5m]))) > 3 for: 30m labels: service: ` + v1beta1constants.DeploymentNameKubeAPIServer + ` @@ -165,7 +165,7 @@ const ( expr: histogram_quantile(0.99, sum without (instance, pod) (rate(` + monitoringMetricApiserverRequestDurationSecondsBucket + `[5m]))) labels: quantile: "0.99" - - record: apiserver_latency:quantile + - record: ` + monitoringMetricApiserverLatencySeconds + `:quantile expr: histogram_quantile(0.9, sum without (instance, pod) (rate(` + monitoringMetricApiserverRequestDurationSecondsBucket + `[5m]))) labels: quantile: "0.9" diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/kubescheduler/kube_scheduler.go b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/kubescheduler/kube_scheduler.go index 73e9e8e76..b458a9b31 100644 --- a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/kubescheduler/kube_scheduler.go +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/kubescheduler/kube_scheduler.go @@ -388,7 +388,9 @@ func (k *kubeScheduler) computeEnvironmentVariables() []corev1.EnvVar { func (k *kubeScheduler) computeComponentConfig() (string, error) { var apiVersion string - if version.ConstraintK8sGreaterEqual122.Check(k.version) { + if version.ConstraintK8sGreaterEqual123.Check(k.version) { + apiVersion = "kubescheduler.config.k8s.io/v1beta3" + } else if version.ConstraintK8sGreaterEqual122.Check(k.version) { apiVersion = "kubescheduler.config.k8s.io/v1beta2" } else if version.ConstraintK8sGreaterEqual119.Check(k.version) { apiVersion = "kubescheduler.config.k8s.io/v1beta1" @@ -424,9 +426,12 @@ func (k *kubeScheduler) computeCommand(port int32) []string { fmt.Sprintf("--tls-cert-file=%s/%s", volumeMountPathServer, secrets.ControlPlaneSecretDataKeyCertificatePEM(SecretNameServer)), fmt.Sprintf("--tls-private-key-file=%s/%s", volumeMountPathServer, secrets.ControlPlaneSecretDataKeyPrivateKey(SecretNameServer)), fmt.Sprintf("--secure-port=%d", port), - "--port=0", ) + if version.ConstraintK8sLessEqual122.Check(k.version) { + command = append(command, "--port=0") + } + if k.config != nil { command = append(command, kutil.FeatureGatesToCommandLineParameter(k.config.FeatureGates)) } diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/nodelocaldns/monitoring.go b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/nodelocaldns/monitoring.go new file mode 100644 index 000000000..8f72a1892 --- /dev/null +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/nodelocaldns/monitoring.go @@ -0,0 +1,102 @@ +// Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package nodelocaldns + +import ( + "strconv" + "strings" + + v1beta1constants "github.com/gardener/gardener/pkg/apis/core/v1beta1/constants" + "github.com/gardener/gardener/pkg/operation/botanist/component/kubeapiserver" +) + +const ( + monitoringPrometheusJobName = "node-local-dns" + + monitoringMetricBuildInfo = "coredns_build_info" + monitoringMetricCacheEntries = "coredns_cache_entries" + monitoringMetricCacheHitsTotal = "coredns_cache_hits_total" + monitoringMetricCacheMissesTotal = "coredns_cache_misses_total" + monitoringMetricDnsRequestDurationSecondsCount = "coredns_dns_request_duration_seconds_count" + monitoringMetricDnsRequestDurationSecondsBucket = "coredns_dns_request_duration_seconds_bucket" + monitoringMetricDnsResponsesTotal = "coredns_dns_responses_total" + monitoringMetricForwardRequestsTotal = "coredns_forward_requests_total" + monitoringMetricForwardResponsesTotal = "coredns_forward_responses_total" + monitoringMetricKubernetesDnsProgrammingDurationSecondsBucket = "coredns_kubernetes_dns_programming_duration_seconds_bucket" + monitoringMetricKubernetesDnsProgrammingDurationSecondsCount = "coredns_kubernetes_dns_programming_duration_seconds_count" + monitoringMetricKubernetesDnsProgrammingDurationSecondsSum = "coredns_kubernetes_dns_programming_duration_seconds_sum" + monitoringMetricProcessMaxFds = "process_max_fds" + monitoringMetricProcessOpenFds = "process_open_fds" +) + +var ( + monitoringAllowedMetrics = []string{ + monitoringMetricBuildInfo, + monitoringMetricCacheEntries, + monitoringMetricCacheHitsTotal, + monitoringMetricCacheMissesTotal, + monitoringMetricDnsRequestDurationSecondsCount, + monitoringMetricDnsRequestDurationSecondsBucket, + monitoringMetricDnsResponsesTotal, + monitoringMetricForwardRequestsTotal, + monitoringMetricForwardResponsesTotal, + monitoringMetricKubernetesDnsProgrammingDurationSecondsBucket, + monitoringMetricKubernetesDnsProgrammingDurationSecondsCount, + monitoringMetricKubernetesDnsProgrammingDurationSecondsSum, + monitoringMetricProcessMaxFds, + monitoringMetricProcessOpenFds, + } + + // TODO: Replace below hard-coded paths to Prometheus certificates once its deployment has been refactored. + monitoringScrapeConfig = `job_name: ` + monitoringPrometheusJobName + ` +scheme: https +honor_labels: false +kubernetes_sd_configs: +- role: pod + api_server: https://` + v1beta1constants.DeploymentNameKubeAPIServer + `:` + strconv.Itoa(kubeapiserver.Port) + ` +relabel_configs: +- source_labels: + - __meta_kubernetes_pod_name + action: keep + regex: node-local.* +- source_labels: + - __meta_kubernetes_pod_container_name + - __meta_kubernetes_pod_container_port_name + action: keep + regex: node-cache;metrics +- source_labels: [ __meta_kubernetes_pod_name ] + target_label: pod +- target_label: __address__ + replacement: ` + v1beta1constants.DeploymentNameKubeAPIServer + `:` + strconv.Itoa(kubeapiserver.Port) + ` +- source_labels: [__meta_kubernetes_pod_name,__meta_kubernetes_pod_container_port_number] + regex: (.+);(.+) + target_label: __metrics_path__ + replacement: /api/v1/namespaces/kube-system/pods/${1}:${2}/proxy/metrics +metric_relabel_configs: +- source_labels: [ __name__ ] + action: keep + regex: ^(` + strings.Join(monitoringAllowedMetrics, "|") + `)$ +` +) + +// ScrapeConfigs returns the scrape configurations for Prometheus. +func (c *nodeLocalDNS) ScrapeConfigs() ([]string, error) { + return []string{monitoringScrapeConfig}, nil +} + +// AlertingRules returns the alerting rules for AlertManager. +func (c *nodeLocalDNS) AlertingRules() (map[string]string, error) { + return nil, nil +} diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/nodelocaldns/nodelocaldns.go b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/nodelocaldns/nodelocaldns.go new file mode 100644 index 000000000..66c63c3bd --- /dev/null +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/nodelocaldns/nodelocaldns.go @@ -0,0 +1,561 @@ +// Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package nodelocaldns + +import ( + "context" + "strconv" + "time" + + gardencorev1beta1 "github.com/gardener/gardener/pkg/apis/core/v1beta1" + v1beta1constants "github.com/gardener/gardener/pkg/apis/core/v1beta1/constants" + resourcesv1alpha1 "github.com/gardener/gardener/pkg/apis/resources/v1alpha1" + "github.com/gardener/gardener/pkg/client/kubernetes" + "github.com/gardener/gardener/pkg/operation/botanist/component" + "github.com/gardener/gardener/pkg/resourcemanager/controller/garbagecollector/references" + kutil "github.com/gardener/gardener/pkg/utils/kubernetes" + "github.com/gardener/gardener/pkg/utils/managedresources" + + appsv1 "k8s.io/api/apps/v1" + autoscalingv1 "k8s.io/api/autoscaling/v1" + corev1 "k8s.io/api/core/v1" + policyv1beta1 "k8s.io/api/policy/v1beta1" + rbacv1 "k8s.io/api/rbac/v1" + "k8s.io/apimachinery/pkg/api/resource" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/intstr" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" + autoscalingv1beta2 "k8s.io/autoscaler/vertical-pod-autoscaler/pkg/apis/autoscaling.k8s.io/v1beta2" + "k8s.io/utils/pointer" + "sigs.k8s.io/controller-runtime/pkg/client" +) + +const ( + // IPVSAddress is the IPv4 address used by node-local-dns when IPVS is used. + IPVSAddress = "169.254.20.10" + // ManagedResourceName is the name of the ManagedResource containing the resource specifications. + ManagedResourceName = "shoot-core-node-local-dns" + + labelKey = "k8s-app" + labelValue = "node-local-dns" + // portServiceServer is the service port used for the DNS server. + portServiceServer = 53 + // portServer is the target port used for the DNS server. + portServer = 8053 + // prometheus configuration for node-local-dns + prometheusPort = 9253 + prometheusScrape = true + + domain = gardencorev1beta1.DefaultDomain + serviceName = "kube-dns-upstream" + livenessProbePort = 8080 + configDataKey = "Corefile" +) + +// Interface contains functions for a node-local-dns deployer. +type Interface interface { + component.DeployWaiter + component.MonitoringComponent +} + +// Values is a set of configuration values for the node-local-dns component. +type Values struct { + // Image is the container image used for node-local-dns. + Image string + // VPAEnabled marks whether VerticalPodAutoscaler is enabled for the shoot. + VPAEnabled bool + // ForceTcpToClusterDNS enforces upgrade to tcp connections for communication between node local and cluster dns. + ForceTcpToClusterDNS bool + // ForceTcpToUpstreamDNS enforces upgrade to tcp connections for communication between node local and upstream dns. + ForceTcpToUpstreamDNS bool + // ClusterDNS is the ClusterIP of kube-system/coredns Service + ClusterDNS string + // DNSServer is the ClusterIP of kube-system/coredns Service + DNSServer string +} + +// New creates a new instance of DeployWaiter for node-local-dns. +func New( + client client.Client, + namespace string, + values Values, +) Interface { + return &nodeLocalDNS{ + client: client, + namespace: namespace, + values: values, + } +} + +type nodeLocalDNS struct { + client client.Client + namespace string + values Values +} + +func (c *nodeLocalDNS) Deploy(ctx context.Context) error { + data, err := c.computeResourcesData() + if err != nil { + return err + } + return managedresources.CreateForShoot(ctx, c.client, c.namespace, ManagedResourceName, false, data) +} + +func (c *nodeLocalDNS) Destroy(ctx context.Context) error { + return managedresources.DeleteForShoot(ctx, c.client, c.namespace, ManagedResourceName) +} + +// TimeoutWaitForManagedResource is the timeout used while waiting for the ManagedResources to become healthy +// or deleted. +var TimeoutWaitForManagedResource = 2 * time.Minute + +func (c *nodeLocalDNS) Wait(ctx context.Context) error { + timeoutCtx, cancel := context.WithTimeout(ctx, TimeoutWaitForManagedResource) + defer cancel() + + return managedresources.WaitUntilHealthy(timeoutCtx, c.client, c.namespace, ManagedResourceName) +} + +func (c *nodeLocalDNS) WaitCleanup(ctx context.Context) error { + timeoutCtx, cancel := context.WithTimeout(ctx, TimeoutWaitForManagedResource) + defer cancel() + + return managedresources.WaitUntilDeleted(timeoutCtx, c.client, c.namespace, ManagedResourceName) +} + +func (c *nodeLocalDNS) computeResourcesData() (map[string][]byte, error) { + var ( + registry = managedresources.NewRegistry(kubernetes.ShootScheme, kubernetes.ShootCodec, kubernetes.ShootSerializer) + + serviceAccount = &corev1.ServiceAccount{ + ObjectMeta: metav1.ObjectMeta{ + Name: "node-local-dns", + Namespace: metav1.NamespaceSystem, + }, + AutomountServiceAccountToken: pointer.Bool(false), + } + + podSecurityPolicy = &policyv1beta1.PodSecurityPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Name: "gardener.kube-system.node-local-dns", + Labels: map[string]string{ + v1beta1constants.LabelApp: labelValue, + }, + }, + Spec: policyv1beta1.PodSecurityPolicySpec{ + AllowedHostPaths: []policyv1beta1.AllowedHostPath{ + { + PathPrefix: "/run/xtables.lock", + }, + }, + FSGroup: policyv1beta1.FSGroupStrategyOptions{ + Rule: policyv1beta1.FSGroupStrategyRunAsAny, + }, + HostNetwork: true, + HostPorts: []policyv1beta1.HostPortRange{ + { + Min: int32(53), + Max: int32(53), + }, + { + Min: prometheusPort, + Max: prometheusPort, + }, + }, + Privileged: true, + RunAsUser: policyv1beta1.RunAsUserStrategyOptions{ + Rule: policyv1beta1.RunAsUserStrategyRunAsAny, + }, + SELinux: policyv1beta1.SELinuxStrategyOptions{ + Rule: policyv1beta1.SELinuxStrategyRunAsAny, + }, + SupplementalGroups: policyv1beta1.SupplementalGroupsStrategyOptions{ + Rule: policyv1beta1.SupplementalGroupsStrategyRunAsAny, + }, + Volumes: []policyv1beta1.FSType{ + "secret", + "hostPath", + "configMap", + }, + }, + } + + clusterRole = &rbacv1.ClusterRole{ + ObjectMeta: metav1.ObjectMeta{ + Name: "gardener.cloud:psp:kube-system:node-local-dns", + Labels: map[string]string{ + v1beta1constants.LabelApp: labelValue, + }, + }, + Rules: []rbacv1.PolicyRule{ + { + APIGroups: []string{"policy", "extensions"}, + ResourceNames: []string{podSecurityPolicy.Name}, + Resources: []string{"podsecuritypolicies"}, + Verbs: []string{"use"}, + }, + }, + } + + roleBinding = &rbacv1.RoleBinding{ + ObjectMeta: metav1.ObjectMeta{ + Name: "gardener.cloud:psp:node-local-dns", + Namespace: metav1.NamespaceSystem, + Labels: map[string]string{ + v1beta1constants.LabelApp: labelValue, + }, + Annotations: map[string]string{resourcesv1alpha1.DeleteOnInvalidUpdate: "true"}, + }, + RoleRef: rbacv1.RoleRef{ + APIGroup: rbacv1.GroupName, + Kind: "ClusterRole", + Name: clusterRole.Name, + }, + Subjects: []rbacv1.Subject{{ + Kind: rbacv1.ServiceAccountKind, + Name: serviceAccount.Name, + Namespace: serviceAccount.Namespace, + }}, + } + + configMap = &corev1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Name: "node-local-dns", + Namespace: metav1.NamespaceSystem, + }, + Data: map[string]string{ + configDataKey: domain + `:53 { + errors + cache { + success 9984 30 + denial 9984 5 + } + reload + loop + bind ` + c.bindIP() + ` + forward . ` + c.values.ClusterDNS + ` { + ` + c.forceTcpToClusterDNS() + ` + } + prometheus :` + strconv.Itoa(prometheusPort) + ` + health ` + IPVSAddress + `:` + strconv.Itoa(livenessProbePort) + ` + } +in-addr.arpa:53 { + errors + cache 30 + reload + loop + bind ` + c.bindIP() + ` + forward . ` + c.values.ClusterDNS + ` { + ` + c.forceTcpToClusterDNS() + ` + } + prometheus :` + strconv.Itoa(prometheusPort) + ` + } +ip6.arpa:53 { + errors + cache 30 + reload + loop + bind ` + c.bindIP() + ` + forward . ` + c.values.ClusterDNS + ` { + ` + c.forceTcpToClusterDNS() + ` + } + prometheus :` + strconv.Itoa(prometheusPort) + ` + } +.:53 { + errors + cache 30 + reload + loop + bind ` + c.bindIP() + ` + forward . __PILLAR__UPSTREAM__SERVERS__ { + ` + c.forceTcpToUpstreamDNS() + ` + } + prometheus :` + strconv.Itoa(prometheusPort) + ` + } +`, + }, + } + ) + utilruntime.Must(kutil.MakeUnique(configMap)) + + var ( + service = &corev1.Service{ + ObjectMeta: metav1.ObjectMeta{ + Name: serviceName, + Namespace: metav1.NamespaceSystem, + Labels: map[string]string{ + "k8s-app": "kube-dns-upstream", + }, + }, + Spec: corev1.ServiceSpec{ + Selector: map[string]string{"k8s-app": "kube-dns"}, + Ports: []corev1.ServicePort{ + { + Name: "dns", + Port: int32(portServiceServer), + TargetPort: intstr.FromInt(portServer), + Protocol: corev1.ProtocolUDP, + }, + { + Name: "dns-tcp", + Port: int32(portServiceServer), + TargetPort: intstr.FromInt(portServer), + Protocol: corev1.ProtocolTCP, + }, + }, + }, + } + + maxUnavailable = intstr.FromString("10%") + hostPathFileOrCreate = corev1.HostPathFileOrCreate + daemonSet = &appsv1.DaemonSet{ + ObjectMeta: metav1.ObjectMeta{ + Name: "node-local-dns", + Namespace: metav1.NamespaceSystem, + Labels: map[string]string{ + labelKey: labelValue, + v1beta1constants.GardenRole: v1beta1constants.GardenRoleSystemComponent, + managedresources.LabelKeyOrigin: managedresources.LabelValueGardener, + }, + }, + Spec: appsv1.DaemonSetSpec{ + UpdateStrategy: appsv1.DaemonSetUpdateStrategy{ + RollingUpdate: &appsv1.RollingUpdateDaemonSet{ + MaxUnavailable: &maxUnavailable, + }, + }, + Selector: &metav1.LabelSelector{ + MatchLabels: map[string]string{ + labelKey: labelValue, + }, + }, + Template: corev1.PodTemplateSpec{ + ObjectMeta: metav1.ObjectMeta{ + Labels: map[string]string{ + labelKey: labelValue, + v1beta1constants.LabelNetworkPolicyToDNS: "allowed", + }, + Annotations: map[string]string{ + "prometheus.io/port": strconv.Itoa(prometheusPort), + "prometheus.io/scrape": strconv.FormatBool(prometheusScrape), + // TODO(rfranzke): Remove in a future release. + "security.gardener.cloud/trigger": "rollout", + }, + }, + Spec: corev1.PodSpec{ + PriorityClassName: "system-node-critical", + ServiceAccountName: serviceAccount.Name, + HostNetwork: true, + DNSPolicy: corev1.DNSDefault, + Tolerations: []corev1.Toleration{ + { + Key: "CriticalAddonsOnly", + Operator: corev1.TolerationOpExists, + }, + { + Operator: corev1.TolerationOpExists, + Effect: corev1.TaintEffectNoExecute, + }, + { + Operator: corev1.TolerationOpExists, + Effect: corev1.TaintEffectNoSchedule, + }, + }, + Containers: []corev1.Container{ + { + Name: "node-cache", + Image: c.values.Image, + Resources: corev1.ResourceRequirements{ + Requests: corev1.ResourceList{ + corev1.ResourceCPU: resource.MustParse("25m"), + corev1.ResourceMemory: resource.MustParse("25Mi"), + }, + Limits: corev1.ResourceList{ + corev1.ResourceCPU: resource.MustParse("100m"), + corev1.ResourceMemory: resource.MustParse("100Mi"), + }, + }, + Args: []string{ + "-localip", + c.containerArg(), + "-conf", + "/etc/Corefile", + "-upstreamsvc", + serviceName, + }, + SecurityContext: &corev1.SecurityContext{ + Privileged: pointer.Bool(true), + }, + Ports: []corev1.ContainerPort{ + { + ContainerPort: int32(53), + Name: "dns", + Protocol: corev1.ProtocolUDP, + }, + { + ContainerPort: int32(53), + Name: "dns-tcp", + Protocol: corev1.ProtocolTCP, + }, + { + ContainerPort: int32(prometheusPort), + Name: "metrics", + Protocol: corev1.ProtocolTCP, + }, + }, + LivenessProbe: &corev1.Probe{ + Handler: corev1.Handler{ + HTTPGet: &corev1.HTTPGetAction{ + Host: IPVSAddress, + Path: "/health", + Port: intstr.FromInt(livenessProbePort), + }, + }, + InitialDelaySeconds: int32(60), + TimeoutSeconds: int32(5), + }, + VolumeMounts: []corev1.VolumeMount{ + { + MountPath: "/run/xtables.lock", + Name: "xtables-lock", + ReadOnly: false, + }, + { + MountPath: "/etc/coredns", + Name: "config-volume", + }, + { + MountPath: "/etc/kube-dns", + Name: "kube-dns-config", + }, + }, + }, + }, + Volumes: []corev1.Volume{ + { + Name: "xtables-lock", + VolumeSource: corev1.VolumeSource{ + HostPath: &corev1.HostPathVolumeSource{ + Path: "/run/xtables.lock", + Type: &hostPathFileOrCreate, + }, + }, + }, + { + Name: "kube-dns-config", + VolumeSource: corev1.VolumeSource{ + ConfigMap: &corev1.ConfigMapVolumeSource{ + LocalObjectReference: corev1.LocalObjectReference{ + Name: "kube-dns", + }, + Optional: pointer.Bool(true), + }, + }, + }, + { + Name: "config-volume", + VolumeSource: corev1.VolumeSource{ + ConfigMap: &corev1.ConfigMapVolumeSource{ + LocalObjectReference: corev1.LocalObjectReference{ + Name: configMap.Name, + }, + Items: []corev1.KeyToPath{ + { + Key: configDataKey, + Path: "Corefile.base", + }, + }, + }, + }, + }, + }, + }, + }, + }, + } + vpa *autoscalingv1beta2.VerticalPodAutoscaler + ) + utilruntime.Must(references.InjectAnnotations(daemonSet)) + + if c.values.VPAEnabled { + vpaUpdateMode := autoscalingv1beta2.UpdateModeAuto + vpa = &autoscalingv1beta2.VerticalPodAutoscaler{ + ObjectMeta: metav1.ObjectMeta{ + Name: "node-local-dns", + Namespace: metav1.NamespaceSystem, + }, + Spec: autoscalingv1beta2.VerticalPodAutoscalerSpec{ + TargetRef: &autoscalingv1.CrossVersionObjectReference{ + APIVersion: appsv1.SchemeGroupVersion.String(), + Kind: "DaemonSet", + Name: daemonSet.Name, + }, + UpdatePolicy: &autoscalingv1beta2.PodUpdatePolicy{ + UpdateMode: &vpaUpdateMode, + }, + ResourcePolicy: &autoscalingv1beta2.PodResourcePolicy{ + ContainerPolicies: []autoscalingv1beta2.ContainerResourcePolicy{ + { + ContainerName: autoscalingv1beta2.DefaultContainerResourcePolicy, + MinAllowed: corev1.ResourceList{ + corev1.ResourceCPU: resource.MustParse("10m"), + corev1.ResourceMemory: resource.MustParse("20Mi"), + }, + }, + }, + }, + }, + } + } + + return registry.AddAllAndSerialize( + serviceAccount, + podSecurityPolicy, + clusterRole, + roleBinding, + configMap, + service, + daemonSet, + vpa, + ) +} + +func (c *nodeLocalDNS) bindIP() string { + if c.values.DNSServer != "" { + return IPVSAddress + " " + c.values.DNSServer + } + return IPVSAddress +} + +func (c *nodeLocalDNS) containerArg() string { + if c.values.DNSServer != "" { + return IPVSAddress + "," + c.values.DNSServer + } + return IPVSAddress +} + +func (c *nodeLocalDNS) forceTcpToClusterDNS() string { + if c.values.ForceTcpToClusterDNS { + return "force_tcp" + } + return "prefer_udp" +} + +func (c *nodeLocalDNS) forceTcpToUpstreamDNS() string { + if c.values.ForceTcpToUpstreamDNS { + return "force_tcp" + } + return "prefer_udp" +} diff --git a/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/nodeproblemdetector/logging.go b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/nodeproblemdetector/logging.go new file mode 100644 index 000000000..de31ec084 --- /dev/null +++ b/vendor/github.com/gardener/gardener/pkg/operation/botanist/component/nodeproblemdetector/logging.go @@ -0,0 +1,42 @@ +// Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package nodeproblemdetector + +import ( + "github.com/gardener/gardener/pkg/operation/botanist/component" +) + +const ( + loggingParserName = "nodeProblemDetector" + loggingParser = `[PARSER] + Name ` + loggingParserName + ` + Format regex + Regex ^(?\w)(?