From 89ef14d1d55ed0eac4a9bc26e5189212c2dd40db Mon Sep 17 00:00:00 2001 From: Adelina Mahu <33446703+adelinag08@users.noreply.github.com> Date: Wed, 15 Jan 2025 15:02:24 +0100 Subject: [PATCH] Fix beast client tag & prettify outputs (#110) --- go.mod | 17 ++++- go.sum | 99 +++++++++++++++++++++++++++++ pkg/cmd/claim/add.go | 10 ++- pkg/cmd/claim/get.go | 10 ++- pkg/cmd/claim/remove.go | 11 +++- pkg/cmd/claim/user.go | 13 ++-- pkg/cmd/dsr/get.go | 34 +++++++++- pkg/cmd/ml/cancel.go | 9 ++- pkg/cmd/ml/get.go | 11 +++- pkg/cmd/ml/run.go | 45 ++++++++----- pkg/cmd/ml/run_test.go | 16 ++++- pkg/cmd/spark/configuration.go | 10 ++- pkg/cmd/spark/configuration_test.go | 2 +- pkg/cmd/spark/logs.go | 3 +- pkg/cmd/spark/requestStatus.go | 3 +- pkg/cmd/spark/runtimeInfo.go | 10 ++- pkg/cmd/spark/runtimeinfo_test.go | 4 +- pkg/cmd/spark/submit.go | 9 +-- pkg/cmd/util/utils.go | 40 +++++++++++- pkg/cmd/util/utils_test.go | 47 ++++++++++++++ pkg/cmd/util/version/version.go | 19 +++++- pkg/cmd/version/version.go | 9 +-- 22 files changed, 375 insertions(+), 56 deletions(-) diff --git a/go.mod b/go.mod index 5180e93..6f5a73a 100644 --- a/go.mod +++ b/go.mod @@ -7,14 +7,18 @@ require ( github.com/SneaksAndData/esd-services-api-client-go v0.1.5 github.com/spf13/cobra v1.8.0 github.com/stretchr/testify v1.8.4 - golang.org/x/mod v0.15.0 + golang.org/x/mod v0.17.0 ) require ( + atomicgo.dev/cursor v0.2.0 // indirect + atomicgo.dev/keyboard v0.2.9 // indirect + atomicgo.dev/schedule v0.1.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1 // indirect github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.1 // indirect github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.2 // indirect github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1 // indirect + github.com/containerd/console v1.0.3 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.3 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/gabriel-vasile/mimetype v1.4.3 // indirect @@ -23,18 +27,25 @@ require ( github.com/go-playground/validator/v10 v10.19.0 // indirect github.com/golang-jwt/jwt/v5 v5.2.0 // indirect github.com/google/uuid v1.6.0 // indirect + github.com/gookit/color v1.5.4 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/kylelemons/godebug v1.1.0 // indirect github.com/leodido/go-urn v1.4.0 // indirect + github.com/lithammer/fuzzysearch v1.1.8 // indirect + github.com/mattn/go-runewidth v0.0.16 // indirect github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/pterm/pterm v0.12.80 // indirect + github.com/rivo/uniseg v0.4.4 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/stretchr/objx v0.5.0 // indirect + github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect golang.org/x/crypto v0.21.0 // indirect golang.org/x/exp v0.0.0-20240119083558-1b970713d09a // indirect golang.org/x/net v0.23.0 // indirect - golang.org/x/sys v0.18.0 // indirect - golang.org/x/text v0.14.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/term v0.26.0 // indirect + golang.org/x/text v0.20.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 6348ebc..a1cffb8 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,9 @@ +atomicgo.dev/cursor v0.2.0 h1:H6XN5alUJ52FZZUkI7AlJbUc1aW38GWZalpYRPpoPOw= +atomicgo.dev/cursor v0.2.0/go.mod h1:Lr4ZJB3U7DfPPOkbH7/6TOtJ4vFGHlgj1nc+n900IpU= +atomicgo.dev/keyboard v0.2.9 h1:tOsIid3nlPLZ3lwgG8KZMp/SFmr7P0ssEN5JUsm78K8= +atomicgo.dev/keyboard v0.2.9/go.mod h1:BC4w9g00XkxH/f1HXhW2sXmJFOCWbKn9xrOunSFtExQ= +atomicgo.dev/schedule v0.1.0 h1:nTthAbhZS5YZmgYbb2+DH8uQIZcTlIrd4eYr3UQxEjs= +atomicgo.dev/schedule v0.1.0/go.mod h1:xeUa3oAkiuHYh8bKiQBRojqAMq3PXXbJujjb0hw8pEU= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1 h1:E+OJmp2tPvt1W+amx48v1eqbjDYsgN+RzP4q16yV5eM= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1/go.mod h1:a6xsAQUZg+VsS3TJ05SRp524Hs4pZ/AeFSr5ENf0Yjo= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.1 h1:sO0/P7g68FrryJzljemN+6GTssUXdANk6aJ7T1ZxnsQ= @@ -8,12 +14,22 @@ github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1 h1:DzHpqpoJVaC github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= +github.com/MarvinJWendt/testza v0.1.0/go.mod h1:7AxNvlfeHP7Z/hDQ5JtE3OKYT3XFUeLCDE2DQninSqs= +github.com/MarvinJWendt/testza v0.2.1/go.mod h1:God7bhG8n6uQxwdScay+gjm9/LnO4D3kkcZX4hv9Rp8= +github.com/MarvinJWendt/testza v0.2.8/go.mod h1:nwIcjmr0Zz+Rcwfh3/4UhBp7ePKVhuBExvZqnKYWlII= +github.com/MarvinJWendt/testza v0.2.10/go.mod h1:pd+VWsoGUiFtq+hRKSU1Bktnn+DMCSrDrXDpX2bG66k= +github.com/MarvinJWendt/testza v0.2.12/go.mod h1:JOIegYyV7rX+7VZ9r77L/eH6CfJHHzXjB69adAhzZkI= +github.com/MarvinJWendt/testza v0.3.0/go.mod h1:eFcL4I0idjtIx8P9C6KkAuLgATNKpX4/2oUqKc6bF2c= +github.com/MarvinJWendt/testza v0.4.2/go.mod h1:mSdhXiKH8sg/gQehJ63bINcCKp7RtYewEjXsvsVUPbE= github.com/SneaksAndData/esd-services-api-client-go v0.1.3 h1:Yx6QSFYBkO2bJ2GOlkEvEvlYvWAcWPTlbzObGxefS0A= github.com/SneaksAndData/esd-services-api-client-go v0.1.3/go.mod h1:VSjjpFbRJd9Yjhaj7hKKFwJjAlc+kvkeg0GQMgJSz5o= github.com/SneaksAndData/esd-services-api-client-go v0.1.4 h1:jhc2BLGG96Wv/L2eeQVuOKdNEJj+5dWnIHlDQ3pQ5wo= github.com/SneaksAndData/esd-services-api-client-go v0.1.4/go.mod h1:VSjjpFbRJd9Yjhaj7hKKFwJjAlc+kvkeg0GQMgJSz5o= github.com/SneaksAndData/esd-services-api-client-go v0.1.5 h1:Dh7yydvLQqI4Ae1Uc6K/vlQkld9+R0rKbn2Ay6YRf+M= github.com/SneaksAndData/esd-services-api-client-go v0.1.5/go.mod h1:VSjjpFbRJd9Yjhaj7hKKFwJjAlc+kvkeg0GQMgJSz5o= +github.com/atomicgo/cursor v0.0.1/go.mod h1:cBON2QmmrysudxNBFthvMtN32r3jxVRIvzkUiF/RuIk= +github.com/containerd/console v1.0.3 h1:lIr7SlA5PxZyMV30bDW0MGbiOPXwc63yRuCP0ARubLw= +github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM= github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -35,18 +51,46 @@ github.com/golang-jwt/jwt/v5 v5.2.0 h1:d/ix8ftRUorsN+5eMIlF4T6J8CAt9rch3My2winC1 github.com/golang-jwt/jwt/v5 v5.2.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gookit/color v1.4.2/go.mod h1:fqRyamkC1W8uxl+lxCQxOT09l/vYfZ+QeiX3rKQHCoQ= +github.com/gookit/color v1.5.0/go.mod h1:43aQb+Zerm/BWh2GnrgOQm7ffz7tvQXEKV6BFMl7wAo= +github.com/gookit/color v1.5.4 h1:FZmqs7XOyGgCAxmWyPslpiok1k05wmY3SJTytgvYFs0= +github.com/gookit/color v1.5.4/go.mod h1:pZJOeOS8DM43rXbp4AZo1n9zCU2qjpcRko0b6/QJi9w= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.0.10/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= +github.com/klauspost/cpuid/v2 v2.0.12/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +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/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= +github.com/lithammer/fuzzysearch v1.1.8 h1:/HIuJnjHuXS8bKaiTMeeDlW2/AyIWk2brx1V8LFgLN4= +github.com/lithammer/fuzzysearch v1.1.8/go.mod h1:IdqeyBClc3FFqSzYq/MXESsS4S0FsZ5ajtkr5xPLts4= +github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pterm/pterm v0.12.27/go.mod h1:PhQ89w4i95rhgE+xedAoqous6K9X+r6aSOI2eFF7DZI= +github.com/pterm/pterm v0.12.29/go.mod h1:WI3qxgvoQFFGKGjGnJR849gU0TsEOvKn5Q8LlY1U7lg= +github.com/pterm/pterm v0.12.30/go.mod h1:MOqLIyMOgmTDz9yorcYbcw+HsgoZo3BQfg2wtl3HEFE= +github.com/pterm/pterm v0.12.31/go.mod h1:32ZAWZVXD7ZfG0s8qqHXePte42kdz8ECtRyEejaWgXU= +github.com/pterm/pterm v0.12.33/go.mod h1:x+h2uL+n7CP/rel9+bImHD5lF3nM9vJj80k9ybiiTTE= +github.com/pterm/pterm v0.12.36/go.mod h1:NjiL09hFhT/vWjQHSj1athJpx6H8cjpHXNAK5bUw8T8= +github.com/pterm/pterm v0.12.40/go.mod h1:ffwPLwlbXxP+rxT0GsgDTzS3y3rmpAO1NMjUkGTYf8s= +github.com/pterm/pterm v0.12.80 h1:mM55B+GnKUnLMUSqhdINe4s6tOuVQIetQ3my8JGyAIg= +github.com/pterm/pterm v0.12.80/go.mod h1:c6DeF9bSnOSeFPZlfs4ZRAFcf5SCoTwvwQ5xaKGQlHo= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= +github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= @@ -55,27 +99,82 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs= +github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= +github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +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.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/exp v0.0.0-20240119083558-1b970713d09a h1:Q8/wZp0KX97QFTc2ywcOE0YRjZPVIx+MXInMzdvQqcA= golang.org/x/exp v0.0.0-20240119083558-1b970713d09a/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08= +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/mod v0.15.0 h1:SernR4v+D55NyBH2QiEQrlBAnj1ECL6AGrA5+dPaMY8= golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= golang.org/x/net v0.23.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/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211013075003-97ac67df715c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= golang.org/x/sys v0.18.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-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.26.0 h1:WEQa6V3Gja/BhNxg540hBip/kkaYtRg3cxg4oXSw4AU= +golang.org/x/term v0.26.0/go.mod h1:Si5m1o57C5nBNQo5z1iq+XDijt21BDBDp2bK0QI8e3E= +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.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= 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/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug= +golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4= +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= +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= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/pkg/cmd/claim/add.go b/pkg/cmd/claim/add.go index 463444e..4f93677 100644 --- a/pkg/cmd/claim/add.go +++ b/pkg/cmd/claim/add.go @@ -4,7 +4,9 @@ import ( "fmt" "github.com/MakeNowJust/heredoc" "github.com/SneaksAndData/esd-services-api-client-go/claim" + "github.com/pterm/pterm" "github.com/spf13/cobra" + "snd-cli/pkg/cmd/util" "snd-cli/pkg/cmdutil" "strings" ) @@ -30,7 +32,7 @@ func NewCmdAddClaim(authServiceFactory *cmdutil.AuthServiceFactory, serviceFacto } resp, err := addClaimRun(service.(*claim.Service), userId, claimProvider, ca) if err == nil { - fmt.Println(resp) + pterm.DefaultBasicText.Println(resp) } return err }, @@ -48,5 +50,9 @@ func addClaimRun(claimService Service, userId, claimProvider string, ca []string } return "", fmt.Errorf("failed to add claims for user %s with claim provider %s: %w", userId, claimProvider, err) } - return response, nil + prettifyResponse, err := util.PrettifyJSON(response) + if err != nil { + return "", fmt.Errorf("failed to prettify response: %w", err) + } + return prettifyResponse, nil } diff --git a/pkg/cmd/claim/get.go b/pkg/cmd/claim/get.go index 058950b..6089212 100644 --- a/pkg/cmd/claim/get.go +++ b/pkg/cmd/claim/get.go @@ -4,7 +4,9 @@ import ( "fmt" "github.com/MakeNowJust/heredoc" "github.com/SneaksAndData/esd-services-api-client-go/claim" + "github.com/pterm/pterm" "github.com/spf13/cobra" + "snd-cli/pkg/cmd/util" "snd-cli/pkg/cmdutil" "strings" ) @@ -28,7 +30,7 @@ func NewCmdGetClaim(authServiceFactory *cmdutil.AuthServiceFactory, serviceFacto } resp, err := getClaimRun(service.(*claim.Service), userId, claimProvider) if err == nil { - fmt.Println(resp) + pterm.DefaultBasicText.Println(resp) } return err }, @@ -46,5 +48,9 @@ func getClaimRun(claimService Service, userId, claimProvider string) (string, er } return "", fmt.Errorf("failed to retrieve claims for user %s for claim provider %s : %w", userId, claimProvider, err) } - return response, nil + prettifyResponse, err := util.PrettifyJSON(response) + if err != nil { + return "", fmt.Errorf("failed to prettify response: %w", err) + } + return prettifyResponse, nil } diff --git a/pkg/cmd/claim/remove.go b/pkg/cmd/claim/remove.go index 87e7314..9083d12 100644 --- a/pkg/cmd/claim/remove.go +++ b/pkg/cmd/claim/remove.go @@ -4,8 +4,9 @@ import ( "fmt" "github.com/MakeNowJust/heredoc" "github.com/SneaksAndData/esd-services-api-client-go/claim" + "github.com/pterm/pterm" "github.com/spf13/cobra" - "log" + "snd-cli/pkg/cmd/util" "snd-cli/pkg/cmdutil" "strings" ) @@ -28,7 +29,7 @@ func NewCmdRemoveClaim(authServiceFactory *cmdutil.AuthServiceFactory, serviceFa } resp, err := removeClaimRun(service.(*claim.Service), userId, claimProvider, cr) if err == nil { - log.Println(resp) + pterm.DefaultBasicText.Println(resp) } return err }, @@ -48,5 +49,9 @@ func removeClaimRun(claimService Service, userId, claimProvider string, cr []str return "", fmt.Errorf("failed to remove claims for user %s with claim provider %s: %w", userId, claimProvider, err) } - return response, nil + prettifyResponse, err := util.PrettifyJSON(response) + if err != nil { + return "", fmt.Errorf("failed to prettify response: %w", err) + } + return prettifyResponse, nil } diff --git a/pkg/cmd/claim/user.go b/pkg/cmd/claim/user.go index 0bbfb65..809347f 100644 --- a/pkg/cmd/claim/user.go +++ b/pkg/cmd/claim/user.go @@ -4,7 +4,9 @@ import ( "fmt" "github.com/MakeNowJust/heredoc" "github.com/SneaksAndData/esd-services-api-client-go/claim" + "github.com/pterm/pterm" "github.com/spf13/cobra" + "snd-cli/pkg/cmd/util" "snd-cli/pkg/cmdutil" ) @@ -37,7 +39,7 @@ func NewCmdAddUser(authServiceFactory *cmdutil.AuthServiceFactory, serviceFactor } resp, err := addUserRun(service.(*claim.Service), userId, claimProvider) if err == nil { - fmt.Println(resp) + pterm.DefaultBasicText.Println(resp) } return err }, @@ -52,7 +54,11 @@ func addUserRun(claimService Service, userId, claimProvider string) (string, err if err != nil { return "", fmt.Errorf("failed to add user %s with claim provider %s: %w", userId, claimProvider, err) } - return response, nil + prettifyResponse, err := util.PrettifyJSON(response) + if err != nil { + return "", fmt.Errorf("failed to prettify response: %w", err) + } + return prettifyResponse, nil } func NewCmdRemoveUser(authServiceFactory *cmdutil.AuthServiceFactory, serviceFactory cmdutil.ServiceFactory) *cobra.Command { @@ -74,14 +80,13 @@ func NewCmdRemoveUser(authServiceFactory *cmdutil.AuthServiceFactory, serviceFac } resp, err := removeUserRun(service.(*claim.Service), userId, claimProvider) if err == nil { - fmt.Println(resp) + pterm.DefaultBasicText.Println(resp) } return err }, } return cmd - } func removeUserRun(claimService Service, userId, claimProvider string) (string, error) { diff --git a/pkg/cmd/dsr/get.go b/pkg/cmd/dsr/get.go index 8382527..f45a2f4 100644 --- a/pkg/cmd/dsr/get.go +++ b/pkg/cmd/dsr/get.go @@ -1,9 +1,11 @@ package dsr import ( + "encoding/json" "fmt" "github.com/MakeNowJust/heredoc" "github.com/SneaksAndData/esd-services-api-client-go/dsr" + "github.com/pterm/pterm" "github.com/spf13/cobra" "snd-cli/pkg/cmdutil" ) @@ -29,7 +31,7 @@ func NewCmdGetDsr(authServiceFactory *cmdutil.AuthServiceFactory, serviceFactory } resp, err := dsrRun(service.(*dsr.Service), email) if err == nil { - fmt.Println(resp) + renderAsTable(resp) } return err }, @@ -39,6 +41,13 @@ func NewCmdGetDsr(authServiceFactory *cmdutil.AuthServiceFactory, serviceFactory return cmd } +type DataEntry struct { + SubjectEmail string `json:"subjectEmail"` + StoragePath string `json:"storagePath"` + MatchedFields []string `json:"matchedFields"` + LastModified string `json:"lastModified"` +} + func dsrRun(dsrService Service, email string) (string, error) { response, err := dsrService.GetDSRRequest(email) if err != nil { @@ -46,3 +55,26 @@ func dsrRun(dsrService Service, email string) (string, error) { } return response, nil } + +func renderAsTable(dsrResponse string) { + var data []DataEntry + err := json.Unmarshal([]byte(dsrResponse), &data) + if err != nil { + fmt.Println("Error parsing JSON:", err) + return + } + tableData := pterm.TableData{ + {"Subject Email", "Storage Path", "Matched Fields", "Last Modified"}, + } + + for _, entry := range data { + tableData = append(tableData, []string{ + entry.SubjectEmail, + entry.StoragePath, + fmt.Sprintf("%v", entry.MatchedFields), + entry.LastModified, + }) + } + + _ = pterm.DefaultTable.WithHasHeader().WithData(tableData).Render() +} diff --git a/pkg/cmd/ml/cancel.go b/pkg/cmd/ml/cancel.go index 49ae4d6..f2720d8 100644 --- a/pkg/cmd/ml/cancel.go +++ b/pkg/cmd/ml/cancel.go @@ -5,6 +5,7 @@ import ( "github.com/MakeNowJust/heredoc" algorithmClient "github.com/SneaksAndData/esd-services-api-client-go/algorithm" "github.com/spf13/cobra" + "snd-cli/pkg/cmd/util" "snd-cli/pkg/cmdutil" "strings" ) @@ -68,5 +69,11 @@ func cancelRun(algorithmService Service, algorithm, id, initiator, reason string } return "", fmt.Errorf("failed to cancel run for algorithm %s with run id %s: %w", algorithm, id, err) } - return response, nil + + prettifyResponse, err := util.PrettifyJSON(response) + if err != nil { + return "", fmt.Errorf("failed to prettify response: %w", err) + } + + return prettifyResponse, nil } diff --git a/pkg/cmd/ml/get.go b/pkg/cmd/ml/get.go index 769cbb7..af47210 100644 --- a/pkg/cmd/ml/get.go +++ b/pkg/cmd/ml/get.go @@ -4,7 +4,9 @@ import ( "fmt" "github.com/MakeNowJust/heredoc" algorithmClient "github.com/SneaksAndData/esd-services-api-client-go/algorithm" + "github.com/pterm/pterm" "github.com/spf13/cobra" + "snd-cli/pkg/cmd/util" "snd-cli/pkg/cmdutil" "strings" ) @@ -27,7 +29,7 @@ func NewCmdGet(authServiceFactory *cmdutil.AuthServiceFactory, serviceFactory cm } resp, err := getRun(service.(*algorithmClient.Service), id, algorithm) if err == nil { - fmt.Println(resp) + pterm.DefaultBasicText.Println(resp) } return err }, @@ -50,5 +52,10 @@ func getRun(algorithmService Service, id, algorithm string) (string, error) { return "", fmt.Errorf("failed to retrieve run for algorithm %s with run id %s: %w", algorithm, id, err) } - return response, nil + prettifyResponse, err := util.PrettifyJSON(response) + if err != nil { + return "", fmt.Errorf("failed to prettify response: %w", err) + } + + return prettifyResponse, nil } diff --git a/pkg/cmd/ml/run.go b/pkg/cmd/ml/run.go index fcb6172..e0136d4 100644 --- a/pkg/cmd/ml/run.go +++ b/pkg/cmd/ml/run.go @@ -4,6 +4,7 @@ import ( "fmt" "github.com/MakeNowJust/heredoc" algorithmClient "github.com/SneaksAndData/esd-services-api-client-go/algorithm" + "github.com/pterm/pterm" "github.com/spf13/cobra" "snd-cli/pkg/cmd/util" "snd-cli/pkg/cmd/util/file" @@ -50,7 +51,11 @@ The payload should be provided as a JSON file with the structure below. `), RunE: func(cmd *cobra.Command, args []string) error { - return runRun(config, authServiceFactory, serviceFactory) + resp, err := runRun(config, authServiceFactory, serviceFactory) + if err == nil { + pterm.DefaultBasicText.Println(resp) + } + return err }, Example: heredoc.Doc(`snd algorithm run --algorithm rdc-auto-replenishment-crystal-orchestrator --payload /path/to/payload.json`), } @@ -67,24 +72,29 @@ The payload should be provided as a JSON file with the structure below. return cmd } -func runRun(config CommandConfig, authServiceFactory *cmdutil.AuthServiceFactory, serviceFactory cmdutil.ServiceFactory) error { +func runRun(config CommandConfig, authServiceFactory *cmdutil.AuthServiceFactory, serviceFactory cmdutil.ServiceFactory) (string, error) { authService, err := cmdutil.InitializeAuthService(authUrl, env, authProvider, *authServiceFactory) if err != nil { - return err + return "", err } - - service, err := serviceFactory.CreateService("algorithm", env, url, authService) - if err != nil { - return err + answer := "no" + if util.IsProdEnv(env) { + answer = util.InteractiveContinue() } - - resp, err := runAlgorithm(service.(*algorithmClient.Service), config.Payload, algorithm, config.Tag) - if err != nil { - return err + if util.IsProdEnv(env) && answer != "yes" { + service, err := serviceFactory.CreateService("algorithm", env, url, authService) + if err != nil { + return "", err + } + + resp, err := runAlgorithm(service.(*algorithmClient.Service), config.Payload, algorithm, config.Tag) + if err != nil { + return "", err + } + + return resp, err } - - fmt.Println(resp) - return nil + return "", err } // runAlgorithm runs the algorithm service with the provided parameters. @@ -98,7 +108,11 @@ func runAlgorithm(algorithmService Service, payloadPath, algorithm, tag string) return "", fmt.Errorf("failed to create run for algorithm %s: %w", algorithm, err) } - return response, nil + prettifyResponse, err := util.PrettifyJSON(response) + if err != nil { + return "", fmt.Errorf("failed to prettify response: %w. \n Response: %s", err, response) + } + return prettifyResponse, nil } // readAlgorithmPayload reads and unmarshal the algorithm payload from the provided path. @@ -127,5 +141,4 @@ func readAlgorithmPayload(payloadPath string) (algorithmClient.Payload, error) { } return payload, nil - } diff --git a/pkg/cmd/ml/run_test.go b/pkg/cmd/ml/run_test.go index 8e9cccf..b23134b 100644 --- a/pkg/cmd/ml/run_test.go +++ b/pkg/cmd/ml/run_test.go @@ -28,10 +28,22 @@ func Test_runRun(t *testing.T) { payloadPath: "", mockFileOpErr: nil, mockFileOpResponse: map[string]interface{}{"request": "request1"}, - mockResponse: "Run successful", + mockResponse: `{"requestId":"123"}`, mockServiceErr: nil, expectedErr: false, - expectedResp: "Run successful", + expectedResp: "{\n \"requestId\": \"123\"\n}", + }, + { + name: "Invalid JSON response Case", + algorithm: "replenishment", + tag: "tag1", + payloadPath: "", + mockFileOpErr: nil, + mockFileOpResponse: map[string]interface{}{"request": "request1"}, + mockResponse: `requestId:123`, + mockServiceErr: nil, + expectedErr: true, + expectedResp: "", }, { name: "Failure Case - Service Error", diff --git a/pkg/cmd/spark/configuration.go b/pkg/cmd/spark/configuration.go index 51f4617..e964094 100644 --- a/pkg/cmd/spark/configuration.go +++ b/pkg/cmd/spark/configuration.go @@ -5,7 +5,9 @@ import ( "fmt" "github.com/MakeNowJust/heredoc" "github.com/SneaksAndData/esd-services-api-client-go/spark" + "github.com/pterm/pterm" "github.com/spf13/cobra" + "snd-cli/pkg/cmd/util" "snd-cli/pkg/cmdutil" ) @@ -30,7 +32,7 @@ The name of the SparkJob should be provided as an argument. } resp, err := configurationRun(service.(*spark.Service), name) if err == nil { - fmt.Println(resp) + pterm.DefaultBasicText.Println(resp) } return err }, @@ -50,5 +52,9 @@ func configurationRun(sparkService Service, name string) (string, error) { if err != nil { return "", fmt.Errorf("Failed to serialize configuration: %w", err) } - return string(m), nil + prettifyResponse, err := util.PrettifyJSON(string(m)) + if err != nil { + return "", fmt.Errorf("failed to prettify response: %w", err) + } + return prettifyResponse, nil } diff --git a/pkg/cmd/spark/configuration_test.go b/pkg/cmd/spark/configuration_test.go index 1c544aa..390efd2 100644 --- a/pkg/cmd/spark/configuration_test.go +++ b/pkg/cmd/spark/configuration_test.go @@ -21,7 +21,7 @@ func Test_configurationRun(t *testing.T) { mockResponse: spark.SubmissionConfiguration{ RootPath: "ExistingConfig", }, - expectedResp: "{\"rootPath\":\"ExistingConfig\",\"projectName\":\"\",\"runnable\":\"\",\"submissionDetails\":{\"version\":\"\",\"executionGroup\":\"\",\"expectedParallelism\":0,\"flexibleDriver\":false,\"additionalDriverNodeTolerations\":null,\"maxRuntimeHours\":0,\"debugMode\":{\"eventLogLocation\":\"\",\"maxSizePerFile\":\"\"},\"submissionMode\":\"\",\"extendedCodeMount\":false,\"submissionJobTemplate\":\"\",\"executorSpecTemplate\":\"\",\"driverJobRetries\":0,\"defaultArguments\":null,\"inputs\":null,\"outputs\":null,\"overwrite\":false}}", + expectedResp: "{\n \"rootPath\": \"ExistingConfig\",\n \"projectName\": \"\",\n \"runnable\": \"\",\n \"submissionDetails\": {\n \"version\": \"\",\n \"executionGroup\": \"\",\n \"expectedParallelism\": 0,\n \"flexibleDriver\": false,\n \"additionalDriverNodeTolerations\": null,\n \"maxRuntimeHours\": 0,\n \"debugMode\": {\n \"eventLogLocation\": \"\",\n \"maxSizePerFile\": \"\"\n },\n \"submissionMode\": \"\",\n \"extendedCodeMount\": false,\n \"submissionJobTemplate\": \"\",\n \"executorSpecTemplate\": \"\",\n \"driverJobRetries\": 0,\n \"defaultArguments\": null,\n \"inputs\": null,\n \"outputs\": null,\n \"overwrite\": false\n }\n}", expectedError: false, }, { diff --git a/pkg/cmd/spark/logs.go b/pkg/cmd/spark/logs.go index 6a8008d..726b8a3 100644 --- a/pkg/cmd/spark/logs.go +++ b/pkg/cmd/spark/logs.go @@ -4,6 +4,7 @@ import ( "fmt" "github.com/MakeNowJust/heredoc" "github.com/SneaksAndData/esd-services-api-client-go/spark" + "github.com/pterm/pterm" "snd-cli/pkg/cmdutil" "strings" @@ -28,7 +29,7 @@ func NewCmdLogs(authServiceFactory *cmdutil.AuthServiceFactory, serviceFactory c } resp, err := logsRun(service.(*spark.Service), id, trimLog) if err == nil { - fmt.Println(resp) + pterm.DefaultBasicText.Println(resp) } return err }, diff --git a/pkg/cmd/spark/requestStatus.go b/pkg/cmd/spark/requestStatus.go index ce4585a..a2a30b6 100644 --- a/pkg/cmd/spark/requestStatus.go +++ b/pkg/cmd/spark/requestStatus.go @@ -4,6 +4,7 @@ import ( "fmt" "github.com/MakeNowJust/heredoc" "github.com/SneaksAndData/esd-services-api-client-go/spark" + "github.com/pterm/pterm" "github.com/spf13/cobra" "snd-cli/pkg/cmdutil" ) @@ -24,7 +25,7 @@ func NewCmdRequestStatus(authServiceFactory *cmdutil.AuthServiceFactory, service } resp, err := requestStatusRun(service.(*spark.Service), id) if err == nil { - fmt.Println(resp) + pterm.DefaultBasicText.Println(resp) } return err }, diff --git a/pkg/cmd/spark/runtimeInfo.go b/pkg/cmd/spark/runtimeInfo.go index dd0e835..5c5f859 100644 --- a/pkg/cmd/spark/runtimeInfo.go +++ b/pkg/cmd/spark/runtimeInfo.go @@ -4,7 +4,9 @@ import ( "fmt" "github.com/MakeNowJust/heredoc" "github.com/SneaksAndData/esd-services-api-client-go/spark" + "github.com/pterm/pterm" "github.com/spf13/cobra" + "snd-cli/pkg/cmd/util" "snd-cli/pkg/cmdutil" ) @@ -29,7 +31,7 @@ func NewCmdRuntimeInfo(authServiceFactory *cmdutil.AuthServiceFactory, serviceFa } resp, err := runtimeInfoRun(service.(*spark.Service), id) if err == nil { - fmt.Println(resp) + pterm.DefaultBasicText.Println(resp) } return err }, @@ -45,5 +47,9 @@ func runtimeInfoRun(sparkService Service, id string) (string, error) { if err != nil { return "", fmt.Errorf("failed to retrieve runtime info for run id %s: %w", id, err) } - return response, nil + prettifyResponse, err := util.PrettifyJSON(response) + if err != nil { + return "", fmt.Errorf("failed to prettify response: %w", err) + } + return prettifyResponse, nil } diff --git a/pkg/cmd/spark/runtimeinfo_test.go b/pkg/cmd/spark/runtimeinfo_test.go index db70f89..29d3195 100644 --- a/pkg/cmd/spark/runtimeinfo_test.go +++ b/pkg/cmd/spark/runtimeinfo_test.go @@ -21,7 +21,9 @@ func TestRuntimeInfoRun(t *testing.T) { id: "valid-id", mockResponse: `{"status":"RUNNING"}`, expectedError: false, - expectedResp: `{"status":"RUNNING"}`, + expectedResp: `{ + "status": "RUNNING" +}`, }, { name: "Error Fetching Info", diff --git a/pkg/cmd/spark/submit.go b/pkg/cmd/spark/submit.go index 9f39dd7..dc14e2f 100644 --- a/pkg/cmd/spark/submit.go +++ b/pkg/cmd/spark/submit.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/MakeNowJust/heredoc" sparkClient "github.com/SneaksAndData/esd-services-api-client-go/spark" + "github.com/pterm/pterm" "github.com/spf13/cobra" "os" "snd-cli/pkg/cmd/util" @@ -63,7 +64,7 @@ If 'extraArguments', 'projectInputs', 'projectOutputs', or 'expectedParallelism' } resp, err := submitRun(service.(*sparkClient.Service), overrides, jobName) if err == nil { - fmt.Println(resp) + pterm.DefaultBasicText.Println(resp) } return err }, @@ -88,10 +89,10 @@ func submitRun(sparkService Service, overrides, jobName string) (string, error) return "", err } defaultTag, _ := generateTag() - if clientTag == "" { - fmt.Printf("You have not provided a client tag for this submission. Using generated tag: %s \n", defaultTag) + if clientTag == "" && params.ClientTag == "" { + pterm.DefaultBasicText.Println(pterm.Sprintf("You have not provided a client tag for this submission. Using generated tag: %s \n", defaultTag)) params.ClientTag = defaultTag - } else { + } else if clientTag != "" { params.ClientTag = clientTag } response, err := sparkService.RunJob(params, jobName) diff --git a/pkg/cmd/util/utils.go b/pkg/cmd/util/utils.go index c583864..462dd5a 100644 --- a/pkg/cmd/util/utils.go +++ b/pkg/cmd/util/utils.go @@ -1,6 +1,10 @@ package util -import "encoding/json" +import ( + "bytes" + "encoding/json" + "github.com/pterm/pterm" +) // ConvertStruct is a function that converts one struct to another struct. // It takes two parameters: the original struct and the target struct. @@ -18,3 +22,37 @@ func ConvertStruct(original interface{}, target interface{}) error { return nil } + +// PrettifyJSON takes a JSON string as input and returns a pretty-printed version of the JSON string. +// It indents the JSON with two spaces for better readability. +// If there is an error during the indentation process, it returns an empty string and the error. +func PrettifyJSON(input string) (string, error) { + var output bytes.Buffer + err := json.Indent(&output, []byte(input), "", " ") + if err != nil { + return "", err + } + return output.String(), nil +} + +// InteractiveContinue prompts the user with a confirmation message to continue running. +// It restricts the user's answers to "yes" and "no". +// The function returns the user's response as a string. +func InteractiveContinue() string { + prompt := pterm.DefaultInteractiveContinue + prompt.DefaultText = "Are you sure you want to run in Production?" + prompt.Options = []string{"yes", "no"} + result, _ := prompt.Show() + pterm.Println() + pterm.Info.Printfln("You answered: %s", result) + return result +} + +// IsProdEnv checks if the given environment string corresponds to a production environment. +// It returns true if the environment is "awsp" or "production", otherwise it returns false. +func IsProdEnv(env string) bool { + if env == "awsp" || env == "production" { + return true + } + return false +} diff --git a/pkg/cmd/util/utils_test.go b/pkg/cmd/util/utils_test.go index 30b7910..8c45485 100644 --- a/pkg/cmd/util/utils_test.go +++ b/pkg/cmd/util/utils_test.go @@ -48,3 +48,50 @@ func Test_ConvertStruct(t *testing.T) { } } + +func Test_PrettifyJSON(t *testing.T) { + tests := []struct { + name string + input string + expected string + expectedError bool + }{ + { + name: "Valid JSON", + input: `{"name":"SomeName","age":30}`, + expected: "{\n \"name\": \"SomeName\",\n \"age\": 30\n}", + expectedError: false, + }, + { + name: "Invalid JSON", + input: `{"name":"SomeName","age":30`, + expected: "", + expectedError: true, + }, + { + name: "Empty JSON", + input: `{}`, + expected: "{}", + expectedError: false, + }, + { + name: "Nested JSON", + input: `{"person":{"name":"SomeName","age":30}}`, + expected: "{\n \"person\": {\n \"name\": \"SomeName\",\n \"age\": 30\n }\n}", + expectedError: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result, err := PrettifyJSON(tt.input) + if (err != nil) != tt.expectedError { + t.Errorf("PrettifyJSON() error = %v, expectedError %v", err, tt.expectedError) + return + } + if result != tt.expected { + t.Errorf("PrettifyJSON() = %v, expected %v", result, tt.expected) + } + }) + } +} diff --git a/pkg/cmd/util/version/version.go b/pkg/cmd/util/version/version.go index 3e2766d..7c6a76e 100644 --- a/pkg/cmd/util/version/version.go +++ b/pkg/cmd/util/version/version.go @@ -2,6 +2,7 @@ package version import ( "fmt" + "github.com/pterm/pterm" "golang.org/x/mod/semver" "os/exec" snd "snd-cli/cmd" @@ -20,11 +21,23 @@ func CheckIfNewVersionIsAvailable() error { } result := semver.Compare(lastTag, currentVersion) if result > 0 { - fmt.Printf("New version available. Please upgrade.\nCurrent version: %s\nLast available version: %s\nPlease run `snd upgrade` command to update the CLI to the latest version.\n", currentVersion, lastTag) + pterm.DefaultBasicText.Println( + pterm.FgLightYellow.Sprintf("New version available. Please upgrade.\n") + + pterm.Sprintf("Current version: %s\nLast available version: %s\n", currentVersion, lastTag) + + "Please run " + + pterm.FgLightCyan.Sprintf("snd upgrade") + + " command to update the CLI to the latest version.", + ) } else if result < 0 { - fmt.Printf("Your version is newer than the one present in GitHub release.\nCurrent version: %s\nLast available version in GitHub release: %s\n", currentVersion, lastTag) + pterm.DefaultBasicText.Println( + "Your version is newer than the one present in GitHub release.\n" + + pterm.Sprintf("Current version: %s\n", currentVersion) + + pterm.Sprintf("Last available version in GitHub release: %s\n", lastTag), + ) } else { - fmt.Printf("The snd version is up to date. %s\n", currentVersion) + pterm.DefaultBasicText.Println( + pterm.Sprintf("The snd version is up to date. %s\n", currentVersion), + ) } return nil diff --git a/pkg/cmd/version/version.go b/pkg/cmd/version/version.go index da3115e..545ef0e 100644 --- a/pkg/cmd/version/version.go +++ b/pkg/cmd/version/version.go @@ -1,7 +1,7 @@ package version import ( - "fmt" + "github.com/pterm/pterm" "github.com/spf13/cobra" snd "snd-cli/cmd" "snd-cli/pkg/cmd/util/version" @@ -15,13 +15,14 @@ func NewCmdVersion() *cobra.Command { PersistentPreRunE: func(cmd *cobra.Command, args []string) error { err := version.CheckIfNewVersionIsAvailable() if err != nil { - fmt.Print("Unable to check if a new version is available: You can view the releases at: https://github.com/SneaksAndData/snd-cli-go/releases\n") + pterm.DefaultBasicText.Println("Unable to check if a new version is available: You can view the releases at: https://github.com/SneaksAndData/snd-cli-go/releases") } return nil - }, Run: func(cmd *cobra.Command, args []string) { - fmt.Printf("snd-cli version %s \n", snd.Version) + pterm.DefaultBasicText.Println( + pterm.Sprintf("snd-cli version %s", snd.Version), + ) }, }