diff --git a/go.mod b/go.mod index afaca76..975ae73 100644 --- a/go.mod +++ b/go.mod @@ -10,9 +10,9 @@ require ( github.com/google/go-containerregistry v0.12.0 github.com/moby/buildkit v0.11.3 github.com/stretchr/testify v1.8.0 - golang.org/x/sync v0.1.0 - google.golang.org/grpc v1.50.1 - google.golang.org/protobuf v1.28.1 + golang.org/x/sync v0.7.0 + google.golang.org/grpc v1.65.0 + google.golang.org/protobuf v1.34.1 gopkg.in/yaml.v3 v3.0.1 k8s.io/api v0.22.5 k8s.io/apimachinery v0.22.5 @@ -38,8 +38,8 @@ require ( github.com/gofrs/flock v0.8.1 // indirect github.com/gogo/googleapis v1.4.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/protobuf v1.5.2 // indirect - github.com/google/go-cmp v0.5.9 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/google/gofuzz v1.2.0 // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect github.com/googleapis/gnostic v0.5.5 // indirect @@ -71,16 +71,15 @@ require ( go.opentelemetry.io/otel/sdk v1.4.1 // indirect go.opentelemetry.io/otel/trace v1.4.1 // indirect go.opentelemetry.io/proto/otlp v0.12.0 // indirect - golang.org/x/crypto v0.2.0 // indirect - golang.org/x/mod v0.6.0 // indirect - golang.org/x/net v0.7.0 // indirect - golang.org/x/oauth2 v0.1.0 // indirect - golang.org/x/sys v0.5.0 // indirect - golang.org/x/term v0.5.0 // indirect - golang.org/x/text v0.7.0 // indirect + golang.org/x/crypto v0.23.0 // indirect + golang.org/x/mod v0.8.0 // indirect + golang.org/x/net v0.25.0 // indirect + golang.org/x/oauth2 v0.20.0 // indirect + golang.org/x/sys v0.20.0 // indirect + golang.org/x/term v0.20.0 // indirect + golang.org/x/text v0.15.0 // indirect golang.org/x/time v0.1.0 // indirect - golang.org/x/tools v0.1.12 // indirect - google.golang.org/appengine v1.6.7 // indirect + golang.org/x/tools v0.6.0 // indirect google.golang.org/genproto v0.0.0-20220706185917-7780775163c4 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/go.sum b/go.sum index 8b239b4..20cfa8c 100644 --- a/go.sum +++ b/go.sum @@ -74,6 +74,7 @@ github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20240423153145-555b57ec207b h1:ga8SEFjZ60pxLcmhnThWgvH2wg8376yUJmPhEH4H3kw= github.com/containerd/cgroups v1.0.4 h1:jN/mbWBEaz+T1pi5OFtnkQ+8qnmEbAr1Oo1FRm5B0dA= github.com/containerd/console v1.0.3 h1:lIr7SlA5PxZyMV30bDW0MGbiOPXwc63yRuCP0ARubLw= github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= @@ -120,6 +121,7 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.m github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v1.0.4 h1:gVPz/FMfvh57HdSJQyvBtF00j8JU4zdyUgIUNhlgg0A= github.com/evanphx/json-patch v4.11.0+incompatible h1:glyUF9yIYtMHzn8xaKw5rMhdWcwsYV8dZHIq5567/xs= github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= @@ -184,8 +186,9 @@ github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= @@ -202,8 +205,8 @@ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-containerregistry v0.12.0 h1:nidOEtFYlgPCRqxCKj/4c/js940HVWplCWc5ftdfdUA= github.com/google/go-containerregistry v0.12.0/go.mod h1:sdIK+oHQO7B93xI8UweYdl887YhuIwg9vz8BSLH3+8k= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -229,7 +232,7 @@ github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaU github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= @@ -411,8 +414,8 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.2.0 h1:BRXPfhNivWL5Yq0BGQ39a2sW6t44aODpfxkWjYdzewE= -golang.org/x/crypto v0.2.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= +golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -446,8 +449,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.6.0 h1:b9gGHsz9/HhJ3HF5DHQytPpuwocVTChQJK3AvoLRD5I= -golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= +golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -487,8 +490,8 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= -golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -500,8 +503,8 @@ golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.1.0 h1:isLCZuhj4v+tYv7eskaN4v/TM+A1begWWgyVJDdl1+Y= -golang.org/x/oauth2 v0.1.0/go.mod h1:G9FE4dLTsbXUu90h/Pf85g4w1D+SSAgR+q46nJZ8M4A= +golang.org/x/oauth2 v0.20.0 h1:4mQdhULixXKP1rwYBW0vAijoXnkTG0BLCDRzfe1idMo= +golang.org/x/oauth2 v0.20.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -513,8 +516,8 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -569,13 +572,13 @@ golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 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/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= +golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -584,8 +587,8 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 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.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= +golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -640,8 +643,8 @@ golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -674,7 +677,6 @@ google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -742,8 +744,8 @@ google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAG google.golang.org/grpc v1.43.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.50.1 h1:DS/BukOZWp8s6p4Dt/tOaJaTQyPyOoCcrjroHuCeLzY= -google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc= +google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -758,8 +760,8 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= +google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/pkg/build/buildkit/build.go b/pkg/build/buildkit/build.go index 2bf8d4d..741e1e8 100644 --- a/pkg/build/buildkit/build.go +++ b/pkg/build/buildkit/build.go @@ -130,6 +130,9 @@ func (b *BuildKit) Build(ctx context.Context, r *pb.BuildRequest, w io.Writer) ( case "BUILD_KIND_APP_BUILD_WITH_CONTAINER_FILE": return b.buildFromContainerFile(ctx, c, r, ow) + case "BUILD_KIND_JOB_DEPLOY_WITH_CONTAINER_FILE": + return b.buildFromContainerFile(ctx, c, r, ow) + case "BUILD_KIND_PLATFORM_WITH_CONTAINER_FILE": return nil, b.buildPlatform(ctx, c, r, ow) } @@ -382,7 +385,14 @@ func (b *BuildKit) buildFromContainerFile(ctx context.Context, c *client.Client, files = bytes.NewReader(r.Data) } - tmpDir, cleanFunc, err := generateBuildLocalDir(ctx, b.opts.TempDir, r.Containerfile, nil, r.App.EnvVars, files) + envVars := map[string]string{} + if r.App != nil { + envVars = r.App.EnvVars + } else if r.Job != nil { + envVars = r.Job.EnvVars + } + + tmpDir, cleanFunc, err := generateBuildLocalDir(ctx, b.opts.TempDir, r.Containerfile, nil, envVars, files) if err != nil { return nil, err } diff --git a/pkg/build/buildkit/build_test.go b/pkg/build/buildkit/build_test.go index 780249e..bec70b5 100644 --- a/pkg/build/buildkit/build_test.go +++ b/pkg/build/buildkit/build_test.go @@ -675,6 +675,246 @@ EXPOSE 8080/tcp 80/tcp 8000/tcp 9090 8888 }) } +func TestBuildKit_BuildJob_FromContainerFile(t *testing.T) { + bc := newBuildKitClient(t) + defer bc.Close() + + t.Run("Dockerfile mounting the job's env vars", func(t *testing.T) { + destImage := baseRegistry(t, "my-job", "") + + dockerfile := `FROM busybox:latest + +RUN --mount=type=secret,id=tsuru-job-envvars,target=/var/run/secrets/envs.sh \ + . /var/run/secrets/envs.sh \ + && echo ${MY_ENV_VAR} > /tmp/envs \ + && echo ${DATABASE_PASSWORD} >> /tmp/envs + +ENV MY_ANOTHER_VAR="another var" +` + + req := &pb.BuildRequest{ + Kind: pb.BuildKind_BUILD_KIND_JOB_DEPLOY_WITH_CONTAINER_FILE, + Job: &pb.TsuruJob{ + Name: "my-job", + EnvVars: map[string]string{ + "MY_ENV_VAR": "hello world", + "DATABASE_PASSWORD": "aw3some`p4ss!", + }, + }, + DestinationImages: []string{destImage}, + Containerfile: string(dockerfile), + PushOptions: &pb.PushOptions{ + InsecureRegistry: registryHTTP, + }, + } + + jobFiles, err := NewBuildKit(bc, BuildKitOptions{TempDir: t.TempDir()}).Build(context.TODO(), req, os.Stdout) + require.NoError(t, err) + assert.Equal(t, &pb.TsuruConfig{ + ImageConfig: &pb.ContainerImageConfig{ + Cmd: []string{"sh"}, + }, + }, jobFiles) + + dc := newDockerClient(t) + defer dc.Close() + + r, err := dc.ImagePull(context.TODO(), destImage, dockertypes.ImagePullOptions{}) + require.NoError(t, err) + defer r.Close() + + fmt.Println("Pulling container image", destImage) + _, err = io.Copy(os.Stdout, r) + require.NoError(t, err) + + defer func() { + fmt.Printf("Removing container image %s\n", destImage) + _, nerr := dc.ImageRemove(context.TODO(), destImage, dockertypes.ImageRemoveOptions{Force: true}) + require.NoError(t, nerr) + }() + + t.Run("should not store the env vars in the container image manifest", func(t *testing.T) { + is, _, err := dc.ImageInspectWithRaw(context.TODO(), destImage) + require.NoError(t, err) + require.NotNil(t, is.Config) + assert.NotEmpty(t, is.Config.Env) + for _, env := range is.Config.Env { + assert.False(t, strings.HasPrefix(env, "MY_ENV_VAR="), "Env MY_ENV_VAR should not be exported to image manifest") + assert.False(t, strings.HasPrefix(env, "DATABASE_PASSWORD="), "Env DATABASE_PASSWORD shold not be exported to image manifest") + + if strings.HasPrefix(env, "MY_ANOTHER_VAR=") { + assert.Equal(t, "MY_ANOTHER_VAR=another var", env) + } + } + }) + t.Run("should be able to see env vars during the build", func(t *testing.T) { + containerCreateResp, err := dc.ContainerCreate(context.TODO(), &dockertypescontainer.Config{ + Image: destImage, + Cmd: dockerstrslice.StrSlice{"sleep", "Inf"}, + }, nil, nil, nil, "") + require.NoError(t, err) + require.NotEmpty(t, containerCreateResp.ID, "container ID cannot be empty") + + containerID := containerCreateResp.ID + fmt.Printf("Container created (ID=%s)\n", containerID) + + defer func() { + fmt.Printf("Removing container (ID=%s)\n", containerID) + require.NoError(t, dc.ContainerRemove(context.TODO(), containerID, dockertypes.ContainerRemoveOptions{Force: true, RemoveVolumes: true})) + }() + + err = dc.ContainerStart(context.TODO(), containerID, dockertypes.ContainerStartOptions{}) + require.NoError(t, err) + fmt.Printf("Starting container (ID=%s)\n", containerID) + + execCreateResp, err := dc.ContainerExecCreate(context.TODO(), containerID, dockertypes.ExecConfig{ + Tty: true, + AttachStderr: true, + AttachStdout: true, + Cmd: []string{"cat", "/tmp/envs"}, + }) + require.NoError(t, err) + require.NotEmpty(t, execCreateResp.ID, "exec ID cannot be empty") + + execID := execCreateResp.ID + + hijackedResp, err := dc.ContainerExecAttach(context.TODO(), execID, dockertypes.ExecStartCheck{}) + require.NoError(t, err) + require.NotNil(t, hijackedResp.Reader) + defer hijackedResp.Close() + + var stderr, stdout bytes.Buffer + _, err = dockerstdcopy.StdCopy(&stdout, &stderr, hijackedResp.Reader) + require.NoError(t, err) + assert.Equal(t, "hello world\r\naw3some`p4ss!\r\n", stdout.String()) + assert.Empty(t, stderr.String()) + }) + + t.Run("job build with Dockerfile", func(t *testing.T) { + destImage := baseRegistry(t, "my-job", "") + + dockerfile := `FROM busybox:latest + + RUN --mount=type=secret,id=tsuru-job-envvars,target=/var/run/secrets/envs.sh \ + . /var/run/secrets/envs.sh \ + && echo ${MY_ENV_VAR} > /tmp/envs \ + && echo ${DATABASE_PASSWORD} >> /tmp/envs + + ENV MY_ANOTHER_VAR="another var" + ` + + req := &pb.BuildRequest{ + Kind: pb.BuildKind_BUILD_KIND_APP_BUILD_WITH_CONTAINER_FILE, + Job: &pb.TsuruJob{ + Name: "my-job", + EnvVars: map[string]string{ + "MY_ENV_VAR": "hello world", + "DATABASE_PASSWORD": "aw3some`p4ss!", + }, + }, + DestinationImages: []string{destImage}, + Containerfile: string(dockerfile), + PushOptions: &pb.PushOptions{ + InsecureRegistry: registryHTTP, + }, + } + + b := NewBuildKit(bc, BuildKitOptions{TempDir: t.TempDir()}) + jobFiles, err := b.Build(context.TODO(), req, os.Stdout) + + //jobFiles, err := NewBuildKit(bc, BuildKitOptions{TempDir: t.TempDir()}).Build(context.TODO(), req, os.Stdout) + require.NoError(t, err) + assert.Equal(t, &pb.TsuruConfig{ + ImageConfig: &pb.ContainerImageConfig{ + Cmd: []string{"sh"}, + }, + }, jobFiles) + + dc := newDockerClient(t) + defer dc.Close() + + r, err := dc.ImagePull(context.TODO(), destImage, dockertypes.ImagePullOptions{}) + require.NoError(t, err) + defer r.Close() + + fmt.Println("Pulling container image", destImage) + _, err = io.Copy(os.Stdout, r) + require.NoError(t, err) + + defer func() { + fmt.Printf("Removing container image %s\n", destImage) + _, nerr := dc.ImageRemove(context.TODO(), destImage, dockertypes.ImageRemoveOptions{Force: true}) + require.NoError(t, nerr) + }() + }) + }) + + t.Run("neither Procfile nor tsuru.yaml, should use command from image manifest", func(t *testing.T) { + destImage := baseRegistry(t, "my-job", "") + + dockerfile := `FROM busybox + +EXPOSE 8080/tcp + +ENTRYPOINT ["/path/to/my/server.sh"] + +CMD ["--port", "8080"] +` + + req := &pb.BuildRequest{ + Kind: pb.BuildKind_BUILD_KIND_JOB_DEPLOY_WITH_CONTAINER_FILE, + Job: &pb.TsuruJob{ + Name: "my-job", + }, + DestinationImages: []string{destImage}, + Containerfile: string(dockerfile), + PushOptions: &pb.PushOptions{ + InsecureRegistry: registryHTTP, + }, + } + + jobFiles, err := NewBuildKit(bc, BuildKitOptions{TempDir: t.TempDir()}).Build(context.TODO(), req, os.Stdout) + require.NoError(t, err) + assert.Equal(t, &pb.TsuruConfig{ + ImageConfig: &pb.ContainerImageConfig{ + Entrypoint: []string{"/path/to/my/server.sh"}, + Cmd: []string{"--port", "8080"}, + ExposedPorts: []string{"8080/tcp"}, + }, + }, jobFiles) + }) + + t.Run("multiple exposed ports, should ensure the ascending order of ports", func(t *testing.T) { + destImage := baseRegistry(t, "my-job", "") + + dockerfile := `FROM busybox + +EXPOSE 100/udp 53/udp 443/udp +EXPOSE 8080/tcp 80/tcp 8000/tcp 9090 8888 +` + req := &pb.BuildRequest{ + Kind: pb.BuildKind_BUILD_KIND_JOB_DEPLOY_WITH_CONTAINER_FILE, + Job: &pb.TsuruJob{ + Name: "my-job", + }, + DestinationImages: []string{destImage}, + Containerfile: string(dockerfile), + PushOptions: &pb.PushOptions{ + InsecureRegistry: registryHTTP, + }, + } + + jobFiles, err := NewBuildKit(bc, BuildKitOptions{TempDir: t.TempDir()}).Build(context.TODO(), req, os.Stdout) + require.NoError(t, err) + assert.Equal(t, &pb.TsuruConfig{ + ImageConfig: &pb.ContainerImageConfig{ + Cmd: []string{"sh"}, + ExposedPorts: []string{"53/udp", "80/tcp", "100/udp", "443/udp", "8000/tcp", "8080/tcp", "8888/tcp", "9090/tcp"}, + }, + }, jobFiles) + }) +} + func compressGZIP(t *testing.T, path string) []byte { t.Helper() var data bytes.Buffer diff --git a/pkg/build/grpc_build_v1/build_service.pb.go b/pkg/build/grpc_build_v1/build_service.pb.go index d876cfe..b1db89b 100644 --- a/pkg/build/grpc_build_v1/build_service.pb.go +++ b/pkg/build/grpc_build_v1/build_service.pb.go @@ -4,8 +4,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 -// protoc v5.27.3 +// protoc-gen-go v1.34.2 +// protoc v5.27.1 // source: pkg/build/grpc_build_v1/build_service.proto package grpc_build_v1 @@ -37,6 +37,8 @@ const ( BuildKind_BUILD_KIND_PLATFORM_WITH_CONTAINER_IMAGE BuildKind = 5 // tsuru platform add/update ... -i registry.example.com/tsuru/python:latest BuildKind_BUILD_KIND_PLATFORM_WITH_CONTAINER_FILE BuildKind = 6 // tsuru platform add/update ... --dockerfile Dockerfile BuildKind_BUILD_KIND_JOB_CREATE_WITH_CONTAINER_IMAGE BuildKind = 7 // tsuru job create ... -i registry.example.com/tsuru/my-job:latest + BuildKind_BUILD_KIND_JOB_DEPLOY_WITH_CONTAINER_IMAGE BuildKind = 7 // tsuru job deploy ... -i registry.example.com/tsuru/my-job:latest + BuildKind_BUILD_KIND_JOB_DEPLOY_WITH_CONTAINER_FILE BuildKind = 8 // tsuru job deploy ... --dockerfile Dockerfile ) // Enum value maps for BuildKind. @@ -52,6 +54,8 @@ var ( 5: "BUILD_KIND_PLATFORM_WITH_CONTAINER_IMAGE", 6: "BUILD_KIND_PLATFORM_WITH_CONTAINER_FILE", 7: "BUILD_KIND_JOB_CREATE_WITH_CONTAINER_IMAGE", + // Duplicate value: 7: "BUILD_KIND_JOB_DEPLOY_WITH_CONTAINER_IMAGE", + 8: "BUILD_KIND_JOB_DEPLOY_WITH_CONTAINER_FILE", } BuildKind_value = map[string]int32{ "BUILD_KIND_UNSPECIFIED": 0, @@ -64,6 +68,8 @@ var ( "BUILD_KIND_PLATFORM_WITH_CONTAINER_IMAGE": 5, "BUILD_KIND_PLATFORM_WITH_CONTAINER_FILE": 6, "BUILD_KIND_JOB_CREATE_WITH_CONTAINER_IMAGE": 7, + "BUILD_KIND_JOB_DEPLOY_WITH_CONTAINER_IMAGE": 7, + "BUILD_KIND_JOB_DEPLOY_WITH_CONTAINER_FILE": 8, } ) @@ -753,7 +759,7 @@ var file_pkg_build_grpc_build_v1_build_service_proto_rawDesc = []byte{ 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0b, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2a, 0xcd, 0x03, 0x0a, 0x09, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x4b, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2a, 0xac, 0x04, 0x0a, 0x09, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x1a, 0x0a, 0x16, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x2b, 0x0a, 0x27, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x41, 0x50, @@ -782,16 +788,22 @@ var file_pkg_build_grpc_build_v1_build_service_proto_rawDesc = []byte{ 0x06, 0x12, 0x2e, 0x0a, 0x2a, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4a, 0x4f, 0x42, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52, 0x5f, 0x49, 0x4d, 0x41, 0x47, 0x45, 0x10, - 0x07, 0x1a, 0x02, 0x10, 0x01, 0x32, 0x4f, 0x0a, 0x05, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x46, - 0x0a, 0x05, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x1b, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x62, - 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x76, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x62, 0x75, 0x69, 0x6c, - 0x64, 0x5f, 0x76, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x42, 0x37, 0x5a, 0x35, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x74, 0x73, 0x75, 0x72, 0x75, 0x2f, 0x64, 0x65, 0x70, 0x6c, 0x6f, - 0x79, 0x2d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x62, 0x75, 0x69, 0x6c, - 0x64, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x76, 0x31, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x07, 0x12, 0x2e, 0x0a, 0x2a, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, + 0x4a, 0x4f, 0x42, 0x5f, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x5f, + 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52, 0x5f, 0x49, 0x4d, 0x41, 0x47, 0x45, 0x10, + 0x07, 0x12, 0x2d, 0x0a, 0x29, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, + 0x4a, 0x4f, 0x42, 0x5f, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x5f, + 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52, 0x5f, 0x46, 0x49, 0x4c, 0x45, 0x10, 0x08, + 0x1a, 0x02, 0x10, 0x01, 0x32, 0x4f, 0x0a, 0x05, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x46, 0x0a, + 0x05, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x1b, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x62, 0x75, + 0x69, 0x6c, 0x64, 0x5f, 0x76, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, + 0x5f, 0x76, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x30, 0x01, 0x42, 0x37, 0x5a, 0x35, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x74, 0x73, 0x75, 0x72, 0x75, 0x2f, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, + 0x2d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, + 0x2f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x76, 0x31, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -808,7 +820,7 @@ func file_pkg_build_grpc_build_v1_build_service_proto_rawDescGZIP() []byte { var file_pkg_build_grpc_build_v1_build_service_proto_enumTypes = make([]protoimpl.EnumInfo, 1) var file_pkg_build_grpc_build_v1_build_service_proto_msgTypes = make([]protoimpl.MessageInfo, 10) -var file_pkg_build_grpc_build_v1_build_service_proto_goTypes = []interface{}{ +var file_pkg_build_grpc_build_v1_build_service_proto_goTypes = []any{ (BuildKind)(0), // 0: grpc_build_v1.BuildKind (*BuildRequest)(nil), // 1: grpc_build_v1.BuildRequest (*BuildResponse)(nil), // 2: grpc_build_v1.BuildResponse @@ -846,7 +858,7 @@ func file_pkg_build_grpc_build_v1_build_service_proto_init() { return } if !protoimpl.UnsafeEnabled { - file_pkg_build_grpc_build_v1_build_service_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_pkg_build_grpc_build_v1_build_service_proto_msgTypes[0].Exporter = func(v any, i int) any { switch v := v.(*BuildRequest); i { case 0: return &v.state @@ -858,7 +870,7 @@ func file_pkg_build_grpc_build_v1_build_service_proto_init() { return nil } } - file_pkg_build_grpc_build_v1_build_service_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_pkg_build_grpc_build_v1_build_service_proto_msgTypes[1].Exporter = func(v any, i int) any { switch v := v.(*BuildResponse); i { case 0: return &v.state @@ -870,7 +882,7 @@ func file_pkg_build_grpc_build_v1_build_service_proto_init() { return nil } } - file_pkg_build_grpc_build_v1_build_service_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_pkg_build_grpc_build_v1_build_service_proto_msgTypes[2].Exporter = func(v any, i int) any { switch v := v.(*TsuruApp); i { case 0: return &v.state @@ -882,7 +894,7 @@ func file_pkg_build_grpc_build_v1_build_service_proto_init() { return nil } } - file_pkg_build_grpc_build_v1_build_service_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + file_pkg_build_grpc_build_v1_build_service_proto_msgTypes[3].Exporter = func(v any, i int) any { switch v := v.(*TsuruJob); i { case 0: return &v.state @@ -894,7 +906,7 @@ func file_pkg_build_grpc_build_v1_build_service_proto_init() { return nil } } - file_pkg_build_grpc_build_v1_build_service_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + file_pkg_build_grpc_build_v1_build_service_proto_msgTypes[4].Exporter = func(v any, i int) any { switch v := v.(*TsuruPlatform); i { case 0: return &v.state @@ -906,7 +918,7 @@ func file_pkg_build_grpc_build_v1_build_service_proto_init() { return nil } } - file_pkg_build_grpc_build_v1_build_service_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + file_pkg_build_grpc_build_v1_build_service_proto_msgTypes[5].Exporter = func(v any, i int) any { switch v := v.(*PushOptions); i { case 0: return &v.state @@ -918,7 +930,7 @@ func file_pkg_build_grpc_build_v1_build_service_proto_init() { return nil } } - file_pkg_build_grpc_build_v1_build_service_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + file_pkg_build_grpc_build_v1_build_service_proto_msgTypes[6].Exporter = func(v any, i int) any { switch v := v.(*ContainerImageConfig); i { case 0: return &v.state @@ -930,7 +942,7 @@ func file_pkg_build_grpc_build_v1_build_service_proto_init() { return nil } } - file_pkg_build_grpc_build_v1_build_service_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + file_pkg_build_grpc_build_v1_build_service_proto_msgTypes[7].Exporter = func(v any, i int) any { switch v := v.(*TsuruConfig); i { case 0: return &v.state @@ -943,7 +955,7 @@ func file_pkg_build_grpc_build_v1_build_service_proto_init() { } } } - file_pkg_build_grpc_build_v1_build_service_proto_msgTypes[1].OneofWrappers = []interface{}{ + file_pkg_build_grpc_build_v1_build_service_proto_msgTypes[1].OneofWrappers = []any{ (*BuildResponse_Output)(nil), (*BuildResponse_TsuruConfig)(nil), } diff --git a/pkg/build/grpc_build_v1/build_service.proto b/pkg/build/grpc_build_v1/build_service.proto index 42aac4b..7259763 100644 --- a/pkg/build/grpc_build_v1/build_service.proto +++ b/pkg/build/grpc_build_v1/build_service.proto @@ -72,6 +72,8 @@ enum BuildKind { BUILD_KIND_PLATFORM_WITH_CONTAINER_FILE = 6; // tsuru platform add/update ... --dockerfile Dockerfile BUILD_KIND_JOB_CREATE_WITH_CONTAINER_IMAGE = 7; // tsuru job create ... -i registry.example.com/tsuru/my-job:latest + BUILD_KIND_JOB_DEPLOY_WITH_CONTAINER_IMAGE = 7; // tsuru job deploy ... -i registry.example.com/tsuru/my-job:latest + BUILD_KIND_JOB_DEPLOY_WITH_CONTAINER_FILE = 8; // tsuru job deploy ... --dockerfile Dockerfile } message BuildResponse { diff --git a/pkg/build/grpc_build_v1/build_service_grpc.pb.go b/pkg/build/grpc_build_v1/build_service_grpc.pb.go index ceaeb50..d790d7c 100644 --- a/pkg/build/grpc_build_v1/build_service_grpc.pb.go +++ b/pkg/build/grpc_build_v1/build_service_grpc.pb.go @@ -4,8 +4,8 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.3.0 -// - protoc v5.27.3 +// - protoc-gen-go-grpc v1.4.0 +// - protoc v5.27.1 // source: pkg/build/grpc_build_v1/build_service.proto package grpc_build_v1 @@ -19,8 +19,8 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. -const _ = grpc.SupportPackageIsVersion7 +// Requires gRPC-Go v1.62.0 or later. +const _ = grpc.SupportPackageIsVersion8 const ( Build_Build_FullMethodName = "/grpc_build_v1.Build/Build" @@ -43,11 +43,12 @@ func NewBuildClient(cc grpc.ClientConnInterface) BuildClient { } func (c *buildClient) Build(ctx context.Context, in *BuildRequest, opts ...grpc.CallOption) (Build_BuildClient, error) { - stream, err := c.cc.NewStream(ctx, &Build_ServiceDesc.Streams[0], Build_Build_FullMethodName, opts...) + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + stream, err := c.cc.NewStream(ctx, &Build_ServiceDesc.Streams[0], Build_Build_FullMethodName, cOpts...) if err != nil { return nil, err } - x := &buildBuildClient{stream} + x := &buildBuildClient{ClientStream: stream} if err := x.ClientStream.SendMsg(in); err != nil { return nil, err } @@ -108,7 +109,7 @@ func _Build_Build_Handler(srv interface{}, stream grpc.ServerStream) error { if err := stream.RecvMsg(m); err != nil { return err } - return srv.(BuildServer).Build(m, &buildBuildServer{stream}) + return srv.(BuildServer).Build(m, &buildBuildServer{ServerStream: stream}) } type Build_BuildServer interface { diff --git a/pkg/build/server.go b/pkg/build/server.go index a8dd4b7..d5a05d9 100644 --- a/pkg/build/server.go +++ b/pkg/build/server.go @@ -102,6 +102,9 @@ func validateBuildRequest(r *pb.BuildRequest) error { case "BUILD_KIND_APP_BUILD_WITH_CONTAINER_FILE": fallthrough + case "BUILD_KIND_JOB_DEPLOY_WITH_CONTAINER_FILE": + fallthrough + case "BUILD_KIND_PLATFORM_WITH_CONTAINER_FILE": if err := validateBuildRequestFromContainerfile(r); err != nil { return err diff --git a/pkg/build/server_test.go b/pkg/build/server_test.go index 71c397b..31ef188 100644 --- a/pkg/build/server_test.go +++ b/pkg/build/server_test.go @@ -127,6 +127,20 @@ func TestBuild(t *testing.T) { }, }, + "missing job, when kind is job dockerfile": { + req: &pb.BuildRequest{ + SourceImage: "tsuru/scratch:latest", + DestinationImages: []string{"registry.example.com/tsuru/app-my-app:v1"}, + Kind: pb.BuildKind_BUILD_KIND_JOB_DEPLOY_WITH_CONTAINER_IMAGE, + }, + assert: func(t *testing.T, stream pb.Build_BuildClient, err error) { + require.NoError(t, err) + require.NotNil(t, stream) + _, _, err = readResponse(t, stream) + assert.EqualError(t, err, status.Error(codes.InvalidArgument, "job cannot be nil").Error()) + }, + }, + "deploy from source code, empty source image": { req: &pb.BuildRequest{ DestinationImages: []string{"registry.example.com/tsuru/app-my-app:v1"}, @@ -208,6 +222,33 @@ func TestBuild(t *testing.T) { }, }, + "job build successful": { + builder: &fake.FakeBuilder{ + OnBuild: func(ctx context.Context, r *pb.BuildRequest, w io.Writer) (*pb.TsuruConfig, error) { + assert.NotNil(t, ctx) + assert.NotNil(t, r) + assert.NotNil(t, w) + fmt.Fprintln(w, "--- EXECUTING BUILD ---") + return nil, nil + }, + }, + req: &pb.BuildRequest{ + Containerfile: "FROM tsuru/scratch:latest", + DestinationImages: []string{"registry.example.com/tsuru/job-my-job:latest"}, + Kind: pb.BuildKind_BUILD_KIND_JOB_DEPLOY_WITH_CONTAINER_FILE, + Job: &pb.TsuruJob{Name: "my-job"}, + Data: []byte("fake data :P"), + }, + assert: func(t *testing.T, stream pb.Build_BuildClient, err error) { + require.NoError(t, err) + require.NotNil(t, stream) + tsuruConfig, output, err := readResponse(t, stream) + require.NoError(t, err) + require.Nil(t, tsuruConfig) + assert.Regexp(t, `(.*)--- EXECUTING BUILD ---(.*)`, output) + }, + }, + "platform build, missing platform": { req: &pb.BuildRequest{ DestinationImages: []string{"registry.example.com/tsuru/app-my-app:v1"}, @@ -275,6 +316,21 @@ func TestBuild(t *testing.T) { assert.EqualError(t, err, status.Error(codes.InvalidArgument, "containerfile cannot be empty").Error()) }, }, + + "job deploy with containerfile, empty containerfile": { + req: &pb.BuildRequest{ + SourceImage: "...", + DestinationImages: []string{"registry.example.com/tsuru/job-my-job:latest"}, + Job: &pb.TsuruJob{Name: "my-job"}, + Kind: pb.BuildKind_BUILD_KIND_JOB_DEPLOY_WITH_CONTAINER_FILE, + }, + assert: func(t *testing.T, stream pb.Build_BuildClient, err error) { + require.NoError(t, err) + require.NotNil(t, stream) + _, _, err = readResponse(t, stream) + assert.EqualError(t, err, status.Error(codes.InvalidArgument, "containerfile cannot be empty").Error()) + }, + }, } for name, tt := range cases { @@ -317,7 +373,7 @@ func setupServer(t *testing.T, bs pb.BuildServer) string { func setupClient(t *testing.T, address string) pb.BuildClient { t.Helper() - conn, err := grpc.Dial(address, grpc.WithTransportCredentials(insecure.NewCredentials())) + conn, err := grpc.NewClient(address, grpc.WithTransportCredentials(insecure.NewCredentials())) require.NoError(t, err) t.Cleanup(func() { conn.Close() })