diff --git a/go.sum b/go.sum index c0cd5bde..677e3564 100644 --- a/go.sum +++ b/go.sum @@ -91,13 +91,12 @@ github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbt github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/Sabayon/pkgs-checker v0.7.2 h1:mh53u5D7FTCeBJevYQA9cCxAWGTSuKqw7m/x7GsQVb0= -github.com/Sabayon/pkgs-checker v0.7.2/go.mod h1:GFGM6ZzSE5owdGgjLnulj0+Vt9UTd5LFGmB2AOVPYrE= github.com/Sabayon/pkgs-checker v0.8.1 h1:pVen975z9WIecq7luntUn+0XzGdiyz2CsDay8w+ZmOw= github.com/Sabayon/pkgs-checker v0.8.1/go.mod h1:GC9PBUzcq0QVEBGRA1IIMXf6wHxo34KH5BeqoyJsLpo= github.com/Sereal/Sereal v0.0.0-20181211220259-509a78ddbda3 h1:Xu7z47ZiE/J+sKXHZMGxEor/oY2q6dq51fkO0JqdSwY= github.com/Sereal/Sereal v0.0.0-20181211220259-509a78ddbda3/go.mod h1:D0JMgToj/WdxCgd30Kc1UcA9E+WdZoJqeVOuYW7iTBM= github.com/Shopify/logrus-bugsnag v0.0.0-20170309145241-6dbc35f2c30d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= +github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d h1:UrqY+r/OJnIp5u0s1SbQ8dVfLCZJsnvazdBP5hS4iRs= github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= @@ -146,18 +145,24 @@ github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+Ce github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bitly/go-hostpool v0.1.0 h1:XKmsF6k5el6xHG3WPJ8U0Ku/ye7njX7W81Ng7O2ioR0= github.com/bitly/go-hostpool v0.1.0/go.mod h1:4gOCgp6+NZnVqlKyZ/iBZFTAJKembaVENUpMkpg42fw= +github.com/bitly/go-simplejson v0.5.0 h1:6IH+V8/tVMab511d5bn4M7EwGXZf9Hj6i2xSwkNEM+Y= github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= github.com/briandowns/spinner v1.12.1-0.20201220203425-e201aaea0a31 h1:yInAg9pE5qGec5eQ7XdfOTTaGwGxD3bKFVjmD6VKkwc= github.com/briandowns/spinner v1.12.1-0.20201220203425-e201aaea0a31/go.mod h1:QOuQk7x+EaDASo80FEXwlwiA+j/PPIcX3FScO+3/ZPQ= github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= +github.com/bugsnag/bugsnag-go v1.0.5-0.20150529004307-13fd6b8acda0 h1:s7+5BfS4WFJoVF9pnB8kBk03S7pZXRdKamnV0FOl5Sc= github.com/bugsnag/bugsnag-go v1.0.5-0.20150529004307-13fd6b8acda0/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= +github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b h1:otBG+dV+YK+Soembjv71DPz3uX/V/6MMlSyD9JBQ6kQ= github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= +github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0 h1:nvj0OLI3YqYXer/kZD8Ri1aaunCxIEsOst1BVJswV0o= github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/cavaliercoder/grab v1.0.1-0.20201108051000-98a5bfe305ec h1:4XvMn0XuV7qxCH22gbnR79r+xTUaLOSA0GW/egpO3SQ= @@ -177,6 +182,7 @@ github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMn github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cloudflare/cfssl v0.0.0-20180223231731-4e2dcbde5004 h1:lkAMpLVBDaj17e85keuznYcH5rqI438v41pKcBl4ZxQ= github.com/cloudflare/cfssl v0.0.0-20180223231731-4e2dcbde5004/go.mod h1:yMWuSON2oQp+43nFtAV/uvKQIFpSPerB57DCt9t8sSA= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= @@ -255,6 +261,7 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/daviddengcn/go-colortext v0.0.0-20160507010035-511bcaf42ccd/go.mod h1:dv4zxwHi5C/8AeI+4gX4dCWOIvNi7I6JCSX0HvlKPgE= github.com/deislabs/oras v0.8.1/go.mod h1:Mx0rMSbBNaNfY9hjpccEnxkOqJL6KGjtxNHPLC4G4As= github.com/denisenkom/go-mssqldb v0.0.0-20191001013358-cfbb681360f0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= +github.com/denisenkom/go-mssqldb v0.0.0-20191128021309-1d7a30a10f73 h1:OGNva6WhsKst5OZf7eZOklDztV3hwtTHovdrLHV+MsA= github.com/denisenkom/go-mssqldb v0.0.0-20191128021309-1d7a30a10f73/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= @@ -315,6 +322,7 @@ github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymF github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5 h1:Yzb9+7DPaBjB8zlTR87/ElzFsnQfuHnVUVqpZZIcV5Y= github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0= github.com/evanphx/json-patch v0.0.0-20200808040245-162e5629780b/go.mod h1:NAJj0yf/KaRKURN6nyi7A9IZydMivZEm9oQLWNjfKDc= github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZMPRZwes7CROmyNKgQzC3XPs6L/G2EJLHddWejkmf4= @@ -400,6 +408,7 @@ github.com/go-openapi/validate v0.19.5/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85n github.com/go-sql-driver/mysql v1.3.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= @@ -432,6 +441,7 @@ github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5 github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= @@ -470,6 +480,7 @@ github.com/golangplus/fmt v0.0.0-20150411045040-2a5d6d7d2995/go.mod h1:lJgMEyOkY github.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e/go.mod h1:0AA//k/eakGydO4jKRoRL2j92ZKSzTgj9tclaCrvXHk= 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/certificate-transparency-go v1.0.10-0.20180222191210-5ab67e519c93 h1:jc2UWq7CbdszqeH6qu1ougXMIUBfSy8Pbh/anURYbGI= github.com/google/certificate-transparency-go v1.0.10-0.20180222191210-5ab67e519c93/go.mod h1:QeJfpSbVSfYc7RgB3gJFj9cbuQMMchQxrWXz8Ruopmg= github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -532,6 +543,7 @@ github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645 h1:MJG/KsmcqMwFAkh8mTnAwhyKoB+sTAnY4CACC110tbU= github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= +github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8= github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= @@ -591,8 +603,11 @@ github.com/jedib0t/go-pretty/v6 v6.0.5/go.mod h1:MTr6FgcfNdnN5wPVBzJ6mhJeDyiF0yB github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jinzhu/copier v0.0.0-20180308034124-7e38e58719c3 h1:sHsPfNMAG70QAvKbddQ0uScZCHQoZsT5NykGRCeeeIs= github.com/jinzhu/copier v0.0.0-20180308034124-7e38e58719c3/go.mod h1:yL958EeXv8Ylng6IfnvG4oflryUi3vgA3xPs9hmII1s= +github.com/jinzhu/gorm v0.0.0-20170222002820-5409931a1bb8 h1:CZkYfurY6KGhVtlalI4QwQ6T0Cu6iuY3e0x5RLu96WE= github.com/jinzhu/gorm v0.0.0-20170222002820-5409931a1bb8/go.mod h1:Vla75njaFJ8clLU1W44h34PjIkijhjHIYnZxMqCdxqo= +github.com/jinzhu/inflection v0.0.0-20170102125226-1c35d901db3d h1:jRQLvyVGL+iVtDElaEIDdKwpPqUIZJfzkNLV34htpEc= github.com/jinzhu/inflection v0.0.0-20170102125226-1c35d901db3d/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.1 h1:g39TucaRWyV3dwDO++eEc6qf8TVIQ/Da48WmqjZ3i7E= github.com/jinzhu/now v1.1.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= @@ -613,6 +628,7 @@ github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1 github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/juju/loggo v0.0.0-20190526231331-6e530bcce5d8 h1:UUHMLvzt/31azWTN/ifGWef4WUqvXk0iRqdhdy/2uzI= github.com/juju/loggo v0.0.0-20190526231331-6e530bcce5d8/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213/go.mod h1:vNUNkEQ1e29fT/6vq2aBdFsgNPmy8qMdSay1npru+Sw= @@ -649,6 +665,7 @@ github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0/go.mod h1:vmVJ0l/dxyfGW6Fm github.com/lib/pq v0.0.0-20150723085316-0dad96c0b94f/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.7.0 h1:h93mCPfUSkaul3Ka/VG8uZdmW1uMHDGxzu0NWHuJmHY= github.com/lib/pq v1.7.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= @@ -1450,6 +1467,7 @@ google.golang.org/protobuf v1.24.0 h1:UhZDfRO8JRQru4/+LlLE0BRKGF8L+PICnvYZmx/fEG google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/cenkalti/backoff.v2 v2.2.1 h1:eJ9UAg01/HIHG987TwxvnzK2MgxXq97YY6rYDpY9aII= gopkg.in/cenkalti/backoff.v2 v2.2.1/go.mod h1:S0QdOvT2AlerfSBkp0O+dk+bbIMaNbEmVk876gPCthU= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -1472,6 +1490,7 @@ gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/rethinkdb/rethinkdb-go.v6 v6.2.1 h1:d4KQkxAaAiRY2h5Zqis161Pv91A37uZyJOx73duwUwM= gopkg.in/rethinkdb/rethinkdb-go.v6 v6.2.1/go.mod h1:WbjuEoo1oadwzQ4apSDU+JTvmllEHtsNHS6y7vFc7iw= gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= diff --git a/pkg/compiler/compiler.go b/pkg/compiler/compiler.go index a7656011..20ad87d8 100644 --- a/pkg/compiler/compiler.go +++ b/pkg/compiler/compiler.go @@ -518,10 +518,10 @@ func oneOfImagesAvailable(images []string, b CompilerBackend) (bool, string) { return false, "" } -func (cs *LuetCompiler) resolveExistingImageHash(imageHash string) string { +func (cs *LuetCompiler) resolveExistingImageHash(imageHash string, p *compilerspec.LuetCompilationSpec) string { var resolvedImage string toChecklist := append([]string{fmt.Sprintf("%s:%s", cs.Options.PushImageRepository, imageHash)}, - genImageList(cs.Options.PullImageRepository, imageHash)...) + genImageList(p.BuildOptions.PullImageRepository, imageHash)...) if exists, which := oneOfImagesExists(toChecklist, cs.Backend); exists { resolvedImage = which } @@ -557,7 +557,7 @@ func (cs *LuetCompiler) getImageArtifact(hash string, p *compilerspec.LuetCompil // we return a full artifact if can be loaded locally. toChecklist := append([]string{fmt.Sprintf("%s:%s", cs.Options.PushImageRepository, hash)}, - genImageList(cs.Options.PullImageRepository, hash)...) + genImageList(p.BuildOptions.PullImageRepository, hash)...) exists, _ := oneOfImagesExists(toChecklist, cs.Backend) if art, err := LoadArtifactFromYaml(p); err == nil && exists { // If YAML is correctly loaded, and both images exists, no reason to rebuild. @@ -698,6 +698,7 @@ func (cs *LuetCompiler) ComputeDepTree(p *compilerspec.LuetCompilationSpec) (sol BuildHash: nthsolution.HashFrom(assertion.Package), PackageHash: nthsolution.AssertionHash(), } + assertion.Package.SetTreeDir(p.Package.GetTreeDir()) assertions = append(assertions, assertion) } } @@ -710,7 +711,7 @@ func (cs *LuetCompiler) ComputeDepTree(p *compilerspec.LuetCompilationSpec) (sol func (cs *LuetCompiler) Compile(keepPermissions bool, p *compilerspec.LuetCompilationSpec) (*artifact.PackageArtifact, error) { asserts, err := cs.ComputeDepTree(p) if err != nil { - panic(err) + return nil, err } p.SetSourceAssertion(asserts) return cs.compile(cs.Options.Concurrency, keepPermissions, p) @@ -725,20 +726,28 @@ func genImageList(refs []string, hash string) []string { } func (cs *LuetCompiler) inheritSpecBuildOptions(p *compilerspec.LuetCompilationSpec) { - if len(p.BuildOptions.PullImageRepository) != 0 { - cs.Options.PullImageRepository = append(cs.Options.PullImageRepository, p.BuildOptions.PullImageRepository...) - } + Debug("Build options before inherit", p.BuildOptions) + + // Append push repositories from buildpsec buildoptions as pull if found. + // This allows to resolve the hash automatically if we pulled the metadata from + // repositories that are advertizing their cache. if len(p.BuildOptions.PushImageRepository) != 0 { - cs.Options.PullImageRepository = append(cs.Options.PullImageRepository, p.BuildOptions.PushImageRepository) + p.BuildOptions.PullImageRepository = append(p.BuildOptions.PullImageRepository, p.BuildOptions.PushImageRepository) + Debug("Inheriting pull repository from PushImageRepository buildoptions", p.BuildOptions.PullImageRepository) } + + if len(cs.Options.PullImageRepository) != 0 { + p.BuildOptions.PullImageRepository = append(p.BuildOptions.PullImageRepository, cs.Options.PullImageRepository...) + Debug("Inheriting pull repository from PullImageRepository buildoptions", p.BuildOptions.PullImageRepository) + } + Debug("Build options after inherit", p.BuildOptions) } func (cs *LuetCompiler) compile(concurrency int, keepPermissions bool, p *compilerspec.LuetCompilationSpec) (*artifact.PackageArtifact, error) { - + // TODO: Racy, remove it // Inherit build options from compilation specs metadata - orig := cs.Options.PullImageRepository - defer func() { cs.Options.PullImageRepository = orig }() - cs.inheritSpecBuildOptions(p) + // orig := cs.Options.PullImageRepository + // defer func() { cs.Options.PullImageRepository = orig }() Info(":package: Compiling", p.GetPackage().HumanReadableString(), ".... :coffee:") @@ -762,7 +771,8 @@ func (cs *LuetCompiler) compile(concurrency int, keepPermissions bool, p *compil }) // Update compilespec build options - it will be then serialized into the compilation metadata file - p.SetBuildOptions(cs.Options) + //p.SetBuildOptions(cs.Options) + cs.inheritSpecBuildOptions(p) // - If image is set we just generate a plain dockerfile // Treat last case (easier) first. The image is provided and we just compute a plain dockerfile with the images listed as above @@ -782,7 +792,10 @@ func (cs *LuetCompiler) compile(concurrency int, keepPermissions bool, p *compil currentN := 0 packageDeps := !cs.Options.PackageTargetOnly - if !cs.Options.NoDeps { + buildDeps := !cs.Options.NoDeps + buildTarget := !cs.Options.OnlyDeps + + if buildDeps { Info(":deciduous_tree: Build dependencies for " + p.GetPackage().HumanReadableString()) for _, assertion := range dependencies { //highly dependent on the order depsN++ @@ -797,6 +810,9 @@ func (cs *LuetCompiler) compile(concurrency int, keepPermissions bool, p *compil if err != nil { return nil, errors.Wrap(err, "Error while generating compilespec for "+assertion.Package.GetName()) } + compileSpec.BuildOptions.PullImageRepository = append(compileSpec.BuildOptions.PullImageRepository, p.BuildOptions.PullImageRepository...) + Debug("PullImage repos:", compileSpec.BuildOptions.PullImageRepository) + compileSpec.SetOutputPath(p.GetOutputPath()) Debug(pkgTag, " :arrow_right_hook: :whale: Builder image from hash", assertion.Hash.BuildHash) Debug(pkgTag, " :arrow_right_hook: :whale: Package image from hash", assertion.Hash.PackageHash) @@ -813,7 +829,7 @@ func (cs *LuetCompiler) compile(concurrency int, keepPermissions bool, p *compil // for the source instead, pick an image and a buildertaggedImage from hashes if they exists. // otherways fallback to the pushed repo // Resolve images from the hashtree - resolvedBuildImage := cs.resolveExistingImageHash(assertion.Hash.BuildHash) + resolvedBuildImage := cs.resolveExistingImageHash(assertion.Hash.BuildHash, compileSpec) if compileSpec.GetImage() != "" { Debug(pkgTag, " :wrench: Compiling "+compileSpec.GetPackage().HumanReadableString()+" from image") @@ -848,8 +864,8 @@ func (cs *LuetCompiler) compile(concurrency int, keepPermissions bool, p *compil lastHash = dependencies[len(dependencies)-1].Hash.PackageHash } - if !cs.Options.OnlyDeps { - resolvedBuildImage := cs.resolveExistingImageHash(lastHash) + if buildTarget { + resolvedBuildImage := cs.resolveExistingImageHash(lastHash, p) Info(":rocket: All dependencies are satisfied, building package requested by the user", p.GetPackage().HumanReadableString()) Info(":package:", p.GetPackage().HumanReadableString(), " Using image: ", resolvedBuildImage) a, err := cs.compileWithImage(resolvedBuildImage, "", targetAssertion.Hash.PackageHash, concurrency, keepPermissions, cs.Options.KeepImg, p, true) @@ -965,7 +981,7 @@ func (cs *LuetCompiler) FromPackage(p pkg.Package) (*compilerspec.LuetCompilatio opts := options.Compiler{} - artifactMetadataFile := filepath.Join(p.GetTreeDir(), "..", p.GetMetadataFilePath()) + artifactMetadataFile := filepath.Join(pack.GetTreeDir(), "..", pack.GetMetadataFilePath()) Debug("Checking if metadata file is present", artifactMetadataFile) if _, err := os.Stat(artifactMetadataFile); err == nil { f, err := os.Open(artifactMetadataFile) @@ -981,12 +997,10 @@ func (cs *LuetCompiler) FromPackage(p pkg.Package) (*compilerspec.LuetCompilatio return nil, errors.Wrap(err, "could not decode package from yaml") } - Debug("Read build options:", art.CompileSpec.BuildOptions) - opts = art.CompileSpec.BuildOptions - opts.PushImageRepository = "" - + Debug("Read build options:", art.CompileSpec.BuildOptions, "from", artifactMetadataFile) + opts = *art.CompileSpec.BuildOptions } else if !os.IsNotExist(err) { - Debug("error reading already existing artifact metadata file: ", err.Error()) + Debug("error reading artifact metadata file: ", err.Error()) } else if os.IsNotExist(err) { Debug("metadata file not present, skipping", artifactMetadataFile) } @@ -1000,7 +1014,9 @@ func (cs *LuetCompiler) FromPackage(p pkg.Package) (*compilerspec.LuetCompilatio if err != nil { return nil, err } - newSpec.BuildOptions = opts + newSpec.BuildOptions = &opts + + cs.inheritSpecBuildOptions(newSpec) return newSpec, err } diff --git a/pkg/compiler/types/spec/spec.go b/pkg/compiler/types/spec/spec.go index ba433bc8..d4d886f4 100644 --- a/pkg/compiler/types/spec/spec.go +++ b/pkg/compiler/types/spec/spec.go @@ -102,7 +102,7 @@ type LuetCompilationSpec struct { Includes []string `json:"includes"` Excludes []string `json:"excludes"` - BuildOptions options.Compiler `json:"build_options"` + BuildOptions *options.Compiler `json:"build_options"` } func NewLuetCompilationSpec(b []byte, p pkg.Package) (*LuetCompilationSpec, error) { @@ -119,7 +119,7 @@ func (cs *LuetCompilationSpec) GetSourceAssertion() solver.PackagesAssertions { } func (cs *LuetCompilationSpec) SetBuildOptions(b options.Compiler) { - cs.BuildOptions = b + cs.BuildOptions = &b } func (cs *LuetCompilationSpec) SetSourceAssertion(as solver.PackagesAssertions) { diff --git a/pkg/installer/client/docker.go b/pkg/installer/client/docker.go index a03a43a9..6d34d9d1 100644 --- a/pkg/installer/client/docker.go +++ b/pkg/installer/client/docker.go @@ -29,6 +29,7 @@ import ( "github.com/mudler/luet/pkg/compiler/types/artifact" "github.com/mudler/luet/pkg/config" "github.com/mudler/luet/pkg/helpers" + "github.com/mudler/luet/pkg/helpers/imgworker" . "github.com/mudler/luet/pkg/logger" ) @@ -136,11 +137,10 @@ func (c *DockerClient) DownloadArtifact(a *artifact.PackageArtifact) (*artifact. } func (c *DockerClient) DownloadFile(name string) (string, error) { - name = helpers.StripInvalidStringsFromImage(name) var file *os.File = nil var err error - var temp string - + var temp, contentstore string + var info *imgworker.ListedImage // Files should be in URI/repository: ok := false @@ -150,22 +150,21 @@ func (c *DockerClient) DownloadFile(name string) (string, error) { } for _, uri := range c.RepoData.Urls { - file, err = config.LuetCfg.GetSystem().TempFile("DockerClient") if err != nil { continue } - contentstore, err := config.LuetCfg.GetSystem().TempDir("contentstore") + contentstore, err = config.LuetCfg.GetSystem().TempDir("contentstore") if err != nil { Warning("Cannot create contentstore", err.Error()) continue } - imageName := fmt.Sprintf("%s:%s", uri, name) + imageName := fmt.Sprintf("%s:%s", uri, helpers.StripInvalidStringsFromImage(name)) Info("Downloading", imageName) - info, err := helpers.DownloadAndExtractDockerImage(contentstore, imageName, temp, c.auth, c.RepoData.Verify) + info, err = helpers.DownloadAndExtractDockerImage(contentstore, imageName, temp, c.auth, c.RepoData.Verify) if err != nil { Warning(fmt.Sprintf(errImageDownloadMsg, imageName, err.Error())) continue @@ -176,7 +175,6 @@ func (c *DockerClient) DownloadFile(name string) (string, error) { Debug("\nCopying file ", filepath.Join(temp, name), "to", file.Name()) err = helpers.CopyFile(filepath.Join(temp, name), file.Name()) - if err != nil { continue } diff --git a/tests/fixtures/docker_repo/interpolated/build.yaml b/tests/fixtures/docker_repo/interpolated/build.yaml new file mode 100644 index 00000000..c56cfdf3 --- /dev/null +++ b/tests/fixtures/docker_repo/interpolated/build.yaml @@ -0,0 +1,3 @@ +steps: + - echo s > /interpolated-{{.Values.foo}}-{{.Values.extra}} +image: "alpine" \ No newline at end of file diff --git a/tests/fixtures/docker_repo/interpolated/definition.yaml b/tests/fixtures/docker_repo/interpolated/definition.yaml new file mode 100644 index 00000000..cd32f58f --- /dev/null +++ b/tests/fixtures/docker_repo/interpolated/definition.yaml @@ -0,0 +1,4 @@ +category: "test" +name: "interpolated" +version: "1.0+2" +foo: "bar" \ No newline at end of file diff --git a/tests/integration/01_simple_docker.sh b/tests/integration/01_simple_docker.sh index ae5ed796..214e58aa 100755 --- a/tests/integration/01_simple_docker.sh +++ b/tests/integration/01_simple_docker.sh @@ -3,28 +3,41 @@ export LUET_NOLOCK=true oneTimeSetUp() { -export tmpdir="$(mktemp -d)" + export tmpdir="$(mktemp -d)" + docker images --filter='reference=luet/cache' --format='{{.Repository}}:{{.Tag}}' | xargs -r docker rmi } oneTimeTearDown() { rm -rf "$tmpdir" + docker images --filter='reference=luet/cache' --format='{{.Repository}}:{{.Tag}}' | xargs -r docker rmi } testBuild() { + # Disable tests which require a DOCKER registry + [ -z "${TEST_DOCKER_IMAGE:-}" ] && startSkipping + cat < $tmpdir/default.yaml +extra: "bar" +foo: "baz" +EOF mkdir $tmpdir/testbuild - luet build --tree "$ROOT_DIR/tests/fixtures/docker_repo" --destination $tmpdir/testbuild --compression zstd test/c@1.0 test/z > /dev/null + luet build --tree "$ROOT_DIR/tests/fixtures/docker_repo" \ + --destination $tmpdir/testbuild \ + --image-repository "${TEST_DOCKER_IMAGE}-cache" --push \ + --compression zstd --values $tmpdir/default.yaml \ + test/c@1.0 test/z test/interpolated #> /dev/null buildst=$? assertEquals 'builds successfully' "$buildst" "0" assertTrue 'create package dep B' "[ -e '$tmpdir/testbuild/b-test-1.0.package.tar.zst' ]" assertTrue 'create package' "[ -e '$tmpdir/testbuild/c-test-1.0.package.tar.zst' ]" assertTrue 'create package z' "[ -e '$tmpdir/testbuild/z-test-1.0+2.package.tar.zst' ]" + assertTrue 'create package interpolated' "[ -e '$tmpdir/testbuild/interpolated-test-1.0+2.package.tar.zst' ]" } testRepo() { # Disable tests which require a DOCKER registry [ -z "${TEST_DOCKER_IMAGE:-}" ] && startSkipping - luet create-repo --tree "$ROOT_DIR/tests/fixtures/docker_repo" \ + createres=$(luet create-repo --tree "$ROOT_DIR/tests/fixtures/docker_repo" \ --output "${TEST_DOCKER_IMAGE}" \ --packages $tmpdir/testbuild \ --name "test" \ @@ -34,10 +47,11 @@ testRepo() { --tree-filename foo.tar \ --meta-filename repository.meta.tar \ --meta-compression zstd \ - --type docker --push-images --force-push + --type docker --push-images --force-push) createst=$? assertEquals 'create repo successfully' "$createst" "0" + assertContains 'contains image push' "$createres" 'Pushed image: quay.io/mocaccinoos/integration-test:z-test-1.0-2' } testConfig() { @@ -66,11 +80,12 @@ testInstall() { # Disable tests which require a DOCKER registry [ -z "${TEST_DOCKER_IMAGE:-}" ] && startSkipping - luet install -y --config $tmpdir/luet.yaml test/c@1.0 test/z + luet install -y --config $tmpdir/luet.yaml test/c@1.0 test/z test/interpolated installst=$? assertEquals 'install test successfully' "$installst" "0" assertTrue 'package installed' "[ -e '$tmpdir/testrootfs/c' ]" assertTrue 'package Z installed' "[ -e '$tmpdir/testrootfs/z' ]" + assertTrue 'package interpolated installed' "[ -e '$tmpdir/testrootfs/interpolated-baz-bar' ]" } testReInstall() { diff --git a/tests/integration/28_nobuildtreedocker.sh b/tests/integration/28_nobuildtreedocker.sh index 9c0204c2..21aba49b 100755 --- a/tests/integration/28_nobuildtreedocker.sh +++ b/tests/integration/28_nobuildtreedocker.sh @@ -3,11 +3,13 @@ export LUET_NOLOCK=true oneTimeSetUp() { -export tmpdir="$(mktemp -d)" + export tmpdir="$(mktemp -d)" + docker images --filter='reference=luet/cache' --format='{{.Repository}}:{{.Tag}}' | xargs -r docker rmi } oneTimeTearDown() { rm -rf "$tmpdir" + docker images --filter='reference=luet/cache' --format='{{.Repository}}:{{.Tag}}' | xargs -r docker rmi } testConfig() { @@ -39,12 +41,17 @@ testBuild() { mkdir $tmpdir/testbuild mkdir $tmpdir/empty - luet build --tree "$tmpdir/empty" --config $tmpdir/luet.yaml --from-repositories --destination $tmpdir/testbuild --compression zstd test/c@1.0 test/z > /dev/null + build_output=$(luet build --pull --tree "$tmpdir/empty" \ + --config $tmpdir/luet.yaml --concurrency 1 \ + --from-repositories --destination $tmpdir/testbuild --compression zstd test/c@1.0 test/z test/interpolated) buildst=$? + echo "$build_output" assertEquals 'builds successfully' "$buildst" "0" assertTrue 'create package dep B' "[ -e '$tmpdir/testbuild/b-test-1.0.package.tar.zst' ]" assertTrue 'create package' "[ -e '$tmpdir/testbuild/c-test-1.0.package.tar.zst' ]" assertTrue 'create package Z' "[ -e '$tmpdir/testbuild/z-test-1.0+2.package.tar.zst' ]" + assertTrue 'create package interpolated' "[ -e '$tmpdir/testbuild/interpolated-test-1.0+2.package.tar.zst' ]" + assertContains 'Does use the upstream cache without specifying it' "$build_output" "Downloaded image: quay.io/mocaccinoos/integration-test-cache:6490e800fe443b99328fc363529aee74bda513930fb27ce6ab814d692bba068e" } testRepo() { @@ -95,11 +102,12 @@ testInstall() { # Disable tests which require a DOCKER registry [ -z "${TEST_DOCKER_IMAGE:-}" ] && startSkipping - luet install -y --config $tmpdir/luet-client.yaml test/c@1.0 test/z + luet install -y --config $tmpdir/luet-client.yaml test/c@1.0 test/z test/interpolated installst=$? assertEquals 'install test successfully' "$installst" "0" assertTrue 'package installed' "[ -e '$tmpdir/testrootfs/c' ]" assertTrue 'package Z installed' "[ -e '$tmpdir/testrootfs/z' ]" + assertTrue 'package interpolated installed' "[ -e '$tmpdir/testrootfs/interpolated-baz-bar' ]" } testReInstall() { diff --git a/tests/integration/29_nobuildtreeinheritvalues.sh b/tests/integration/29_nobuildtreeinheritvalues.sh new file mode 100755 index 00000000..35b6bfd9 --- /dev/null +++ b/tests/integration/29_nobuildtreeinheritvalues.sh @@ -0,0 +1,158 @@ +#!/bin/bash + +export LUET_NOLOCK=true + +oneTimeSetUp() { + export tmpdir="$(mktemp -d)" + docker images --filter='reference=luet/cache' --format='{{.Repository}}:{{.Tag}}' | xargs -r docker rmi +} + +oneTimeTearDown() { + rm -rf "$tmpdir" + docker images --filter='reference=luet/cache' --format='{{.Repository}}:{{.Tag}}' | xargs -r docker rmi +} + +testConfig() { + [ -z "${TEST_DOCKER_IMAGE:-}" ] && startSkipping + + mkdir $tmpdir/testrootfs + cat < $tmpdir/luet.yaml +general: + debug: true +system: + rootfs: $tmpdir/testrootfs + database_path: "/" + database_engine: "boltdb" +config_from_host: true +repositories: + - name: "main" + type: "docker" + enable: true + urls: + - "${TEST_DOCKER_IMAGE}" +EOF + luet config --config $tmpdir/luet.yaml + res=$? + assertEquals 'config test successfully' "$res" "0" +} + +testBuild() { + [ -z "${TEST_DOCKER_IMAGE:-}" ] && startSkipping + cat < $tmpdir/default.yaml +extra: "an" +EOF + mkdir $tmpdir/testbuild + mkdir $tmpdir/empty + build_output=$(luet build --pull --tree "$tmpdir/empty" \ + --config $tmpdir/luet.yaml --values $tmpdir/default.yaml --concurrency 1 \ + --from-repositories --destination $tmpdir/testbuild --compression zstd test/c@1.0 test/z test/interpolated) + buildst=$? + assertEquals 'builds successfully' "$buildst" "0" + assertTrue 'create package dep B' "[ -e '$tmpdir/testbuild/b-test-1.0.package.tar.zst' ]" + assertTrue 'create package' "[ -e '$tmpdir/testbuild/c-test-1.0.package.tar.zst' ]" + assertTrue 'create package Z' "[ -e '$tmpdir/testbuild/z-test-1.0+2.package.tar.zst' ]" + assertTrue 'create package interpolated' "[ -e '$tmpdir/testbuild/interpolated-test-1.0+2.package.tar.zst' ]" + assertContains 'Does use the upstream cache without specifying it' "$build_output" "Generating 'builder' image from quay.io/mocaccinoos/integration-test-cache:79d7107d13d578b362e6a7bf10ec850efce26316405b8d732ce8f9e004d64281 as luet/cache:builder-09e1e5824824b770c9dec10b4d846132" +} + +testRepo() { + # Disable tests which require a DOCKER registry + [ -z "${TEST_DOCKER_IMAGE:-}" ] && startSkipping + + luet create-repo \ + --output "${TEST_DOCKER_IMAGE}-2" \ + --packages $tmpdir/testbuild \ + --name "test" \ + --descr "Test Repo" \ + --urls $tmpdir/testrootfs \ + --tree-compression zstd \ + --tree-filename foo.tar \ + --tree "$tmpdir/empty" --config $tmpdir/luet.yaml --from-repositories \ + --meta-filename repository.meta.tar \ + --meta-compression zstd \ + --type docker --push-images --force-push --debug + + createst=$? + assertEquals 'create repo successfully' "$createst" "0" +} + +testConfigClient() { + [ -z "${TEST_DOCKER_IMAGE:-}" ] && startSkipping + + cat < $tmpdir/luet-client.yaml +general: + debug: true +system: + rootfs: $tmpdir/testrootfs + database_path: "/" + database_engine: "boltdb" +config_from_host: true +repositories: + - name: "main" + type: "docker" + enable: true + urls: + - "${TEST_DOCKER_IMAGE}-2" +EOF + luet config --config $tmpdir/luet-client.yaml + res=$? + assertEquals 'config test successfully' "$res" "0" +} + +testInstall() { + # Disable tests which require a DOCKER registry + [ -z "${TEST_DOCKER_IMAGE:-}" ] && startSkipping + + luet install -y --config $tmpdir/luet-client.yaml test/c@1.0 test/z test/interpolated + installst=$? + assertEquals 'install test successfully' "$installst" "0" + assertTrue 'package installed' "[ -e '$tmpdir/testrootfs/c' ]" + assertTrue 'package Z installed' "[ -e '$tmpdir/testrootfs/z' ]" + ls -liah $tmpdir/testrootfs/ + assertTrue 'package interpolated installed' "[ -e '$tmpdir/testrootfs/interpolated-baz-an' ]" +} + +testReInstall() { + # Disable tests which require a DOCKER registry + [ -z "${TEST_DOCKER_IMAGE:-}" ] && startSkipping + + output=$(luet install -y --config $tmpdir/luet-client.yaml test/c@1.0) + installst=$? + assertEquals 'install test successfully' "$installst" "0" + assertContains 'contains warning' "$output" 'No packages to install' +} + +testUnInstall() { + # Disable tests which require a DOCKER registry + [ -z "${TEST_DOCKER_IMAGE:-}" ] && startSkipping + + luet uninstall -y --config $tmpdir/luet-client.yaml test/c@1.0 + installst=$? + assertEquals 'uninstall test successfully' "$installst" "0" + assertTrue 'package uninstalled' "[ ! -e '$tmpdir/testrootfs/c' ]" +} + +testInstallAgain() { + # Disable tests which require a DOCKER registry + [ -z "${TEST_DOCKER_IMAGE:-}" ] && startSkipping + + assertTrue 'package uninstalled' "[ ! -e '$tmpdir/testrootfs/c' ]" + output=$(luet install -y --config $tmpdir/luet-client.yaml test/c@1.0) + installst=$? + assertEquals 'install test successfully' "$installst" "0" + assertNotContains 'contains warning' "$output" 'No packages to install' + assertTrue 'package installed' "[ -e '$tmpdir/testrootfs/c' ]" + assertTrue 'package in cache' "[ -e '$tmpdir/testrootfs/packages/c-test-1.0.package.tar.zst' ]" +} + +testCleanup() { + [ -z "${TEST_DOCKER_IMAGE:-}" ] && startSkipping + + luet cleanup --config $tmpdir/luet-client.yaml + installst=$? + assertEquals 'cleanup test successfully' "$installst" "0" +} + +# Load shUnit2. +. "$ROOT_DIR/tests/integration/shunit2"/shunit2 +