From 89b1d552fe332482b1baba42819aecffaa804223 Mon Sep 17 00:00:00 2001 From: petruki <31597636+petruki@users.noreply.github.com> Date: Sun, 10 Nov 2024 12:36:57 -0800 Subject: [PATCH] Added support to compare Relay changes --- go.mod | 41 ++++--- go.sum | 63 +++++------ .../comparator/changed_config_relay.json | 65 +++++++++++ .../fixtures/comparator/new_config_relay.json | 65 +++++++++++ src/core/comparator.go | 41 ++++++- src/core/comparator_test.go | 104 ++++++++++++++++++ src/model/snapshot.go | 9 ++ 7 files changed, 330 insertions(+), 58 deletions(-) create mode 100644 resources/fixtures/comparator/changed_config_relay.json create mode 100644 resources/fixtures/comparator/new_config_relay.json diff --git a/go.mod b/go.mod index 9352db5..d216402 100644 --- a/go.mod +++ b/go.mod @@ -7,46 +7,43 @@ toolchain go1.23.0 require ( github.com/go-git/go-billy/v5 v5.5.0 github.com/go-git/go-git/v5 v5.12.0 + github.com/golang-jwt/jwt v3.2.2+incompatible + github.com/gorilla/mux v1.8.1 github.com/joho/godotenv v1.5.1 github.com/stretchr/testify v1.9.0 + go.mongodb.org/mongo-driver v1.2.1 ) require ( - dario.cat/mergo v1.0.0 // indirect + dario.cat/mergo v1.0.1 // indirect + github.com/DataDog/zstd v1.5.6 // indirect github.com/Microsoft/go-winio v0.6.2 // indirect github.com/ProtonMail/go-crypto v1.0.0 // indirect - github.com/cloudflare/circl v1.3.9 // indirect - github.com/cyphar/filepath-securejoin v0.2.5 // indirect + github.com/cloudflare/circl v1.3.7 // indirect + github.com/cyphar/filepath-securejoin v0.3.4 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect github.com/emirpasic/gods v1.18.1 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect + github.com/go-stack/stack v1.8.1 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/snappy v0.0.4 // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect github.com/kevinburke/ssh_config v1.2.0 // indirect - github.com/klauspost/compress v1.17.9 // indirect - github.com/montanaflynn/stats v0.7.1 // indirect github.com/pjbgf/sha1cd v0.3.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect github.com/skeema/knownhosts v1.2.2 // indirect + github.com/tidwall/pretty v1.2.1 // indirect github.com/xanzy/ssh-agent v0.3.3 // indirect - github.com/xdg-go/pbkdf2 v1.0.0 // indirect - github.com/xdg-go/scram v1.1.2 // indirect - github.com/xdg-go/stringprep v1.0.4 // indirect - github.com/youmark/pkcs8 v0.0.0-20240424034433-3c2c7870ae76 // indirect - golang.org/x/crypto v0.25.0 // indirect - golang.org/x/net v0.27.0 // indirect - golang.org/x/sync v0.7.0 // indirect - golang.org/x/sys v0.22.0 // indirect - golang.org/x/text v0.16.0 // indirect + github.com/xdg/scram v1.0.5 // indirect + github.com/xdg/stringprep v1.0.3 // indirect + golang.org/x/crypto v0.21.0 // indirect + golang.org/x/net v0.22.0 // indirect + golang.org/x/sync v0.9.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/text v0.14.0 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect -) - -require ( - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/golang-jwt/jwt v3.2.2+incompatible - github.com/gorilla/mux v1.8.1 - github.com/pmezard/go-difflib v1.0.0 // indirect - go.mongodb.org/mongo-driver v1.16.0 gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index ec06f9e..e65fd9e 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,7 @@ -dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= -dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= +dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s= +dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= +github.com/DataDog/zstd v1.5.6 h1:LbEglqepa/ipmmQJUDnSsfvA8e8IStVcGaFWDuxvGOY= +github.com/DataDog/zstd v1.5.6/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= @@ -11,10 +13,10 @@ github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPd github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= -github.com/cloudflare/circl v1.3.9 h1:QFrlgFYf2Qpi8bSpVPK1HBvWpx16v/1TZivyo7pGuBE= -github.com/cloudflare/circl v1.3.9/go.mod h1:PDRU+oXvdD7KCtgKxW95M5Z8BpSCJXQORiZFnBQS5QU= -github.com/cyphar/filepath-securejoin v0.2.5 h1:6iR5tXJ/e6tJZzzdMc1km3Sa7RRIVBKAK32O2s7AYfo= -github.com/cyphar/filepath-securejoin v0.2.5/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= +github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU= +github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA= +github.com/cyphar/filepath-securejoin v0.3.4 h1:VBWugsJh2ZxJmLFSM06/0qzQyiQX2Qs0ViKrUAcqdZ8= +github.com/cyphar/filepath-securejoin v0.3.4/go.mod h1:8s/MCNJREmFK0H02MF6Ihv1nakJe4L/w3WZLHNkvlYM= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -32,6 +34,8 @@ github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMj github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= github.com/go-git/go-git/v5 v5.12.0 h1:7Md+ndsjrzZxbddRDZjF14qK+NN56sy6wkqaVrjZtys= github.com/go-git/go-git/v5 v5.12.0/go.mod h1:FTM9VKtnI2m65hNI/TenDDDnUf2Q9FHnXYjuz9i5OEY= +github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= +github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= @@ -48,8 +52,6 @@ github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= -github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= -github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= @@ -57,8 +59,6 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/montanaflynn/stats v0.7.1 h1:etflOAAHORrCC44V+aR6Ftzort912ZU+YLiSTuV8eaE= -github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4= @@ -79,26 +79,24 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= +github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= -github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= -github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= -github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= -github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= -github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= -github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= -github.com/youmark/pkcs8 v0.0.0-20240424034433-3c2c7870ae76 h1:tBiBTKHnIjovYoLX/TPkcf+OjqqKGQrPtGT3Foz+Pgo= -github.com/youmark/pkcs8 v0.0.0-20240424034433-3c2c7870ae76/go.mod h1:SQliXeA7Dhkt//vS29v3zpbEwoa+zb2Cn5xj5uO4K5U= +github.com/xdg/scram v1.0.5 h1:TuS0RFmt5Is5qm9Tm2SoD89OPqe4IRiFtyFY4iwWXsw= +github.com/xdg/scram v1.0.5/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= +github.com/xdg/stringprep v1.0.3 h1:cmL5Enob4W83ti/ZHuZLuKD/xqJfus4fVPwE+/BDm+4= +github.com/xdg/stringprep v1.0.3/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -go.mongodb.org/mongo-driver v1.16.0 h1:tpRsfBJMROVHKpdGyc1BBEzzjDUWjItxbVSZ8Ls4BQ4= -go.mongodb.org/mongo-driver v1.16.0/go.mod h1:oB6AhJQvFQL4LEHyXi6aJzQJtBiTQHiAd83l0GdFaiw= +go.mongodb.org/mongo-driver v1.2.1 h1:ANAlYXXM5XmOdW/Nc38jOr+wS5nlk7YihT24U1imiWM= +go.mongodb.org/mongo-driver v1.2.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30= -golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -108,13 +106,13 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys= -golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE= +golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= +golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 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/sync v0.9.0 h1:fEo0HyrW1GIgZdpbhCRO0PkJajUS5H9IFUztCgEo2jQ= +golang.org/x/sync v0.9.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -128,25 +126,24 @@ golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= -golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.22.0 h1:BbsgPEJULsl2fV/AT3v15Mjva5yXKQDyKf+TbDz7QJk= -golang.org/x/term v0.22.0/go.mod h1:F3qCibpT5AMpCRfhfT53vVJwhLtIVHhB9XDjfFvnMI4= +golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= +golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/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.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= -golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= diff --git a/resources/fixtures/comparator/changed_config_relay.json b/resources/fixtures/comparator/changed_config_relay.json new file mode 100644 index 0000000..dce2096 --- /dev/null +++ b/resources/fixtures/comparator/changed_config_relay.json @@ -0,0 +1,65 @@ +{ + "domain": { + "group": [ + { + "name": "Release 1", + "description": "Showcase configuration", + "activated": true, + "config": [ + { + "key": "MY_SWITCHER_1", + "description": "My first switcher", + "activated": true, + "strategies": [ + { + "strategy": "VALUE_VALIDATION", + "activated": false, + "operation": "EXIST", + "values": [ + "user_1" + ] + } + ], + "components": [ + "switcher-playground" + ] + }, + { + "key": "MY_SWITCHER_2", + "description": "", + "activated": false, + "strategies": [], + "components": [ + "switcher-playground" + ] + }, + { + "key": "MY_SWITCHER_3", + "description": "", + "activated": true, + "strategies": [], + "components": [ + "benchmark" + ] + }, + { + "key": "MY_SWITCHER_4", + "description": "", + "activated": true, + "strategies": [], + "relay": { + "type": "VALIDATION", + "method": "GET", + "endpoint": "https://localhost:3000/v1/relay", + "description": "Changed Relay to localhost", + "activated": false + }, + "components": [ + "benchmark" + ] + } + ] + } + ] + } +} \ No newline at end of file diff --git a/resources/fixtures/comparator/new_config_relay.json b/resources/fixtures/comparator/new_config_relay.json new file mode 100644 index 0000000..4147cf0 --- /dev/null +++ b/resources/fixtures/comparator/new_config_relay.json @@ -0,0 +1,65 @@ +{ + "domain": { + "group": [ + { + "name": "Release 1", + "description": "Showcase configuration", + "activated": true, + "config": [ + { + "key": "MY_SWITCHER_1", + "description": "My first switcher", + "activated": true, + "strategies": [ + { + "strategy": "VALUE_VALIDATION", + "activated": false, + "operation": "EXIST", + "values": [ + "user_1" + ] + } + ], + "components": [ + "switcher-playground" + ] + }, + { + "key": "MY_SWITCHER_2", + "description": "", + "activated": false, + "strategies": [], + "components": [ + "switcher-playground" + ] + }, + { + "key": "MY_SWITCHER_3", + "description": "", + "activated": true, + "strategies": [], + "components": [ + "benchmark" + ] + }, + { + "key": "MY_SWITCHER_4", + "description": "", + "activated": true, + "strategies": [], + "relay": { + "type": "NOTIFICATION", + "method": "POST", + "endpoint": "https://localhost:3000/relay", + "description": "Relay to localhost", + "activated": true + }, + "components": [ + "benchmark" + ] + } + ] + } + ] + } +} \ No newline at end of file diff --git a/src/core/comparator.go b/src/core/comparator.go index 67101a4..db5c6ad 100644 --- a/src/core/comparator.go +++ b/src/core/comparator.go @@ -27,6 +27,7 @@ const ( GROUP DiffResult = "GROUP" CONFIG DiffResult = "CONFIG" STRATEGY DiffResult = "STRATEGY" + RELAY DiffResult = "RELAY" COMPONENT DiffResult = "COMPONENT" ) @@ -115,10 +116,12 @@ func checkConfigDiff(leftGroup model.Group, rightGroup model.Group, diffResult * if diffType == CHANGED { diffFound = compareAndUpdateBool(leftConfig.Activated, rightConfig.Activated, diffFound, &modelDiffFound.Activated) diffFound = compareAndUpdateString(leftConfig.Description, rightConfig.Description, diffFound, &modelDiffFound.Description) + diffFound = compareAndUpdateRelay(leftConfig, rightConfig, diffFound, &modelDiffFound) } checkStrategyDiff(leftConfig, rightConfig, leftGroup, diffResult, diffType) checkComponentsDiff(leftConfig, rightConfig, leftGroup, diffResult, diffType) + checkRelayDiff(leftConfig, rightConfig, leftGroup, diffResult, diffType) if diffFound { appendDiffResults(string(diffType), string(CONFIG), []string{leftGroup.Name, leftConfig.Key}, modelDiffFound, diffResult) @@ -127,7 +130,9 @@ func checkConfigDiff(leftGroup model.Group, rightGroup model.Group, diffResult * } } -func checkStrategyDiff(leftConfig model.Config, rightConfig model.Config, leftGroup model.Group, diffResult *model.DiffResult, diffType DiffType) { +func checkStrategyDiff(leftConfig model.Config, rightConfig model.Config, leftGroup model.Group, + diffResult *model.DiffResult, diffType DiffType) { + if len(leftConfig.Strategies) == 0 { return } @@ -135,9 +140,11 @@ func checkStrategyDiff(leftConfig model.Config, rightConfig model.Config, leftGr for _, leftStrategy := range leftConfig.Strategies { if !slices.Contains(model.StrategyNames(rightConfig.Strategies), leftStrategy.Strategy) { if diffType == NEW { - appendDiffResults(string(diffType), string(STRATEGY), []string{leftGroup.Name, leftConfig.Key}, leftStrategy, diffResult) + appendDiffResults(string(diffType), string(STRATEGY), + []string{leftGroup.Name, leftConfig.Key}, leftStrategy, diffResult) } else if diffType == DELETED { - appendDiffResults(string(diffType), string(STRATEGY), []string{leftGroup.Name, leftConfig.Key, leftStrategy.Strategy}, nil, diffResult) + appendDiffResults(string(diffType), string(STRATEGY), + []string{leftGroup.Name, leftConfig.Key, leftStrategy.Strategy}, nil, diffResult) } } else { rightStrategy := model.GetStrategyByName(rightConfig.Strategies, leftStrategy.Strategy) @@ -158,6 +165,19 @@ func checkStrategyDiff(leftConfig model.Config, rightConfig model.Config, leftGr } } +func checkRelayDiff(leftConfig model.Config, rightConfig model.Config, leftGroup model.Group, + diffResult *model.DiffResult, diffType DiffType) { + + if diffType != DELETED { + return + } + + if leftConfig.Relay != nil && rightConfig.Relay == nil { + appendDiffResults(string(DELETED), string(RELAY), + []string{leftGroup.Name, leftConfig.Key}, nil, diffResult) + } +} + func checkComponentsDiff(leftConfig model.Config, rightConfig model.Config, leftGroup model.Group, diffResult *model.DiffResult, diffType DiffType) { @@ -178,6 +198,21 @@ func checkComponentsDiff(leftConfig model.Config, rightConfig model.Config, left } } +func compareAndUpdateRelay(leftConfig model.Config, rightConfig model.Config, diffFound bool, modelDiffFound *model.Config) bool { + if leftConfig.Relay == nil || rightConfig.Relay == nil { + return diffFound + } + + modelDiffFound.Relay = &model.Relay{} + diffFound = compareAndUpdateString(leftConfig.Relay.Type, rightConfig.Relay.Type, diffFound, &modelDiffFound.Relay.Type) + diffFound = compareAndUpdateString(leftConfig.Relay.Method, rightConfig.Relay.Method, diffFound, &modelDiffFound.Relay.Method) + diffFound = compareAndUpdateString(leftConfig.Relay.Endpoint, rightConfig.Relay.Endpoint, diffFound, &modelDiffFound.Relay.Endpoint) + diffFound = compareAndUpdateString(leftConfig.Relay.Description, rightConfig.Relay.Description, diffFound, &modelDiffFound.Relay.Description) + diffFound = compareAndUpdateBool(leftConfig.Relay.Activated, rightConfig.Relay.Activated, diffFound, &modelDiffFound.Relay.Activated) + + return diffFound +} + func compareAndUpdateBool(left *bool, right *bool, diffFound bool, modelDiffFound **bool) bool { // Bool are required and will assume right is equal to left if right is nil // E.g. when Respository (right) has not been set, it will assume the value from the left (API) diff --git a/src/core/comparator_test.go b/src/core/comparator_test.go index e1605a3..8346187 100644 --- a/src/core/comparator_test.go +++ b/src/core/comparator_test.go @@ -199,6 +199,42 @@ func TestCheckConfigSnapshot(t *testing.T) { ]}`, utils.ToJsonFromObject(actual)) }) + t.Run("Should return changes in config relay", func(t *testing.T) { + // Given + jsonApi := utils.ReadJsonFromFile("../../resources/fixtures/comparator/new_config_relay.json") + jsonRepo := utils.ReadJsonFromFile("../../resources/fixtures/comparator/changed_config_relay.json") + fromApi := c.NewSnapshotFromJson([]byte(jsonApi)) + fromRepo := c.NewSnapshotFromJson([]byte(jsonRepo)) + + // Test Check/Merge changes + diffChanged := c.CheckSnapshotDiff(fromApi, fromRepo, CHANGED) + diffNew := c.CheckSnapshotDiff(fromRepo, fromApi, NEW) + diffDeleted := c.CheckSnapshotDiff(fromApi, fromRepo, DELETED) + actual := c.MergeResults([]model.DiffResult{diffChanged, diffNew, diffDeleted}) + + assert.NotNil(t, actual) + assert.JSONEq(t, `{ + "changes": [ + { + "action": "CHANGED", + "diff": "CONFIG", + "path": [ + "Release 1", + "MY_SWITCHER_4" + ], + "content": { + "relay": { + "type": "VALIDATION", + "method": "GET", + "endpoint": "https://localhost:3000/v1/relay", + "activated": false, + "description": "Changed Relay to localhost" + } + } + } + ]}`, utils.ToJsonFromObject(actual)) + }) + t.Run("Should return changes in config - missing description assume not changed", func(t *testing.T) { // Given jsonApi := utils.ReadJsonFromFile(DEFAULT_JSON) @@ -294,6 +330,46 @@ func TestCheckConfigSnapshot(t *testing.T) { ]}`, utils.ToJsonFromObject(actual)) }) + t.Run("Should return new config with relay", func(t *testing.T) { + // Given + jsonApi := utils.ReadJsonFromFile(DEFAULT_JSON) + jsonRepo := utils.ReadJsonFromFile("../../resources/fixtures/comparator/new_config_relay.json") + fromApi := c.NewSnapshotFromJson([]byte(jsonApi)) + fromRepo := c.NewSnapshotFromJson([]byte(jsonRepo)) + + // Test Check/Merge changes + diffChanged := c.CheckSnapshotDiff(fromApi, fromRepo, CHANGED) + diffNew := c.CheckSnapshotDiff(fromRepo, fromApi, NEW) + diffDeleted := c.CheckSnapshotDiff(fromApi, fromRepo, DELETED) + actual := c.MergeResults([]model.DiffResult{diffChanged, diffNew, diffDeleted}) + + assert.NotNil(t, actual) + assert.JSONEq(t, `{ + "changes": [ + { + "action": "NEW", + "diff": "CONFIG", + "path": [ + "Release 1" + ], + "content": { + "key": "MY_SWITCHER_4", + "activated": true, + "relay": { + "type": "NOTIFICATION", + "method": "POST", + "endpoint": "https://localhost:3000/relay", + "description": "Relay to localhost", + "activated": true + }, + "components": [ + "benchmark" + ] + } + } + ]}`, utils.ToJsonFromObject(actual)) + }) + t.Run("Should return new config with strategy", func(t *testing.T) { // Given jsonApi := utils.ReadJsonFromFile(DEFAULT_JSON) @@ -362,6 +438,34 @@ func TestCheckConfigSnapshot(t *testing.T) { } ]}`, utils.ToJsonFromObject(actual)) }) + + t.Run("Should return deleted config relay", func(t *testing.T) { + // Given + jsonApi := utils.ReadJsonFromFile("../../resources/fixtures/comparator/new_config_relay.json") + jsonRepo := utils.ReadJsonFromFile("../../resources/fixtures/comparator/new_config.json") + fromApi := c.NewSnapshotFromJson([]byte(jsonApi)) + fromRepo := c.NewSnapshotFromJson([]byte(jsonRepo)) + + // Test Check/Merge changes + diffChanged := c.CheckSnapshotDiff(fromApi, fromRepo, CHANGED) + diffNew := c.CheckSnapshotDiff(fromRepo, fromApi, NEW) + diffDeleted := c.CheckSnapshotDiff(fromApi, fromRepo, DELETED) + actual := c.MergeResults([]model.DiffResult{diffChanged, diffNew, diffDeleted}) + + assert.NotNil(t, actual) + assert.JSONEq(t, `{ + "changes": [ + { + "action": "DELETED", + "diff": "RELAY", + "path": [ + "Release 1", + "MY_SWITCHER_4" + ], + "content": null + } + ]}`, utils.ToJsonFromObject(actual)) + }) } func TestCheckStrategySnapshot(t *testing.T) { diff --git a/src/model/snapshot.go b/src/model/snapshot.go index 2e6cfce..6467259 100644 --- a/src/model/snapshot.go +++ b/src/model/snapshot.go @@ -17,6 +17,7 @@ type Config struct { Description string `json:"description,omitempty"` Activated *bool `json:"activated,omitempty"` Strategies []Strategy `json:"strategies,omitempty"` + Relay *Relay `json:"relay,omitempty"` Components []string `json:"components,omitempty"` } @@ -27,6 +28,14 @@ type Strategy struct { Values []string `json:"values,omitempty"` } +type Relay struct { + Type string `json:"type,omitempty"` + Method string `json:"method,omitempty"` + Endpoint string `json:"endpoint,omitempty"` + Activated *bool `json:"activated,omitempty"` + Description string `json:"description,omitempty"` +} + type Snapshot struct { Domain Domain `json:"domain,omitempty"` }