diff --git a/go.mod b/go.mod index d056fe0b..84363385 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.20 require ( github.com/GehirnInc/crypt v0.0.0-20200316065508-bb7000b8a962 - github.com/UffizziCloud/uffizzi-cluster-operator v1.3.6 + github.com/UffizziCloud/uffizzi-cluster-operator v1.3.7 github.com/a8m/envsubst v1.3.0 github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de @@ -51,6 +51,7 @@ require ( github.com/imdario/mergo v0.3.13 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect + github.com/kr/pretty v0.3.1 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect diff --git a/go.sum b/go.sum index c5980496..46f3a27c 100644 --- a/go.sum +++ b/go.sum @@ -58,16 +58,36 @@ github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAE github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= -github.com/UffizziCloud/uffizzi-cluster-operator v0.0.14 h1:Of3aMbd+WvAeyOII3jQ3lrHpGit4d2593Ibdk9DOe1o= -github.com/UffizziCloud/uffizzi-cluster-operator v0.0.14/go.mod h1:jSyAkV5svJYybuvNpfxfZxsgNzeU8mR/iEBEm1TBoMk= -github.com/UffizziCloud/uffizzi-cluster-operator v0.0.22 h1:VVdruAW/bgfx5Q/FYg+mKq5+sMrXIOzoU85CsD/Cvc0= -github.com/UffizziCloud/uffizzi-cluster-operator v0.0.22/go.mod h1:jSyAkV5svJYybuvNpfxfZxsgNzeU8mR/iEBEm1TBoMk= -github.com/UffizziCloud/uffizzi-cluster-operator v0.1.1 h1:clc9OS18kiICmHoqoQ/Sw9nRvW5Jq1UL6ZZMGADvMp8= -github.com/UffizziCloud/uffizzi-cluster-operator v0.1.1/go.mod h1:jSyAkV5svJYybuvNpfxfZxsgNzeU8mR/iEBEm1TBoMk= -github.com/UffizziCloud/uffizzi-cluster-operator v1.2.0 h1:HtjcIwo5Pa8Yu5jZob1yMhIRB5zAXsPRipt90O06qhE= -github.com/UffizziCloud/uffizzi-cluster-operator v1.2.0/go.mod h1:jSyAkV5svJYybuvNpfxfZxsgNzeU8mR/iEBEm1TBoMk= -github.com/UffizziCloud/uffizzi-cluster-operator v1.3.6 h1:O+0YkhxZ+RkGfIqjNDPFR6AoevezfpxOQ2/l8RoIGVM= -github.com/UffizziCloud/uffizzi-cluster-operator v1.3.6/go.mod h1:jSyAkV5svJYybuvNpfxfZxsgNzeU8mR/iEBEm1TBoMk= +github.com/UffizziCloud/uffizzi-cluster-operator v1.3.4-0.20230928114948-586105468212 h1:FD7uJc28MIbwneTpdN3btGt20+wo+iELSOfEgBK4OtQ= +github.com/UffizziCloud/uffizzi-cluster-operator v1.3.4-0.20230928114948-586105468212/go.mod h1:jSyAkV5svJYybuvNpfxfZxsgNzeU8mR/iEBEm1TBoMk= +github.com/UffizziCloud/uffizzi-cluster-operator v1.3.4-0.20230928123635-b13b65bb0a30 h1:J60RTX0b13hJcl5oTZPgYnSiT+8wrsiGHqfyAr9nrQc= +github.com/UffizziCloud/uffizzi-cluster-operator v1.3.4-0.20230928123635-b13b65bb0a30/go.mod h1:jSyAkV5svJYybuvNpfxfZxsgNzeU8mR/iEBEm1TBoMk= +github.com/UffizziCloud/uffizzi-cluster-operator v1.3.4-0.20231002162628-89f4fb7d6bde h1:hDNo/zQl+dtazAYbFz0OLIZ/kksXfSjcA9JPeFK3Dj0= +github.com/UffizziCloud/uffizzi-cluster-operator v1.3.4-0.20231002162628-89f4fb7d6bde/go.mod h1:jSyAkV5svJYybuvNpfxfZxsgNzeU8mR/iEBEm1TBoMk= +github.com/UffizziCloud/uffizzi-cluster-operator v1.3.4-0.20231002163316-399c6463a97a h1:2b+LgXG83Y34/v2fLcfqi+wp96AmqP58lgitMkluuFA= +github.com/UffizziCloud/uffizzi-cluster-operator v1.3.4-0.20231002163316-399c6463a97a/go.mod h1:jSyAkV5svJYybuvNpfxfZxsgNzeU8mR/iEBEm1TBoMk= +github.com/UffizziCloud/uffizzi-cluster-operator v1.3.4-0.20231002163613-203cb90583c9 h1:YzqUuS6a/vE9oQMHG6xgA/QR4LmoEPDwaXIzMO6KCNw= +github.com/UffizziCloud/uffizzi-cluster-operator v1.3.4-0.20231002163613-203cb90583c9/go.mod h1:jSyAkV5svJYybuvNpfxfZxsgNzeU8mR/iEBEm1TBoMk= +github.com/UffizziCloud/uffizzi-cluster-operator v1.3.4-0.20231002163917-49b36f64dd5f h1:FAJW2nWY/ukY58Tn/gaclOHRU4YxCtgCRsRtmUa+tc0= +github.com/UffizziCloud/uffizzi-cluster-operator v1.3.4-0.20231002163917-49b36f64dd5f/go.mod h1:jSyAkV5svJYybuvNpfxfZxsgNzeU8mR/iEBEm1TBoMk= +github.com/UffizziCloud/uffizzi-cluster-operator v1.3.4-0.20231002164131-99cfcd8f3499 h1:cmZ31mw6iMNHibRfxrN0z1xLF9RbJNCdAvEutVgQT/Y= +github.com/UffizziCloud/uffizzi-cluster-operator v1.3.4-0.20231002164131-99cfcd8f3499/go.mod h1:jSyAkV5svJYybuvNpfxfZxsgNzeU8mR/iEBEm1TBoMk= +github.com/UffizziCloud/uffizzi-cluster-operator v1.3.4-0.20231002164556-9ef1785174fc h1:2T+Us7FdB95SlVXfTL7ixf1UlsWDVCe65ifMixG0l5E= +github.com/UffizziCloud/uffizzi-cluster-operator v1.3.4-0.20231002164556-9ef1785174fc/go.mod h1:jSyAkV5svJYybuvNpfxfZxsgNzeU8mR/iEBEm1TBoMk= +github.com/UffizziCloud/uffizzi-cluster-operator v1.3.4-0.20231004095707-dce1307e95e3 h1:pwkgrj4Wn3l3c62BF/WjAlJPsJTzawFnXOZUcX1WlU8= +github.com/UffizziCloud/uffizzi-cluster-operator v1.3.4-0.20231004095707-dce1307e95e3/go.mod h1:jSyAkV5svJYybuvNpfxfZxsgNzeU8mR/iEBEm1TBoMk= +github.com/UffizziCloud/uffizzi-cluster-operator v1.3.4-0.20231004103042-a25872c445f1 h1:w1k8hwlMvZVxEhLU6h0ANe+uOFam1z9pUdjHOlJGFUE= +github.com/UffizziCloud/uffizzi-cluster-operator v1.3.4-0.20231004103042-a25872c445f1/go.mod h1:jSyAkV5svJYybuvNpfxfZxsgNzeU8mR/iEBEm1TBoMk= +github.com/UffizziCloud/uffizzi-cluster-operator v1.3.4-0.20231004103609-f3e9ae0069ad h1:0MnKRxLSyFyFiQcZ6Hu0TPdQiOgLXemNDNIQaGgEFog= +github.com/UffizziCloud/uffizzi-cluster-operator v1.3.4-0.20231004103609-f3e9ae0069ad/go.mod h1:jSyAkV5svJYybuvNpfxfZxsgNzeU8mR/iEBEm1TBoMk= +github.com/UffizziCloud/uffizzi-cluster-operator v1.3.4-0.20231004104447-e2deda46f44b h1:Iukt3xEJ098V4PKAKLZd5nKKaK9668jIQz4V6lCh7GQ= +github.com/UffizziCloud/uffizzi-cluster-operator v1.3.4-0.20231004104447-e2deda46f44b/go.mod h1:jSyAkV5svJYybuvNpfxfZxsgNzeU8mR/iEBEm1TBoMk= +github.com/UffizziCloud/uffizzi-cluster-operator v1.3.4-0.20231004105442-e95df579aad0 h1:v9BiCzZhTt/DepI8BrdtGr8oC4O6uVuDttFP2/g9VnY= +github.com/UffizziCloud/uffizzi-cluster-operator v1.3.4-0.20231004105442-e95df579aad0/go.mod h1:jSyAkV5svJYybuvNpfxfZxsgNzeU8mR/iEBEm1TBoMk= +github.com/UffizziCloud/uffizzi-cluster-operator v1.3.4-0.20231004151549-6c665d9db0e6 h1:+l2lripSMjRbpPQyUjaSKdILfC+k/59iO3ZS0I5XN0M= +github.com/UffizziCloud/uffizzi-cluster-operator v1.3.4-0.20231004151549-6c665d9db0e6/go.mod h1:jSyAkV5svJYybuvNpfxfZxsgNzeU8mR/iEBEm1TBoMk= +github.com/UffizziCloud/uffizzi-cluster-operator v1.3.7 h1:DxJ2MhGfc8D3t9mV9HydkSWXrc6tRV/ZuDhIHQqRUyE= +github.com/UffizziCloud/uffizzi-cluster-operator v1.3.7/go.mod h1:jSyAkV5svJYybuvNpfxfZxsgNzeU8mR/iEBEm1TBoMk= github.com/a8m/envsubst v1.3.0 h1:GmXKmVssap0YtlU3E230W98RWtWCyIZzjtf1apWWyAg= github.com/a8m/envsubst v1.3.0/go.mod h1:MVUTQNGQ3tsjOOtKCNd+fl8RzhsXcDvvAEzkhGtlsbY= github.com/agiledragon/gomonkey/v2 v2.3.1 h1:k+UnUY0EMNYUFUAQVETGY9uUTxjMdnUkP0ARyJS1zzs= @@ -326,7 +346,8 @@ github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgo github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -396,6 +417,7 @@ github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/9 github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -413,6 +435,7 @@ github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -585,8 +608,6 @@ golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1 golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.11.0 h1:Gi2tvZIJyBtO9SDr1q9h5hEQCp/4L2RQ+ar0qjx2oNU= -golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ= golang.org/x/net v0.12.0 h1:cfawfvKITfUsFCeJIHJrbSxpeu/E81khclypR0GVT50= golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -671,14 +692,10 @@ golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s= -golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA= golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.9.0 h1:GRRCnKYhdQrD8kfRAdQ6Zcw1P0OcELxGLKJvtjVMZ28= -golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo= golang.org/x/term v0.10.0 h1:3R7pNqamzBraeqj/Tj8qt1aQ2HpmlC+Cx/qL/7hn4/c= golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -690,8 +707,6 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.10.0 h1:UpjohKhiEgNc0CSauXmwYftY1+LlaC75SJwh0SgCX58= -golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4= golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -913,8 +928,6 @@ k8s.io/api v0.27.2/go.mod h1:ENmbocXfBT2ADujUXcBhHV55RIT31IIEvkntP6vZKS4= k8s.io/apiextensions-apiserver v0.27.2 h1:iwhyoeS4xj9Y7v8YExhUwbVuBhMr3Q4bd/laClBV6Bo= k8s.io/apiextensions-apiserver v0.27.2/go.mod h1:Oz9UdvGguL3ULgRdY9QMUzL2RZImotgxvGjdWRq6ZXQ= k8s.io/apimachinery v0.23.3/go.mod h1:BEuFMMBaIbcOqVIJqNZJXGFTP4W6AycEpb5+m/97hrM= -k8s.io/apimachinery v0.27.3 h1:Ubye8oBufD04l9QnNtW05idcOe9Z3GQN8+7PqmuVcUM= -k8s.io/apimachinery v0.27.3/go.mod h1:XNfZ6xklnMCOGGFNqXG7bUrQCoR04dh/E7FprV6pb+E= k8s.io/apimachinery v0.27.4 h1:CdxflD4AF61yewuid0fLl6bM4a3q04jWel0IlP+aYjs= k8s.io/apimachinery v0.27.4/go.mod h1:XNfZ6xklnMCOGGFNqXG7bUrQCoR04dh/E7FprV6pb+E= k8s.io/client-go v0.23.3/go.mod h1:47oMd+YvAOqZM7pcQ6neJtBiFH7alOyfunYN48VsmwE= @@ -936,8 +949,6 @@ k8s.io/metrics v0.23.3 h1:rX/RBOwqi0atFlTSlpbQ7CX5s/kfqGR9zEefCx9Rv1s= k8s.io/metrics v0.23.3/go.mod h1:Ut8TvkbsO4oMVeUzaTArvPrcw9QRFLs2XNzUlORjdYE= k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20211116205334-6203023598ed/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20230505201702-9f6742963106 h1:EObNQ3TW2D+WptiYXlApGNLVy0zm/JIBVY9i+M4wpAU= -k8s.io/utils v0.0.0-20230505201702-9f6742963106/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= @@ -950,8 +961,6 @@ sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMm sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= sigs.k8s.io/structured-merge-diff/v4 v4.3.0 h1:UZbZAZfX0wV2zr7YZorDz6GXROfDFj6LvqCRm4VUVKk= sigs.k8s.io/structured-merge-diff/v4 v4.3.0/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/infrastructure/toolbox/Dockerfile b/infrastructure/toolbox/Dockerfile index 5741dfcc..05cf5748 100644 --- a/infrastructure/toolbox/Dockerfile +++ b/infrastructure/toolbox/Dockerfile @@ -24,6 +24,7 @@ RUN apk add --no-cache \ RUN pip3 install --upgrade pip RUN pip3 install "urllib3<1.25" RUN pip3 install pyrsistent==0.16.1 +RUN pip3 install "cython<3.0.0" wheel && pip install pyyaml==5.4.1 --no-build-isolation RUN pip3 install docker-compose RUN echo "cryptography==3.3.2" > /tmp/requirements.txt \ && pip3 install -U docker-compose -r /tmp/requirements.txt \ diff --git a/internal/clients/kuber/cluster.go b/internal/clients/kuber/cluster.go index 6fd0a6c1..92b66fa1 100644 --- a/internal/clients/kuber/cluster.go +++ b/internal/clients/kuber/cluster.go @@ -15,6 +15,7 @@ func (client *Client) CreateCluster( clusterSpec := clientsetUffizziClusterV1.UffizziClusterProps{ Name: clusterParams.Name, Spec: v1alpha1.UffizziClusterSpec{ + Sleep: false, Manifests: &clusterParams.Manifest, Ingress: v1alpha1.UffizziClusterIngress{ Host: clusterParams.BaseIngressHost, @@ -31,6 +32,26 @@ func (client *Client) CreateCluster( return client.uffizziClusterClient.UffizziClusterV1(namespace).Create(clusterSpec) } +func (client *Client) PatchCluster( + clusterName string, + namespaceName string, + patchClusterParams domainTypes.PatchClusterParams, +) error { + clusterSpec := clientsetUffizziClusterV1.PatchUffizziClusterProps{ + Spec: v1alpha1.UffizziClusterSpec{ + Manifests: &patchClusterParams.Manifest, + Ingress: v1alpha1.UffizziClusterIngress{ + Host: patchClusterParams.BaseIngressHost, + }, + ResourceQuota: &patchClusterParams.ResourceSettings.ResourceQuota, + LimitRange: &patchClusterParams.ResourceSettings.LimitRange, + Sleep: patchClusterParams.Sleep, + }, + } + + return client.uffizziClusterClient.UffizziClusterV1(namespaceName).Patch(clusterName, clusterSpec) +} + func (client *Client) GetCluster( name string, namespace string, diff --git a/internal/domain_logic/cluster.go b/internal/domain_logic/cluster.go index 11792a6f..823a87f1 100644 --- a/internal/domain_logic/cluster.go +++ b/internal/domain_logic/cluster.go @@ -2,11 +2,12 @@ package domain import ( "encoding/base64" - + "fmt" "log" "github.com/UffizziCloud/uffizzi-cluster-operator/api/v1alpha1" types "gitlab.com/dualbootpartners/idyl/uffizzi_controller/internal/types/domain" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) func (l *Logic) mapUffizziClusterToCluster( @@ -18,10 +19,13 @@ func (l *Logic) mapUffizziClusterToCluster( UID: string(ufizziCluster.ObjectMeta.UID), } - status := clusterStatus(ufizziCluster) - cluster.Status.Ready = status + readyStatus := isClusterReady(ufizziCluster) + cluster.Status.Ready = readyStatus + + sleepStatus := isClusterAsleep(ufizziCluster) + cluster.Status.Sleep = sleepStatus - if !status { + if !readyStatus { return cluster } @@ -83,6 +87,7 @@ func (l *Logic) GetCluster( clusterName, namespace.Name, ) + if err != nil { log.Printf("ClusterError: %s", err) return nil, err @@ -93,14 +98,69 @@ func (l *Logic) GetCluster( return cluster, err } -func clusterStatus(ufizziCluster *v1alpha1.UffizziCluster) bool { +func (l *Logic) PatchCluster( + clusterName string, + namespaceName string, + patchClusterParams types.PatchClusterParams, +) error { + namespace, err := l.KuberClient.FindNamespace(namespaceName) + + if err != nil { + return err + } + + log.Printf("namespace/%s found", namespace.Name) + + err = l.KuberClient.PatchCluster( + clusterName, + namespaceName, + patchClusterParams, + ) + + if err != nil { + log.Printf("ClusterError: %s", err) + return err + } + + return nil +} + +func isClusterReady(ufizziCluster *v1alpha1.UffizziCluster) bool { if len(ufizziCluster.Status.Conditions) == 0 { return false } - if ufizziCluster.Status.Conditions[0].Status == "False" { + readyCondition, err := getConditionByName(ufizziCluster.Status.Conditions, "APIReady") + + if err != nil { + log.Printf("ClusterError: %s", err) + return false + } + + return readyCondition.Status == "True" +} + +func isClusterAsleep(ufizziCluster *v1alpha1.UffizziCluster) bool { + if len(ufizziCluster.Status.Conditions) == 0 { + return false + } + + sleepCondition, err := getConditionByName(ufizziCluster.Status.Conditions, "Sleep") + + if err != nil { + log.Printf("ClusterError: %s", err) return false - } else { - return true } + + return sleepCondition.Status == "True" +} + +func getConditionByName(conditions []metav1.Condition, conditionType string) (metav1.Condition, error) { + for _, condition := range conditions { + if condition.Type == conditionType { + return condition, nil + } + } + + return conditions[0], fmt.Errorf("Status with type %v not found", conditionType) } diff --git a/internal/http/clusters.go b/internal/http/clusters.go index 3f6f8956..6f31e36e 100644 --- a/internal/http/clusters.go +++ b/internal/http/clusters.go @@ -56,7 +56,7 @@ func (h *Handlers) handleCreateCluster(w http.ResponseWriter, r *http.Request) { // @Response 403 "Incorrect Token for HTTP Basic Auth" // @Security BasicAuth // @Produce plain -// @Router /namespaces/{namespace}/cluster [get] +// @Router /namespaces/{namespace}/cluster/{name} [get] func (h *Handlers) handleGetCluster(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) @@ -77,3 +77,42 @@ func (h *Handlers) handleGetCluster(w http.ResponseWriter, r *http.Request) { respondWithJSON(w, r, http.StatusOK, cluster) } + +// @Description Update a virtual cluster within a Namespace. +// @Param namespace path string true "unique Uffizzi Namespace" +// @Param name path string true "Uffizzi Virtual Cluster Name" +// @Success 200 "OK" +// @Failure 500 "most errors including Not Found" +// @Response 403 "Incorrect Token for HTTP Basic Auth" +// @Security BasicAuth +// @Produce plain +// @Router /namespaces/{namespace}/cluster/{name} [put] +func (h *Handlers) handlePatchCluster(w http.ResponseWriter, r *http.Request) { + vars := mux.Vars(r) + + namespaceName := vars["namespace"] + name := vars["name"] + + localHub := sentry.CurrentHub().Clone() + localHub.ConfigureScope(func(scope *sentry.Scope) { + scope.SetTag("namespace", fmt.Sprint(namespaceName)) + }) + + var patchClusterParams domainTypes.PatchClusterParams + + err := json.NewDecoder(r.Body).Decode(&patchClusterParams) + if err != nil { + handleError(err, w, r) + return + } + + log.Printf("Decoded HTTP Request: %+v", patchClusterParams) + + err = domainLogic.PatchCluster(name, namespaceName, patchClusterParams) + + if err != nil { + handleDomainError("domainLogic.PatchCluster", err, localHub) + } + + respondWithJSON(w, r, http.StatusOK, nil) +} diff --git a/internal/http/routes.go b/internal/http/routes.go index fe9e9261..a19af5cc 100644 --- a/internal/http/routes.go +++ b/internal/http/routes.go @@ -34,5 +34,6 @@ func drawRoutes(r *mux.Router, h *Handlers) { r.HandleFunc("/namespaces/{namespace}/cluster", h.handleCreateCluster).Methods(http.MethodPost) r.HandleFunc("/namespaces/{namespace}/cluster/{name}", h.handleGetCluster).Methods(http.MethodGet) r.HandleFunc("/namespaces/{namespace}/ingresses", h.handleGetNamespaceIngresses).Methods(http.MethodGet) + r.HandleFunc("/namespaces/{namespace}/cluster/{name}", h.handlePatchCluster).Methods(http.MethodPatch) r.PathPrefix("/docs/").Handler(httpSwagger.WrapHandler) } diff --git a/internal/types/domain/cluster.go b/internal/types/domain/cluster.go index 516b2a64..15951630 100644 --- a/internal/types/domain/cluster.go +++ b/internal/types/domain/cluster.go @@ -10,6 +10,7 @@ type Cluster struct { UID string `json:"uid"` Status struct { Ready bool `json:"ready"` + Sleep bool `json:"sleep"` KubeConfig string `json:"kubeConfig"` Host string `json:"host"` } `json:"status"` @@ -24,6 +25,13 @@ type ClusterParams struct { Image string `json:"image"` } +type PatchClusterParams struct { + Manifest string `json:"manifest"` + BaseIngressHost string `json:"base_ingress_host"` + ResourceSettings ClusterResourceSettings `json:"resource_settings"` + Sleep bool `json:"sleep"` +} + type ClusterResourceSettings struct { ResourceQuota v1alpha1.UffizziClusterResourceQuota `json:"resourceQuota,omitempty"` LimitRange v1alpha1.UffizziClusterLimitRange `json:"limitRange,omitempty"`