From 5a3bf297423e3238f1265a2b66c55ffa955862f4 Mon Sep 17 00:00:00 2001 From: Frikky Date: Thu, 7 Dec 2023 22:55:13 +0100 Subject: [PATCH 01/42] Now set to 1.3.2 --- frontend/src/components/NewHeader.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/components/NewHeader.jsx b/frontend/src/components/NewHeader.jsx index 77cabb46..bd28e2de 100644 --- a/frontend/src/components/NewHeader.jsx +++ b/frontend/src/components/NewHeader.jsx @@ -613,7 +613,7 @@ const Header = (props) => { - Version: 1.3.1 + Version: 1.3.2 From 0be63f4775063c6d345cbf0ce6d43f84755773d4 Mon Sep 17 00:00:00 2001 From: Frikky Date: Thu, 7 Dec 2023 22:56:42 +0100 Subject: [PATCH 02/42] Minor gomod updates --- backend/go-app/main.go | 2 -- functions/onprem/orborus/go.mod | 2 +- functions/onprem/worker/go.mod | 2 +- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/backend/go-app/main.go b/backend/go-app/main.go index 571e8422..bb656596 100755 --- a/backend/go-app/main.go +++ b/backend/go-app/main.go @@ -27,9 +27,7 @@ import ( "os/exec" "path/filepath" - // import httptest "net/http/httptest" - "strings" "time" diff --git a/functions/onprem/orborus/go.mod b/functions/onprem/orborus/go.mod index 4d2d9450..eeca97b2 100644 --- a/functions/onprem/orborus/go.mod +++ b/functions/onprem/orborus/go.mod @@ -9,7 +9,7 @@ require ( github.com/mackerelio/go-osstat v0.2.3 github.com/satori/go.uuid v1.2.0 github.com/shirou/gopsutil v3.21.11+incompatible - github.com/shuffle/shuffle-shared v0.5.29 + github.com/shuffle/shuffle-shared v0.5.30 k8s.io/api v0.28.1 k8s.io/apimachinery v0.28.1 k8s.io/client-go v0.28.1 diff --git a/functions/onprem/worker/go.mod b/functions/onprem/worker/go.mod index 9e0f8e1e..5afaddcc 100644 --- a/functions/onprem/worker/go.mod +++ b/functions/onprem/worker/go.mod @@ -11,7 +11,7 @@ require ( github.com/gorilla/mux v1.8.0 github.com/patrickmn/go-cache v2.1.0+incompatible github.com/satori/go.uuid v1.2.0 - github.com/shuffle/shuffle-shared v0.5.29 + github.com/shuffle/shuffle-shared v0.5.30 k8s.io/api v0.28.3 k8s.io/apimachinery v0.28.3 k8s.io/client-go v0.28.3 From 14fee85a293da4685faa0ce22e609bde115a1d67 Mon Sep 17 00:00:00 2001 From: Frikky Date: Thu, 7 Dec 2023 23:19:08 +0100 Subject: [PATCH 03/42] Rebuild with frikky instead of frikky0.... --- .github/workflows/dockerbuild.yaml | 2 ++ backend/go-app/main.go | 3 --- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/dockerbuild.yaml b/.github/workflows/dockerbuild.yaml index ca750fa5..86203121 100644 --- a/.github/workflows/dockerbuild.yaml +++ b/.github/workflows/dockerbuild.yaml @@ -80,6 +80,8 @@ jobs: ghcr.io/shuffle/shuffle-${{ matrix.app }}:nightly ${{ secrets.DOCKERHUB_USERNAME }}/shuffle-${{ matrix.app }}:${{ matrix.version }} ${{ secrets.DOCKERHUB_USERNAME }}/shuffle-${{ matrix.app }}:nightly + frikky/shuffle-${{ matrix.app }}:${{ matrix.version }} + frikky/shuffle-${{ matrix.app }}:nightly - name: Image digest run: echo ${{ steps.docker_build.outputs.digest }} diff --git a/backend/go-app/main.go b/backend/go-app/main.go index bb656596..160c8312 100755 --- a/backend/go-app/main.go +++ b/backend/go-app/main.go @@ -11,9 +11,6 @@ import ( "crypto/md5" "strconv" - //"crypto/tls" - //"crypto/x509" - //"encoding/base64" "encoding/hex" "encoding/json" "errors" From 1d64ee64cd164f8e0c6a7fde49c73e000e6ec706 Mon Sep 17 00:00:00 2001 From: Frikky Date: Thu, 7 Dec 2023 23:32:08 +0100 Subject: [PATCH 04/42] App sdk fix 2 --- .github/workflows/dockerbuild.yaml | 1 + backend/go-app/main.go | 4 ---- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/.github/workflows/dockerbuild.yaml b/.github/workflows/dockerbuild.yaml index 86203121..fd31dac4 100644 --- a/.github/workflows/dockerbuild.yaml +++ b/.github/workflows/dockerbuild.yaml @@ -82,6 +82,7 @@ jobs: ${{ secrets.DOCKERHUB_USERNAME }}/shuffle-${{ matrix.app }}:nightly frikky/shuffle-${{ matrix.app }}:${{ matrix.version }} frikky/shuffle-${{ matrix.app }}:nightly + frikky/shuffle:${{ matrix.app }} - name: Image digest run: echo ${{ steps.docker_build.outputs.digest }} diff --git a/backend/go-app/main.go b/backend/go-app/main.go index 160c8312..b365416d 100755 --- a/backend/go-app/main.go +++ b/backend/go-app/main.go @@ -44,10 +44,6 @@ import ( "golang.org/x/crypto/bcrypt" "gopkg.in/yaml.v3" - // PROXY overrides - //"gopkg.in/src-d/go-git.v4/plumbing/transport/client" - // githttp "gopkg.in/src-d/go-git.v4/plumbing/transport/http" - // Web "github.com/gorilla/mux" http2 "gopkg.in/src-d/go-git.v4/plumbing/transport/http" From 22c6b2931cc1d48001ec45814ead76523fa2700f Mon Sep 17 00:00:00 2001 From: Frikky Date: Mon, 11 Dec 2023 14:19:44 +0100 Subject: [PATCH 05/42] Build nightly --- functions/onprem/orborus/go.mod | 2 +- functions/onprem/worker/go.mod | 2 +- functions/onprem/worker/go.sum | 2 ++ 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/functions/onprem/orborus/go.mod b/functions/onprem/orborus/go.mod index eeca97b2..a621444e 100644 --- a/functions/onprem/orborus/go.mod +++ b/functions/onprem/orborus/go.mod @@ -9,7 +9,7 @@ require ( github.com/mackerelio/go-osstat v0.2.3 github.com/satori/go.uuid v1.2.0 github.com/shirou/gopsutil v3.21.11+incompatible - github.com/shuffle/shuffle-shared v0.5.30 + github.com/shuffle/shuffle-shared v0.5.31 k8s.io/api v0.28.1 k8s.io/apimachinery v0.28.1 k8s.io/client-go v0.28.1 diff --git a/functions/onprem/worker/go.mod b/functions/onprem/worker/go.mod index 5afaddcc..b847ac38 100644 --- a/functions/onprem/worker/go.mod +++ b/functions/onprem/worker/go.mod @@ -11,7 +11,7 @@ require ( github.com/gorilla/mux v1.8.0 github.com/patrickmn/go-cache v2.1.0+incompatible github.com/satori/go.uuid v1.2.0 - github.com/shuffle/shuffle-shared v0.5.30 + github.com/shuffle/shuffle-shared v0.5.31 k8s.io/api v0.28.3 k8s.io/apimachinery v0.28.3 k8s.io/client-go v0.28.3 diff --git a/functions/onprem/worker/go.sum b/functions/onprem/worker/go.sum index 5afdce76..821c92f0 100644 --- a/functions/onprem/worker/go.sum +++ b/functions/onprem/worker/go.sum @@ -286,6 +286,8 @@ github.com/shuffle/shuffle-shared v0.4.57 h1:o+mMPRY4ourkE3R0qdi80jg6RlCtvAJ/VVr github.com/shuffle/shuffle-shared v0.4.57/go.mod h1:X613gbo0dT3fnYvXDRwjQZyLC+T49T2nSQOrCV5QMlI= github.com/shuffle/shuffle-shared v0.5.29 h1:n4vThl7v3mFVXbrIW71XREFdmZZo7mOBAWxnsdiNjDk= github.com/shuffle/shuffle-shared v0.5.29/go.mod h1:X613gbo0dT3fnYvXDRwjQZyLC+T49T2nSQOrCV5QMlI= +github.com/shuffle/shuffle-shared v0.5.31 h1:OV4IIfKWWFW66WjGvyXOmmsSz3p8pW9L1ge1mDo8ftM= +github.com/shuffle/shuffle-shared v0.5.31/go.mod h1:X613gbo0dT3fnYvXDRwjQZyLC+T49T2nSQOrCV5QMlI= github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e h1:MRM5ITcdelLK2j1vwZ3Je0FKVCfqOLp5zO6trqMLYs0= github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e/go.mod h1:XV66xRDqSt+GTGFMVlhk3ULuV0y9ZmzeVGR4mloJI3M= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= From 2383b1e730c348242785200d49ed28c189b67772 Mon Sep 17 00:00:00 2001 From: Frikky Date: Mon, 11 Dec 2023 14:51:40 +0100 Subject: [PATCH 06/42] Proxy bypass for internal --- backend/app_sdk/app_base.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/backend/app_sdk/app_base.py b/backend/app_sdk/app_base.py index 003f4459..e2a0fcae 100755 --- a/backend/app_sdk/app_base.py +++ b/backend/app_sdk/app_base.py @@ -332,6 +332,14 @@ class AppBase: if len(os.getenv("SHUFFLE_INTERNAL_NO_PROXY", "")) > 0: self.proxy_config["no_proxy"] = os.getenv("SHUFFLE_INTERNAL_NO_PROXY", "") + try: + if self.proxy_config["http"].lower() == "noproxy": + self.proxy_config["http"] = "" + if self.proxy_config["https"].lower() == "noproxy": + self.proxy_config["https"] = "" + except Exception as e: + self.logger.info(f"[DEBUG] Failed setting proxy config: {e}. NOT important if running apps with webserver. This is NOT critical.") + if isinstance(self.action, str): try: self.action = json.loads(self.action) From daf378e5d62ec69bb2c32e5dff5b58003b08a5ce Mon Sep 17 00:00:00 2001 From: Frikky Date: Tue, 12 Dec 2023 13:23:56 +0100 Subject: [PATCH 07/42] Rebuild orborus with correct env --- backend/app_sdk/app_base.py | 2 ++ functions/onprem/orborus/orborus.go | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/backend/app_sdk/app_base.py b/backend/app_sdk/app_base.py index e2a0fcae..0e735176 100755 --- a/backend/app_sdk/app_base.py +++ b/backend/app_sdk/app_base.py @@ -340,6 +340,8 @@ class AppBase: except Exception as e: self.logger.info(f"[DEBUG] Failed setting proxy config: {e}. NOT important if running apps with webserver. This is NOT critical.") + self.logger.info(f"[DEBUG] Proxy config: {self.proxy_config}") + if isinstance(self.action, str): try: self.action = json.loads(self.action) diff --git a/functions/onprem/orborus/orborus.go b/functions/onprem/orborus/orborus.go index cfa62a9c..99da2cc1 100755 --- a/functions/onprem/orborus/orborus.go +++ b/functions/onprem/orborus/orborus.go @@ -1611,12 +1611,12 @@ func main() { overrideHttpsProxy := os.Getenv("SHUFFLE_INTERNAL_HTTPS_PROXY") if len(overrideHttpProxy) > 0 { log.Printf("[DEBUG] Added internal proxy: %s", overrideHttpProxy) - env = append(env, fmt.Sprintf("HTTP_PROXY=%s", overrideHttpProxy)) + env = append(env, fmt.Sprintf("SHUFFLE_INTERNAL_HTTP_PROXY=%s", overrideHttpProxy)) } if len(overrideHttpsProxy) > 0 { log.Printf("[DEBUG] Added internal proxy: %s", overrideHttpsProxy) - env = append(env, fmt.Sprintf("HTTPS_PROXY=%s", overrideHttpsProxy)) + env = append(env, fmt.Sprintf("SHUFFLE_INTERNAL_HTTPS_PROXY=%s", overrideHttpsProxy)) } err = deployWorker(workerImage, containerName, env, execution) From 51b891782cc013f805db1b1602e5f39abb5b5cfd Mon Sep 17 00:00:00 2001 From: Frikky Date: Thu, 14 Dec 2023 11:49:16 +0100 Subject: [PATCH 08/42] Added SHUFFLE_RERUN_ENVIRONMENTS to control what environments RERUN --- backend/go-app/go.mod | 2 +- backend/go-app/go.sum | 4 ++++ backend/go-app/main.go | 27 ++++++++++++++++++++++----- 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/backend/go-app/go.mod b/backend/go-app/go.mod index af4b2f8b..82995baa 100644 --- a/backend/go-app/go.mod +++ b/backend/go-app/go.mod @@ -18,7 +18,7 @@ require ( github.com/gorilla/mux v1.8.0 github.com/h2non/filetype v1.1.3 github.com/satori/go.uuid v1.2.0 - github.com/shuffle/shuffle-shared v0.5.30 + github.com/shuffle/shuffle-shared v0.5.31 golang.org/x/crypto v0.14.0 google.golang.org/api v0.125.0 google.golang.org/grpc v1.55.0 diff --git a/backend/go-app/go.sum b/backend/go-app/go.sum index bea5b3c6..3f77bb07 100644 --- a/backend/go-app/go.sum +++ b/backend/go-app/go.sum @@ -422,6 +422,10 @@ github.com/shuffle/shuffle-shared v0.5.14 h1:d14u1e4k+qKgnf4Insq4x2S+0MMKlDqdyTT github.com/shuffle/shuffle-shared v0.5.14/go.mod h1:X613gbo0dT3fnYvXDRwjQZyLC+T49T2nSQOrCV5QMlI= github.com/shuffle/shuffle-shared v0.5.29 h1:n4vThl7v3mFVXbrIW71XREFdmZZo7mOBAWxnsdiNjDk= github.com/shuffle/shuffle-shared v0.5.29/go.mod h1:X613gbo0dT3fnYvXDRwjQZyLC+T49T2nSQOrCV5QMlI= +github.com/shuffle/shuffle-shared v0.5.30 h1:ORWjQU3UJhdZY5mRsAoR2hvftNcJmiEekNKjbaMo7K8= +github.com/shuffle/shuffle-shared v0.5.30/go.mod h1:X613gbo0dT3fnYvXDRwjQZyLC+T49T2nSQOrCV5QMlI= +github.com/shuffle/shuffle-shared v0.5.31 h1:OV4IIfKWWFW66WjGvyXOmmsSz3p8pW9L1ge1mDo8ftM= +github.com/shuffle/shuffle-shared v0.5.31/go.mod h1:X613gbo0dT3fnYvXDRwjQZyLC+T49T2nSQOrCV5QMlI= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= diff --git a/backend/go-app/main.go b/backend/go-app/main.go index b365416d..296c8739 100755 --- a/backend/go-app/main.go +++ b/backend/go-app/main.go @@ -3839,7 +3839,9 @@ func runInitEs(ctx context.Context) { } // FIXME: Have this for all envs in all orgs (loop and find). - if len(parsedApikey) > 0 { + if len(parsedApikey) == 0 { + log.Printf("[WARNING] No apikey found for cleanup. Skipping cleanup schedule.") + } else { cleanupSchedule := 300 if len(os.Getenv("SHUFFLE_RERUN_SCHEDULE")) > 0 { @@ -3854,8 +3856,25 @@ func runInitEs(ctx context.Context) { } } - environments := []string{"Shuffle"} - log.Printf("[DEBUG] Starting schedule setup for execution cleanup every %d seconds. Running first immediately.", cleanupSchedule) + environments := []string{defaultEnv} + + // Comma separated list of RERUN environments + if len(os.Getenv("SHUFFLE_RERUN_ENVIRONMENTS")) > 0 { + foundenv := strings.Split(os.Getenv("SHUFFLE_RERUN_ENVIRONMENTS"), ",") + for i, env := range foundenv { + if len(env) == 0 { + continue + } + + environments[i] = strings.TrimSpace(env) + if !shuffle.ArrayContains(environments, env) { + environments = append(foundenv, env) + } + } + } + + log.Printf("[DEBUG] Starting schedule setup for execution cleanup every %d seconds. Running first immediately. Environments: %#v", cleanupSchedule, environments) + cleanupJob := func() func() { return func() { log.Printf("[INFO] Running schedule for cleaning up or re-running unfinished workflows in %d environments.", len(environments)) @@ -3925,8 +3944,6 @@ func runInitEs(ctx context.Context) { } else { _ = jobret } - } else { - log.Printf("[DEBUG] Couldn't find a valid API-key, hence couldn't run cleanup") } // Getting apps to see if we should initialize a test From c3dc377f7f30cc47bf06bd2ca20168aa41560066 Mon Sep 17 00:00:00 2001 From: Frikky Date: Fri, 15 Dec 2023 16:08:48 +0100 Subject: [PATCH 09/42] 1.3.1 removal for nightly --- .github/workflows/dockerbuild.yaml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/dockerbuild.yaml b/.github/workflows/dockerbuild.yaml index fd31dac4..8f139bba 100644 --- a/.github/workflows/dockerbuild.yaml +++ b/.github/workflows/dockerbuild.yaml @@ -19,23 +19,23 @@ jobs: include: - app: frontend path: frontend - version: 1.3.1 + version: nightly experimental: true - app: backend path: backend - version: 1.3.1 + version: nightly experimental: true - app: app_sdk path: backend/app_sdk - version: 1.3.1 + version: nightly experimental: true - app: orborus path: functions/onprem/orborus - version: 1.3.1 + version: nightly experimental: true - app: worker path: functions/onprem/worker - version: 1.3.1 + version: nightly experimental: true steps: - name: Checkout From 8cfba1ac306b93d264d8032e4e259af55daf7c83 Mon Sep 17 00:00:00 2001 From: Frikky Date: Mon, 18 Dec 2023 13:40:39 +0100 Subject: [PATCH 10/42] Added App Auth name editing and dynamic auth during workflow run --- backend/go-app/go.mod | 2 +- backend/go-app/go.sum | 2 + frontend/src/views/Admin.jsx | 67 ++++++++++++++++++++++---- frontend/src/views/AngularWorkflow.jsx | 1 + 4 files changed, 61 insertions(+), 11 deletions(-) diff --git a/backend/go-app/go.mod b/backend/go-app/go.mod index 82995baa..056ab254 100644 --- a/backend/go-app/go.mod +++ b/backend/go-app/go.mod @@ -18,7 +18,7 @@ require ( github.com/gorilla/mux v1.8.0 github.com/h2non/filetype v1.1.3 github.com/satori/go.uuid v1.2.0 - github.com/shuffle/shuffle-shared v0.5.31 + github.com/shuffle/shuffle-shared v0.5.44 golang.org/x/crypto v0.14.0 google.golang.org/api v0.125.0 google.golang.org/grpc v1.55.0 diff --git a/backend/go-app/go.sum b/backend/go-app/go.sum index 3f77bb07..0358ac5c 100644 --- a/backend/go-app/go.sum +++ b/backend/go-app/go.sum @@ -426,6 +426,8 @@ github.com/shuffle/shuffle-shared v0.5.30 h1:ORWjQU3UJhdZY5mRsAoR2hvftNcJmiEekNK github.com/shuffle/shuffle-shared v0.5.30/go.mod h1:X613gbo0dT3fnYvXDRwjQZyLC+T49T2nSQOrCV5QMlI= github.com/shuffle/shuffle-shared v0.5.31 h1:OV4IIfKWWFW66WjGvyXOmmsSz3p8pW9L1ge1mDo8ftM= github.com/shuffle/shuffle-shared v0.5.31/go.mod h1:X613gbo0dT3fnYvXDRwjQZyLC+T49T2nSQOrCV5QMlI= +github.com/shuffle/shuffle-shared v0.5.44 h1:6WiFPIsij+IWvXY7vzVX7cUicb+PYOzhTbWF/gDmYeU= +github.com/shuffle/shuffle-shared v0.5.44/go.mod h1:X613gbo0dT3fnYvXDRwjQZyLC+T49T2nSQOrCV5QMlI= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= diff --git a/frontend/src/views/Admin.jsx b/frontend/src/views/Admin.jsx index 9a7884b0..7663aa70 100755 --- a/frontend/src/views/Admin.jsx +++ b/frontend/src/views/Admin.jsx @@ -748,11 +748,20 @@ If you're interested, please let me know a time that works for you, or set up a .then((response) => response.json().then((responseJson) => { if (responseJson["success"] === false) { - toast("Failed changing authentication"); + // Check if .reason exists + if (responseJson.reason !== undefined) { + toast("Failed changing authentication: " + responseJson.reason); + } else { + toast("Failed changing authentication"); + } } else { //toast("Successfully password!") setSelectedUserModalOpen(false); getAppAuthentication(); + + + setSelectedAuthentication({}); + setSelectedAuthenticationModalOpen(false); } }) ) @@ -813,7 +822,8 @@ If you're interested, please let me know a time that works for you, or set up a const data = { id: id, action: parentAction !== undefined && parentAction !== null ? parentAction : "assign_everywhere", - }; + } + const url = globalUrl + "/api/v1/apps/authentication/" + id + "/config"; fetch(url, { @@ -1798,17 +1808,53 @@ If you're interested, please let me know a time that works for you, or set up a > - Edit authentication for {selectedAuthentication.app.name} ( + Edit authentication for {selectedAuthentication.app.name.replaceAll("_", " ")} ( {selectedAuthentication.label}) + + You can not see the previous values for an authentication while editing. This is to keep your data secure. You can overwrite one- or multiple fields at a time. + + + Authentication Label + + { + selectedAuthentication.label = e.target.value + }} + /> + + {selectedAuthentication.fields.map((data, index) => { + var fieldname = data.key.replaceAll("_", " ") + if (fieldname.endsWith(" basic")) { + fieldname = fieldname.substring(0, fieldname.length - 6) + } + //console.log("DATA: ", data, selectedAuthentication) return (
- {data.key} + {fieldname} { var error = false; + var fails = 0 for (var key in authenticationFields) { const item = authenticationFields[key]; if (item.value.length === 0) { + fails += 1 console.log("ITEM: ", item); //var currentnode = cy.getElementById(data.id) var textfield = document.getElementById( @@ -1866,14 +1914,13 @@ If you're interested, please let me know a time that works for you, or set up a } } - if (error) { - toast("All fields must have a new value"); + if (error && fails === authenticationFields.length) { + toast("Updating auth with new name only") + saveAuthentication(selectedAuthentication); } else { toast("Saving new version of this authentication"); selectedAuthentication.fields = authenticationFields; saveAuthentication(selectedAuthentication); - setSelectedAuthentication({}); - setSelectedAuthenticationModalOpen(false); } }} color="primary" @@ -3732,7 +3779,7 @@ If you're interested, please let me know a time that works for you, or set up a }} /> {/* diff --git a/frontend/src/views/AngularWorkflow.jsx b/frontend/src/views/AngularWorkflow.jsx index 53a43232..9ccbd3c5 100755 --- a/frontend/src/views/AngularWorkflow.jsx +++ b/frontend/src/views/AngularWorkflow.jsx @@ -1824,6 +1824,7 @@ const AngularWorkflow = (defaultprops) => { setExecutionModalOpen(true); setExecutionModalView(1); start(); + navigate(`/workflows/${props.match.params.key}?execution_id=${responseJson.execution_id}`) }) .catch((error) => { //toast(error.toString()); From 6d7756b09317c90e28c2e76c4b04839b718e971a Mon Sep 17 00:00:00 2001 From: Frikky Date: Mon, 18 Dec 2023 22:38:53 +0100 Subject: [PATCH 11/42] Made orborus have the environment variable SHUFFLE_AUTO_IMAGE_DOWNLOAD=false distribution to worker in swarm --- backend/go-app/docker.go | 1 + functions/onprem/orborus/go.mod | 2 +- functions/onprem/orborus/go.sum | 2 ++ functions/onprem/orborus/orborus.go | 6 ++++++ 4 files changed, 10 insertions(+), 1 deletion(-) diff --git a/backend/go-app/docker.go b/backend/go-app/docker.go index a2dc9fd1..a4565523 100755 --- a/backend/go-app/docker.go +++ b/backend/go-app/docker.go @@ -821,6 +821,7 @@ func handleRemoteDownloadApp(resp http.ResponseWriter, ctx context.Context, user return } + defer newresp.Body.Close() respBody, err := ioutil.ReadAll(newresp.Body) if err != nil { log.Printf("[ERROR] Failed setting respbody for workflow download: %s", err) diff --git a/functions/onprem/orborus/go.mod b/functions/onprem/orborus/go.mod index a621444e..ce907d08 100644 --- a/functions/onprem/orborus/go.mod +++ b/functions/onprem/orborus/go.mod @@ -9,7 +9,7 @@ require ( github.com/mackerelio/go-osstat v0.2.3 github.com/satori/go.uuid v1.2.0 github.com/shirou/gopsutil v3.21.11+incompatible - github.com/shuffle/shuffle-shared v0.5.31 + github.com/shuffle/shuffle-shared v0.5.44 k8s.io/api v0.28.1 k8s.io/apimachinery v0.28.1 k8s.io/client-go v0.28.1 diff --git a/functions/onprem/orborus/go.sum b/functions/onprem/orborus/go.sum index fa8b721c..3f9526d9 100644 --- a/functions/onprem/orborus/go.sum +++ b/functions/onprem/orborus/go.sum @@ -280,6 +280,8 @@ github.com/shuffle/shuffle-shared v0.4.96 h1:iaIB/HP9eKpw9DMMJZhSLDbKdHJt075kFYL github.com/shuffle/shuffle-shared v0.4.96/go.mod h1:X613gbo0dT3fnYvXDRwjQZyLC+T49T2nSQOrCV5QMlI= github.com/shuffle/shuffle-shared v0.5.29 h1:n4vThl7v3mFVXbrIW71XREFdmZZo7mOBAWxnsdiNjDk= github.com/shuffle/shuffle-shared v0.5.29/go.mod h1:X613gbo0dT3fnYvXDRwjQZyLC+T49T2nSQOrCV5QMlI= +github.com/shuffle/shuffle-shared v0.5.44 h1:6WiFPIsij+IWvXY7vzVX7cUicb+PYOzhTbWF/gDmYeU= +github.com/shuffle/shuffle-shared v0.5.44/go.mod h1:X613gbo0dT3fnYvXDRwjQZyLC+T49T2nSQOrCV5QMlI= github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e h1:MRM5ITcdelLK2j1vwZ3Je0FKVCfqOLp5zO6trqMLYs0= github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e/go.mod h1:XV66xRDqSt+GTGFMVlhk3ULuV0y9ZmzeVGR4mloJI3M= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= diff --git a/functions/onprem/orborus/orborus.go b/functions/onprem/orborus/orborus.go index 99da2cc1..8a9992a3 100755 --- a/functions/onprem/orborus/orborus.go +++ b/functions/onprem/orborus/orborus.go @@ -533,6 +533,10 @@ func deployServiceWorkers(image string) { serviceSpec.TaskTemplate.ContainerSpec.Env = append(serviceSpec.TaskTemplate.ContainerSpec.Env, fmt.Sprintf("SHUFFLE_CLOUDRUN_URL=%s", os.Getenv("SHUFFLE_CLOUDRUN_URL"))) } + if len(os.Getenv("SHUFFLE_AUTO_IMAGE_DOWNLOAD")) > 0 { + serviceSpec.TaskTemplate.ContainerSpec.Env = append(serviceSpec.TaskTemplate.ContainerSpec.Env, fmt.Sprintf("SHUFFLE_AUTO_IMAGE_DOWNLOAD=%s", os.Getenv("SHUFFLE_AUTO_IMAGE_DOWNLOAD"))) + } + if len(os.Getenv("DOCKER_HOST")) > 0 { serviceSpec.TaskTemplate.ContainerSpec.Env = append(serviceSpec.TaskTemplate.ContainerSpec.Env, fmt.Sprintf("DOCKER_HOST=%s", os.Getenv("DOCKER_HOST"))) } else { @@ -580,6 +584,8 @@ func deployServiceWorkers(image string) { serviceOptions, ) + //dockercli.ServiceUpdate( + if err == nil { log.Printf("[DEBUG] Successfully deployed workers with %d replica(s) on %d node(s)", replicas, cnt) //time.Sleep(time.Duration(10) * time.Second) From f2a3c64563e33904e99ad293e7d51efdbd2c2a66 Mon Sep 17 00:00:00 2001 From: Frikky Date: Tue, 19 Dec 2023 00:05:51 +0100 Subject: [PATCH 12/42] Added shuffle stats disabled to make it skip that --- functions/onprem/orborus/orborus.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/functions/onprem/orborus/orborus.go b/functions/onprem/orborus/orborus.go index 8a9992a3..b81b4597 100755 --- a/functions/onprem/orborus/orborus.go +++ b/functions/onprem/orborus/orborus.go @@ -1039,6 +1039,11 @@ func getOrborusStats(ctx context.Context) shuffle.OrborusStats { Timestamp: time.Now().Unix(), } + // Disable orborus stats + if os.Getenv("SHUFFLE_STATS_DISABLED") == "true" { + return newStats + } + if swarmConfig == "run" || swarmConfig == "swarm" { newStats.Swarm = true } From 126bbf54a865defcf08089990f684283ae4d2919 Mon Sep 17 00:00:00 2001 From: Frikky Date: Fri, 22 Dec 2023 18:05:31 +0100 Subject: [PATCH 13/42] Changed schedule to start immediately onprem --- backend/go-app/walkoff.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/backend/go-app/walkoff.go b/backend/go-app/walkoff.go index dafbcdc7..7c23a1cc 100755 --- a/backend/go-app/walkoff.go +++ b/backend/go-app/walkoff.go @@ -106,7 +106,10 @@ func createSchedule(ctx context.Context, scheduleId, workflowId, name, startNode } log.Printf("[INFO] Starting frequency for execution: %d", newfrequency) - jobret, err := newscheduler.Every(newfrequency).Seconds().NotImmediately().Run(job) + + + //jobret, err := newscheduler.Every(newfrequency).Seconds().NotImmediately().Run(job) + jobret, err := newscheduler.Every(newfrequency).Seconds().Run(job) if err != nil { log.Printf("Failed to schedule workflow: %s", err) return err From 0e9b975c98b349a6a535fcb344211401060dbf53 Mon Sep 17 00:00:00 2001 From: Frikky Date: Wed, 3 Jan 2024 14:09:49 +0000 Subject: [PATCH 14/42] Updated worker nightly to run with latest shared version --- functions/onprem/worker/go.mod | 2 +- functions/onprem/worker/go.sum | 4 ++ functions/onprem/worker/worker.go | 81 ++++++++++++++++++++++--------- 3 files changed, 64 insertions(+), 23 deletions(-) diff --git a/functions/onprem/worker/go.mod b/functions/onprem/worker/go.mod index b847ac38..698af467 100644 --- a/functions/onprem/worker/go.mod +++ b/functions/onprem/worker/go.mod @@ -11,7 +11,7 @@ require ( github.com/gorilla/mux v1.8.0 github.com/patrickmn/go-cache v2.1.0+incompatible github.com/satori/go.uuid v1.2.0 - github.com/shuffle/shuffle-shared v0.5.31 + github.com/shuffle/shuffle-shared v0.5.53 k8s.io/api v0.28.3 k8s.io/apimachinery v0.28.3 k8s.io/client-go v0.28.3 diff --git a/functions/onprem/worker/go.sum b/functions/onprem/worker/go.sum index 821c92f0..64484995 100644 --- a/functions/onprem/worker/go.sum +++ b/functions/onprem/worker/go.sum @@ -288,6 +288,10 @@ github.com/shuffle/shuffle-shared v0.5.29 h1:n4vThl7v3mFVXbrIW71XREFdmZZo7mOBAWx github.com/shuffle/shuffle-shared v0.5.29/go.mod h1:X613gbo0dT3fnYvXDRwjQZyLC+T49T2nSQOrCV5QMlI= github.com/shuffle/shuffle-shared v0.5.31 h1:OV4IIfKWWFW66WjGvyXOmmsSz3p8pW9L1ge1mDo8ftM= github.com/shuffle/shuffle-shared v0.5.31/go.mod h1:X613gbo0dT3fnYvXDRwjQZyLC+T49T2nSQOrCV5QMlI= +github.com/shuffle/shuffle-shared v0.5.44 h1:6WiFPIsij+IWvXY7vzVX7cUicb+PYOzhTbWF/gDmYeU= +github.com/shuffle/shuffle-shared v0.5.44/go.mod h1:X613gbo0dT3fnYvXDRwjQZyLC+T49T2nSQOrCV5QMlI= +github.com/shuffle/shuffle-shared v0.5.53 h1:Osr5sjr0wppqlf/MjH1oykdcw/Q48d8+ZnerRrYfOA4= +github.com/shuffle/shuffle-shared v0.5.53/go.mod h1:X613gbo0dT3fnYvXDRwjQZyLC+T49T2nSQOrCV5QMlI= github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e h1:MRM5ITcdelLK2j1vwZ3Je0FKVCfqOLp5zO6trqMLYs0= github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e/go.mod h1:XV66xRDqSt+GTGFMVlhk3ULuV0y9ZmzeVGR4mloJI3M= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= diff --git a/functions/onprem/worker/worker.go b/functions/onprem/worker/worker.go index 0c8fd3a5..2eaa1f74 100755 --- a/functions/onprem/worker/worker.go +++ b/functions/onprem/worker/worker.go @@ -354,7 +354,8 @@ func shutdown(workflowExecution shuffle.WorkflowExecution, nodeId string, reason req.Header.Add("Content-Type", "application/json") //log.Printf("[DEBUG][%s] All App Logs: %#v", workflowExecution.ExecutionId, allLogs) - newresp, err := topClient.Do(req) + client := shuffle.GetExternalClient(abortUrl) + newresp, err := client.Do(req) if err != nil { log.Printf("[WARNING][%s] Failed abort request: %s", workflowExecution.ExecutionId, err) } else { @@ -464,6 +465,9 @@ func deployApp(cli *dockerclient.Client, image string, identifier string, env [] // Check action if subflow // Check if url is default (shuffle-backend) // If it doesn't exist, add it + + // FIXME: This does NOT replace it in all cases as the data + // is not saved in the database as the correct param. if action.AppName == "shuffle-subflow" { // Automatic replacement of URL for paramIndex, param := range action.Parameters { @@ -471,17 +475,19 @@ func deployApp(cli *dockerclient.Client, image string, identifier string, env [] continue } - if strings.Contains(param.Value, "shuffle-backend") { - // Automatic replacement as this is default - if len(os.Getenv("BASE_URL")) > 0 { - action.Parameters[paramIndex].Value = os.Getenv("BASE_URL") - log.Printf("[DEBUG][%s] Replaced backend_url with base_url %s", workflowExecution.ExecutionId, os.Getenv("BASE_URL")) - } + if !strings.Contains(param.Value, "shuffle-backend") { + continue + } - if len(os.Getenv("SHUFFLE_CLOUDRUN_URL")) > 0 { - action.Parameters[paramIndex].Value = os.Getenv("SHUFFLE_CLOUDRUN_URL") - log.Printf("[DEBUG][%s] Replaced backend_url with cloudrun %s", workflowExecution.ExecutionId, os.Getenv("SHUFFLE_CLOUDRUN_URL")) - } + // Automatic replacement as this is default + if len(os.Getenv("BASE_URL")) > 0 { + action.Parameters[paramIndex].Value = os.Getenv("BASE_URL") + log.Printf("[DEBUG][%s] Replaced backend_url with base_url %s", workflowExecution.ExecutionId, os.Getenv("BASE_URL")) + } + + if len(os.Getenv("SHUFFLE_CLOUDRUN_URL")) > 0 { + action.Parameters[paramIndex].Value = os.Getenv("SHUFFLE_CLOUDRUN_URL") + log.Printf("[DEBUG][%s] Replaced backend_url with cloudrun %s", workflowExecution.ExecutionId, os.Getenv("SHUFFLE_CLOUDRUN_URL")) } } } @@ -745,6 +751,8 @@ func removeContainer(containername string) error { return err } + defer cli.Close() + // FIXME - ucnomment // containers, err := cli.ContainerList(ctx, types.ContainerListOptions{ // All: true, @@ -800,6 +808,8 @@ func getWorkerURLs() ([]string, error) { return workerUrls, err } + defer cli.Close() + // Specify the name of the service for which you want to list tasks serviceName := "shuffle-workers" @@ -827,12 +837,19 @@ func askOtherWorkersToDownloadImage(image string) { return } + // Check environment SHUFFLE_AUTO_IMAGE_DOWNLOAD + if os.Getenv("SHUFFLE_AUTO_IMAGE_DOWNLOAD") == "false" { + log.Printf("[DEBUG] SHUFFLE_AUTO_IMAGE_DOWNLOAD is false. NOT distributing images %s", image) + return + } + urls, err := getWorkerURLs() if err != nil { log.Printf("[ERROR] Error in listing worker urls: %s", err) return } + httpClient := &http.Client{} for _, url := range urls { log.Printf("[DEBUG] Trying to speak to: %s", url) imagesRequest := ImageRequest{ @@ -855,7 +872,6 @@ func askOtherWorkersToDownloadImage(image string) { continue } - httpClient := &http.Client{} resp, err := httpClient.Do(req) if err != nil { log.Printf("[ERROR] Error in making request to %s : %s", url, err) @@ -892,6 +908,8 @@ func handleExecutionResult(workflowExecution shuffle.WorkflowExecution) { return } + defer dockercli.Close() + for _, action := range relevantActions { appname := action.AppName appversion := action.AppVersion @@ -1116,6 +1134,7 @@ func handleExecutionResult(workflowExecution shuffle.WorkflowExecution) { shutdown(workflowExecution, action.ID, fmt.Sprintf("%s", err.Error()), true) return } else { + defer reader.Close() baseTag := strings.Split(image, ":") if len(baseTag) > 1 { tag := baseTag[1] @@ -1226,6 +1245,7 @@ func handleExecutionResult(workflowExecution shuffle.WorkflowExecution) { shutdown(workflowExecution, action.ID, fmt.Sprintf("%s", err.Error()), true) return } else { + defer reader.Close() baseTag := strings.Split(image, ":") if len(baseTag) > 1 { tag := baseTag[1] @@ -1494,7 +1514,8 @@ func handleSubflowPoller(ctx context.Context, workflowExecution shuffle.Workflow bytes.NewBuffer([]byte(data)), ) - newresp, err := topClient.Do(req) + client := shuffle.GetExternalClient(streamResultUrl) + newresp, err := client.Do(req) if err != nil { log.Printf("[ERROR] Failed making request (1): %s", err) time.Sleep(time.Duration(sleepTime) * time.Second) @@ -2101,7 +2122,8 @@ func sendSelfRequest(actionResult shuffle.ActionResult) { return } - newresp, err := topClient.Do(req) + client := shuffle.GetExternalClient(streamUrl) + newresp, err := client.Do(req) if err != nil { log.Printf("[ERROR][%s] Error running finishing request (2): %s", actionResult.ExecutionId, err) return @@ -2158,9 +2180,10 @@ func sendResult(workflowExecution shuffle.WorkflowExecution, data []byte) { return } - newresp, err := topClient.Do(req) + client := shuffle.GetExternalClient(streamUrl) + newresp, err := client.Do(req) if err != nil { - log.Printf("[ERROR][%s] Error running finishing request: %s", workflowExecution.ExecutionId, err) + log.Printf("[ERROR][%s] Error running finishing request (1): %s", workflowExecution.ExecutionId, err) log.Printf("[DEBUG][%s] Shutting down (23)", workflowExecution.ExecutionId) shutdown(workflowExecution, "", "", false) return @@ -2348,6 +2371,12 @@ func webserverSetup(workflowExecution shuffle.WorkflowExecution) net.Listener { func downloadDockerImageBackend(client *http.Client, imageName string) error { log.Printf("[DEBUG] Trying to download image %s from backend %s as it doesn't exist. All images: %#v", imageName, baseUrl, downloadedImages) + // Check environment SHUFFLE_AUTO_IMAGE_DOWNLOAD + if os.Getenv("SHUFFLE_AUTO_IMAGE_DOWNLOAD") == "false" { + log.Printf("[DEBUG] SHUFFLE_AUTO_IMAGE_DOWNLOAD is false. Not downloading image %s", imageName) + return nil + } + if arrayContains(downloadedImages, imageName) { log.Printf("[DEBUG] Image %s already downloaded", imageName) return nil @@ -2407,12 +2436,15 @@ func downloadDockerImageBackend(client *http.Client, imageName string) error { return err } + defer dockercli.Close() + imageLoadResponse, err := dockercli.ImageLoad(context.Background(), tar, true) if err != nil { log.Printf("[ERROR] Error loading images: %s", err) return err } + defer imageLoadResponse.Body.Close() body, err := ioutil.ReadAll(imageLoadResponse.Body) if err != nil { log.Printf("[ERROR] Error reading: %s", err) @@ -2570,9 +2602,11 @@ func sendAppRequest(ctx context.Context, incomingUrl, appName string, port int, log.Printf("[DEBUG][%s] Adding %s to cache (%#v)", workflowExecution.ExecutionId, newExecId, action.Name) } - // FIXME: Add 5 tries + client := shuffle.GetExternalClient(streamUrl) - newresp, err := topClient.Do(req) + // Set client timeout to 5 seconds + client.Timeout = time.Duration(10) * time.Second + newresp, err := client.Do(req) if err != nil { // Another timeout issue here somewhere // context deadline @@ -2630,6 +2664,8 @@ func baseDeploy() { return } + defer cli.Close() + for key, value := range autoDeploy { newNameSplit := strings.Split(key, ":") @@ -2897,7 +2933,6 @@ func main() { shutdown(workflowExecution, "", "", true) } - topClient = client firstRequest := true environments := []string{} for { @@ -3007,15 +3042,14 @@ func handleRunExecution(resp http.ResponseWriter, request *http.Request) { var workflowExecution shuffle.WorkflowExecution data = fmt.Sprintf(`{"execution_id": "%s", "authorization": "%s"}`, execRequest.ExecutionId, execRequest.Authorization) streamResultUrl := fmt.Sprintf("%s/api/v1/streams/results", baseUrl) - topClient = shuffle.GetExternalClient(streamResultUrl) - req, err := http.NewRequest( "POST", streamResultUrl, bytes.NewBuffer([]byte(data)), ) - newresp, err := topClient.Do(req) + client := shuffle.GetExternalClient(streamResultUrl) + newresp, err := client.Do(req) if err != nil { log.Printf("[ERROR] Failed making request (2): %s", err) resp.WriteHeader(401) @@ -3145,6 +3179,8 @@ func handleDownloadImage(resp http.ResponseWriter, request *http.Request) { return } + defer client.Close() + // check if images are already downloaded // Retrieve a list of Docker images images, err := client.ImageList(context.Background(), types.ImageListOptions{}) @@ -3155,6 +3191,7 @@ func handleDownloadImage(resp http.ResponseWriter, request *http.Request) { return } + for _, img := range images { for _, tag := range img.RepoTags { splitTag := strings.Split(tag, ":") From 9b24a456276e3220d5396f98e29def61748217f1 Mon Sep 17 00:00:00 2001 From: Frikky Date: Tue, 16 Jan 2024 14:02:12 +0100 Subject: [PATCH 15/42] Minor SDK update for prints --- .env | 10 ++++---- backend/app_sdk/app_base.py | 3 +-- backend/go-app/main.go | 48 ------------------------------------- 3 files changed, 7 insertions(+), 54 deletions(-) diff --git a/.env b/.env index 73fbdf63..2fd946ed 100755 --- a/.env +++ b/.env @@ -46,15 +46,17 @@ OUTER_HOSTNAME=shuffle-backend DB_LOCATION=./shuffle-database DOCKER_API_VERSION=1.40 -# Proxy configurations. SHUFFLE_PASS_WORKER_PROXY must be FALSE to not pass the proxy information to sub-apps. -# PS: It will skip proxy for +# Orborus/Proxy configurations HTTP_PROXY= HTTPS_PROXY= -SHUFFLE_PASS_WORKER_PROXY=TRUE -SHUFFLE_PASS_APP_PROXY=FALSE +SHUFFLE_PASS_WORKER_PROXY=TRUE # Decides if proxy configurations should be passed to workers or not +SHUFFLE_PASS_APP_PROXY=TRUE # Decides if proxy configurations should be passed to apps or not. Requires SHUFFLE_PASS_WORKER_PROXY=true +SHUFFLE_INTERNAL_HTTP_PROXY= # Used to differentiate proxies for shuffle internal vs external traffic +SHUFFLE_INTERNAL_HTTPS_PROXY= TZ=Europe/Amsterdam # Timezone-handler in Orborus, Worker and Apps ORBORUS_CONTAINER_NAME= # Used to FIND the containername. cgroup v2: issue 501 SHUFFLE_ORBORUS_STARTUP_DELAY= # Used for setting up a startup delay for Orborus +SHUFFLE_SKIPSSL_VERIFY=true IS_KUBERNETES=false # Used for controlling if the environment should run in kubernetes or not SHUFFLE_BASE_IMAGE_NAME=shuffle diff --git a/backend/app_sdk/app_base.py b/backend/app_sdk/app_base.py index 0e735176..18840691 100755 --- a/backend/app_sdk/app_base.py +++ b/backend/app_sdk/app_base.py @@ -2691,7 +2691,7 @@ class AppBase: #self.logger.info(f"\n\nType of value: {type(value)}") if isinstance(value, str): # Could we take it here? - self.logger.info(f"[DEBUG] Got value %s for parameter {paramname}" % value) + #self.logger.info(f"[DEBUG] Got value %s for parameter {paramname}" % value) # Should check if there is are quotes infront of and after the to_be_replaced # If there are, then we need to sanitize the value # 1. Look for the to_be_replaced in the data @@ -2703,7 +2703,6 @@ class AppBase: # value = returnvalue - parameter["value"] = parameter["value"].replace(to_be_replaced, value) elif isinstance(value, dict) or isinstance(value, list): # Changed from JSON dump to str() 28.05.2021 diff --git a/backend/go-app/main.go b/backend/go-app/main.go index 296c8739..249c9d78 100755 --- a/backend/go-app/main.go +++ b/backend/go-app/main.go @@ -3049,55 +3049,7 @@ func verifySwagger(resp http.ResponseWriter, request *http.Request) { buildSwaggerApp(resp, body, user, false) } -// Creates osfs from folderpath with a basepath as directory base -func createFs(basepath, pathname string) (billy.Filesystem, error) { - log.Printf("[INFO] MemFS base: %s, pathname: %s", basepath, pathname) - fs := memfs.New() - err := filepath.Walk(pathname, - func(path string, info os.FileInfo, err error) error { - if err != nil { - return err - } - - if strings.Contains(path, ".git") { - return nil - } - - // Fix the inner path here - newpath := strings.ReplaceAll(path, pathname, "") - fullpath := fmt.Sprintf("%s%s", basepath, newpath) - switch mode := info.Mode(); { - case mode.IsDir(): - err = fs.MkdirAll(fullpath, 0644) - if err != nil { - log.Printf("Failed making folder: %s", err) - } - case mode.IsRegular(): - srcData, err := ioutil.ReadFile(path) - if err != nil { - log.Printf("Src error: %s", err) - return err - } - - dst, err := fs.Create(fullpath) - if err != nil { - log.Printf("Dst error: %s", err) - return err - } - - _, err = dst.Write(srcData) - if err != nil { - log.Printf("Dst write error: %s", err) - return err - } - } - - return nil - }) - - return fs, err -} // Hotloads new apps from a folder func handleAppHotload(ctx context.Context, location string, forceUpdate bool) error { From 8a48dee950164deaf9a5699c8a734d5342977c85 Mon Sep 17 00:00:00 2001 From: Frikky Date: Tue, 16 Jan 2024 15:18:47 +0100 Subject: [PATCH 16/42] Small SDK changes for proxy and verbosity --- backend/app_sdk/app_base.py | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/backend/app_sdk/app_base.py b/backend/app_sdk/app_base.py index 18840691..34fbd22c 100755 --- a/backend/app_sdk/app_base.py +++ b/backend/app_sdk/app_base.py @@ -551,12 +551,12 @@ class AppBase: # Proxyerrror except requests.exceptions.ProxyError as e: - self.logger.info(f"[ERROR] Proxy error: {e}") + self.logger.info(f"[ERROR] Proxy error for url {url}: {e}") self.proxy_config = {} continue except requests.exceptions.RequestException as e: - self.logger.info(f"[DEBUG] Request problem: {e}") + self.logger.info(f"[DEBUG] Request problem for url {url}: {e}" time.sleep(sleeptime) # Check if we have a read timeout. If we do, exit as we most likely sent the result without getting a good result @@ -1576,9 +1576,10 @@ class AppBase: "execution_id": self.current_execution_id } - self.logger.info("[ERROR] Before FULLEXEC stream result") + resultsurl = "%s/api/v1/streams/results" % (self.base_url) + self.logger.info("[ERROR] Before FULLEXEC stream result url '%s'" % (resultsurl)) ret = requests.post( - "%s/api/v1/streams/results" % (self.base_url), + resultsurl, headers=headers, json=tmpdata, verify=False, @@ -1600,7 +1601,7 @@ class AppBase: continue else: - self.logger.info("[ERROR] Error in app with status code %d for results (2). Crashing because results can't be handled" % ret.status_code) + self.logger.info("[ERROR] (fails: %d) Error in app with status code %d for results (2). Crashing because results can't be handled. Details: %s" % (i+1, ret.status_code, ret.text)) rettext = ret.text failed = True @@ -1621,11 +1622,21 @@ class AppBase: self.logger.info("[ERROR] FullExec Connectionerror: %s" % e) self.action_result["result"] = json.dumps({ "success": False, - "reason": f"Connection error during startup: {e}" + "reason": f"Connection error during startup (connection error): {e}" }) self.send_result(self.action_result, headers, stream_path) return + except Exception as e: + self.logger.info("[ERROR] FullExec Exception outer: %s" % e) + self.action_result["result"] = json.dumps({ + "success": False, + "reason": f"Exception during startup of app (general error): {e}" + }) + + self.send_result(self.action_result, headers, stream_path) + return + else: self.logger.info(f"[DEBUG] Setting execution to default value with type {type(self.full_execution)}") try: From 09ab560dd5bbbabfb055bd9c7e9b1e941165bb3b Mon Sep 17 00:00:00 2001 From: Frikky Date: Wed, 17 Jan 2024 10:52:59 +0100 Subject: [PATCH 17/42] Disabled orborus stats by default --- backend/go-app/walkoff.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/backend/go-app/walkoff.go b/backend/go-app/walkoff.go index 7c23a1cc..68c2c107 100755 --- a/backend/go-app/walkoff.go +++ b/backend/go-app/walkoff.go @@ -308,8 +308,13 @@ func handleGetWorkflowqueue(resp http.ResponseWriter, request *http.Request) { environment = env.OrgId } - if request.Method == "POST" { - if rand.Intn(1) == 0 { + // FIXME: Workflow stats disabled for now + // as it caused too many problems + // goal: track docker stuff once a minute and graph it + // For now: Disable this as it caused too many problems + if request.Method == "POST" && true == false { + //log.Printf("[DEBUG] POST to workflowqueue") + if rand.Intn(10) == 0 { // Parse out body body, err := ioutil.ReadAll(request.Body) if err == nil { From 14498f1fb4f430a90a566ebc303cb24276dbf867 Mon Sep 17 00:00:00 2001 From: Frikky Date: Wed, 17 Jan 2024 14:26:53 +0100 Subject: [PATCH 18/42] Multiple frontend & backend fixes --- frontend/src/components/NewHeader.jsx | 14 +- frontend/src/components/ParsedAction.jsx | 43 +- frontend/src/components/SearchData.jsx | 151 +++---- frontend/src/components/Searchfield.jsx | 6 +- .../src/components/WorkflowTemplatePopup.jsx | 23 +- frontend/src/views/Admin.jsx | 60 ++- frontend/src/views/AngularWorkflow.jsx | 395 +++++++++++++++--- frontend/src/views/AppCreator.jsx | 16 +- frontend/src/views/Apps.jsx | 262 +++++++++--- functions/onprem/orborus/orborus.go | 14 +- 10 files changed, 735 insertions(+), 249 deletions(-) diff --git a/frontend/src/components/NewHeader.jsx b/frontend/src/components/NewHeader.jsx index bd28e2de..e9891240 100644 --- a/frontend/src/components/NewHeader.jsx +++ b/frontend/src/components/NewHeader.jsx @@ -454,12 +454,9 @@ const Header = (props) => { return response.json(); }) .then(function (responseJson) { + console.log("In here?") if (responseJson.success === true) { - if ( - responseJson.region_url !== undefined && - responseJson.region_url !== null && - responseJson.region_url.length > 0 - ) { + if (responseJson.region_url !== undefined && responseJson.region_url !== null && responseJson.region_url.length > 0) { console.log("Region Change: ", responseJson.region_url); localStorage.setItem("globalUrl", responseJson.region_url); //globalUrl = responseJson.region_url @@ -468,9 +465,14 @@ const Header = (props) => { setTimeout(() => { window.location.reload(); }, 2000); + toast("Successfully changed active organization - refreshing!"); } else { - toast("Failed changing org: ", responseJson.reason); + if (responseJson.reason !== undefined && responseJson.reason !== null && responseJson.reason.length > 0) { + toast(responseJson.reason); + } else { + toast("Failed changing org. Try again or contact support@shuffler.io if this persists."); + } } }) .catch((error) => { diff --git a/frontend/src/components/ParsedAction.jsx b/frontend/src/components/ParsedAction.jsx index e0abbe42..66c159a0 100755 --- a/frontend/src/components/ParsedAction.jsx +++ b/frontend/src/components/ParsedAction.jsx @@ -11,6 +11,7 @@ import { NestedMenuItem } from "mui-nested-menu"; //import { useAlert import { + Chip, ButtonGroup, Popper, TextField, @@ -3298,14 +3299,12 @@ const ParsedAction = (props) => { Authentication
{ ); })} + + {isCloud && (selectedApp.sharing === true || selectedApp.public === true || creatorProfile.github_avatar !== undefined) && !internalIds.includes(selectedApp.name.toLowerCase()) ? + + : null}
) : null} + +
+ {isCloud && Object.getOwnPropertyNames(creatorProfile).length !== 0 && creatorProfile.github_avatar !== undefined && creatorProfile.github_avatar !== null ? +
+ { + //setAnchorElAvatar(event.currentTarget); + }} + > + + + + + + Shared by{" "} + + {creatorProfile.github_username} + + +
+ : null} + {selectedApp.tags !== undefined && selectedApp.tags !== null ? ( +
+ {selectedApp.tags.map((tag, index) => { + if (index >= 3) { + return null; + } + + return ( + + ); + })} +
+ ) : null} +
{/*

Owner: {selectedApp.owner}

*/} {selectedApp.privateId !== undefined && selectedApp.privateId.length > 0 ? ( @@ -1666,37 +1804,45 @@ const Apps = (props) => { ) } - const activateApp = (appid, refresh) => { - fetch(globalUrl + "/api/v1/apps/" + appid + "/activate", { - method: 'GET', - headers: { - 'Content-Type': 'application/json', - 'Accept': 'application/json', - }, - credentials: "include", + const activateApp = (appid, refresh) => { + const appExists = userdata.active_apps !== undefined && userdata.active_apps !== null && userdata.active_apps.includes(appid) + const url = appExists ? `${globalUrl}/api/v1/apps/${appid}/deactivate` : `${globalUrl}/api/v1/apps/${appid}/activate` + + fetch(url, { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + 'Accept': 'application/json', + }, + credentials: "include", + }) + .then((response) => { + if (response.status !== 200) { + console.log("Failed to deactivate") + } + + return response.json() }) - .then((response) => { - if (response.status !== 200) { - console.log("Failed to activate") - } + .then((responseJson) => { + if (responseJson.success === false) { + toast("Failed to activate the app") + } else { + //toast("App activated for your organization! Refresh the page to use the app.") + if (appExists) { + toast("App deactivated for your organization! Existing workflows with the app will continue to work.") + } else { + toast("App activated for your organization!") + } - return response.json() - }) - .then((responseJson) => { - if (responseJson.success === false) { - toast("Failed to activate the app") - } else { - toast("App activated for your organization! Refresh the page to use the app.") - - if (refresh === true) { - getApps() - } + if (refresh === true) { + getApps() } - }) - .catch(error => { - //toast(error.toString()) - console.log("Activate app error: ", error.toString()) - }); + } + }) + .catch(error => { + //toast(error.toString()) + console.log("Deactivate app error: ", error.toString()) + }); } diff --git a/functions/onprem/orborus/orborus.go b/functions/onprem/orborus/orborus.go index b81b4597..ed141a1d 100755 --- a/functions/onprem/orborus/orborus.go +++ b/functions/onprem/orborus/orborus.go @@ -675,11 +675,13 @@ func deployWorker(image string, identifier string, env []string, executionReques createdPod, err := clientset.CoreV1().Pods("shuffle").Create(context.Background(), pod, metav1.CreateOptions{}) if err != nil { - fmt.Fprintf(os.Stderr, "Error creating pod: %v\n", err) + log.Printf("[ERROR] Failed creating pod: %v", err) + return err } log.Printf("[INFO] Created pod %q in namespace %q\n", createdPod.Name, createdPod.Namespace) - } else { + return nil + } // Binds is the actual "-v" volume. // Max 20% CPU every second @@ -839,9 +841,6 @@ func deployWorker(image string, identifier string, env []string, executionReques log.Printf("[INFO][%s] New Worker created. Environment %s: docker logs %s", executionRequest.ExecutionId, environment, cont.ID) } - return nil - } - return nil } @@ -1039,11 +1038,16 @@ func getOrborusStats(ctx context.Context) shuffle.OrborusStats { Timestamp: time.Now().Unix(), } + // FIXME: Returning for now due to this causing network congestion + // and database fillup. The backend api also has it disabled. + return newStats + // Disable orborus stats if os.Getenv("SHUFFLE_STATS_DISABLED") == "true" { return newStats } + if swarmConfig == "run" || swarmConfig == "swarm" { newStats.Swarm = true } From d9b7123382f7a3f20746d16f1a658c1839fa0363 Mon Sep 17 00:00:00 2001 From: Frikky Date: Wed, 17 Jan 2024 14:27:22 +0100 Subject: [PATCH 19/42] Fixed non finishing workflows with conditions --- functions/onprem/worker/go.mod | 2 +- functions/onprem/worker/worker.go | 17 ++++++++++++++--- 2 files changed, 15 insertions(+), 4 deletions(-) mode change 100755 => 100644 functions/onprem/worker/worker.go diff --git a/functions/onprem/worker/go.mod b/functions/onprem/worker/go.mod index 698af467..7c8e8045 100644 --- a/functions/onprem/worker/go.mod +++ b/functions/onprem/worker/go.mod @@ -11,7 +11,7 @@ require ( github.com/gorilla/mux v1.8.0 github.com/patrickmn/go-cache v2.1.0+incompatible github.com/satori/go.uuid v1.2.0 - github.com/shuffle/shuffle-shared v0.5.53 + github.com/shuffle/shuffle-shared v0.5.57 k8s.io/api v0.28.3 k8s.io/apimachinery v0.28.3 k8s.io/client-go v0.28.3 diff --git a/functions/onprem/worker/worker.go b/functions/onprem/worker/worker.go old mode 100755 new mode 100644 index 2eaa1f74..773510fb --- a/functions/onprem/worker/worker.go +++ b/functions/onprem/worker/worker.go @@ -1501,6 +1501,8 @@ func executionInit(workflowExecution shuffle.WorkflowExecution) error { } func handleSubflowPoller(ctx context.Context, workflowExecution shuffle.WorkflowExecution, streamResultUrl, subflowId string) error { + // FIXME: If MEMCACHE is enabled, check in this order: + extra := 0 for _, trigger := range workflowExecution.Workflow.Triggers { if trigger.AppName == "User Input" || trigger.AppName == "Shuffle Workflow" { @@ -2064,7 +2066,8 @@ func runWorkflowExecutionTransaction(ctx context.Context, attempts int64, workfl } if setExecution || workflowExecution.Status == "FINISHED" || workflowExecution.Status == "ABORTED" || workflowExecution.Status == "FAILURE" { - log.Printf("[DEBUG][%s] Running setexec with status %s and %d result(s)", workflowExecution.ExecutionId, workflowExecution.Status, len(workflowExecution.Results)) + log.Printf("[DEBUG][%s] Running setexec with status %s and %d/%d results", workflowExecution.ExecutionId, workflowExecution.Status, len(workflowExecution.Results), len(workflowExecution.Workflow.Actions)) + //result(s)", workflowExecution.ExecutionId, workflowExecution.Status, len(workflowExecution.Results)) err = setWorkflowExecution(ctx, *workflowExecution, dbSave) if err != nil { resp.WriteHeader(401) @@ -2360,6 +2363,8 @@ func webserverSetup(workflowExecution shuffle.WorkflowExecution) net.Listener { port := listener.Addr().(*net.TCPAddr).Port + // Set the port environment variable + os.Setenv("WORKER_PORT", fmt.Sprintf("%d", port)) log.Printf("[DEBUG] Starting webserver (2) on port %d with hostname: %s", port, hostname) appCallbackUrl = fmt.Sprintf("http://%s:%d", hostname, port) @@ -2605,7 +2610,7 @@ func sendAppRequest(ctx context.Context, incomingUrl, appName string, port int, client := shuffle.GetExternalClient(streamUrl) // Set client timeout to 5 seconds - client.Timeout = time.Duration(10) * time.Second + //client.Timeout = time.Duration(10) * time.Second newresp, err := client.Do(req) if err != nil { // Another timeout issue here somewhere @@ -2807,6 +2812,7 @@ func getStreamResultsWrapper(client *http.Client, req *http.Request, workflowExe log.Printf("[DEBUG] Environments: %s. Source: %s. 1 env = webserver, 0 or >1 = default. Subflow exists: %#v", environments, workflowExecution.ExecutionSource, subflowFound) if len(environments) == 1 && workflowExecution.ExecutionSource != "default" && !subflowFound { log.Printf("[DEBUG] Running OPTIMIZED execution (not manual)") + os.Setenv("SHUFFLE_OPTIMIZED", "true") listener := webserverSetup(workflowExecution) err := executionInit(workflowExecution) if err != nil { @@ -2820,7 +2826,13 @@ func getStreamResultsWrapper(client *http.Client, req *http.Request, workflowExe handleExecutionResult(workflowExecution) }() + log.Printf("[DEBUG] Running with port %#v", os.Getenv("WORKER_PORT")) + runWebserver(listener) + + // Set environment variable + + //log.Printf("Before wait") //wg := sync.WaitGroup{} //wg.Add(1) @@ -3262,5 +3274,4 @@ func runWebserver(listener net.Listener) { if err != nil { log.Printf("[ERROR] Serve issue in worker: %#v", err) } - log.Printf("[DEBUG] Do we see this?") } From a08c9c0bf33dee39e3a37e10c29d71f9939c12af Mon Sep 17 00:00:00 2001 From: Frikky Date: Thu, 18 Jan 2024 12:52:14 +0100 Subject: [PATCH 20/42] Fixed a problem where variables with loops fail, and a print problem --- backend/app_sdk/app_base.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/backend/app_sdk/app_base.py b/backend/app_sdk/app_base.py index 34fbd22c..29aab5c9 100755 --- a/backend/app_sdk/app_base.py +++ b/backend/app_sdk/app_base.py @@ -556,7 +556,7 @@ class AppBase: continue except requests.exceptions.RequestException as e: - self.logger.info(f"[DEBUG] Request problem for url {url}: {e}" + self.logger.info(f"[DEBUG] Request problem for url {url}: {e}") time.sleep(sleeptime) # Check if we have a read timeout. If we do, exit as we most likely sent the result without getting a good result @@ -2036,6 +2036,10 @@ class AppBase: # Goes here if loop if value == "#": newvalue = [] + + if basejson == None: + return "", False + for innervalue in basejson: # 1. Check the next item (message) # 2. Call this function again From f7c0c6e5e4a2e08f0eaff3d3b4da8efb506465f3 Mon Sep 17 00:00:00 2001 From: Frikky Date: Sun, 21 Jan 2024 22:11:10 +0100 Subject: [PATCH 21/42] Added more management tools for workflow running and stat management --- frontend/src/components/Billing.jsx | 1 + frontend/src/components/BillingStats.jsx | 374 +++++++++++++++--- frontend/src/components/RuntimeDebugger.jsx | 3 +- .../src/components/WorkflowTemplatePopup.jsx | 4 +- frontend/src/views/Admin.jsx | 209 ++++++++-- frontend/src/views/AngularWorkflow.jsx | 39 +- frontend/src/views/AppCreator.jsx | 228 +++++++---- frontend/src/views/Apps.jsx | 85 ++-- 8 files changed, 752 insertions(+), 191 deletions(-) diff --git a/frontend/src/components/Billing.jsx b/frontend/src/components/Billing.jsx index 2327a089..4152ce2a 100644 --- a/frontend/src/components/Billing.jsx +++ b/frontend/src/components/Billing.jsx @@ -1230,6 +1230,7 @@ const Billing = (props) => {
{ const [hovered, setHovered] = useState(""); const inputdata = keys.data === undefined ? keys : keys.data return ( -
+
{inputname} @@ -75,16 +84,174 @@ const LineChartWrapper = ({keys, inputname, height, width}) => { const AppStats = (defaultprops) => { - const { globalUrl, selectedOrganization, userdata, } = defaultprops; + const { globalUrl, selectedOrganization, userdata, isCloud, } = defaultprops; + const [keys, setKeys] = useState([]) const [searches, setSearches] = useState([]); - const [clickData, setClickData] = useState(undefined); - const [conversionData, setConversionData] = useState(undefined); - const [statistics, setStatistics] = useState(undefined); const [appRuns, setAppruns] = useState(undefined); + const [appRunCosts, setApprunCosts] = useState(undefined); const [workflowRuns, setWorkflowRuns] = useState(undefined); const [subflowRuns, setSubflowRuns] = useState(undefined); + const [endTime, setEndTime] = useState("") + const [startTime, setStartTime] = useState("") + const [statistics, setStatistics] = useState(undefined); + const [filteredStatistics, setFilteredStatistics] = useState(undefined); + + const [apprunCost, setApprunCost] = useState(0) + const [monthToDateCost, setMonthToDateCost] = useState(0) + const [monthTotalCost, setMonthTotalCost] = useState(0) + + const includedExecutions = selectedOrganization.sync_features.app_executions !== undefined ? selectedOrganization.sync_features.app_executions.limit : 0 + + // Cost in old contracts: 0.0009 + // Old contracts also always included 150.000 executions + const invocationCost = includedExecutions === 150000 || includedExecutions === 250000 ? 0.0009 : typecost_single + const defaultAmount = 10000 + + useEffect(() => { + if (statistics === undefined || statistics === null) { + return + } + + if (statistics["daily_statistics"] === undefined || statistics["daily_statistics"] === null) { + setFilteredStatistics(statistics) + return + } + + // Calculate month to date cost + var mtd_cost = 0 + for (let key in statistics["daily_statistics"]) { + const item = statistics["daily_statistics"][key] + if (item["date"] === undefined) { + continue + } + + const date = new Date(item["date"]) + const today = new Date() + if (date.getMonth() === today.getMonth()) { + mtd_cost += (item["app_executions"] * invocationCost) + } + } + + if (isCloud && mtd_cost !== monthToDateCost) { + // Find how many days there have been in the current month + const today = new Date() + const daysInMonth = new Date(today.getFullYear(), today.getMonth()+1, 0).getDate() + // Find what day we are on + const day = today.getDate() + // Find how many days are left in the month + const daysLeft = daysInMonth - day + + // Calculate the cost of the entire month + var monthTotalCost = mtd_cost/day*daysInMonth + monthTotalCost -= defaultAmount*invocationCost + monthTotalCost -= includedExecutions*invocationCost + + // Remove included amount + //const defaultAmount = 10000 + mtd_cost -= defaultAmount*invocationCost + mtd_cost -= includedExecutions*invocationCost + + if (monthTotalCost > 0) { + setMonthTotalCost(monthTotalCost.toFixed(2)) + } + + if (mtd_cost > 0) { + setMonthToDateCost(mtd_cost.toFixed(2)) + } + } + + // Make a date at the 1st of the current month + var foundstarttime = (new Date()) + foundstarttime.setDate(1) + if (startTime !== "" && startTime !== undefined && startTime !== null) { + foundstarttime = startTime + } + + // Set to tomorrow by default + var foundendtime = (new Date()) + foundendtime.setDate(foundendtime.getDate() + 1) + + // Check if endtime is after the daily statistics["date"] string + if (endTime !== "" && endTime !== undefined && endTime !== null) { + foundendtime = endTime + } + + // Check if start time is before the daily statistics["date"] string + var newlist = [] + for (let key in statistics["daily_statistics"]) { + const item = statistics["daily_statistics"][key] + if (item["date"] === undefined) { + continue + } + + const date = new Date(item["date"]) + if (date >= foundstarttime) { + if (date <= foundendtime) { + newlist.push(item) + } + } + } + + // If newlist is empty, set the timestamp to 1 year back and check if there are any statistics there + // If foundstarttime is more than 30 days back, don't do this + /* + if (newlist.length === 0 && foundstarttime.getDate() > 30) { + // Set the timestamp to be back + foundstarttime.setFullYear(foundstarttime.getFullYear() - 1) + setStartTime(foundstarttime) + + console.log("IN HERE") + } + */ + + var tmpstats = JSON.parse(JSON.stringify(statistics)) + + var workflowexecutions = 0 + var appexecutions = 0 + var estimatedcost = 0 + if (newlist.length > 0) { + tmpstats["daily_statistics"] = newlist + + for (let key in newlist) { + const item = newlist[key] + if (item["workflow_executions"] === undefined) { + continue + } + + workflowexecutions += item["workflow_executions"] + appexecutions += item["app_executions"] + + estimatedcost += (item["app_executions"] * invocationCost) + } + + tmpstats["monthly_workflow_executions"] = workflowexecutions + tmpstats["monthly_app_executions"] = appexecutions + } + + // Make estimatedcost have max 2 decimals + if (isCloud) { + // Exclude includedExecutions*month + // const includedExecutions = 150000 + //estimatedcost -= (includedExecutions * invocationCost) + + setApprunCost(estimatedcost.toFixed(2)) + } + + setFilteredStatistics(tmpstats) + handleDataSetting(tmpstats, "day") + + }, [statistics, startTime, endTime]) + + const handleStartTimeChange = (date) => { + setStartTime(date) + } + + const handleEndTimeChange = (date) => { + setEndTime(date) + } + const handleDataSetting = (inputdata, grouping) => { if (inputdata === undefined || inputdata === null) { return @@ -95,8 +262,6 @@ const AppStats = (defaultprops) => { return } - console.log("Looking at daily data: ", inputdata) - var appRuns = { "key": "App Runs", "data": [] @@ -112,6 +277,11 @@ const AppStats = (defaultprops) => { "data": [] } + var appcostRuns = { + "key": "Cost of App Runs", + "data": [] + } + for (let key in dailyStats) { // Always skips first one as it has accumulated data in it if (key === 0) { @@ -119,7 +289,6 @@ const AppStats = (defaultprops) => { } const item = dailyStats[key] - if (item["date"] === undefined) { console.log("No date: ", item) continue @@ -131,6 +300,12 @@ const AppStats = (defaultprops) => { key: new Date(item["date"]), data: item["app_executions"] }) + + // Add number + appcostRuns["data"].push({ + key: new Date(item["date"]), + data: (item["app_executions"] * invocationCost).toFixed(2) + }) } // Check if workflow_executions key in item @@ -150,12 +325,16 @@ const AppStats = (defaultprops) => { } // Adds data for today - console.log("Inputdata: ", inputdata) if (inputdata["daily_app_executions"] !== undefined && inputdata["daily_app_executions"] !== null) { appRuns["data"].push({ key: new Date(), data: inputdata["daily_app_executions"] }) + + appcostRuns["data"].push({ + key: new Date(), + data: (inputdata["daily_app_executions"] * invocationCost).toFixed(2) + }) } if (inputdata["daily_workflow_executions"] !== undefined && inputdata["daily_workflow_executions"] !== null) { @@ -175,6 +354,7 @@ const AppStats = (defaultprops) => { setSubflowRuns(subflowRuns) setWorkflowRuns(workflowRuns) setAppruns(appRuns) + setApprunCosts(appcostRuns) } const getStats = () => { @@ -186,25 +366,25 @@ const AppStats = (defaultprops) => { }, credentials: "include", }) - .then((response) => { - if (response.status !== 200) { - console.log("Status not 200 for workflows :O!: ", response.status); - return; - } + .then((response) => { + if (response.status !== 200) { + console.log("Status not 200 for workflows :O!: ", response.status); + return; + } - return response.json(); - }) - .then((responseJson) => { - if (responseJson["success"] === false) { - return - } + return response.json(); + }) + .then((responseJson) => { + if (responseJson["success"] === false) { + return + } - setStatistics(responseJson) - handleDataSetting(responseJson, "day") - }) - .catch((error) => { - console.log("error: ", error) - }); + setStatistics(responseJson) + handleDataSetting(responseJson, "day") + }) + .catch((error) => { + console.log("error: ", error) + }); } useEffect(() => { @@ -215,40 +395,126 @@ const AppStats = (defaultprops) => { textAlign: "center", padding: 40, margin: 5, - backgroundColor: theme.palette.surfaceColor, + backgroundColor: theme.palette.platformColor, + border: "1px solid rgba(255,255,255,0.3)", maxWidth: 300, } const data = (
- All Stat widgets are monthly and gathered from Your Organization Statistics. - This is a feature to help give you more insight into Shuffle, and will be populating over time. + >Your Organization Statistics + This is a feature to help give you more insight into Shuffle, and to understand your utilization of the Shuffle platform. The billing tracker is in Beta, and is always calculated manually before being invoiced. - {statistics !== undefined ? -
- - - {statistics.monthly_workflow_executions} - - - Workflow Runs - - - - - {statistics.monthly_app_executions} - - - App Runs - - -
- : null} + +
+ {filteredStatistics !== undefined ? +
+ + The cost of app runs in the selected period based on {filteredStatistics.monthly_app_executions} App Runs. These numbers do not exclude your included 10.000/month or {includedExecutions} App Runs per month. App Run cost: ${invocationCost}. + + }> + + + ${apprunCost} + + + Period Cost + + + + + App runs in the selected period + + }> + + + {filteredStatistics.monthly_app_executions === null || filteredStatistics.monthly_app_executions === undefined ? 0 : filteredStatistics.monthly_app_executions} + + + App Runs + + + + + Workflow runs in the selected period + + }> + + + {filteredStatistics.monthly_workflow_executions === null || filteredStatistics.monthly_workflow_executions === undefined ? 0 : filteredStatistics.monthly_workflow_executions} + + + Workflow Runs + + + + + Estimated cost to be billed at the end of the current month. Subtracted contractually included app runs. Actual cost month to date: ${monthToDateCost}. App Run cost: ${invocationCost}. + + }> + + + ${monthTotalCost} + + + Estimated cost + + + +
+ : null} + + +
+ } + /> + } + /> +
+
+ +
{appRuns === undefined ? null @@ -267,6 +533,12 @@ const AppStats = (defaultprops) => { : } + + {/*appRunCosts === undefined ? + null + : + + */}
) diff --git a/frontend/src/components/RuntimeDebugger.jsx b/frontend/src/components/RuntimeDebugger.jsx index 5810cbab..570778df 100644 --- a/frontend/src/components/RuntimeDebugger.jsx +++ b/frontend/src/components/RuntimeDebugger.jsx @@ -830,6 +830,7 @@ const RuntimeDebugger = (props) => { ); }} /> + { onChange={handleEndTimeChange} renderInput={(params) => } /> - + + + + : null} ); @@ -2658,7 +2815,7 @@ If you're interested, please let me know a time that works for you, or set up a /> - Licensing + Billing & Stats /> )} - Cloud sync features + Features - If not otherwise specified, Usage will reset monthly + Features and Limitations that are currently available to you in your Cloud or Hybrid Organization. App Executions (App Runs) reset monthly. If the organization is a customer or in a trial, these features limitations are not always enforced. - + {selectedOrganization.sync_features === undefined || selectedOrganization.sync_features === null @@ -2872,15 +3029,15 @@ If you're interested, please let me know a time that works for you, or set up a key, index ) { - // unnecessary parts - if (key === "schedule" || key === "apps" || key === "updates") { + + if (key === "schedule" || key === "apps" || key === "updates" || key === "editing") { return null; } const item = selectedOrganization.sync_features[key]; - if (item === null) { - return null - } + if (item === null) { + return null + } const newkey = key.replaceAll("_", " "); const griditem = { diff --git a/frontend/src/views/AngularWorkflow.jsx b/frontend/src/views/AngularWorkflow.jsx index 579ca8d1..650c2e9d 100755 --- a/frontend/src/views/AngularWorkflow.jsx +++ b/frontend/src/views/AngularWorkflow.jsx @@ -1022,7 +1022,7 @@ const AngularWorkflow = (defaultprops) => { }) .then((responseJson) => { console.log("GOT A RESPONSE??") - getWorkflowExecutionCount(id); + // getWorkflowExecutionCount(id); if (responseJson !== undefined && responseJson !== null && responseJson.executions !== undefined && responseJson.executions !== null) { // - means it's opposite @@ -13758,6 +13758,40 @@ const AngularWorkflow = (defaultprops) => {
: null + const RightsideBar = () => { + const [hovered, setHovered] = useState(false) + + return ( +
setHovered(true)} + onMouseLeave={() => setHovered(false)} + onClick={() => { + setExecutionModalOpen(true); + getWorkflowExecution(props.match.params.key, ""); + }} + > + + + Explore runs + + {/* */} +
+ ) + } + const BottomCytoscapeBar = () => { if (workflow.id === undefined || workflow.id === null || (!workflow.public && apps.length === 0)) { return null; @@ -15069,7 +15103,7 @@ const AngularWorkflow = (defaultprops) => { >

- All Workflow Runs: { workflowExecutionCount } + All Workflow Runs

{ {showErrors} + }
diff --git a/frontend/src/views/AppCreator.jsx b/frontend/src/views/AppCreator.jsx index d2a74d71..33184cc0 100755 --- a/frontend/src/views/AppCreator.jsx +++ b/frontend/src/views/AppCreator.jsx @@ -20,6 +20,7 @@ import { TextField, Tooltip, Breadcrumbs, + Drawer, CircularProgress, Chip, IconButton, @@ -43,6 +44,7 @@ import { Loop as LoopIcon, AddPhotoAlternate as AddPhotoAlternateIcon, CallMerge as CallMergeIcon, + CloudDownload as CloudDownloadIcon, } from "@mui/icons-material"; import { v4 as uuidv4 } from "uuid"; @@ -448,6 +450,8 @@ const AppCreator = (defaultprops) => { const [openApiData, setOpenApiData] = React.useState(""); const [openApiModal, setOpenApiModal] = React.useState(false); + const [appDownloadData, setAppDownloadData] = React.useState(""); + useEffect(() => { console.log("In useEffect for openApiData: ", openApiData) }, [openApiData]); @@ -900,8 +904,9 @@ const AppCreator = (defaultprops) => { } if (newaction.url !== undefined && newaction.url !== null && newaction.url.includes("_shuffle_replace_")) { - const regex = /_shuffle_replace_\d/i; - //console.log("NEW: ", + //const regex = /_shuffle_replace_\d/i; + const regex = /_shuffle_replace_\d+/i + newaction.url = newaction.url.replaceAll(new RegExp(regex, 'g'), "") } @@ -1205,9 +1210,9 @@ const AppCreator = (defaultprops) => { ); } } - } catch (e) { - console.log("Param Error: ", e, path) - } + } catch (e) { + console.log("Param Error: ", e, path) + } } } } @@ -2569,6 +2574,8 @@ const AppCreator = (defaultprops) => { } } + setAppDownloadData(JSON.stringify(data, null, 4)) + fetch(globalUrl + "/api/v1/verify_openapi", { method: "POST", headers: { @@ -3687,48 +3694,76 @@ const AppCreator = (defaultprops) => { return errormessage; }; - + + const getBackgroundColor = (data) => { + var bgColor = "#61afee"; + if (data === "POST") { + bgColor = "#49cc90"; + } else if (data === "PUT") { + bgColor = "#fca130"; + } else if (data === "PATCH") { + bgColor = "#50e3c2"; + } else if (data === "DELETE") { + bgColor = "#f93e3e"; + } else if (data === "HEAD") { + bgColor = "#9012fe"; + } + + return bgColor; + } + const newActionModal = ( - { - setUrlPath(""); - setCurrentAction({ - name: "", - description: "", - url: "", - file_field: "", - headers: "", - paths: [], - queries: [], - body: "", - errors: [], - method: actionNonBodyRequest[0], - action_label: "No Label", - required_bodyfields: [], - }); - setCurrentActionMethod(apikeySelection[0]); - setUrlPathQueries([]); - setActionsModalOpen(false); - setFileUploadEnabled(false); + console.log("Closing modal"); + + // Old: This had some issue with arrays + //setUrlPath(""); + //setCurrentAction({ + // name: "", + // description: "", + // url: "", + // file_field: "", + // headers: "", + // paths: [], + // queries: [], + // body: "", + // errors: [], + // method: actionNonBodyRequest[0], + // action_label: "No Label", + // required_bodyfields: [], + //}); + //setCurrentActionMethod(apikeySelection[0]); + //setUrlPathQueries([]); + //setActionsModalOpen(false); + //setFileUploadEnabled(false); + + console.log(currentAction); + const errors = getActionErrors(); + addActionToView(errors); + setActionsModalOpen(false); + setUrlPathQueries([]); + setUrlPath(""); + setFileUploadEnabled(false); }} > - +
New action
- + { id: "method-option", }} > - {actionNonBodyRequest.map((data, index) => { + + // Add actionBodyRequest to actionNonBodyRequest + {actionNonBodyRequest.concat(actionBodyRequest).map((data, index) => { + const backgroundColor = getBackgroundColor(data); return ( - {data} + ); })} - {actionBodyRequest.map((data, index) => ( - - {data} - - ))}
URL path / Curl statement @@ -4222,19 +4264,11 @@ const AppCreator = (defaultprops) => { /> {exampleResponse} - - +
- + +
-
+ ); @@ -6103,20 +6145,68 @@ const AppCreator = (defaultprops) => { {testView} */} - - - {errorCode.length > 0 ? `Error: ${errorCode}` : null} - +
+ {appDownloadData.length > 0 ? + + { + toast(`Downloading OpenAPI JSON data for for ${name}`) + // Download as file + var blob = new Blob([appDownloadData], { + type: "application/octet-stream", + }); + + var url = URL.createObjectURL(blob); + var link = document.createElement("a"); + link.setAttribute("href", url); + link.setAttribute("download", `${name}.json`); + var event = document.createEvent("MouseEvents"); + event.initMouseEvent( + "click", + true, + true, + window, + 1, + 0, + 0, + 0, + 0, + false, + false, + false, + false, + 0, + null + ); + link.dispatchEvent(event); + }} + > + + + + : null} + + {appDownloadData.length > 0 ? +
+ : null} +
+ + + {errorCode.length > 0 ? `Upload Error: ${errorCode}` : null} + +
); diff --git a/frontend/src/views/Apps.jsx b/frontend/src/views/Apps.jsx index 0acface3..6234b535 100755 --- a/frontend/src/views/Apps.jsx +++ b/frontend/src/views/Apps.jsx @@ -921,6 +921,7 @@ const Apps = (props) => { : null + console.log("Sharing config: ", sharingConfiguration); const activateButton = selectedApp.generated && !selectedApp.activated ? (
@@ -943,6 +944,7 @@ const Apps = (props) => { onClick={() => { setDeleteModalOpen(true); }} + disabled={sharingConfiguration === undefined || sharingConfiguration === null || sharingConfiguration == "public"} > @@ -957,7 +959,7 @@ const Apps = (props) => { (selectedApp.downloaded !== undefined && selectedApp.downloaded == true) || !selectedApp.generated) && activateButton === null ? ( - + @@ -1240,48 +1243,50 @@ const Apps = (props) => { {isCloud && (selectedApp.sharing === true || selectedApp.public === true || creatorProfile.github_avatar !== undefined) && !internalIds.includes(selectedApp.name.toLowerCase()) ? - + activateApp(selectedApp.id, true) + }} + style={{ height: 35, marginTop: 0, marginLeft: 10, }} + > + Deactivate + + : null}
) : null} From fb9cab4ec05155d4c4f3dd90b78e552a7f675fb9 Mon Sep 17 00:00:00 2001 From: Frikky Date: Sun, 21 Jan 2024 23:57:39 +0100 Subject: [PATCH 22/42] Fixed further user input problems --- backend/go-app/go.mod | 34 +++--- backend/go-app/go.sum | 149 +++++++++++++++++++++++++ backend/go-app/main.go | 5 +- backend/go-app/walkoff.go | 4 +- frontend/src/views/Admin.jsx | 14 +-- frontend/src/views/AngularWorkflow.jsx | 11 +- frontend/src/views/LoginPage.jsx | 26 ++--- 7 files changed, 201 insertions(+), 42 deletions(-) diff --git a/backend/go-app/go.mod b/backend/go-app/go.mod index 056ab254..c201b9f6 100644 --- a/backend/go-app/go.mod +++ b/backend/go-app/go.mod @@ -13,13 +13,13 @@ require ( github.com/frikky/kin-openapi v0.42.0 github.com/fsouza/go-dockerclient v1.9.7 github.com/ghodss/yaml v1.0.0 - github.com/go-git/go-billy/v5 v5.4.1 - github.com/go-git/go-git/v5 v5.7.0 + github.com/go-git/go-billy/v5 v5.5.0 + github.com/go-git/go-git/v5 v5.11.0 github.com/gorilla/mux v1.8.0 github.com/h2non/filetype v1.1.3 github.com/satori/go.uuid v1.2.0 - github.com/shuffle/shuffle-shared v0.5.44 - golang.org/x/crypto v0.14.0 + github.com/shuffle/shuffle-shared v0.5.61 + golang.org/x/crypto v0.16.0 google.golang.org/api v0.125.0 google.golang.org/grpc v1.55.0 gopkg.in/src-d/go-git.v4 v4.13.1 @@ -34,10 +34,11 @@ require ( cloud.google.com/go/compute v1.19.3 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect cloud.google.com/go/iam v1.0.1 // indirect + dario.cat/mergo v1.0.0 // indirect github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect github.com/Masterminds/semver v1.5.0 // indirect - github.com/Microsoft/go-winio v0.6.0 // indirect - github.com/ProtonMail/go-crypto v0.0.0-20230518184743-7afd39499903 // indirect + github.com/Microsoft/go-winio v0.6.1 // indirect + github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371 // indirect github.com/acomagu/bufpipe v1.0.4 // indirect github.com/adrg/strutil v0.2.3 // indirect github.com/algolia/algoliasearch-client-go/v3 v3.18.1 // indirect @@ -46,19 +47,20 @@ require ( github.com/bradfitz/slice v0.0.0-20180809154707-2b758aa73013 // indirect github.com/cloudflare/circl v1.3.3 // indirect github.com/containerd/containerd v1.6.18 // indirect + github.com/cyphar/filepath-securejoin v0.2.4 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/docker/distribution v2.8.2+incompatible // indirect github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/emirpasic/gods v1.18.1 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect - github.com/go-logr/logr v1.2.2 // indirect + github.com/go-logr/logr v1.2.4 // indirect github.com/go-openapi/jsonpointer v0.19.5 // indirect github.com/go-openapi/swag v0.19.5 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.3 // indirect - github.com/google/go-cmp v0.5.9 // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/google/go-github/v28 v28.1.1 // indirect github.com/google/go-querystring v1.0.0 // indirect github.com/google/gofuzz v1.2.0 // indirect @@ -88,21 +90,21 @@ require ( github.com/pjbgf/sha1cd v0.3.0 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/sergi/go-diff v1.1.0 // indirect - github.com/sirupsen/logrus v1.8.1 // indirect - github.com/skeema/knownhosts v1.1.1 // indirect + github.com/sirupsen/logrus v1.9.0 // indirect + github.com/skeema/knownhosts v1.2.1 // indirect github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e // indirect github.com/src-d/gcfg v1.4.0 // indirect github.com/xanzy/ssh-agent v0.3.3 // indirect go.opencensus.io v0.24.0 // indirect go4.org v0.0.0-20201209231011-d4a079459e60 // indirect - golang.org/x/mod v0.8.0 // indirect - golang.org/x/net v0.17.0 // indirect + golang.org/x/mod v0.12.0 // indirect + golang.org/x/net v0.19.0 // indirect golang.org/x/oauth2 v0.8.0 // indirect - golang.org/x/sys v0.13.0 // indirect - golang.org/x/term v0.13.0 // indirect - golang.org/x/text v0.13.0 // indirect + golang.org/x/sys v0.15.0 // indirect + golang.org/x/term v0.15.0 // indirect + golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.3.0 // indirect - golang.org/x/tools v0.6.0 // indirect + golang.org/x/tools v0.13.0 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc // indirect diff --git a/backend/go-app/go.sum b/backend/go-app/go.sum index 0358ac5c..960dc1a0 100644 --- a/backend/go-app/go.sum +++ b/backend/go-app/go.sum @@ -47,6 +47,8 @@ cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9 cloud.google.com/go/storage v1.12.0/go.mod h1:fFLk2dp2oAhDz8QFKwqrjdJvxSp/W2g7nillojlL5Ho= cloud.google.com/go/storage v1.30.1 h1:uOdMxAs8HExqBlnLtnQyP0YkvbiDpdGShGKtx6U/oNM= cloud.google.com/go/storage v1.30.1/go.mod h1:NfxhC0UJE1aXSx7CIIbCf7y9HKT7BiccwkR7+P7gN8E= +dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= +dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/AdaLogics/go-fuzz-headers v0.0.0-20210715213245-6c3934b029d8 h1:V8krnnfGj4pV65YLUm3C0/8bl7V5Nry2Pwvy3ru/wLc= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= @@ -65,10 +67,14 @@ github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF0 github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= github.com/Microsoft/go-winio v0.6.0 h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2yDvg= github.com/Microsoft/go-winio v0.6.0/go.mod h1:cTAf44im0RAYeL23bpB+fzCyDH2MJiz2BO69KH/soAE= +github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/Microsoft/hcsshim v0.9.6 h1:VwnDOgLeoi2du6dAznfmspNqTiwczvjv4K7NxuY9jsY= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/ProtonMail/go-crypto v0.0.0-20230518184743-7afd39499903 h1:ZK3C5DtzV2nVAQTx5S5jQvMeDqWtD1By5mOoyY/xJek= github.com/ProtonMail/go-crypto v0.0.0-20230518184743-7afd39499903/go.mod h1:8TI4H3IbrackdNgv+92dI+rhpCaLqM0IfpgCgenFvRE= +github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371 h1:kkhsdkhsCvIsutKu5zLMgWtgh9YxGCNAw8Ad8hjwfYg= +github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/acomagu/bufpipe v1.0.4 h1:e3H4WUzM3npvo5uv95QuJM3cQspFNtFBzvJ2oNjKIDQ= @@ -81,6 +87,7 @@ github.com/algolia/algoliasearch-client-go/v3 v3.18.1 h1:FP2Xtqqs/sefR5Qluygp+jV github.com/algolia/algoliasearch-client-go/v3 v3.18.1/go.mod h1:i7tLoP7TYDmHX3Q7vkIOL4syVse/k5VJ+k0i8WqFiJk= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= +github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= @@ -108,6 +115,7 @@ github.com/bradfitz/gomemcache v0.0.0-20221031212613-62deef7fc822/go.mod h1:H0wQ github.com/bradfitz/slice v0.0.0-20180809154707-2b758aa73013 h1:/P9/RL0xgWE+ehnCUUN5h3RpG3dmoMCOONO1CCvq23Y= github.com/bradfitz/slice v0.0.0-20180809154707-2b758aa73013/go.mod h1:pccXHIvs3TV/TUqSNyEvF99sxjX2r4FFRIyw6TZY9+w= github.com/bwesterb/go-ristretto v1.2.0/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= +github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= github.com/carlescere/scheduler v0.0.0-20170109141437-ee74d2f83d82 h1:9bAydALqAjBfPHd/eAiJBHnMZUYov8m2PkXVr+YGQeI= github.com/carlescere/scheduler v0.0.0-20170109141437-ee74d2f83d82/go.mod h1:tyA14J0sA3Hph4dt+AfCjPrYR13+vVodshQSM7km9qw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -138,6 +146,8 @@ github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ3 github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw= github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= +github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= +github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= 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= @@ -153,6 +163,8 @@ github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDD github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/elazarl/goproxy v0.0.0-20221015165544-a0805db90819 h1:RIB4cRk+lBqKK3Oy0r2gRX4ui7tuhiZq2SuTtTCi0/0= +github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= +github.com/elazarl/goproxy/ext v0.0.0-20190711103511-473e67f1d7d2/go.mod h1:gNh8nYJoAm43RfaxurUnxr+N1PwuFV3ZMl/efxlIlY8= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= @@ -180,13 +192,19 @@ github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/gliderlabs/ssh v0.3.5 h1:OcaySEmAQJgyYcArR+gGGTHCyE7nvhEMTlYY+Dp8CpY= +github.com/gliderlabs/ssh v0.3.5/go.mod h1:8XB4KraRrX39qHhT6yxPsHedjA08I/uBVwj4xC+/+z4= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= github.com/go-git/go-billy/v5 v5.4.1 h1:Uwp5tDRkPr+l/TnbHOQzp+tmJfLceOlbVucgpTz8ix4= github.com/go-git/go-billy/v5 v5.4.1/go.mod h1:vjbugF6Fz7JIflbVpl1hJsGjSHNltrSw45YK/ukIvQg= +github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU= +github.com/go-git/go-billy/v5 v5.5.0/go.mod h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgFRpCtpDCKow= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20230305113008-0c11038e723f h1:Pz0DHeFij3XFhoBRGUDPzSJ+w2UcK5/0JvF8DRI58r8= +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.7.0 h1:t9AudWVLmqzlo+4bqdf7GY+46SUuRsx59SboFxkq2aE= github.com/go-git/go-git/v5 v5.7.0/go.mod h1:coJHKEOk5kUClpsNlXrUvPrDxY3w3gjHvhcZd8Fodw8= +github.com/go-git/go-git/v5 v5.11.0 h1:XIZc1p+8YzypNr34itUfSvYJcv+eYdTnTvOZ2vD3cA4= +github.com/go-git/go-git/v5 v5.11.0/go.mod h1:6GFcX2P3NM7FPBfpePbpLd21XxsgdAt+lKqXmCUiUCY= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -195,12 +213,17 @@ github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTg github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.2 h1:ahHml/yUpnlb96Rp8HCvtYVPY8ZYpxq3g7UYchIYwbs= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= +github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= @@ -253,6 +276,8 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-github/v28 v28.1.1 h1:kORf5ekX5qwXO2mGzXXOjMe/g6ap8ahVe0sBEulhSxo= github.com/google/go-github/v28 v28.1.1/go.mod h1:bsqJWQX05omyWVmc00nEUql9mhQyv38lDZ8kPZcQVoM= github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= @@ -276,9 +301,11 @@ github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200905233945-acf8798be1f7/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/s2a-go v0.1.4 h1:1kZ/sQM3srePvKs3tXAvQzo66XfcReoqFpIpIccE7Oc= github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= @@ -329,11 +356,13 @@ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORN github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= 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/libgit2/git2go/v34 v34.0.0/go.mod h1:blVco2jDAw6YTXkErMMqzHLcAjKkwF0aWIRHBqiJkZ0= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e h1:hB2xlXdHp/pmPZq0y3QnmWAArdw9PqbmotexnWx/FU8= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= @@ -341,6 +370,7 @@ github.com/matryer/is v1.2.0 h1:92UTHpy8CDwaJ08GqLDzhhuixiBUUD1p3AU6PHddz4A= github.com/matryer/is v1.2.0/go.mod h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlWXA= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mmcloughlin/avo v0.5.0/go.mod h1:ChHFdoV7ql95Wi7vuq2YT1bwCJqiWdZrQ1im3VujLYM= github.com/moby/patternmatcher v0.5.0 h1:YCZgJOeULcxLw1Q+sVR636pmS7sPEn1Qo2iAN6M7DBo= github.com/moby/patternmatcher v0.5.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= @@ -363,13 +393,44 @@ github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8m github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= +github.com/onsi/ginkgo/v2 v2.1.4/go.mod h1:um6tUpWM/cxCK3/FK8BXqEiUMUwRgSM4JXG47RKZmLU= +github.com/onsi/ginkgo/v2 v2.1.6/go.mod h1:MEH45j8TBi6u9BMogfbp0stKC5cdGjumZj5Y7AG4VIk= +github.com/onsi/ginkgo/v2 v2.3.0/go.mod h1:Eew0uilEqZmIEZr8JrvYlvOM7Rr6xzTmMV8AyFNU9d0= +github.com/onsi/ginkgo/v2 v2.4.0/go.mod h1:iHkDK1fKGcBoEHT5W7YBq4RFWaQulw+caOMkAt4OrFo= +github.com/onsi/ginkgo/v2 v2.5.0/go.mod h1:Luc4sArBICYCS8THh8v3i3i5CuSZO+RaQRaJoeNwomw= +github.com/onsi/ginkgo/v2 v2.7.0/go.mod h1:yjiuMwPokqY1XauOgju45q3sJt6VzQ/Fict1LFVcsAo= +github.com/onsi/ginkgo/v2 v2.8.1/go.mod h1:N1/NbDngAFcSLdyZ+/aYTYGSlq9qMCS/cNKGJjy+csc= +github.com/onsi/ginkgo/v2 v2.9.0/go.mod h1:4xkjoL/tZv4SMWeww56BU5kAt19mVB47gTWxmrTcxyk= +github.com/onsi/ginkgo/v2 v2.9.1/go.mod h1:FEcmzVcCHl+4o9bQZVab+4dC9+j+91t2FHSzmGAPfuo= +github.com/onsi/ginkgo/v2 v2.9.2/go.mod h1:WHcJJG2dIlcCqVfBAwUCrJxSPFb6v4azBwgxeMeDuts= +github.com/onsi/ginkgo/v2 v2.9.5/go.mod h1:tvAoo1QUJwNEU2ITftXTpR7R1RbCzoZUOs3RonqW57k= +github.com/onsi/ginkgo/v2 v2.9.7/go.mod h1:cxrmXWykAwTwhQsJOPfdIDiJ+l2RYq7U8hFU+M/1uw0= +github.com/onsi/ginkgo/v2 v2.11.0/go.mod h1:ZhrRA5XmEE3x3rhlzamx/JJvujdZoJ2uvgI7kR0iZvM= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= +github.com/onsi/gomega v1.20.1/go.mod h1:DtrZpjmvpn2mPm4YWQa0/ALMDj9v4YxLgojwPeREyVo= +github.com/onsi/gomega v1.21.1/go.mod h1:iYAIXgPSaDHak0LCMA+AWBpIKBr8WZicMxnE8luStNc= +github.com/onsi/gomega v1.22.1/go.mod h1:x6n7VNe4hw0vkyYUM4mjIXx3JbLiPaBPNgB7PRQ1tuM= +github.com/onsi/gomega v1.24.0/go.mod h1:Z/NWtiqwBrwUt4/2loMmHL63EDLnYHmVbuBpDr2vQAg= +github.com/onsi/gomega v1.24.1/go.mod h1:3AOiACssS3/MajrniINInwbfOOtfZvplPzuRSmvt1jM= +github.com/onsi/gomega v1.26.0/go.mod h1:r+zV744Re+DiYCIPRlYOTxn0YkOLcAnW8k1xXdMPGhM= +github.com/onsi/gomega v1.27.1/go.mod h1:aHX5xOykVYzWOV4WqQy0sy8BQptgukenXpCXfadcIAw= +github.com/onsi/gomega v1.27.3/go.mod h1:5vG284IBtfDAmDyrK+eGyZmUgUlmi+Wngqo557cZ6Gw= +github.com/onsi/gomega v1.27.4/go.mod h1:riYq/GJKh8hhoM01HN6Vmuy93AarCXCBGpvFDK3q3fQ= +github.com/onsi/gomega v1.27.6/go.mod h1:PIQNjfQwkP3aQAH7lf7j87O/5FiNr+ZR8+ipb+qQlhg= +github.com/onsi/gomega v1.27.7/go.mod h1:1p8OOlwo2iUUDsHnOrjE5UKYJ+e3W8eQ3qSlRahPmr4= +github.com/onsi/gomega v1.27.8/go.mod h1:2J8vzI/s+2shY9XHRApDkdgPo1TKT7P2u6fXeJKFnNQ= +github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799 h1:rc3tiVYb5z54aKaDfakKn0dDjIyPpTtszkjuMzyt7ec= @@ -388,6 +449,7 @@ github.com/pelletier/go-buffruneio v0.2.0/go.mod h1:JkE26KsDizTr40EUHkXVtNPvgGtb github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4= github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -395,7 +457,10 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-charset v0.0.0-20180617210344-2471d30d28b4/go.mod h1:qgYeAmZ5ZIpBWTGllZSQnw97Dj+woV0toclVaRGI8pc= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd/go.mod h1:hPqNNc0+uJM6H+SuU8sEs5K5IQeKccPqeSjfgcKGgPk= github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= @@ -428,12 +493,20 @@ github.com/shuffle/shuffle-shared v0.5.31 h1:OV4IIfKWWFW66WjGvyXOmmsSz3p8pW9L1ge github.com/shuffle/shuffle-shared v0.5.31/go.mod h1:X613gbo0dT3fnYvXDRwjQZyLC+T49T2nSQOrCV5QMlI= github.com/shuffle/shuffle-shared v0.5.44 h1:6WiFPIsij+IWvXY7vzVX7cUicb+PYOzhTbWF/gDmYeU= github.com/shuffle/shuffle-shared v0.5.44/go.mod h1:X613gbo0dT3fnYvXDRwjQZyLC+T49T2nSQOrCV5QMlI= +github.com/shuffle/shuffle-shared v0.5.60 h1:R0BWYp/DlgyNPU0xVNSPhsWBnJ+LeVD3iLoDRZmtKMo= +github.com/shuffle/shuffle-shared v0.5.60/go.mod h1:oIZkx93Z7EvtiTXty7xO+ax63Fjz8MQvjXMxDN0Qws0= +github.com/shuffle/shuffle-shared v0.5.61 h1:Fkd7pvk8ypwaio1VvMOmJ6PQF9xCfNYx8RWjPnXjn5E= +github.com/shuffle/shuffle-shared v0.5.61/go.mod h1:oIZkx93Z7EvtiTXty7xO+ax63Fjz8MQvjXMxDN0Qws0= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= +github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/skeema/knownhosts v1.1.1 h1:MTk78x9FPgDFVFkDLTrsnnfCJl7g1C/nnKvePgrIngE= github.com/skeema/knownhosts v1.1.1/go.mod h1:g4fPeYpque7P0xefxtGzV81ihjC8sX2IqpAoNkjxbMo= +github.com/skeema/knownhosts v1.2.1 h1:SHWdIUa82uGZz+F+47k8SY4QhhI291cXCpopT1lK2AQ= +github.com/skeema/knownhosts v1.2.1/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo= github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e h1:MRM5ITcdelLK2j1vwZ3Je0FKVCfqOLp5zO6trqMLYs0= github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e/go.mod h1:XV66xRDqSt+GTGFMVlhk3ULuV0y9ZmzeVGR4mloJI3M= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= @@ -452,12 +525,14 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +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.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= @@ -469,6 +544,7 @@ github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= @@ -481,6 +557,7 @@ go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go4.org v0.0.0-20201209231011-d4a079459e60 h1:iqAGo78tVOJXELHQFRjR6TMwItrvXH4hrGJ32I/NFF8= go4.org v0.0.0-20201209231011-d4a079459e60/go.mod h1:CIiUVy99QCPfoE13bO4EZaz5GZMZXMSBGhxRdsvzbkg= +golang.org/x/arch v0.1.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -489,14 +566,21 @@ golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220826181053-bd7e27e6170d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= +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.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY= +golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -530,9 +614,16 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= +golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -568,16 +659,29 @@ golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220826154423-83b083e8dc8b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= +golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= +golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= +golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.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.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= +golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -598,9 +702,12 @@ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.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.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI= +golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -640,32 +747,57 @@ golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/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-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/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-20220422013727-9388b58f7150/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-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220825204002-c680a09ffe64/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +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.4.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.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.0.0-20220722155259-a9ba230a4035/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= +golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= +golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= 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.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= +golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= +golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= +golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -676,10 +808,16 @@ 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.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.6.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.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +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/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -735,12 +873,21 @@ golang.org/x/tools v0.0.0-20200915173823-2db8f0ff891c/go.mod h1:z6u4i615ZeAfBE4X golang.org/x/tools v0.0.0-20200918232735-d647fc253266/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210114065538-d78b04bdf963/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= +golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= +golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= +golang.org/x/tools v0.9.3/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= +golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -857,6 +1004,7 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -916,6 +1064,7 @@ k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a/go.mod h1:jPW/WVKK9YHAvNhRxK0md/ k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b h1:wxEMGetGMur3J1xuGLQY7GEQYg9bZxKn3tKo5k/eYcs= k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= diff --git a/backend/go-app/main.go b/backend/go-app/main.go index 249c9d78..c9441aaa 100755 --- a/backend/go-app/main.go +++ b/backend/go-app/main.go @@ -22,7 +22,6 @@ import ( "net/url" "os" "os/exec" - "path/filepath" "net/http/httptest" "strings" @@ -32,7 +31,7 @@ import ( "github.com/frikky/kin-openapi/openapi2conv" "github.com/frikky/kin-openapi/openapi3" - "github.com/go-git/go-billy/v5" + //"github.com/go-git/go-billy/v5" "github.com/go-git/go-billy/v5/memfs" "github.com/go-git/go-git/v5" "github.com/go-git/go-git/v5/plumbing" @@ -3055,7 +3054,7 @@ func verifySwagger(resp http.ResponseWriter, request *http.Request) { func handleAppHotload(ctx context.Context, location string, forceUpdate bool) error { basepath := "base" - fs, err := createFs(basepath, location) + fs, err := shuffle.CreateFs(basepath, location) if err != nil { log.Printf("Failed memfs creation - probably bad path: %s", err) return errors.New(fmt.Sprintf("Failed to find directory %s", location)) diff --git a/backend/go-app/walkoff.go b/backend/go-app/walkoff.go index 68c2c107..0bcada9c 100755 --- a/backend/go-app/walkoff.go +++ b/backend/go-app/walkoff.go @@ -1067,7 +1067,7 @@ func handleExecution(id string, workflow shuffle.Workflow, request *http.Request // Special for user input callbacks return workflowExecution, fmt.Sprintf("%s", err), nil } else { - log.Printf("[ERROR] Failed in prepareExecution: %s", err) + log.Printf("[ERROR] Failed in prepareExecution: '%s'", err) return shuffle.WorkflowExecution{}, fmt.Sprintf("Failed starting workflow: %s", err), err } } @@ -1892,7 +1892,7 @@ func executeWorkflow(resp http.ResponseWriter, request *http.Request) { } } - log.Printf("[AUDIT] Starting execution of workflow '%s' by user %s (%s)!", fileId, user.Username, user.Id) + log.Printf("[AUDIT] Starting execution of workflow '%s' by user '%s' (%s). If this is empty, it's most likely a subflow!", fileId, user.Username, user.Id) user.ActiveOrg.Users = []shuffle.UserMini{} workflow.ExecutingOrg = user.ActiveOrg diff --git a/frontend/src/views/Admin.jsx b/frontend/src/views/Admin.jsx index 8dc219fb..be7711af 100755 --- a/frontend/src/views/Admin.jsx +++ b/frontend/src/views/Admin.jsx @@ -4221,7 +4221,7 @@ If you're interested, please let me know a time that works for you, or set up a /> setDefaultEnvironment(environment)} color="primary" > diff --git a/frontend/src/views/AngularWorkflow.jsx b/frontend/src/views/AngularWorkflow.jsx index 650c2e9d..0a2220cc 100755 --- a/frontend/src/views/AngularWorkflow.jsx +++ b/frontend/src/views/AngularWorkflow.jsx @@ -10634,7 +10634,6 @@ const AngularWorkflow = (defaultprops) => { }; const handleWorkflowSelectionUpdate = (e, isUserinput) => { - setUpdate(Math.random()); if (e.target.value === undefined || e.target.value === null || e.target.value.id === undefined) { console.log("Returning as there's no id. Value: ", e.target.value); @@ -10642,6 +10641,16 @@ const AngularWorkflow = (defaultprops) => { } const paramIndex = isUserinput === true ? 5 : 0 + + console.log("USERINPUT: ", paramIndex, workflow.triggers[selectedTriggerIndex]) + if (workflow.triggers[selectedTriggerIndex].parameters[paramIndex] === undefined || workflow.triggers[selectedTriggerIndex].parameters[paramIndex] === null) { + workflow.triggers[selectedTriggerIndex].parameters[paramIndex] = { + "name": "subflow", + "value": "", + } + } + + setUpdate(Math.random()); workflow.triggers[selectedTriggerIndex].parameters[paramIndex].value = e.target.value.id; setSubworkflow(e.target.value); diff --git a/frontend/src/views/LoginPage.jsx b/frontend/src/views/LoginPage.jsx index 5958b2fc..33e9953b 100755 --- a/frontend/src/views/LoginPage.jsx +++ b/frontend/src/views/LoginPage.jsx @@ -181,20 +181,20 @@ const LoginDialog = (props) => { ); } - if (responseJson.tutorials === undefined || responseJson.tutorials === null || !responseJson.tutorials.includes("welcome")) { - console.log("RUN Welcome!!") - window.location.pathname = "/welcome" - return - } + if (responseJson.tutorials === undefined || responseJson.tutorials === null || !responseJson.tutorials.includes("welcome")) { + console.log("RUN Welcome!!") + window.location.pathname = "/welcome" + return + } - const tmpView = new URLSearchParams(window.location.search).get("view") - if (tmpView !== undefined && tmpView !== null) { - //const newUrl = `/${tmpView}${decodeURIComponent(window.location.search)}` - const newUrl = `/${tmpView}` - window.location.pathname = newUrl - } else { - window.location.pathname = "/workflows" - } + const tmpView = new URLSearchParams(window.location.search).get("view") + if (tmpView !== undefined && tmpView !== null) { + //const newUrl = `/${tmpView}${decodeURIComponent(window.location.search)}` + const newUrl = `/${tmpView}` + window.location.pathname = newUrl + } else { + window.location.pathname = "/workflows" + } setIsLoggedIn(true); } From 19135a055119fb8a9fb1e810a13dbff0e52babb7 Mon Sep 17 00:00:00 2001 From: Frikky Date: Sun, 21 Jan 2024 23:58:30 +0100 Subject: [PATCH 23/42] User Input worker fix --- functions/onprem/worker/go.mod | 42 +++-- functions/onprem/worker/go.sum | 301 +++++++++++++++++++++++------- functions/onprem/worker/worker.go | 4 +- 3 files changed, 268 insertions(+), 79 deletions(-) diff --git a/functions/onprem/worker/go.mod b/functions/onprem/worker/go.mod index 7c8e8045..20a427a1 100644 --- a/functions/onprem/worker/go.mod +++ b/functions/onprem/worker/go.mod @@ -5,13 +5,10 @@ go 1.19 //replace github.com/shuffle/shuffle-shared => ../../../../shuffle-shared require ( - cloud.google.com/go/datastore v1.10.0 - cloud.google.com/go/storage v1.29.0 github.com/docker/docker v23.0.3+incompatible github.com/gorilla/mux v1.8.0 - github.com/patrickmn/go-cache v2.1.0+incompatible github.com/satori/go.uuid v1.2.0 - github.com/shuffle/shuffle-shared v0.5.57 + github.com/shuffle/shuffle-shared v0.5.61 k8s.io/api v0.28.3 k8s.io/apimachinery v0.28.3 k8s.io/client-go v0.28.3 @@ -21,21 +18,30 @@ require ( cloud.google.com/go v0.107.0 // indirect cloud.google.com/go/compute v1.14.0 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect + cloud.google.com/go/datastore v1.10.0 // indirect cloud.google.com/go/iam v0.8.0 // indirect + cloud.google.com/go/storage v1.29.0 // indirect + dario.cat/mergo v1.0.0 // indirect github.com/Masterminds/semver v1.5.0 // indirect - github.com/Microsoft/go-winio v0.6.0 // indirect + github.com/Microsoft/go-winio v0.6.1 // indirect + github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371 // indirect github.com/adrg/strutil v0.2.3 // indirect github.com/algolia/algoliasearch-client-go/v3 v3.18.1 // indirect github.com/bradfitz/gomemcache v0.0.0-20221031212613-62deef7fc822 // indirect github.com/bradfitz/slice v0.0.0-20180809154707-2b758aa73013 // indirect + github.com/cloudflare/circl v1.3.3 // indirect + github.com/cyphar/filepath-securejoin v0.2.4 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/docker/distribution v2.8.2+incompatible // indirect github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/emicklei/go-restful/v3 v3.9.0 // indirect - github.com/frikky/go-elasticsearch/v8 v8.13.1 // indirect + github.com/emirpasic/gods v1.18.1 // indirect github.com/frikky/kin-openapi v0.41.0 // indirect github.com/ghodss/yaml v1.0.0 // indirect + github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect + github.com/go-git/go-billy/v5 v5.5.0 // indirect + github.com/go-git/go-git/v5 v5.11.0 // indirect github.com/go-logr/logr v1.2.4 // indirect github.com/go-openapi/jsonpointer v0.19.6 // indirect github.com/go-openapi/jsonreference v0.20.2 // indirect @@ -44,7 +50,7 @@ require ( github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/google/gnostic-models v0.6.8 // indirect - github.com/google/go-cmp v0.5.9 // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/google/go-github/v28 v28.1.1 // indirect github.com/google/go-querystring v1.0.0 // indirect github.com/google/gofuzz v1.2.0 // indirect @@ -52,8 +58,10 @@ require ( github.com/googleapis/enterprise-certificate-proxy v0.2.1 // indirect github.com/googleapis/gax-go/v2 v2.7.0 // indirect github.com/imdario/mergo v0.3.6 // indirect + github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect + github.com/kevinburke/ssh_config v1.2.0 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/moby/term v0.0.0-20221205130635-1aeaba878587 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect @@ -64,20 +72,25 @@ require ( github.com/opencontainers/image-spec v1.0.2 // indirect github.com/opensearch-project/opensearch-go v1.1.0 // indirect github.com/opensearch-project/opensearch-go/v2 v2.3.0 // indirect + github.com/patrickmn/go-cache v2.1.0+incompatible // indirect + github.com/pjbgf/sha1cd v0.3.0 // indirect github.com/pkg/errors v0.9.1 // indirect + github.com/sergi/go-diff v1.1.0 // indirect + github.com/skeema/knownhosts v1.2.1 // indirect github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e // indirect github.com/spf13/pflag v1.0.5 // indirect + github.com/xanzy/ssh-agent v0.3.3 // indirect go.opencensus.io v0.24.0 // indirect go4.org v0.0.0-20201209231011-d4a079459e60 // indirect - golang.org/x/crypto v0.14.0 // indirect - golang.org/x/mod v0.10.0 // indirect - golang.org/x/net v0.17.0 // indirect + golang.org/x/crypto v0.16.0 // indirect + golang.org/x/mod v0.12.0 // indirect + golang.org/x/net v0.19.0 // indirect golang.org/x/oauth2 v0.8.0 // indirect - golang.org/x/sys v0.13.0 // indirect - golang.org/x/term v0.13.0 // indirect - golang.org/x/text v0.13.0 // indirect + golang.org/x/sys v0.15.0 // indirect + golang.org/x/term v0.15.0 // indirect + golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.3.0 // indirect - golang.org/x/tools v0.8.0 // indirect + golang.org/x/tools v0.13.0 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect google.golang.org/api v0.106.0 // indirect google.golang.org/appengine v1.6.7 // indirect @@ -85,6 +98,7 @@ require ( google.golang.org/grpc v1.51.0 // indirect google.golang.org/protobuf v1.30.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect + gopkg.in/warnings.v0 v0.1.2 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect gotest.tools/v3 v3.4.0 // indirect diff --git a/functions/onprem/worker/go.sum b/functions/onprem/worker/go.sum index 64484995..d8b5d719 100644 --- a/functions/onprem/worker/go.sum +++ b/functions/onprem/worker/go.sum @@ -48,18 +48,29 @@ cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9 cloud.google.com/go/storage v1.12.0/go.mod h1:fFLk2dp2oAhDz8QFKwqrjdJvxSp/W2g7nillojlL5Ho= cloud.google.com/go/storage v1.29.0 h1:6weCgzRvMg7lzuUurI4697AqIRPU1SvzHhynwpW31jI= cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= +dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= +dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Microsoft/go-winio v0.6.0 h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2yDvg= -github.com/Microsoft/go-winio v0.6.0/go.mod h1:cTAf44im0RAYeL23bpB+fzCyDH2MJiz2BO69KH/soAE= +github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= +github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= +github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371 h1:kkhsdkhsCvIsutKu5zLMgWtgh9YxGCNAw8Ad8hjwfYg= +github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= github.com/adrg/strutil v0.2.3 h1:WZVn3ItPBovFmP4wMHHVXUr8luRaHrbyIuLlHt32GZQ= github.com/adrg/strutil v0.2.3/go.mod h1:+SNxbiH6t+O+5SZqIj5n/9i5yUjR+S3XXVrjEcN2mxg= +github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs= github.com/algolia/algoliasearch-client-go/v3 v3.18.1 h1:FP2Xtqqs/sefR5Qluygp+jVV+juXzEdJaPrZTCDLhDQ= github.com/algolia/algoliasearch-client-go/v3 v3.18.1/go.mod h1:i7tLoP7TYDmHX3Q7vkIOL4syVse/k5VJ+k0i8WqFiJk= +github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= +github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= +github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/aws/aws-sdk-go v1.42.27/go.mod h1:OGr6lGMAKGlG9CVrYnWYDKIyb829c6EVBRjxqjmPepc= github.com/aws/aws-sdk-go v1.44.263/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= github.com/aws/aws-sdk-go-v2 v1.18.0/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= @@ -78,17 +89,20 @@ github.com/bradfitz/gomemcache v0.0.0-20221031212613-62deef7fc822 h1:hjXJeBcAMS1 github.com/bradfitz/gomemcache v0.0.0-20221031212613-62deef7fc822/go.mod h1:H0wQNHz2YrLsuXOZozoeDmnHXkNCRmMW0gwFWDfEZDA= github.com/bradfitz/slice v0.0.0-20180809154707-2b758aa73013 h1:/P9/RL0xgWE+ehnCUUN5h3RpG3dmoMCOONO1CCvq23Y= github.com/bradfitz/slice v0.0.0-20180809154707-2b758aa73013/go.mod h1:pccXHIvs3TV/TUqSNyEvF99sxjX2r4FFRIyw6TZY9+w= +github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cloudflare/circl v1.3.3 h1:fE/Qz0QdIGqeWfnwq0RE0R7MI51s0M2E4Ga9kq5AEMs= +github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= +github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= 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= @@ -100,42 +114,61 @@ github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKoh github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a h1:mATvB/9r/3gvcejNsXKSkQ6lcIaNec2nyfOdlTBR2lU= +github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= +github.com/elazarl/goproxy/ext v0.0.0-20190711103511-473e67f1d7d2/go.mod h1:gNh8nYJoAm43RfaxurUnxr+N1PwuFV3ZMl/efxlIlY8= github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE= github.com/emicklei/go-restful/v3 v3.9.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= +github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= +github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= 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/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/frikky/go-elasticsearch/v8 v8.13.1 h1:GB+Wr0Yx8efG7D1jc9fGGiqjjRRngWJTcMSua3QIDaM= -github.com/frikky/go-elasticsearch/v8 v8.13.1/go.mod h1:RPq0JXPQVVSFHTlPwj/go8BZ1hegRf+StaSpT2iGIoQ= +github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/frikky/kin-openapi v0.41.0 h1:oMmjo+ekGS971lb3KLeZZOqRDZOwWi3+g/OiSWP08+s= github.com/frikky/kin-openapi v0.41.0/go.mod h1:ev9OZAw7Bv5p0w93j91++6a1ElPzGcCofst+kmrWsj4= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= +github.com/gliderlabs/ssh v0.3.5 h1:OcaySEmAQJgyYcArR+gGGTHCyE7nvhEMTlYY+Dp8CpY= +github.com/gliderlabs/ssh v0.3.5/go.mod h1:8XB4KraRrX39qHhT6yxPsHedjA08I/uBVwj4xC+/+z4= +github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= +github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= +github.com/go-git/go-billy/v5 v5.4.1/go.mod h1:vjbugF6Fz7JIflbVpl1hJsGjSHNltrSw45YK/ukIvQg= +github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU= +github.com/go-git/go-billy/v5 v5.5.0/go.mod h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgFRpCtpDCKow= +github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4= +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.11.0 h1:XIZc1p+8YzypNr34itUfSvYJcv+eYdTnTvOZ2vD3cA4= +github.com/go-git/go-git/v5 v5.11.0/go.mod h1:6GFcX2P3NM7FPBfpePbpLd21XxsgdAt+lKqXmCUiUCY= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= -github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -161,7 +194,6 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= @@ -181,8 +213,9 @@ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-github/v28 v28.1.1 h1:kORf5ekX5qwXO2mGzXXOjMe/g6ap8ahVe0sBEulhSxo= github.com/google/go-github/v28 v28.1.1/go.mod h1:bsqJWQX05omyWVmc00nEUql9mhQyv38lDZ8kPZcQVoM= github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= @@ -195,7 +228,6 @@ github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXi github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.2.1 h1:d8MncMlErDFTwQGBK1xhv026j9kqhvw1Qv9IbWT1VLQ= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= @@ -206,8 +238,10 @@ github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200905233945-acf8798be1f7/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -221,10 +255,14 @@ github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.6 h1:xTNEAn+kxVO7dTZGu0CegyqKZmoWFI0rF8UxjlB2d28= github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= @@ -233,21 +271,27 @@ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnr github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= +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/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= +github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= 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/libgit2/git2go/v34 v34.0.0/go.mod h1:blVco2jDAw6YTXkErMMqzHLcAjKkwF0aWIRHBqiJkZ0= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e h1:hB2xlXdHp/pmPZq0y3QnmWAArdw9PqbmotexnWx/FU8= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mmcloughlin/avo v0.5.0/go.mod h1:ChHFdoV7ql95Wi7vuq2YT1bwCJqiWdZrQ1im3VujLYM= github.com/moby/term v0.0.0-20221205130635-1aeaba878587 h1:HfkjXDfhgVaN5rmueG8cL8KKeFNecRCXFhaJ2qZ5SKA= github.com/moby/term v0.0.0-20221205130635-1aeaba878587/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -259,6 +303,46 @@ github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= +github.com/onsi/ginkgo/v2 v2.1.4/go.mod h1:um6tUpWM/cxCK3/FK8BXqEiUMUwRgSM4JXG47RKZmLU= +github.com/onsi/ginkgo/v2 v2.1.6/go.mod h1:MEH45j8TBi6u9BMogfbp0stKC5cdGjumZj5Y7AG4VIk= +github.com/onsi/ginkgo/v2 v2.3.0/go.mod h1:Eew0uilEqZmIEZr8JrvYlvOM7Rr6xzTmMV8AyFNU9d0= +github.com/onsi/ginkgo/v2 v2.4.0/go.mod h1:iHkDK1fKGcBoEHT5W7YBq4RFWaQulw+caOMkAt4OrFo= +github.com/onsi/ginkgo/v2 v2.5.0/go.mod h1:Luc4sArBICYCS8THh8v3i3i5CuSZO+RaQRaJoeNwomw= +github.com/onsi/ginkgo/v2 v2.7.0/go.mod h1:yjiuMwPokqY1XauOgju45q3sJt6VzQ/Fict1LFVcsAo= +github.com/onsi/ginkgo/v2 v2.8.1/go.mod h1:N1/NbDngAFcSLdyZ+/aYTYGSlq9qMCS/cNKGJjy+csc= +github.com/onsi/ginkgo/v2 v2.9.0/go.mod h1:4xkjoL/tZv4SMWeww56BU5kAt19mVB47gTWxmrTcxyk= +github.com/onsi/ginkgo/v2 v2.9.1/go.mod h1:FEcmzVcCHl+4o9bQZVab+4dC9+j+91t2FHSzmGAPfuo= +github.com/onsi/ginkgo/v2 v2.9.2/go.mod h1:WHcJJG2dIlcCqVfBAwUCrJxSPFb6v4azBwgxeMeDuts= +github.com/onsi/ginkgo/v2 v2.9.5/go.mod h1:tvAoo1QUJwNEU2ITftXTpR7R1RbCzoZUOs3RonqW57k= +github.com/onsi/ginkgo/v2 v2.9.7/go.mod h1:cxrmXWykAwTwhQsJOPfdIDiJ+l2RYq7U8hFU+M/1uw0= +github.com/onsi/ginkgo/v2 v2.11.0 h1:WgqUCUt/lT6yXoQ8Wef0fsNn5cAuMK7+KT9UFRz2tcU= +github.com/onsi/ginkgo/v2 v2.11.0/go.mod h1:ZhrRA5XmEE3x3rhlzamx/JJvujdZoJ2uvgI7kR0iZvM= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= +github.com/onsi/gomega v1.20.1/go.mod h1:DtrZpjmvpn2mPm4YWQa0/ALMDj9v4YxLgojwPeREyVo= +github.com/onsi/gomega v1.21.1/go.mod h1:iYAIXgPSaDHak0LCMA+AWBpIKBr8WZicMxnE8luStNc= +github.com/onsi/gomega v1.22.1/go.mod h1:x6n7VNe4hw0vkyYUM4mjIXx3JbLiPaBPNgB7PRQ1tuM= +github.com/onsi/gomega v1.24.0/go.mod h1:Z/NWtiqwBrwUt4/2loMmHL63EDLnYHmVbuBpDr2vQAg= +github.com/onsi/gomega v1.24.1/go.mod h1:3AOiACssS3/MajrniINInwbfOOtfZvplPzuRSmvt1jM= +github.com/onsi/gomega v1.26.0/go.mod h1:r+zV744Re+DiYCIPRlYOTxn0YkOLcAnW8k1xXdMPGhM= +github.com/onsi/gomega v1.27.1/go.mod h1:aHX5xOykVYzWOV4WqQy0sy8BQptgukenXpCXfadcIAw= +github.com/onsi/gomega v1.27.3/go.mod h1:5vG284IBtfDAmDyrK+eGyZmUgUlmi+Wngqo557cZ6Gw= +github.com/onsi/gomega v1.27.4/go.mod h1:riYq/GJKh8hhoM01HN6Vmuy93AarCXCBGpvFDK3q3fQ= +github.com/onsi/gomega v1.27.6/go.mod h1:PIQNjfQwkP3aQAH7lf7j87O/5FiNr+ZR8+ipb+qQlhg= +github.com/onsi/gomega v1.27.7/go.mod h1:1p8OOlwo2iUUDsHnOrjE5UKYJ+e3W8eQ3qSlRahPmr4= +github.com/onsi/gomega v1.27.8/go.mod h1:2J8vzI/s+2shY9XHRApDkdgPo1TKT7P2u6fXeJKFnNQ= +github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= +github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM= @@ -269,49 +353,62 @@ github.com/opensearch-project/opensearch-go/v2 v2.3.0 h1:nQIEMr+A92CkhHrZgUhcfsr github.com/opensearch-project/opensearch-go/v2 v2.3.0/go.mod h1:8LDr9FCgUTVoT+5ESjc2+iaZuldqE+23Iq0r1XeNue8= github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= +github.com/pelletier/go-buffruneio v0.2.0/go.mod h1:JkE26KsDizTr40EUHkXVtNPvgGtbSNq5BcowyYOWdKo= +github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4= +github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 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/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/rogpeppe/go-charset v0.0.0-20180617210344-2471d30d28b4/go.mod h1:qgYeAmZ5ZIpBWTGllZSQnw97Dj+woV0toclVaRGI8pc= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= +github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd/go.mod h1:hPqNNc0+uJM6H+SuU8sEs5K5IQeKccPqeSjfgcKGgPk= github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/shuffle/shuffle-shared v0.4.17 h1:56ll366bdmIJu/7GFqNC2XTjjl0SGBf430PSq+EB6Ro= -github.com/shuffle/shuffle-shared v0.4.17/go.mod h1:jQrYySmvp/0De5ftrAaY6xwwr7TMfqBmBxQ2AX9yrjQ= -github.com/shuffle/shuffle-shared v0.4.50 h1:fJLfhWIJ5mYap4JwHnD/B5aaLyIULwylFSl3FoWlajM= -github.com/shuffle/shuffle-shared v0.4.50/go.mod h1:X613gbo0dT3fnYvXDRwjQZyLC+T49T2nSQOrCV5QMlI= -github.com/shuffle/shuffle-shared v0.4.57 h1:o+mMPRY4ourkE3R0qdi80jg6RlCtvAJ/VVrPk4y75Hk= -github.com/shuffle/shuffle-shared v0.4.57/go.mod h1:X613gbo0dT3fnYvXDRwjQZyLC+T49T2nSQOrCV5QMlI= -github.com/shuffle/shuffle-shared v0.5.29 h1:n4vThl7v3mFVXbrIW71XREFdmZZo7mOBAWxnsdiNjDk= -github.com/shuffle/shuffle-shared v0.5.29/go.mod h1:X613gbo0dT3fnYvXDRwjQZyLC+T49T2nSQOrCV5QMlI= -github.com/shuffle/shuffle-shared v0.5.31 h1:OV4IIfKWWFW66WjGvyXOmmsSz3p8pW9L1ge1mDo8ftM= -github.com/shuffle/shuffle-shared v0.5.31/go.mod h1:X613gbo0dT3fnYvXDRwjQZyLC+T49T2nSQOrCV5QMlI= -github.com/shuffle/shuffle-shared v0.5.44 h1:6WiFPIsij+IWvXY7vzVX7cUicb+PYOzhTbWF/gDmYeU= -github.com/shuffle/shuffle-shared v0.5.44/go.mod h1:X613gbo0dT3fnYvXDRwjQZyLC+T49T2nSQOrCV5QMlI= -github.com/shuffle/shuffle-shared v0.5.53 h1:Osr5sjr0wppqlf/MjH1oykdcw/Q48d8+ZnerRrYfOA4= -github.com/shuffle/shuffle-shared v0.5.53/go.mod h1:X613gbo0dT3fnYvXDRwjQZyLC+T49T2nSQOrCV5QMlI= +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= +github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/shuffle/shuffle-shared v0.5.61 h1:Fkd7pvk8ypwaio1VvMOmJ6PQF9xCfNYx8RWjPnXjn5E= +github.com/shuffle/shuffle-shared v0.5.61/go.mod h1:oIZkx93Z7EvtiTXty7xO+ax63Fjz8MQvjXMxDN0Qws0= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/skeema/knownhosts v1.2.1 h1:SHWdIUa82uGZz+F+47k8SY4QhhI291cXCpopT1lK2AQ= +github.com/skeema/knownhosts v1.2.1/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo= github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e h1:MRM5ITcdelLK2j1vwZ3Je0FKVCfqOLp5zO6trqMLYs0= github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e/go.mod h1:XV66xRDqSt+GTGFMVlhk3ULuV0y9ZmzeVGR4mloJI3M= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/src-d/gcfg v1.4.0/go.mod h1:p/UMsR43ujA89BJY9duynAwIpvqEujIH/jFlfL7jWoI= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +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.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +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/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0Bx9h2kr4= +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/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= @@ -323,17 +420,25 @@ go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go4.org v0.0.0-20201209231011-d4a079459e60 h1:iqAGo78tVOJXELHQFRjR6TMwItrvXH4hrGJ32I/NFF8= go4.org v0.0.0-20201209231011-d4a079459e60/go.mod h1:CIiUVy99QCPfoE13bO4EZaz5GZMZXMSBGhxRdsvzbkg= +golang.org/x/arch v0.1.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= +golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 h1:7I4JAnoQBe7ZtJcBaYHi5UtiO8tQHbUSXxL+pnGRANg= +golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU= +golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220826181053-bd7e27e6170d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +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.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY= +golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -367,13 +472,18 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s= +golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= +golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk= +golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -394,6 +504,7 @@ golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= @@ -404,15 +515,26 @@ golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20221014081412-f15817d10f9b h1:tvrvnPFcdzp294diPnrdZZZ8XUt2Tyj7svb7X52iDuU= -golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20220826154423-83b083e8dc8b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= +golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= +golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= +golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= +golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -422,8 +544,6 @@ golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210113160501-8b1d76fa0423/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783 h1:nt+Q6cXKz4MosCSpnbMtqiQ8Oz0pxTef2B4Vca2lvfk= -golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.8.0 h1:6dkIjl3j3LtZ/O3sTgZTMsLKSftL/B8Zgq4huOIIUu8= golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -435,9 +555,16 @@ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.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.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -445,7 +572,11 @@ golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -466,23 +597,49 @@ golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/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-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/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-20220422013727-9388b58f7150/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-20220715151400-c0bba94af5f8/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 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U= +golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220825204002-c680a09ffe64/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= +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.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.0.0-20220722155259-a9ba230a4035/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= +golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= +golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= -golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= +golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= +golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= +golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= +golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -492,15 +649,17 @@ golang.org/x/text v0.3.4/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.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.5.0 h1:OLmvp0KP+FVG99Ct/qFiL/Fhk4zp4QQnZ7b2U+5piUM= golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= +golang.org/x/text v0.6.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.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +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/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0 h1:/5xXl8Y5W96D+TtHSlonuFqGHIWVuyCkGJLwGh9JJFs= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -516,6 +675,7 @@ golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBn golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190729092621-ff9f1409240a/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -551,15 +711,21 @@ golang.org/x/tools v0.0.0-20200915173823-2db8f0ff891c/go.mod h1:z6u4i615ZeAfBE4X golang.org/x/tools v0.0.0-20200918232735-d647fc253266/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210114065538-d78b04bdf963/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU= +golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= +golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.8.0 h1:vSDcovVPld282ceKgDimkRSC8kpaH1dgyc9UMzlt84Y= -golang.org/x/tools v0.8.0/go.mod h1:JxBZ99ISMI5ViVkT1tr6tdNmXeTrcpVSD3vZ1RsRdN4= +golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= +golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= +golang.org/x/tools v0.9.3/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= +golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -666,23 +832,31 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/src-d/go-billy.v4 v4.3.2/go.mod h1:nDjArDMp+XMs1aFAESLRjfGSgfvoYN0hDfzEk0GjC98= +gopkg.in/src-d/go-git-fixtures.v3 v3.5.0/go.mod h1:dLBcvytrw/TYZsNTWCnkNF2DSIlzWYqTe3rJR56Ac7g= +gopkg.in/src-d/go-git.v4 v4.13.1/go.mod h1:nx5NYcxdKxq5fpltdHnPa2Exj4Sx0EclMWZQbYDu2z8= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= +gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= 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.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/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= gotest.tools/v3 v3.4.0 h1:ZazjZUfuVeZGLAmlKKuyv3IKP5orXcwtOwDQH6YVr6o= @@ -707,6 +881,7 @@ k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9/go.mod h1:wZK2AVp1uHCp4Va k8s.io/utils v0.0.0-20230406110748-d93618cff8a2 h1:qY1Ad8PODbnymg2pRbkyMT/ylpTrCM8P2RJ0yroCyIk= k8s.io/utils v0.0.0-20230406110748-d93618cff8a2/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= diff --git a/functions/onprem/worker/worker.go b/functions/onprem/worker/worker.go index 773510fb..8f212721 100644 --- a/functions/onprem/worker/worker.go +++ b/functions/onprem/worker/worker.go @@ -120,7 +120,7 @@ func setWorkflowExecution(ctx context.Context, workflowExecution shuffle.Workflo } //log.Printf("[DEBUG][%s] Setting with %d results (pre)", workflowExecution.ExecutionId, len(workflowExecution.Results)) - workflowExecution = shuffle.Fixexecution(ctx, workflowExecution) + workflowExecution, _ = shuffle.Fixexecution(ctx, workflowExecution) cacheKey := fmt.Sprintf("workflowexecution_%s", workflowExecution.ExecutionId) execData, err := json.Marshal(workflowExecution) @@ -2215,7 +2215,7 @@ func validateFinished(workflowExecution shuffle.WorkflowExecution) bool { } //startAction, extra, children, parents, visited, executed, nextActions, environments := shuffle.GetExecutionVariables(ctx, workflowExecution.ExecutionId) - workflowExecution = shuffle.Fixexecution(ctx, workflowExecution) + workflowExecution, _ = shuffle.Fixexecution(ctx, workflowExecution) _, extra, _, _, _, _, _, environments := shuffle.GetExecutionVariables(ctx, workflowExecution.ExecutionId) log.Printf("[INFO][%s] VALIDATION. Status: %s, shuffle.Actions: %d, Extra: %d, Results: %d. Parent: %#v", workflowExecution.ExecutionId, workflowExecution.Status, len(workflowExecution.Workflow.Actions), extra, len(workflowExecution.Results), workflowExecution.ExecutionParent) From 990ba015fd3a52a30ef5415dac31bf9871fb7d2f Mon Sep 17 00:00:00 2001 From: Frikky Date: Mon, 22 Jan 2024 02:24:05 +0100 Subject: [PATCH 24/42] Builds with new release info --- backend/go-app/go.mod | 2 +- backend/go-app/go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/backend/go-app/go.mod b/backend/go-app/go.mod index c201b9f6..d8b28936 100644 --- a/backend/go-app/go.mod +++ b/backend/go-app/go.mod @@ -18,7 +18,7 @@ require ( github.com/gorilla/mux v1.8.0 github.com/h2non/filetype v1.1.3 github.com/satori/go.uuid v1.2.0 - github.com/shuffle/shuffle-shared v0.5.61 + github.com/shuffle/shuffle-shared v0.5.62 golang.org/x/crypto v0.16.0 google.golang.org/api v0.125.0 google.golang.org/grpc v1.55.0 diff --git a/backend/go-app/go.sum b/backend/go-app/go.sum index 960dc1a0..5ea6060a 100644 --- a/backend/go-app/go.sum +++ b/backend/go-app/go.sum @@ -497,6 +497,8 @@ github.com/shuffle/shuffle-shared v0.5.60 h1:R0BWYp/DlgyNPU0xVNSPhsWBnJ+LeVD3iLo github.com/shuffle/shuffle-shared v0.5.60/go.mod h1:oIZkx93Z7EvtiTXty7xO+ax63Fjz8MQvjXMxDN0Qws0= github.com/shuffle/shuffle-shared v0.5.61 h1:Fkd7pvk8ypwaio1VvMOmJ6PQF9xCfNYx8RWjPnXjn5E= github.com/shuffle/shuffle-shared v0.5.61/go.mod h1:oIZkx93Z7EvtiTXty7xO+ax63Fjz8MQvjXMxDN0Qws0= +github.com/shuffle/shuffle-shared v0.5.62 h1:L1la7++aqPLPsh1z3cuGIzH+NTuvBlmEU/T2mQvfEk8= +github.com/shuffle/shuffle-shared v0.5.62/go.mod h1:oIZkx93Z7EvtiTXty7xO+ax63Fjz8MQvjXMxDN0Qws0= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= From 3e9bdcf05b9e701d02f96c1b99ecc43a07864722 Mon Sep 17 00:00:00 2001 From: Frikky Date: Mon, 22 Jan 2024 18:13:33 +0100 Subject: [PATCH 25/42] Update package.json --- frontend/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/package.json b/frontend/package.json index fbababec..b832a893 100755 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,7 +1,7 @@ { "name": "shuffler", "homepage": "https://shuffler.io", - "version": "1.3.0", + "version": "1.4.0", "private": true, "dependencies": { "@codemirror/commands": "^6.2.4", From c220d9c4a5ccbcf1780ff882923b037f5ef2e46d Mon Sep 17 00:00:00 2001 From: Frikky Date: Tue, 23 Jan 2024 01:30:11 +0100 Subject: [PATCH 26/42] Minor fixes for queue management onprem --- frontend/src/components/BillingStats.jsx | 6 +- frontend/src/views/Admin.jsx | 105 +++++++++++++---------- functions/onprem/orborus/orborus.go | 37 +++++--- 3 files changed, 91 insertions(+), 57 deletions(-) diff --git a/frontend/src/components/BillingStats.jsx b/frontend/src/components/BillingStats.jsx index 81ea7100..a91c275a 100644 --- a/frontend/src/components/BillingStats.jsx +++ b/frontend/src/components/BillingStats.jsx @@ -421,7 +421,11 @@ const AppStats = (defaultprops) => { }> - ${apprunCost} + {selectedOrganization.lead_info.customer === false && selectedOrganization.lead_info.pov === false ? + 0 + : + apprunCost + } Period Cost diff --git a/frontend/src/views/Admin.jsx b/frontend/src/views/Admin.jsx index be7711af..1bacd611 100755 --- a/frontend/src/views/Admin.jsx +++ b/frontend/src/views/Admin.jsx @@ -1011,62 +1011,62 @@ If you're interested, please let me know a time that works for you, or set up a responseJson.sync_features = {}; } - if (responseJson.lead_info !== undefined && responseJson.lead_info !== null) { - var leads = [] - if (responseJson.lead_info.contacted) { - leads.push("contacted") - } + if (responseJson.lead_info !== undefined && responseJson.lead_info !== null) { + var leads = [] + if (responseJson.lead_info.contacted) { + leads.push("contacted") + } - if (responseJson.lead_info.customer) { - leads.push("customer") - } + if (responseJson.lead_info.customer) { + leads.push("customer") + } - if (responseJson.lead_info.old_customer) { - leads.push("old customer") - } + if (responseJson.lead_info.old_customer) { + leads.push("old customer") + } - if (responseJson.lead_info.old_lead) { - leads.push("old lead") - } + if (responseJson.lead_info.old_lead) { + leads.push("old lead") + } - if (responseJson.lead_info.tech_partner) { - leads.push("tech partner") - } + if (responseJson.lead_info.tech_partner) { + leads.push("tech partner") + } - if (responseJson.lead_info.creator) { - leads.push("creator") - } + if (responseJson.lead_info.creator) { + leads.push("creator") + } - if (responseJson.lead_info.opensource) { - leads.push("open source") - } + if (responseJson.lead_info.opensource) { + leads.push("open source") + } - if (responseJson.lead_info.demo_done) { - leads.push("demo done") - } + if (responseJson.lead_info.demo_done) { + leads.push("demo done") + } - if (responseJson.lead_info.pov) { - leads.push("pov") - } + if (responseJson.lead_info.pov) { + leads.push("pov") + } - if (responseJson.lead_info.lead) { - leads.push("lead") - } + if (responseJson.lead_info.lead) { + leads.push("lead") + } - if (responseJson.lead_info.student) { - leads.push("student") - } + if (responseJson.lead_info.student) { + leads.push("student") + } - if (responseJson.lead_info.internal) { - leads.push("internal") - } + if (responseJson.lead_info.internal) { + leads.push("internal") + } - if (responseJson.lead_info.sub_org) { - leads.push("sub_org") - } + if (responseJson.lead_info.sub_org) { + leads.push("sub_org") + } - setSelectedStatus(leads) - } + setSelectedStatus(leads) + } setSelectedOrganization(responseJson) var lists = { @@ -1503,6 +1503,19 @@ If you're interested, please let me know a time that works for you, or set up a }) .then((responseJson) => { setEnvironments(responseJson); + + // Helper info for users in case they have a large queue and don't know about queue flushing + if (responseJson !== undefined && responseJson !== null && responseJson.length > 0) { + for (var i = 0; i < responseJson.length; i++) { + const env = responseJson[i]; + + // Check if queuesize is too large + if (env.queue !== undefined && env.queue !== null && env.queue > 100) { + toast("Queue size for " + env.name + " is very large. We recommend you to reduce it by flushing the queue before continuing."); + break + } + } + } }) .catch((error) => { toast(error.toString()); @@ -2405,6 +2418,10 @@ If you're interested, please let me know a time that works for you, or set up a { + if (!isCloud || userdata.support !== true) { + return + } + e.preventDefault(); e.stopPropagation(); @@ -4269,7 +4286,7 @@ If you're interested, please let me know a time that works for you, or set up a //console.log("Show CPU alert: ", showCPUAlert) - const queueSize = environment.queue !== undefined && environment.queue !== null ? environment.queue < 0 ? 0 : environment.queue > 99 ? ">99" : environment.queue : 0 + const queueSize = environment.queue !== undefined && environment.queue !== null ? environment.queue < 0 ? 0 : environment.queue > 1000 ? ">1000" : environment.queue : 0 return ( diff --git a/functions/onprem/orborus/orborus.go b/functions/onprem/orborus/orborus.go index ed141a1d..793fe383 100755 --- a/functions/onprem/orborus/orborus.go +++ b/functions/onprem/orborus/orborus.go @@ -396,16 +396,16 @@ func deployServiceWorkers(image string) { } innerContainerName := fmt.Sprintf("shuffle-workers") - cnt, _ := findActiveSwarmNodes() + cnt, err := findActiveSwarmNodes() + if err != nil { + log.Printf("[ERROR] Failed to find active swarm nodes: %s. Defaulting to 1", err) + } + nodeCount := uint64(1) if cnt > 0 { nodeCount = uint64(cnt) } - if cnt == 0 { - cnt = 1 - } - appReplicas := os.Getenv("SHUFFLE_APP_REPLICAS") appReplicaCnt := 1 if len(appReplicas) > 0 { @@ -477,6 +477,7 @@ func deployServiceWorkers(image string) { fmt.Sprintf("SHUFFLE_LOGS_DISABLED=%s", os.Getenv("SHUFFLE_LOGS_DISABLED")), fmt.Sprintf("DEBUG_MEMORY=%s", os.Getenv("DEBUG_MEMORY")), fmt.Sprintf("SHUFFLE_APP_SDK_TIMEOUT=%s", os.Getenv("SHUFFLE_APP_SDK_TIMEOUT")), + fmt.Sprintf("SHUFFLE_MAX_SWARM_NODES=%d", os.Getenv("SHUFFLE_MAX_SWARM_NODES")), }, //Hosts: []string{ // innerContainerName, @@ -927,7 +928,7 @@ func findActiveSwarmNodes() (int64, error) { ctx := context.Background() nodes, err := dockercli.NodeList(ctx, types.NodeListOptions{}) if err != nil { - return 0, err + return 1, err } nodeCount := int64(0) @@ -938,13 +939,21 @@ func findActiveSwarmNodes() (int64, error) { } } - return nodeCount, nil + // Check for SHUFFLE_MAX_NODES + // Make it into a number and check if it's lower than nodeCount + maxNodesString := os.Getenv("SHUFFLE_MAX_SWARM_NODES") + if len(maxNodesString) > 0 { + maxNodes, err := strconv.ParseInt(maxNodesString, 10, 64) + if err != nil { + return nodeCount, err + } - /* - containers, err := dockercli.ContainerList(ctx, types.ContainerListOptions{ - All: true, - }) - */ + if nodeCount > maxNodes { + nodeCount = maxNodes + } + } + + return nodeCount, nil } // Get IP @@ -1634,6 +1643,10 @@ func main() { env = append(env, fmt.Sprintf("SHUFFLE_INTERNAL_HTTPS_PROXY=%s", overrideHttpsProxy)) } + if len(os.Getenv("SHUFFLE_MAX_SWARM_NODES")) > 0 { + env = append(env, fmt.Sprintf("SHUFFLE_MAX_SWARM_NODES=%s", os.Getenv("SHUFFLE_MAX_SWARM_NODES"))) + } + err = deployWorker(workerImage, containerName, env, execution) zombiecounter += 1 if err == nil { From eabd5ade54965496d6519fd1563c64b6e9b884ba Mon Sep 17 00:00:00 2001 From: Frikky Date: Tue, 23 Jan 2024 01:32:42 +0100 Subject: [PATCH 27/42] Upgrade worker details --- functions/onprem/worker/go.mod | 2 +- functions/onprem/worker/worker.go | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/functions/onprem/worker/go.mod b/functions/onprem/worker/go.mod index 20a427a1..d3eed236 100644 --- a/functions/onprem/worker/go.mod +++ b/functions/onprem/worker/go.mod @@ -8,7 +8,7 @@ require ( github.com/docker/docker v23.0.3+incompatible github.com/gorilla/mux v1.8.0 github.com/satori/go.uuid v1.2.0 - github.com/shuffle/shuffle-shared v0.5.61 + github.com/shuffle/shuffle-shared v0.5.63 k8s.io/api v0.28.3 k8s.io/apimachinery v0.28.3 k8s.io/client-go v0.28.3 diff --git a/functions/onprem/worker/worker.go b/functions/onprem/worker/worker.go index 8f212721..0afcc325 100644 --- a/functions/onprem/worker/worker.go +++ b/functions/onprem/worker/worker.go @@ -2485,7 +2485,7 @@ func findActiveSwarmNodes(dockercli *dockerclient.Client) (int64, error) { ctx := context.Background() nodes, err := dockercli.NodeList(ctx, types.NodeListOptions{}) if err != nil { - return 0, err + return 1, err } nodeCount := int64(0) @@ -2496,6 +2496,20 @@ func findActiveSwarmNodes(dockercli *dockerclient.Client) (int64, error) { } } + // Check for SHUFFLE_MAX_NODES + maxNodesString := os.Getenv("SHUFFLE_MAX_SWARM_NODES") + // Make it into a number and check if it's lower than nodeCount + if len(maxNodesString) > 0 { + maxNodes, err := strconv.ParseInt(maxNodesString, 10, 64) + if err != nil { + return nodeCount, err + } + + if nodeCount > maxNodes { + nodeCount = maxNodes + } + } + return nodeCount, nil /* From 2fec9306a3fadbab5e5e0c7a5be6fd300c16b7e1 Mon Sep 17 00:00:00 2001 From: Frikky Date: Tue, 23 Jan 2024 01:33:57 +0100 Subject: [PATCH 28/42] Last push for 1.3.2 --- backend/go-app/go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/go-app/go.mod b/backend/go-app/go.mod index d8b28936..ca3008d1 100644 --- a/backend/go-app/go.mod +++ b/backend/go-app/go.mod @@ -18,7 +18,7 @@ require ( github.com/gorilla/mux v1.8.0 github.com/h2non/filetype v1.1.3 github.com/satori/go.uuid v1.2.0 - github.com/shuffle/shuffle-shared v0.5.62 + github.com/shuffle/shuffle-shared v0.5.63 golang.org/x/crypto v0.16.0 google.golang.org/api v0.125.0 google.golang.org/grpc v1.55.0 From 729b2b211d33a90b1844ff8d1f54857c9bfba2a6 Mon Sep 17 00:00:00 2001 From: Frikky Date: Tue, 23 Jan 2024 16:12:58 +0100 Subject: [PATCH 29/42] Added SHUFFLE_MAX_EXECUTION_DEPTH for subflows to be able to go lower than 10 subflows --- backend/app_sdk/app_base.py | 3 ++- backend/go-app/walkoff.go | 10 +++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/backend/app_sdk/app_base.py b/backend/app_sdk/app_base.py index 29aab5c9..6c4f05e6 100755 --- a/backend/app_sdk/app_base.py +++ b/backend/app_sdk/app_base.py @@ -3289,7 +3289,8 @@ class AppBase: })) if parameter["name"] == "body": - self.logger.info(f"[INFO] Should debug field with liquid and other checks as it's BODY: {value}") + #self.logger.info(f"[INFO] Should debug field with liquid and other checks as it's BODY: {value}") + pass # Custom format for ${name[0,1,2,...]}$ #submatch = "([${]{2}([0-9a-zA-Z_-]+)(\[.*\])[}$]{2})" diff --git a/backend/go-app/walkoff.go b/backend/go-app/walkoff.go index 0bcada9c..3811b0e1 100755 --- a/backend/go-app/walkoff.go +++ b/backend/go-app/walkoff.go @@ -1056,7 +1056,15 @@ func handleExecution(id string, workflow shuffle.Workflow, request *http.Request return shuffle.WorkflowExecution{}, fmt.Sprintf(`workflow %s is invalid`, workflow.ID), errors.New("Failed getting workflow") } - workflowExecution, execInfo, _, err := shuffle.PrepareWorkflowExecution(ctx, workflow, request, 10) + maxExecutionDepth := 10 + if os.Getenv("SHUFFLE_MAX_EXECUTION_DEPTH") != "" { + maxExecutionDepthNew, err = strconv.Atoi(os.Getenv("SHUFFLE_MAX_EXECUTION_DEPTH")) + if err == nil && maxExecutionDepthNew > 1 && maxExecutionDepthNew < 1000 { + maxExecutionDepth = maxExecutionDepthNew + } + } + + workflowExecution, execInfo, _, err := shuffle.PrepareWorkflowExecution(ctx, workflow, request, maxExecutionDepth) if err != nil { err = shuffle.SetWorkflowExecution(ctx, workflowExecution, true) if err != nil { From 98bf24d51eabed19a727c4c644b53f8e14c0debb Mon Sep 17 00:00:00 2001 From: Frikky Date: Wed, 24 Jan 2024 11:09:00 +0100 Subject: [PATCH 30/42] Fixed an integer mapping problem in conditions --- backend/app_sdk/app_base.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/backend/app_sdk/app_base.py b/backend/app_sdk/app_base.py index 6c4f05e6..a1a57375 100755 --- a/backend/app_sdk/app_base.py +++ b/backend/app_sdk/app_base.py @@ -2137,6 +2137,12 @@ class AppBase: if isinstance(basejson, list): print("[WARNING] VALUE IN ISINSTANCE IS NOT TO BE USED (list): %s" % value) return basejson, False + elif isinstance(basejson, bool): + print("[WARNING] VALUE IN ISINSTANCE IS NOT TO BE USED (bool): %s" % value) + return basejson, False + elif isinstance(basejson, int): + print("[WARNING] VALUE IN ISINSTANCE IS NOT TO BE USED (int): %s" % value) + return basejson, False elif isinstance(basejson[value], str): try: if (basejson[value].endswith("}") and basejson[value].endswith("}")) or (basejson[value].startswith("[") and basejson[value].endswith("]")): @@ -2159,6 +2165,12 @@ class AppBase: if isinstance(basejson, list): print("[WARNING] VALUE IN ISINSTANCE IS NOT TO BE USED (list): %s" % value) return basejson, False + elif isinstance(basejson, bool): + print("[WARNING] VALUE IN ISINSTANCE IS NOT TO BE USED (bool): %s" % value) + return basejson, False + elif isinstance(basejson, int): + print("[WARNING] VALUE IN ISINSTANCE IS NOT TO BE USED (int): %s" % value) + return basejson, False elif isinstance(basejson[value], str): print(f"[INFO] LOADING STRING '%s' AS JSON" % basejson[value]) try: From b82b68c8b240377a6192bef6cdfac50802f0c166 Mon Sep 17 00:00:00 2001 From: Frikky Date: Wed, 24 Jan 2024 12:06:48 +0100 Subject: [PATCH 31/42] https://github.com/Shuffle/Shuffle/issues/1306: Fixed int casting issue in app sdk during list management --- backend/app_sdk/app_base.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/backend/app_sdk/app_base.py b/backend/app_sdk/app_base.py index a1a57375..3a8d2634 100755 --- a/backend/app_sdk/app_base.py +++ b/backend/app_sdk/app_base.py @@ -2073,9 +2073,9 @@ class AppBase: # Means it's a single item -> continue if seconditem == "": print("[INFO] In first - handling %s. Len: %d" % (firstitem, len(basejson))) - if firstitem.lower() == "max" or firstitem.lower() == "last" or firstitem.lower() == "end": + if str(firstitem).lower() == "max" or str(firstitem).lower() == "last" or str(firstitem).lower() == "end": firstitem = len(basejson)-1 - elif firstitem.lower() == "min" or firstitem.lower() == "first": + elif str(firstitem).lower() == "min" or str(firstitem).lower() == "first": firstitem = 0 else: firstitem = int(firstitem) @@ -2099,9 +2099,9 @@ class AppBase: firstitem = int(firstitem) if isinstance(seconditem, str): - if seconditem.lower() == "max" or seconditem.lower() == "last" or firstitem.lower() == "end": + if str(seconditem).lower() == "max" or str(seconditem).lower() == "last" or str(firstitem).lower() == "end": seconditem = len(basejson)-1 - elif seconditem.lower() == "min" or seconditem.lower() == "first": + elif str(seconditem).lower() == "min" or str(seconditem).lower() == "first": seconditem = 0 else: seconditem = int(seconditem) From f10e382565793b094eded864c4acdb84ff6c26f7 Mon Sep 17 00:00:00 2001 From: Frikky Date: Thu, 25 Jan 2024 12:03:45 +0100 Subject: [PATCH 32/42] Made user re-invite to an org work even when user exists --- backend/go-app/go.mod | 2 +- backend/go-app/main.go | 42 ++++++++++++++++++++++++++++++++++----- backend/go-app/walkoff.go | 6 ++++-- 3 files changed, 42 insertions(+), 8 deletions(-) diff --git a/backend/go-app/go.mod b/backend/go-app/go.mod index ca3008d1..b990c6df 100644 --- a/backend/go-app/go.mod +++ b/backend/go-app/go.mod @@ -1,6 +1,6 @@ module shuffle-shared -//replace github.com/shuffle/shuffle-shared => ../../../shuffle-shared +replace github.com/shuffle/shuffle-shared => ../../../shuffle-shared go 1.19 diff --git a/backend/go-app/main.go b/backend/go-app/main.go index c9441aaa..ab9f68e5 100755 --- a/backend/go-app/main.go +++ b/backend/go-app/main.go @@ -562,7 +562,7 @@ func handleRegister(resp http.ResponseWriter, request *http.Request) { currentOrg := user.ActiveOrg if user.ActiveOrg.Id == "" { - log.Printf("[WARNING] There's no active org for the user %s. Checking if there's a single one to assing it to.", user.Username) + log.Printf("[WARNING] There's no active org for the user %s. Checking if there's a single one to assign it to.", user.Username) orgs, err := shuffle.GetAllOrgs(ctx) if err == nil && len(orgs) > 0 { @@ -620,10 +620,42 @@ func handleRegister(resp http.ResponseWriter, request *http.Request) { err = createNewUser(data.Username, data.Password, role, apikey, currentOrg) if err != nil { - log.Printf("[WARNING] Failed registering user: %s", err) - resp.WriteHeader(401) - resp.Write([]byte(fmt.Sprintf(`{"success": false, "reason": "%s"}`, err))) - return + if strings.Contains(err.Error(), "already exists") { + // Assign it to the org + log.Printf("[WARNING] User %s already exists. Assigning to org %s", data.Username, currentOrg.Name) + + // Get the user + users, err := shuffle.FindUser(ctx, data.Username) + if err != nil || len(users) == 0 { + log.Printf("[WARNING] Failed finding user %s: %s", data.Username, err) + resp.WriteHeader(400) + resp.Write([]byte(fmt.Sprintf(`{"success": false, "reason": "%s"}`, err))) + return + } + + newUser := users[0] + + if !strings.Contains(newUser.Orgs[0], currentOrg.Id) { + newUser.Orgs = append(newUser.Orgs, currentOrg.Id) + } + + if newUser.ActiveOrg.Id == "" || newUser.ActiveOrg.Name == "" { + newUser.ActiveOrg = currentOrg + } + + err = shuffle.SetUser(ctx, &newUser, false) + if err != nil { + log.Printf("[WARNING] Failed updating the user %s: %s", data.Username, err) + resp.WriteHeader(400) + resp.Write([]byte(fmt.Sprintf(`{"success": false, "reason": "%s"}`, err))) + return + } + } else { + log.Printf("[WARNING] Failed registering user: %s", err) + resp.WriteHeader(401) + resp.Write([]byte(fmt.Sprintf(`{"success": false, "reason": "%s"}`, err))) + return + } } resp.WriteHeader(200) diff --git a/backend/go-app/walkoff.go b/backend/go-app/walkoff.go index 3811b0e1..a22bddca 100755 --- a/backend/go-app/walkoff.go +++ b/backend/go-app/walkoff.go @@ -932,13 +932,15 @@ func deleteWorkflow(resp http.ResponseWriter, request *http.Request) { } } + log.Printf("[DEBUG] Attempting to delete the workflow %s from the database...", fileId) err = shuffle.DeleteKey(ctx, "workflow", fileId) if err != nil { - log.Printf("[DEBUG]] Failed deleting key %s", fileId) - resp.WriteHeader(401) + log.Printf("[DEBUG] Failed deleting workflow key %s", fileId) + resp.WriteHeader(400) resp.Write([]byte(`{"success": false, "reason": "Failed deleting key"}`)) return } + log.Printf("[INFO] Should have deleted workflow %s (%s)", workflow.Name, fileId) cacheKey := fmt.Sprintf("%s_workflows", user.Id) From 7a6970e3d60afeddad93bcd55b472cf8c360dfb9 Mon Sep 17 00:00:00 2001 From: Frikky Date: Thu, 25 Jan 2024 12:05:25 +0100 Subject: [PATCH 33/42] Made MAX EXECUTION DEPTH be followed for further recursion than 10 --- .env | 1 + backend/go-app/walkoff.go | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.env b/.env index 2fd946ed..e3221e33 100755 --- a/.env +++ b/.env @@ -81,6 +81,7 @@ SHUFFLE_DISABLE_RERUN_AND_ABORT=false SHUFFLE_RERUN_SCHEDULE=300 SHUFFLE_WORKER_SERVER_URL= # Definition in case Worker & Orborus is talking to the wrong server SHUFFLE_ORBORUS_PULL_TIME= # Definition in case Orborus is pulling too often/not often enough +SHUFFLE_MAX_EXECUTION_DEPTH= # Max recursion depth for subflows # DATABASE CONFIGURATIONS DATASTORE_EMULATOR_HOST=shuffle-database:8000 diff --git a/backend/go-app/walkoff.go b/backend/go-app/walkoff.go index a22bddca..659c52b3 100755 --- a/backend/go-app/walkoff.go +++ b/backend/go-app/walkoff.go @@ -1060,13 +1060,13 @@ func handleExecution(id string, workflow shuffle.Workflow, request *http.Request maxExecutionDepth := 10 if os.Getenv("SHUFFLE_MAX_EXECUTION_DEPTH") != "" { - maxExecutionDepthNew, err = strconv.Atoi(os.Getenv("SHUFFLE_MAX_EXECUTION_DEPTH")) + maxExecutionDepthNew, err := strconv.Atoi(os.Getenv("SHUFFLE_MAX_EXECUTION_DEPTH")) if err == nil && maxExecutionDepthNew > 1 && maxExecutionDepthNew < 1000 { maxExecutionDepth = maxExecutionDepthNew } } - workflowExecution, execInfo, _, err := shuffle.PrepareWorkflowExecution(ctx, workflow, request, maxExecutionDepth) + workflowExecution, execInfo, _, err := shuffle.PrepareWorkflowExecution(ctx, workflow, request, int64(maxExecutionDepth)) if err != nil { err = shuffle.SetWorkflowExecution(ctx, workflowExecution, true) if err != nil { From 7a09037604991ee75d7dc27f91cea6af73d72772 Mon Sep 17 00:00:00 2001 From: Frikky Date: Thu, 25 Jan 2024 14:56:52 +0100 Subject: [PATCH 34/42] Made it so wait for results does what it should for loops on cloud --- backend/go-app/main.go | 10 +- frontend/package.json | 112 ++++++----- frontend/src/App.jsx | 9 +- frontend/src/components/CacheView.jsx | 15 +- frontend/src/components/ConfigureWorkflow.jsx | 185 ++++++++++++------ frontend/src/components/NewHeader.jsx | 2 +- frontend/src/components/Oauth2Auth.jsx | 25 ++- frontend/src/components/ParsedAction.jsx | 18 +- frontend/src/components/ShuffleCodeEditor.jsx | 131 ++++++++++--- .../src/components/WorkflowTemplatePopup.jsx | 124 +++++++++++- frontend/src/views/AngularWorkflow.jsx | 17 +- frontend/src/views/AppCreator.jsx | 103 +++++----- frontend/src/views/Docs.jsx | 6 + frontend/src/views/Workflows.jsx | 20 +- 14 files changed, 550 insertions(+), 227 deletions(-) diff --git a/backend/go-app/main.go b/backend/go-app/main.go index ab9f68e5..31d0e85f 100755 --- a/backend/go-app/main.go +++ b/backend/go-app/main.go @@ -634,8 +634,7 @@ func handleRegister(resp http.ResponseWriter, request *http.Request) { } newUser := users[0] - - if !strings.Contains(newUser.Orgs[0], currentOrg.Id) { + if !shuffle.ArrayContains(newUser.Orgs, currentOrg.Id) { newUser.Orgs = append(newUser.Orgs, currentOrg.Id) } @@ -643,13 +642,18 @@ func handleRegister(resp http.ResponseWriter, request *http.Request) { newUser.ActiveOrg = currentOrg } - err = shuffle.SetUser(ctx, &newUser, false) + err = shuffle.SetUser(ctx, &newUser, true) if err != nil { log.Printf("[WARNING] Failed updating the user %s: %s", data.Username, err) resp.WriteHeader(400) resp.Write([]byte(fmt.Sprintf(`{"success": false, "reason": "%s"}`, err))) return } + + resp.WriteHeader(200) + resp.Write([]byte(fmt.Sprintf(`{"success": true}`))) + log.Printf("[INFO] %s Successfully re-added to org %s (%s)", data.Username, currentOrg.Name, currentOrg.Id) + return } else { log.Printf("[WARNING] Failed registering user: %s", err) resp.WriteHeader(401) diff --git a/frontend/package.json b/frontend/package.json index b832a893..186c50c7 100755 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,54 +1,64 @@ { "name": "shuffler", "homepage": "https://shuffler.io", - "version": "1.4.0", + "version": "1.3.3", "private": true, "dependencies": { + "@babel/plugin-proposal-class-properties": "^7.18.6", "@codemirror/commands": "^6.2.4", - "@emotion/is-prop-valid": "^1.1.1", + "@codemirror/lang-python": "^6.1.3", "@emotion/react": "^11.11.1", - "@emotion/styled": "^11.11.0", + "@emotion/styled": "^11.6.0", "@lezer/highlight": "^1.1.3", + "@metamask/detect-provider": "^1.2.0", "@mui/icons-material": "^5.14.0", "@mui/material": "^5.14.0", "@mui/styles": "^5.14.0", "@mui/x-data-grid": "^5.17.11", "@mui/x-date-pickers": "^6.11.1", + "@types/algoliasearch": "^3.34.11", + "@uiw/codemirror-theme-basic": "^4.21.20", "@uiw/codemirror-theme-vscode": "^4.21.20", "@uiw/codemirror-themes": "^4.21.9", - "@uiw/react-codemirror": "^4.21.9", - "@use-it/interval": "^1.0.0", - "algoliasearch": "^4.13.1", - "calculate-size": "^1.1.1", - "class-transformer": "^0.4.0", + "@uiw/react-codemirror": "^4.21.21", + "@use-it/interval": "^0.1.3", + "algoliasearch": "^4.8.3", + "class-transformer": "^0.2.0", + "codemirror": "^6.0.1", + "cpx": "^1.5.0", "create-react-app": "^5.0.1", - "cytoscape": "^3.15.1", - "cytoscape-edgehandles": "^3.6.0", - "cytoscape-node-html-label": "^1.1.5", - "d3": "^7.1.1", - "dayjs": "^1.11.9", + "cytoscape": "^3.23.0", + "cytoscape-clipboard": "^2.2.1", + "cytoscape-cxtmenu": "^3.4.0", + "cytoscape-edgehandles": "^3.5.1", + "cytoscape-grid-guide": "~2.3.3", + "cytoscape-node-html-label": "^1.2.2", + "cytoscape-panzoom": "^2.5.3", + "cytoscape-undo-redo": "^1.3.3", + "d3": "~4.10.0", + "dayjs": "^1.11.10", "dotenv": "^6.1.0", - "downshift": "^3.3.5", + "downshift": "^3.4.8", + "express": "^4.17.1", + "express-useragent": "^1.0.15", "github-markdown-css": "^3.0.1", + "i18next": "^22.3.0", + "i18next-browser-languagedetector": "^7.0.1", + "i18next-chained-backend": "^4.2.0", + "i18next-http-backend": "^2.1.1", + "i18next-localstorage-backend": "^4.1.0", + "i18next-xhr-backend": "^3.2.2", "import": "0.0.6", "interweave": "^11.2.0", - "jss": "^10.10.0", - "jss-camel-case": "^6.1.0", - "jss-default-unit": "^8.0.2", - "jss-global": "^3.0.0", - "jss-nested": "^6.0.1", - "jss-props-sort": "^6.0.0", - "jss-vendor-prefixer": "^8.0.1", + "is-plain-obj": "^4.1.0", + "json-bigint": "^1.0.0", + "match-sorter": "^6.3.1", "md5-file": "^4.0.0", "mdbreact": "^4.21.1", - "mime": "^3.0.0", - "moment": "^2.29.1", + "moment": "~2.29.4", "mui-chips-input": "^2.1.3", "mui-nested-menu": "^3.2.1", - "process": "^0.11.10", "react": "^18.2.0", - "react-alert": "^7.0.3", - "react-alert-template-basic": "^1.0.0", "react-alice-carousel": "^2.6.4", "react-avatar-editor": "^11.1.0", "react-beforeunload": "^2.2.1", @@ -57,31 +67,40 @@ "react-cytoscapejs": "^2.0.0", "react-device-detect": "^2.2.3", "react-dom": "^18.2.0", - "react-draggable": "^3.3.2", + "react-draggable": "^4.4.5", "react-driftjs": "^1.2.2", "react-dropzone": "^14.2.3", "react-ga4": "^2.0.0", "react-hotkeys": "^2.0.0", + "react-i18next": "^13.1.2", "react-instantsearch-dom": "^6.28.0", "react-json-pretty": "^2.2.0", "react-json-view": "^1.21.3", + "react-json-view-ssr": "^1.19.1", "react-markdown": "^8.0.7", "react-markdown-github": "^3.3.1", "react-powerhooks": "^0.0.7", "react-router": "^6.14.1", "react-router-dom": "^6.14.1", "react-scripts": "^5.0.1", + "react-social-icons": "^5.15.0", + "react-stripe-elements": "^6.1.2", "react-toastify": "^9.1.3", - "reaviz": "^14.9.4", + "reaviz": "^14.9.7", "remark-gfm": "^3.0.1", + "remark-html": "^16.0.1", + "remark-images": "^4.0.0", + "remark-rehype": "^11.0.0", + "rsuite": "^5.23.0", "search-insights": "^2.2.1", - "shellwords": "^0.1.1", + "shellwords": "^1.0.1", "simplebar": "^4.2.3", - "styled-components": "^4.4.0", - "webpack": "^5.88.2", - "yaml": "^1.7.2", + "styled-components": "^4.4.1", + "sync-fetch": "^0.3.0", + "terser-webpack-plugin": "^4.2.3", + "yaml": "^1.10.0", "yamljs": "^0.3.0", - "zone.js": "^0.13.1" + "zone.js": "~0.8.26" }, "scripts": { "start": "HTTPS=false&&PORT=3000 GENERATE_SOURCEMAP=false react-scripts --openssl-legacy-provider start", @@ -92,12 +111,7 @@ "lint_file": "eslint 'src/views/AngularWorkflow.jsx'" }, "eslintConfig": { - "extends": "react-app", - "rules": { - "jsx-a11y/img-redundant-alt": "off", - "no-redeclare": "off", - "no-loop-func": "off" - } + "extends": "react-app" }, "browserslist": [ ">0.2%", @@ -106,13 +120,19 @@ "not op_mini all" ], "devDependencies": { - "@babel/core": "^7.15.8", - "@babel/plugin-proposal-private-property-in-object": "^7.21.11", - "babel-eslint": "^10.1.0", - "prettier": "2.4.1", + "@babel/cli": "^7.22.10", + "@babel/core": "^7.22.10", + "@babel/plugin-proposal-export-default-from": "^7.22.5", + "@babel/preset-flow": "^7.22.5", + "@babel/preset-react": "^7.22.5", + "babel-loader": "^8.0.5", + "babel-plugin-css-modules-transform": "^1.6.2", + "babel-plugin-react-css-modules": "^5.2.6", + "babel-plugin-transform-imports": "^2.0.0", + "babel-preset-env": "^1.7.0", + "babel-preset-es2015": "^6.24.1", "promise-window": "^1.2.1", - "react-16": "npm:react@16.13.1", - "react-dom-16": "npm:react-dom@16.13.1", - "react-error-overlay": "6.0.9" + "react-hot-loader": "^4.13.0", + "webpack-cli": "^5.1.4" } } diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index 4e4fc9c9..eccd320f 100755 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -37,7 +37,6 @@ import UpdateAuthentication from "./views/UpdateAuthentication.jsx"; import FrameworkWrapper from "./views/FrameworkWrapper.jsx"; import ScrollToTop from "./components/ScrollToTop"; import AlertTemplate from "./components/AlertTemplate"; -import { useAlert, positions, Provider } from "react-alert"; import { isMobile } from "react-device-detect"; import RuntimeDebugger from "./components/RuntimeDebugger.jsx" @@ -160,10 +159,6 @@ const App = (message, props) => { // Dumb for content load (per now), but good for making the site not suddenly reload parts (ajax thingies) - const options = { - timeout: 9000, - position: positions.BOTTOM_LEFT, - }; const handleFirstInteraction = (event) => { console.log("First interaction: ", event) @@ -566,9 +561,7 @@ const App = (message, props) => { - - {includedData} - + {includedData} { const deleteCache = (orgId, key) => { toast("Attempting to delete Cache"); - fetch(globalUrl + `/api/v1/orgs/${orgId}/cache/${key}`, { - method: "DELETE", + + // method: "DELETE", + const method = "POST" + //const url = `${globalUrl}/api/v1/orgs/${orgId}/cache/${key}` + const url = `${globalUrl}/api/v1/orgs/${orgId}/delete_cache` + const parsed = { + "org_id": orgId, + "key": key, + } + + fetch(url, { + method: method, headers: { Accept: "application/json", }, + body: JSON.stringify(parsed), credentials: "include", }) .then((response) => { diff --git a/frontend/src/components/ConfigureWorkflow.jsx b/frontend/src/components/ConfigureWorkflow.jsx index 189a1cf6..81e9fd3d 100755 --- a/frontend/src/components/ConfigureWorkflow.jsx +++ b/frontend/src/components/ConfigureWorkflow.jsx @@ -32,6 +32,8 @@ import { import { FixName } from "../views/Apps.jsx"; import aa from 'search-insights' +import AuthenticationOauth2 from "../components/Oauth2Auth.jsx"; + // Handles workflow updates on first open to highlight the issues of the workflow // Variables // Action (exists, missing fields) @@ -60,6 +62,8 @@ const ConfigureWorkflow = (props) => { setAuthenticationType, setAuthenticationModalOpen, setConfigureWorkflowModalOpen, + + setConfigurationFinished, } = props; const [requiredActions, setRequiredActions] = React.useState([]); @@ -70,9 +74,19 @@ const ConfigureWorkflow = (props) => { const [firstLoad, setFirstLoad] = React.useState(""); const [showFinalizeAnimation, setShowFinalizeAnimation] = React.useState(false); const [loopRunning, setLoopRunning] = useState(false) - const [checkStarted, setCheckStarted] = React.useState(false); + useEffect(() => { + console.log("Required actions: ", requiredActions) + if (requiredActions.length === 0) { + console.log("No more actions? Set parent to done?") + + if (setConfigurationFinished !== undefined) { + setConfigurationFinished(true) + } + } + }, [requiredActions]) + const stop = () => { setLoopRunning(false) } @@ -81,6 +95,7 @@ const ConfigureWorkflow = (props) => { setLoopRunning(true) } + useEffect(() => { if (loopRunning) { const intervalId = setInterval(() => { @@ -159,7 +174,6 @@ const ConfigureWorkflow = (props) => { return response.json(); }) .then((responseJson) => { - console.log("ACTION: ", responseJson); if ( responseJson.actions !== undefined && responseJson.actions !== null @@ -215,6 +229,9 @@ const ConfigureWorkflow = (props) => { // without version match const newappname = action.app_name.toLowerCase().replaceAll(" ", "_") const app = apps.find((app) => app.id === action.app_id || app.name.toLowerCase().replaceAll(" ", "_") === newappname) + + + if (app === undefined || app === null) { const subapp = apps.find(app => app.name === action.app_name) @@ -229,47 +246,51 @@ const ConfigureWorkflow = (props) => { "required": true, }) } else { + if (action.authentication_id === "" && app.authentication.required === true && action.parameters !== undefined && action.parameters !== null) { - // Check if configuration is filled or not + // Check if configuration is filled or not var filled = true; for (let [key,keyval] in Object.entries(action.parameters)) { if (action.parameters[key].configuration) { - //console.log("Found config: ", action.parameters[key]) - if ( - action.parameters[key].value === null || - action.parameters[key].value.length === 0 - ) { + if (action.parameters[key].value === null || action.parameters[key].value.length === 0) { filled = false; break; } } } + if (app.authentication.type === "oauth2" || app.authentication.type === "oauth2-app") { + filled = false + + action.auth_type = "oauth2" + } + newaction.steps.push({ "title": "Authenticate app", "type": "authenticate", "required": true, + "auth_type": app.authentication.type, }) if (!filled) { newaction.must_authenticate = true; newaction.action_ids.push(action.id); } - } else if (action.authentication_id !== "" && app.authentication.required === true) { - console.log("Should verify authentication ID ", action.authentication_id) + + } else if (action.authentication_id !== undefined && action.authentication_id !== null && action.authentication_id !== "" && app.authentication.required === true) { + console.log("FIXME: Should verify authentication ID ", action.authentication_id) } newaction.app = app; } - if ( - action.errors !== undefined && - action.errors !== null && - action.errors.length > 0 - ) { + + if (newaction.errors !== undefined && newaction.errors !== null && newaction.errors.length > 0) { //console.log("Node has errors!: ", action.errors) } + //console.log(newaction.app_name,"AUTH: ", newaction.must_authenticate, " ACTIVATE: ", newaction.must_activate) + if (newaction.must_authenticate) { var authenticationOptions = []; for (let [key,keyval] in Object.entries(appAuthentication)) { @@ -395,29 +416,29 @@ const ConfigureWorkflow = (props) => { setRequiredActions(newactions); } - if (appAuthentication !== undefined && previousAuth !== undefined && appAuthentication.length !== previousAuth.length) { - var newactions = [] - for (let [actionkey, actionkeyval] in Object.entries(requiredActions)) { - var newaction = requiredActions[actionkey]; - const app = newaction.app; + if (appAuthentication !== undefined && previousAuth !== undefined && appAuthentication.length !== previousAuth.length) { + var newactions = [] + for (let [actionkey, actionkeyval] in Object.entries(requiredActions)) { + var newaction = requiredActions[actionkey]; + const app = newaction.app; - for (let [key,keyval] in Object.entries(appAuthentication)) { - const auth = appAuthentication[key]; + for (let [key,keyval] in Object.entries(appAuthentication)) { + const auth = appAuthentication[key]; - // Does this account for all the different ones of the same? - if (auth.app.name === app.name && auth.active === true) { - newaction.auth_done = true; - break; + // Does this account for all the different ones of the same? + if (auth.app.name === app.name && auth.active === true) { + newaction.auth_done = true; + break; + } } + + newactions.push(newaction); } - newactions.push(newaction); - } - - setRequiredActions(newactions); - setPreviousAuth(appAuthentication); - // Set auth done to true - //"auth_done": false + setRequiredActions(newactions); + setPreviousAuth(appAuthentication); + // Set auth done to true + //"auth_done": false } const TriggerSection = (props) => { @@ -610,14 +631,24 @@ const ConfigureWorkflow = (props) => { const [authFields, setAuthFields] = useState([]) const [sensitiveFields, setSensitiveFields] = useState([]) + //console.log("ACTION", action) + + useEffect(() => { + if (finalized === true) { + setOpened(false) + setFilled(true) + } + }, [finalized]) + if (authFields.length === 0 && opened === true) { // Loop through fields of the action + var newfields = [] - const params = action.action.parameters - var sensitiveIndexes = [] var index = 0 + var sensitiveIndexes = [] + const params = action.action.parameters for (let key in params) { const param = params[key] @@ -732,9 +763,34 @@ const ConfigureWorkflow = (props) => { : null} + {opened ?
- {authFields.map((field, index) => { + + {action.app.authentication.type === "oauth2-app" || action.app.authentication.type === "oauth2" || action.auth_type === "oauth2" ? +
+ +
+ : + authFields.map((field, index) => { + console.log("THESE FIELDS?: ", field) + var parsedName = field.key // Remove _basic at the end if it exists if (parsedName.toLowerCase().endsWith("_basic")) { @@ -807,25 +863,28 @@ const ConfigureWorkflow = (props) => {
) })} - + {action.app.authentication.type !== "oauth2-app" && action.app.authentication.type !== "oauth2" ? + + : null} : null} @@ -1237,19 +1296,22 @@ const ConfigureWorkflow = (props) => { return (
-
+
{setConfigureWorkflowModalOpen !== undefined ? - {workflow.name} + + {workflow.name} + : null } - - Please configure the following apps for automatic startup of automation: - {requiredActions.length > 0 ? ( + + Please configure the following steps to help us complete your workflow. This can also be done later. + + {setConfigureWorkflowModalOpen !== undefined ? Required Actions @@ -1258,6 +1320,11 @@ const ConfigureWorkflow = (props) => { {requiredActions.map((data, index) => { + + // AppWrapper = Default in a workflow, only shows with steps + // AppSection = + // AppSectionSelfcontained = default for template generator + return (
{data.steps !== undefined && data.steps !== null && data.show_steps === true && setConfigureWorkflowModalOpen !== undefined ? diff --git a/frontend/src/components/NewHeader.jsx b/frontend/src/components/NewHeader.jsx index e9891240..277b1a40 100644 --- a/frontend/src/components/NewHeader.jsx +++ b/frontend/src/components/NewHeader.jsx @@ -615,7 +615,7 @@ const Header = (props) => { - Version: 1.3.2 + Version: 1.3.3 diff --git a/frontend/src/components/Oauth2Auth.jsx b/frontend/src/components/Oauth2Auth.jsx index d9b58330..c76a6b59 100755 --- a/frontend/src/components/Oauth2Auth.jsx +++ b/frontend/src/components/Oauth2Auth.jsx @@ -97,6 +97,8 @@ const AuthenticationOauth2 = (props) => { autoAuth, authButtonOnly, isLoggedIn, + + setFinalized, } = props; let navigate = useNavigate(); @@ -489,20 +491,27 @@ const AuthenticationOauth2 = (props) => { var open = true; const timer = setInterval(() => { if (newwin.closed) { - console.log("Closing?") - + console.log("Closing?") setButtonClicked(false); clearInterval(timer); //alert('"Secure Payment" window closed!'); - // - if (getAppAuthentication !== undefined) { - getAppAuthentication(true, true, true); - } + if (getAppAuthentication !== undefined) { + getAppAuthentication(true, true, true); + } + + // This is more a guess than anything + // Should be handled in getAppAuthentication() + // in the parent component to make it accurate, + // seeing as we don't know what the parent component + // wants to happen + if (setFinalized !== undefined) { + setFinalized(true) + } } else { - console.log("Not closed") - } + console.log("Not closed") + } }, 1000); //do { // setTimeout(() => { diff --git a/frontend/src/components/ParsedAction.jsx b/frontend/src/components/ParsedAction.jsx index 66c159a0..aef01467 100755 --- a/frontend/src/components/ParsedAction.jsx +++ b/frontend/src/components/ParsedAction.jsx @@ -3373,14 +3373,16 @@ const ParsedAction = (props) => { variant="outlined" color="secondary" /> - : null} - - {data.label} + : null} + {data.app.app_version !== undefined && data.app.app_version !== null && data.app.app_version !== "" && data.app.app_version !== "undefined" ? + + : null} + {data.label} ); })} diff --git a/frontend/src/components/ShuffleCodeEditor.jsx b/frontend/src/components/ShuffleCodeEditor.jsx index 39b1a26c..c1926c72 100644 --- a/frontend/src/components/ShuffleCodeEditor.jsx +++ b/frontend/src/components/ShuffleCodeEditor.jsx @@ -47,6 +47,7 @@ import ReactJson from "react-json-view"; import PaperComponent from "../components/PaperComponent.jsx"; import CodeMirror from '@uiw/react-codemirror'; +import { python } from '@codemirror/lang-python'; //import 'codemirror/keymap/sublime'; //import 'codemirror/addon/selection/mark-selection.js' //import 'codemirror/theme/gruvbox-dark.css'; @@ -212,6 +213,80 @@ const CodeEditor = (props) => { expectedOutput(localcodedata) }, []) + useEffect(() => { + expectedOutput(localcodedata) + }, [availableVariables]) + + var to_be_copied = ""; + const HandleJsonCopy = (base, copy, base_node_name) => { + if (typeof copy.name === "string") { + copy.name = copy.name.replaceAll(" ", "_"); + } + + //lol + if (typeof base === 'object' || typeof base === 'dict') { + base = JSON.stringify(base) + } + + if (base_node_name === "execution_argument" || base_node_name === "Execution Argument") { + base_node_name = "exec" + } + + console.log("COPY: ", base_node_name, copy); + + //var newitem = JSON.parse(base); + var newitem = validateJson(base).result + + + to_be_copied = "$" + base_node_name.toLowerCase().replaceAll(" ", "_"); + for (let copykey in copy.namespace) { + if (copy.namespace[copykey].includes("Results for")) { + continue; + } + + if (newitem !== undefined && newitem !== null) { + newitem = newitem[copy.namespace[copykey]]; + if (!isNaN(copy.namespace[copykey])) { + to_be_copied += ".#"; + } else { + to_be_copied += "." + copy.namespace[copykey]; + } + } + } + + if (newitem !== undefined && newitem !== null) { + newitem = newitem[copy.name]; + if (!isNaN(copy.name)) { + to_be_copied += ".#"; + } else { + to_be_copied += "." + copy.name; + } + } + + to_be_copied.replaceAll(" ", "_"); + const elementName = "copy_element_shuffle"; + var copyText = document.getElementById(elementName); + if (copyText !== null && copyText !== undefined) { + console.log("NAVIGATOR: ", navigator); + const clipboard = navigator.clipboard; + if (clipboard === undefined) { + toast("Can only copy over HTTPS (port 3443)"); + return; + } + + navigator.clipboard.writeText(to_be_copied); + copyText.select(); + copyText.setSelectionRange(0, 99999); /* For mobile devices */ + + /* Copy the text inside the text field */ + document.execCommand("copy"); + console.log("COPYING!"); + toast("Copied JSON path to clipboard.") + } else { + console.log("Couldn't find element ", elementName); + } + } + const aiSubmit = (value, inputAction) => { if (value === undefined || value === "") { console.log("No value input!") @@ -938,10 +1013,10 @@ const CodeEditor = (props) => { style: { zIndex: 12501, color: "white", - minWidth: isMobile ? "100%" : isFileEditor ? 650 : 1200, - maxWidth: isMobile ? "100%" : isFileEditor ? 650 : 1200, - minHeight: isMobile ? "100%" : 720, - maxHeight: isMobile ? "100%" : 720, + minWidth: isMobile ? "100%" : isFileEditor ? 650 : 1100, + maxWidth: isMobile ? "100%" : isFileEditor ? 650 : 1100, + minHeight: isMobile ? "100%" : 620, + maxHeight: isMobile ? "100%" : 620, border: theme.palette.defaultBorder, padding: isMobile ? "25px 10px 25px 10px" : 25, }, @@ -951,8 +1026,8 @@ const CodeEditor = (props) => { style={{ zIndex: 5000, position: "absolute", - top: 14, - right: 18, + top: 6, + right: 6, color: "grey", }} onClick={() => { @@ -1425,22 +1500,26 @@ const CodeEditor = (props) => { borderRadius: theme.palette.borderRadius, position: "relative", paddingTop: 0, - minHeight: 548, - overflow: "hidden", + // minHeight: 548, + // overflow: "hidden", }}> { console.log("CURSOR: ", value.getCursor()) @@ -1463,8 +1542,9 @@ const CodeEditor = (props) => { }} options={{ mode: validation === true ? "json" : "python", - lineWrapping: linewrap, + lineWrapping: true, theme: vscodeDark, + lineNumbers: true, }} />
@@ -1604,7 +1684,7 @@ const CodeEditor = (props) => { color="primary" style={{ border: `1px solid ${theme.palette.primary.main}`, - marginLeft: 200, + marginLeft: 175, maxHeight: 35, minWidth: 70, }} @@ -1633,8 +1713,8 @@ const CodeEditor = (props) => { borderRadius: 5, border: `2px solid ${theme.palette.inputColor}`, padding: 10, - maxHeight: 500, - minheight: 500, + maxHeight: 450, + minheight: 450, overflow: "auto", }} collapsed={false} @@ -1643,7 +1723,12 @@ const CodeEditor = (props) => { }} displayDataTypes={false} onSelect={(select) => { - //HandleJsonCopy(validate.result, select, "exec"); + var basename = "exec" + if (selectedAction !== undefined && selectedAction !== null && Object.keys(selectedAction).length !== 0) { + basename = selectedAction.label.toLowerCase().replaceAll(" ", "_") + } + + HandleJsonCopy(expOutput, select, basename) }} name={"JSON autocompletion"} /> @@ -1659,10 +1744,10 @@ const CodeEditor = (props) => { marginTop: -2, border: `2px solid ${theme.palette.inputColor}`, borderRadius: theme.palette.borderRadius, - maxHeight: 500, - minHeight: 500, - minWidth: 580, - maxWidth: 580, + maxHeight: 450, + minHeight: 450, + minWidth: 480, + maxWidth: 480, overflow: "auto", whiteSpace: "pre-wrap", }} @@ -1689,7 +1774,7 @@ const CodeEditor = (props) => { }} displayDataTypes={false} onSelect={(select) => { - //HandleJsonCopy(validate.result, select, "exec"); + //HandleJsonCopy(executionResult.result, select, "exec"); }} name={"Test result"} /> @@ -1725,7 +1810,7 @@ const CodeEditor = (props) => {
-
+
- : null} + : null*/} ) @@ -537,6 +649,8 @@ const WorkflowTemplatePopup = (props) => { : ""}
+ +
) } diff --git a/frontend/src/views/AngularWorkflow.jsx b/frontend/src/views/AngularWorkflow.jsx index 0a2220cc..969a30c4 100755 --- a/frontend/src/views/AngularWorkflow.jsx +++ b/frontend/src/views/AngularWorkflow.jsx @@ -1408,13 +1408,20 @@ const AngularWorkflow = (defaultprops) => { const streamUrl = "https://stream.shuffler.io" const url = `${streamUrl}/api/v1/workflows/${props.match.params.key}/stream` + var parsedbody = body + try { + parsedbody = JSON.stringify(body) + } catch (e) { + console.log("Error parsing body for stream: ", e) + } + fetch(url, { method: "POST", headers: { "Content-Type": "application/json", Accept: "application/json", }, - body: JSON.stringify(body), + body: parsedbody, credentials: "include", }) .then((response) => { @@ -2630,7 +2637,6 @@ const AngularWorkflow = (defaultprops) => { const appendChunks = (result) => { var chunk = decoder.decode(result.value || new Uint8Array, {stream: !result.done}); - console.log("Got chunk: ", chunk) if (chunk === undefined || chunk === null) { console.log("Chunk is undefined or null") @@ -2777,8 +2783,11 @@ const AngularWorkflow = (defaultprops) => { if (response.status >= 500) { toast("Something went wrong while loading the workflow. Please reload.") } else { - toast("You don't access to this workflow or loading failed.") - window.location.pathname = "/workflows"; + toast("You don't access to this workflow or loading failed. Redirecting to workflows in a few seconds..") + + setTimeout(() => { + window.location.pathname = "/workflows"; + }, 2000); } } diff --git a/frontend/src/views/AppCreator.jsx b/frontend/src/views/AppCreator.jsx index 33184cc0..71625903 100755 --- a/frontend/src/views/AppCreator.jsx +++ b/frontend/src/views/AppCreator.jsx @@ -916,11 +916,12 @@ const AppCreator = (defaultprops) => { var categoryindex = -1; // Stupid way of finding a category/grouping for (let splitkey in pathsplit) { - if (pathsplit[splitkey].includes("_shuffle_replace_")) { - const regex = /_shuffle_replace_\d/i; - //console.log("NEW: ", - pathsplit[splitkey] = pathsplit[splitkey].replaceAll(new RegExp(regex, 'g'), "") - } + if (pathsplit[splitkey].includes("_shuffle_replace_")) { + //const regex = /_shuffle_replace_\d/i; + const regex = /_shuffle_replace_\d+/i + //console.log("NEW: ", + pathsplit[splitkey] = pathsplit[splitkey].replaceAll(new RegExp(regex, 'g'), "") + } if ( pathsplit[splitkey].length > 0 && @@ -2016,9 +2017,10 @@ const AppCreator = (defaultprops) => { var pathjoin = item.url+"_"+item.method.toLowerCase() if (handledPaths.includes(pathjoin)) { - // Max 100 of same lol - for (let i = 0; i < 100; i++) { - item.url = item.url+"_shuffle_replace_"+i + // Max 1000 of same. Will it be ok for graphql longterm? + const baseurl = item.url + for (let i = 0; i < 1000; i++) { + item.url = baseurl+"_shuffle_replace_"+i pathjoin = item.url+"_"+item.method.toLowerCase() if (handledPaths.includes(pathjoin)) { @@ -2596,9 +2598,16 @@ const AppCreator = (defaultprops) => { }) .then((responseJson) => { if (!responseJson.success) { + if (responseJson.extra !== undefined && responseJson.extra !== null) { + toast("Failed building: " + responseJson.extra); + } + if (responseJson.reason !== undefined) { setErrorCode(responseJson.reason); - toast("Failed to verify: " + responseJson.reason); + + if (responseJson.extra === undefined && responseJson.extra === null) { + toast("Failed to verify: " + responseJson.reason); + } } } else { toast("Successfully uploaded openapi"); @@ -3401,13 +3410,13 @@ const AppCreator = (defaultprops) => { }} label={parsedChip} onClick={() => { - if (chipRequired) { - currentAction["required_bodyfields"].splice(currentAction["required_bodyfields"].indexOf(chipData), 1) - } else { - currentAction["required_bodyfields"].push(chipData) - } + if (chipRequired) { + currentAction["required_bodyfields"].splice(currentAction["required_bodyfields"].indexOf(chipData), 1) + } else { + currentAction["required_bodyfields"].push(chipData) + } - setCurrentAction(currentAction); + setCurrentAction(currentAction); setChipRequired(!chipRequired); }} /> @@ -3729,27 +3738,6 @@ const AppCreator = (defaultprops) => { onClose={() => { console.log("Closing modal"); - // Old: This had some issue with arrays - //setUrlPath(""); - //setCurrentAction({ - // name: "", - // description: "", - // url: "", - // file_field: "", - // headers: "", - // paths: [], - // queries: [], - // body: "", - // errors: [], - // method: actionNonBodyRequest[0], - // action_label: "No Label", - // required_bodyfields: [], - //}); - //setCurrentActionMethod(apikeySelection[0]); - //setUrlPathQueries([]); - //setActionsModalOpen(false); - //setFileUploadEnabled(false); - console.log(currentAction); const errors = getActionErrors(); addActionToView(errors); @@ -3789,7 +3777,8 @@ const AppCreator = (defaultprops) => { variant="outlined" defaultValue={currentAction["name"]} onChange={(e) => { - setActionField("name", e.target.value); + var trimmed = e.target.value.trim(); + setActionField("name", trimmed) }} onBlur={(e) => { // Fix basic issues in frontend. Python functions run a-zA-Z0-9_ @@ -3798,6 +3787,18 @@ const AppCreator = (defaultprops) => { if (found !== null) { setActionField("name", found.join("")); } + + // Look through all actions and see if there is one with the same name + if (currentAction.url === "" && actions !== undefined && actions !== null && actions.length > 0) { + for (var i = 0; i < actions.length; i++) { + if (actions[i].name.toLowerCase() === e.target.value.toLowerCase()) { + toast("Action with name " + e.target.value + " already exists. If you keep this, it will be overwritten.") + break + } + } + + } + }} key={currentAction} InputProps={{ @@ -4283,6 +4284,7 @@ const AppCreator = (defaultprops) => { > Submit + {/* + */}
@@ -4501,7 +4504,7 @@ const AppCreator = (defaultprops) => { style={{ borderRadius: 0, position: "absolute", top: 70, }} variant={actions.length === 0 ? "contained" : "outlined"} onClick={(e) => { - e.preventDefault(); + e.preventDefault(); setCurrentActionMethod(actionNonBodyRequest[0]); setCurrentAction({ @@ -4515,8 +4518,8 @@ const AppCreator = (defaultprops) => { body: "", errors: [], method: actionNonBodyRequest[0], - action_label: "No Label", - required_bodyfields: [], + action_label: "No Label", + required_bodyfields: [], }); setActionsModalOpen(true); }} @@ -4533,20 +4536,20 @@ const AppCreator = (defaultprops) => { //console.log("Actions: ", filteredActions) if (filteredActions === null || filteredActions === undefined || filteredActions.length === 0) { - return null - } + return null + } - return ( + return (
{filteredActions.slice(0, actionAmount).map((data, index) => { //console.log("Found action: ", data) - return ( - - ) - })} -
- ) - } + return ( + + ) + })} + + ) + } diff --git a/frontend/src/views/Docs.jsx b/frontend/src/views/Docs.jsx index ef7f3bad..37bcec0a 100755 --- a/frontend/src/views/Docs.jsx +++ b/frontend/src/views/Docs.jsx @@ -523,6 +523,12 @@ const Docs = (defaultprops) => { ); } + if (extraInfo !== "" && props.level === 1 && props.children !== undefined && props.children !== null && props.children.length > 0) { + if (props.children[0].toLowerCase().includes("privacy") || props.children[0].toLowerCase().includes("terms")) { + extraInfo = "" + } + } + return ( { diff --git a/frontend/src/views/Workflows.jsx b/frontend/src/views/Workflows.jsx index 73f02cc2..001fdd89 100755 --- a/frontend/src/views/Workflows.jsx +++ b/frontend/src/views/Workflows.jsx @@ -2199,15 +2199,15 @@ const Workflows = (props) => { // Can create and set workflows const setNewWorkflow = ( - name, - description, - tags, - defaultReturnValue, - editingWorkflow, - redirect, - currentUsecases, - inputblogpost, - inputstatus, + name, + description, + tags, + defaultReturnValue, + editingWorkflow, + redirect, + currentUsecases, + inputblogpost, + inputstatus, ) => { var method = "POST"; var extraData = ""; @@ -2292,7 +2292,7 @@ const Workflows = (props) => { }) .catch((error) => { toast(error.toString()); - setSubmitLoading(false) + setSubmitLoading(false) setModalOpen(false); setSubmitLoading(false); }); From d6f9c7b6b3f18f870960a5d17e6ca5e712e210ca Mon Sep 17 00:00:00 2001 From: Frikky Date: Thu, 25 Jan 2024 20:13:45 +0100 Subject: [PATCH 35/42] Made logo show up, and fixed notification loading problems onprem --- backend/go-app/main.go | 4 +++- frontend/public/images/logos/topleft_logo.svg | 6 ++++++ frontend/src/App.jsx | 5 +++-- frontend/src/components/NewHeader.jsx | 9 +++++---- 4 files changed, 17 insertions(+), 7 deletions(-) create mode 100644 frontend/public/images/logos/topleft_logo.svg diff --git a/backend/go-app/main.go b/backend/go-app/main.go index 31d0e85f..b702f16d 100755 --- a/backend/go-app/main.go +++ b/backend/go-app/main.go @@ -4945,10 +4945,12 @@ func initHandlers() { r.HandleFunc("/api/v1/files", shuffle.HandleGetFiles).Methods("GET", "OPTIONS") // Introduced in 0.9.21 to handle notifications for e.g. failed Workflow + r.HandleFunc("/api/v1/notifications", shuffle.HandleCreateNotification).Methods("POST", "OPTIONS") r.HandleFunc("/api/v1/notifications", shuffle.HandleGetNotifications).Methods("GET", "OPTIONS") r.HandleFunc("/api/v1/notifications/clear", shuffle.HandleClearNotifications).Methods("GET", "OPTIONS") r.HandleFunc("/api/v1/notifications/{notificationId}/markasread", shuffle.HandleMarkAsRead).Methods("GET", "OPTIONS") - //r.HandleFunc("/api/v1/notifications/{notificationId}/markasread", shuffle.HandleMarkAsRead).Methods("GET", "OPTIONS") + + r.HandleFunc("/api/v1/users/notifications", shuffle.HandleCreateNotification).Methods("POST", "OPTIONS") r.HandleFunc("/api/v1/users/notifications", shuffle.HandleGetNotifications).Methods("GET", "OPTIONS") r.HandleFunc("/api/v1/users/notifications/clear", shuffle.HandleClearNotifications).Methods("GET", "OPTIONS") r.HandleFunc("/api/v1/users/notifications/{notificationId}/markasread", shuffle.HandleMarkAsRead).Methods("GET", "OPTIONS") diff --git a/frontend/public/images/logos/topleft_logo.svg b/frontend/public/images/logos/topleft_logo.svg new file mode 100644 index 00000000..95895320 --- /dev/null +++ b/frontend/public/images/logos/topleft_logo.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index eccd320f..f2a79f65 100755 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -8,8 +8,8 @@ import Workflows from "./views/Workflows"; import GettingStarted from "./views/GettingStarted"; import AngularWorkflow from "./views/AngularWorkflow.jsx"; -//import Header from "./components/NewHeader.jsx"; -import Header from "./components/Header.jsx"; +import Header from "./components/NewHeader.jsx"; +//import Header from "./components/Header.jsx"; import theme from "./theme"; import Apps from "./views/Apps"; import AppCreator from "./views/AppCreator"; @@ -240,6 +240,7 @@ const App = (message, props) => { setCookie={setCookie} cookies={cookies} checkLogin={checkLogin} + notifications={notifications} {...props} /> } diff --git a/frontend/src/components/NewHeader.jsx b/frontend/src/components/NewHeader.jsx index 277b1a40..558d0c72 100644 --- a/frontend/src/components/NewHeader.jsx +++ b/frontend/src/components/NewHeader.jsx @@ -235,7 +235,7 @@ const Header = (props) => { setLoginHoverColor(hoverOutColor); }; - const notificationWidth = 300 + const notificationWidth = 335 const imagesize = 22; const boxColor = "#86c142"; @@ -398,7 +398,8 @@ const Header = (props) => { - - ) - })} -
- : null*/}
- {/* - - Line Wrap - { - if (linewrap) { - setlinewrap(false) - } - if (!linewrap){ - setlinewrap(true) - } - }} - defaultChecked - size="small" - sx={{ - color: orange[600], - '&.Mui-checked': { - color: orange[800], - }, - }} - /> - - - - Dark Theme - { - if (codeTheme === "gruvbox-dark") { - setcodeTheme("duotone-light") - } - if (codeTheme === "duotone-light"){ - setcodeTheme("gruvbox-dark") - } - }} - defaultChecked - size="small" - sx={{ - color: orange[600], - '&.Mui-checked': { - color: orange[800], - }, - }} - /> - - */} -
@@ -1673,88 +1567,93 @@ const CodeEditor = (props) => { display: "flex", }} > - - Expected Output - - - - - +
+ + Expected Output + +
} - - {isMobile ? null : - validation === true ? - + + + + + {isMobile ? null : + validation === true ? + { + //handleReactJsonClipboard(copy); + }} + displayDataTypes={false} + onSelect={(select) => { + var basename = "exec" + if (selectedAction !== undefined && selectedAction !== null && Object.keys(selectedAction).length !== 0) { + basename = selectedAction.label.toLowerCase().replaceAll(" ", "_") + } + + HandleJsonCopy(expOutput, select, basename) + }} + name={"JSON autocompletion"} + /> + : +

+ {expOutput} +

+ } + {executionResult.valid === true ? { : - - No test output yet. - + +
+ + Output is based on the last VALID run of the node(s) you are referencing. Only updates when you refresh the Workflow Window. + + + No test output yet. + +
} {executionResult.errors !== undefined && executionResult.errors !== null && executionResult.errors.length > 0 ? diff --git a/frontend/src/views/AngularWorkflow.jsx b/frontend/src/views/AngularWorkflow.jsx index 4fc4caaa..ed968653 100755 --- a/frontend/src/views/AngularWorkflow.jsx +++ b/frontend/src/views/AngularWorkflow.jsx @@ -9267,15 +9267,21 @@ const AngularWorkflow = (defaultprops) => { break } + const execution = workflowExecutions[executionKey] if (execution.execution_argument === undefined || execution.execution_argument === null || execution.execution_argument.length < 2) { continue } + if (execution.execution_argument.includes("too large ")) { + continue + } + if (availableArguments.includes(execution.execution_argument)) { continue } + availableArguments.push(execution.execution_argument) } } diff --git a/frontend/src/views/SettingsPage.jsx b/frontend/src/views/SettingsPage.jsx index 68acae51..2b0c1ebd 100755 --- a/frontend/src/views/SettingsPage.jsx +++ b/frontend/src/views/SettingsPage.jsx @@ -290,59 +290,6 @@ const Settings = (props) => { } }; - // const registerProviders = (userdata) => { - // // Register hooks here - // detectEthereumProvider().then((provider) => { - // if (provider) { - // if (!provider.isMetaMask) { - // toast("Only MetaMask is supported as of now."); - // return; - // } - - // // Find the ethereum network - // // Get the users' account(s) - // //toast("Connecting to MetaMask") - // //console.log("Connected: ", provider.isConnected()) - - // if (!provider.isConnected()) { - // toast("Metamask is not connected."); - // return; - // } - - // provider.on("message", (event) => { - // toast("Ethereum message: ", event); - // }); - - // provider.on("chainChanged", (chainId) => { - // console.log("Changed chain to: ", chainId); - - // const method = "eth_getBalance"; - // const params = [userdata.eth_info.account, "latest"]; - // provider - // .request({ - // method: method, - // params, - // }) - // .then((result) => { - // console.log("Got result: ", result); - // if (result !== undefined && result !== null) { - // userdata.eth_info.balance = result; - // userdata.eth_info.parsed_balance = result / 1000000000000000000; - // console.log("INFO: ", userdata); - // setUserData(userdata); - // } else { - // toast("Couldn't find balance: ", result); - // } - // }) - // .catch((error) => { - // // If the request fails, the Promise will reject with an error. - // toast("Failed getting info from ethereum API: " + error); - // }); - // }); - // } - // }); - // }; - // This should "always" have data useEffect(() => { if (firstrequest) { diff --git a/frontend/src/views/Workflows.jsx b/frontend/src/views/Workflows.jsx index 3cd86c64..7f78244a 100755 --- a/frontend/src/views/Workflows.jsx +++ b/frontend/src/views/Workflows.jsx @@ -1336,16 +1336,21 @@ const Workflows = (props) => { }; const exportAllWorkflows = (allWorkflows) => { - for (var i = 0; i < allWorkflows.length; i++) { - console.log(allWorkflows[i]) - setTimeout(() => { - console.log(allWorkflows[i]) - exportWorkflow(allWorkflows[i], false) - }, i * 200); - } + for (var i = 0; i < allWorkflows.length; i++) { + const wf = allWorkflows[i] - toast(`Exporting and keeping original for all ${allWorkflows.length} workflows`); - }; + if (wf === undefined || wf.id === undefined) { + continue + } + + console.log("Exporting workflow: ", wf) + setTimeout(() => { + exportWorkflow(JSON.parse(JSON.stringify(wf)), false) + }, i * 100); + } + + toast(`Exporting and keeping original for all ${allWorkflows.length} workflows`); + } const deduplicateIds = (data, skip_sanitize) => { if (data.triggers !== null && data.triggers !== undefined) { @@ -1498,7 +1503,12 @@ const Workflows = (props) => { }; const exportWorkflow = (data, sanitize) => { - data = JSON.parse(JSON.stringify(data)); + try { + data = JSON.parse(JSON.stringify(data)); + } catch (e) { + console.log("Failed to parse JSON: ", e); + } + let exportFileDefaultName = data.name + ".json"; if (sanitize === true) { diff --git a/functions/onprem/worker/go.sum b/functions/onprem/worker/go.sum index d8b5d719..90bc2968 100644 --- a/functions/onprem/worker/go.sum +++ b/functions/onprem/worker/go.sum @@ -376,6 +376,8 @@ github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/shuffle/shuffle-shared v0.5.61 h1:Fkd7pvk8ypwaio1VvMOmJ6PQF9xCfNYx8RWjPnXjn5E= github.com/shuffle/shuffle-shared v0.5.61/go.mod h1:oIZkx93Z7EvtiTXty7xO+ax63Fjz8MQvjXMxDN0Qws0= +github.com/shuffle/shuffle-shared v0.5.63 h1:Ukjj1ThyTvcoPCi0Hhxp+BbD8VfI1xr4Xyyhh3URb3Q= +github.com/shuffle/shuffle-shared v0.5.63/go.mod h1:oIZkx93Z7EvtiTXty7xO+ax63Fjz8MQvjXMxDN0Qws0= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/skeema/knownhosts v1.2.1 h1:SHWdIUa82uGZz+F+47k8SY4QhhI291cXCpopT1lK2AQ= From f8bbfb0fdb0f38294c89fc9867bd664ddbd9c19d Mon Sep 17 00:00:00 2001 From: Frikky Date: Wed, 31 Jan 2024 10:54:56 +0100 Subject: [PATCH 42/42] Fixed execution mapping problems in workflows for 1.3.2 --- backend/app_sdk/app_base.py | 18 +- frontend/src/components/ParsedAction.jsx | 219 ++++++++++---------- frontend/src/components/RuntimeDebugger.jsx | 84 +++++++- frontend/src/views/AngularWorkflow.jsx | 47 ++--- 4 files changed, 217 insertions(+), 151 deletions(-) diff --git a/backend/app_sdk/app_base.py b/backend/app_sdk/app_base.py index 3ded5fba..a29853d8 100755 --- a/backend/app_sdk/app_base.py +++ b/backend/app_sdk/app_base.py @@ -1178,7 +1178,7 @@ class AppBase: #ret = ret[0] self.logger.info("[DEBUG] DONT make list of 1 into 0!!") - self.logger.info("Return from execution: %s" % ret) + #self.logger.info("Return from execution: %s" % ret) if ret == None: results.append("") json_object = False @@ -1202,11 +1202,12 @@ class AppBase: except: results.append(ret) - if len(results) == 1: - #results = results[0] - self.logger.info("DONT MAKE LIST FROM 1 TO 0!!") + #if len(results) == 1: + # #results = results[0] + # #self.logger.info("DONT MAKE LIST FROM 1 TO 0!!") + # pass - self.logger.info("\nLOOP: %s\nRESULTS: %s" % (loop_wrapper, results)) + #self.logger.info("\nLOOP: %s\nRESULTS: %s" % (loop_wrapper, results)) return results # Downloads all files from a namespace @@ -3305,7 +3306,7 @@ class AppBase: pass - self.logger.info(f"""HANDLING BODY: {action["parameters"][counter]["value"]}""") + #self.logger.info(f"""HANDLING BODY: {action["parameters"][counter]["value"]}""") action["parameters"][counter]["value"] = recurse_cleanup_script(action["parameters"][counter]["value"]) #self.logger.info(action["parameters"]) @@ -3345,9 +3346,8 @@ class AppBase: "exception": f"Value Error: {check}", })) - if parameter["name"] == "body": - #self.logger.info(f"[INFO] Should debug field with liquid and other checks as it's BODY: {value}") - pass + #if parameter["name"] == "body": + # #self.logger.info(f"[INFO] Should debug field with liquid and other checks as it's BODY: {value}") # Custom format for ${name[0,1,2,...]}$ #submatch = "([${]{2}([0-9a-zA-Z_-]+)(\[.*\])[}$]{2})" diff --git a/frontend/src/components/ParsedAction.jsx b/frontend/src/components/ParsedAction.jsx index aef01467..68366fe4 100755 --- a/frontend/src/components/ParsedAction.jsx +++ b/frontend/src/components/ParsedAction.jsx @@ -175,8 +175,6 @@ const ParsedAction = (props) => { } = props; const classes = useStyles(); - //const alert = useAlert() - const [hideBody, setHideBody] = React.useState(true); const [activateHidingBodyButton, setActivateHidingBodyButton] = React.useState(false); @@ -185,31 +183,34 @@ const ParsedAction = (props) => { const [autoCompleting, setAutocompleting] = React.useState(false); + useEffect(() => { + if (setLastSaved !== undefined) { + setLastSaved(false) + } + }, [expansionModalOpen]) useEffect(() => { - if (setLastSaved !== undefined) { - setLastSaved(false) - } - }, [expansionModalOpen]) + if (selectedAction.parameters === null || selectedAction.parameters === undefined) { + return + } - useEffect(() => { - if (selectedAction.parameters !== null && selectedAction.parameters !== undefined) { - const paramcheck = selectedAction.parameters.find(param => param.name === "body") - //console.log("LOADED! Change hideBody based on input? Action: ", selectedAction, paramcheck) - if (paramcheck !== undefined && paramcheck !== null) { - if (paramcheck.id === "TOGGLED"){ - setHideBody(false) - setActivateHidingBodyButton(false) - } else { - setHideBody(true) + const paramcheck = selectedAction.parameters.find(param => param.name === "body") + if (paramcheck === undefined || paramcheck === null) { + return + } - if (paramcheck.id === "UNTOGGLED") { - setActivateHidingBodyButton(false) - } - } - } + // This was just opposite.. + if (paramcheck.id === "TOGGLED"){ + setHideBody(true) + } else { + setHideBody(false) + + if (paramcheck.id === "UNTOGGLED") { + setActivateHidingBodyButton(false) } - }, []) + } + + }, []) const keywords = [ "len(", @@ -1190,14 +1191,14 @@ const ParsedAction = (props) => { } return ( - ); }} @@ -1360,20 +1361,6 @@ const ParsedAction = (props) => { var disabled = false; var rows = "3"; var openApiHelperText = "This is an OpenAPI specific field"; - /* - if ( - selectedApp.generated && - data.name === "url" && - data.required && - data.configuration - ) { - //&& - //hideExtraTypes - - //console.log("GENERATED WITH DATA: ", data); - return null; - } - */ if (selectedApp.generated && data.name === "headers") { //console.log("HEADER: ", data) @@ -1386,8 +1373,9 @@ const ParsedAction = (props) => { const hideBodyButtonValue = (
{ > { color: theme.palette.primary.secondary, }} onChange={(event) => { - var tag = "TOGGLED" - if (hideBody) { - tag = "UNTOGGLED" - } + var tag = "TOGGLED" + if (hideBody) { + tag = "UNTOGGLED" + } - setHideBody(!hideBody); - + setHideBody(!hideBody) for (let paramkey in Object.entries(selectedActionParameters)) { var currentItem = selectedActionParameters[paramkey]; if (currentItem.name === "ssl_verify") { @@ -1423,21 +1410,33 @@ const ParsedAction = (props) => { } if (currentItem.name === "body") { - // FIXME: Workaround for toggling, as actions don't have IDs. - // May screw up something in the future. currentItem.id = tag } if (currentItem.description === openApiFieldDesc) { - currentItem.field_active = !hideBody; - //console.log("Changing", currentItem); + currentItem.field_active = !hideBody } } + + + // Scroll to hide_body_button + setTimeout(() => { + var element = document.getElementById("hide_body_button") + if (element !== undefined && element !== null) { + // Keep the button a little below the top + element.scrollIntoView({ + behavior: "smooth", + block: "center", + }) + } + }, 100) + + }} name="requires_unique" /> } - label={"Automatically fix body"} + label={hideBody ? "Show Body" : "Hide Body"} />
@@ -1447,6 +1446,8 @@ const ParsedAction = (props) => { const regex = /\${(\w+)}/g; const found = placeholder.match(regex); + // setActivateHidingBodyButton(false) + // hideBodyButton = hideBodyButtonValue; if (found === null || !hideBody) { if (found === null) { @@ -1455,13 +1456,13 @@ const ParsedAction = (props) => { //console.log("In found: ", found, hideBody) } } else { - //console.log("SHOW BUTTON"); rows = "1"; disabled = true; openApiHelperText = "OpenAPI spec: fill the following fields."; - //console.log("SHOULD ADD TO selectedActionParameters!: ", found, selectedActionParameters) + var changed = false; + var tempArray = [] for (let specKey in found) { const tmpitem = found[specKey]; var skip = false; @@ -1490,7 +1491,7 @@ const ParsedAction = (props) => { } } - selectedActionParameters.push({ + tempArray.push({ action_field: "", configuration: false, description: openApiFieldDesc, @@ -1506,11 +1507,39 @@ const ParsedAction = (props) => { value: "", variant: "STATIC_VALUE", field_active: true, + + autocompleted: true, }); } + + console.log("TEMP ARRAY: ", tempArray) + var required = selectedActionParameters.filter(item => item.required === true) + var notRequired = selectedActionParameters.filter(item => item.required === false) + + if (tempArray.length > 0) { + // Sort tempArray based on tempArray.required + tempArray.sort((a, b) => (a.required < b.required) ? 1 : -1) + // Add all items to the selectedActionParameters array + for (let innerkey in tempArray) { + tempArray[innerkey].id = "ADDED" + + if (tempArray[innerkey].required === true) { + required.push(tempArray[innerkey]) + } else { + notRequired.push(tempArray[innerkey]) + } + } + } + //selectedActionParameters if (changed) { - setSelectedActionParameters(selectedActionParameters); + // Sort selectedActionParameters based on selectedActionParameters.required + //selectedActionParameters.sort((a, b) => (a.required < b.required) ? 1 : -1) + // Find the "headers" and "queries" field names and put them on the first indexes anyway + var newArray = required.concat(notRequired) + + + setSelectedActionParameters(newArray) } return hideBodyButton; @@ -1523,9 +1552,6 @@ const ParsedAction = (props) => { const clickedFieldId = "rightside_field_" + count; - // 0) { baseHelperText = calculateHelpertext(data.value) @@ -1619,33 +1645,15 @@ const ParsedAction = (props) => { helperText={returnHelperText(data.name, data.value)} onClick={() => { console.log("Clicked field: ", clickedFieldId, data.name) + /* + setExpansionModalOpen(false); + */ - //if (data.name === "file_id") { - // console.log("show file video?") - // if (setShowVideo !== undefined) { - // setShowVideo("https://www.youtube.com/embed/DPYowyTbsSk") - // } - //} - //(data.name.toLowerCase().includes("api") || - /* - setExpansionModalOpen(false); - if ( - setScrollConfig !== undefined && - scrollConfig !== null && - scrollConfig !== undefined && - scrollConfig.selected !== clickedFieldId - ) { - scrollConfig.selected = clickedFieldId; - setScrollConfig(scrollConfig); - //console.log("Change field id!") - } - */ - - //console.log("Clicked field: ", clickedFieldId) if (setScrollConfig !== undefined && scrollConfig !== null && scrollConfig !== undefined && scrollConfig.selected !== clickedFieldId) { + console.log("IN SCROLL CONFIG!") + scrollConfig.selected = clickedFieldId setScrollConfig(scrollConfig) - //console.log("Change field id!") } }} id={clickedFieldId} @@ -2476,19 +2484,19 @@ const ParsedAction = (props) => { ) : null} - {hasAutocomplete === true ? - - - - : - null} + {hasAutocomplete === true ? + + + + : + null}
{ const parsedBaseLabel = "$"+baselabel.toLowerCase().replaceAll(" ", "_") const newname = "$"+name.toLowerCase().replaceAll(" ", "_") - console.log("NAME: ", name) - // Check if it's the same as the current name in use //if (name === selectedAction.label) { // console.log("Returning from name thing") @@ -3352,9 +3358,8 @@ const ParsedAction = (props) => { No selection {selectedAction.authentication.map((data) => { - console.log("AUTH DATA: ", data) if (data.last_modified === true) { - console.log("LAST MODIFIED: ", data.label) + //console.log("LAST MODIFIED: ", data.label) } return ( @@ -3736,9 +3741,12 @@ const ParsedAction = (props) => { return ( { backgroundColor: theme.palette.inputColor, borderRadius: theme.palette.borderRadius, }} - {...params} label="Find Actions" variant="outlined" + name={`disable_autocomplete_${Math.random()}`} + /> ); }} diff --git a/frontend/src/components/RuntimeDebugger.jsx b/frontend/src/components/RuntimeDebugger.jsx index 570778df..01bb345c 100644 --- a/frontend/src/components/RuntimeDebugger.jsx +++ b/frontend/src/components/RuntimeDebugger.jsx @@ -54,6 +54,7 @@ const RuntimeDebugger = (props) => { const [status, setStatus] = useState("") const [endTime, setEndTime] = useState("") const [startTime, setStartTime] = useState("") + const [totalCount, setTotalCount] = useState(0) const [workflow, setWorkflow] = useState({}) const [ignoreOrg, setIgnoreOrg] = useState(false) @@ -65,16 +66,80 @@ const RuntimeDebugger = (props) => { const [workflows, setWorkflows] = useState([ {"id": "", "name": "All Workflows",} ]) - /* - [ - {id: "1", execution_id: "1", status: "FINISHED", startTimestamp: "2021-10-01 12:00:00", endTimestamp: "2021-10-01 12:00:00", workflow: {"id": "1234", "name": "what",}}, - {id: "2", execution_id: "2", status: "WAITING", startTimestamp: "2021-10-01 12:00:00", endTimestamp: "2021-10-01 12:00:00", workflow: {"id": "1234", "name": "what",}}, - {id: "3", execution_id: "3", status: "EXECUTING",startTimestamp: "2021-10-01 12:00:00", endTimestamp: "2021-10-01 12:00:00", workflow: {"id": "1234", "name": "what",}}, - {id: "4", execution_id: "4", status: "ABORTED", startTimestamp: "2021-10-01 12:00:00", endTimestamp: "2021-10-01 12:00:00", workflow: {"id": "1234", "name": "what",}}, - ]); - */ + + // Shitty workflow search on purpose :) + const handleWorkflowUsageCount = (workflows) => { + if (workflows === undefined || workflows === null || workflows.length === 0) { + return + } + + setTotalCount(0) + + var count = 0 + var starttime = startTime === undefined || startTime === null || startTime === "" ? "" : new Date(startTime).toISOString() + var endtime = endTime === undefined || endTime === null || endTime == "" ? "" : new Date(endTime).toISOString() + + var maxworkflows = 5 + + console.log("Looking for MAX this amount of workflows: ", maxworkflows) + for (let key in workflows) { + if (key > maxworkflows) { + break + } + + const workflowId = workflows[key].id + // Fetch the data for the workflow + var url = `${globalUrl}/api/v1/workflows/${workflowId}/executions/count` + if (starttime !== "") { + url += `?start_time=${starttime}` + } + + if (endtime !== "") { + if (starttime !== "") { + url += `&end_time=${endtime}` + } else { + url += `?end_time=${endtime}` + } + } + + fetch(url, { + method: "GET", + headers: { + "Content-Type": "application/json", + Accept: "application/json", + }, + credentials: "include", + }) + .then((response) => { + if (response.status !== 200) { + console.log("Status not 200 for workflows :O!"); + return; + } + + return response.json() + }) + .then((data) => { + if (data.success) { + if (data.count !== undefined && data.count !== null) { + count += data.count + } + } else { + console.log("Failed to get workflow usage count: ", data) + } + }) + .catch((error) => { + console.error("Error:", error); + }) + } + + setTimeout(() => { + console.log("Setting total count: ", count) + setTotalCount(count) + }, maxworkflows*300) + } const submitSearch = (workflowId, status, startTime, endTime, cursor, limit) => { + handleWorkflowUsageCount(workflows) //setResultRows([]) setSearchLoading(true) @@ -135,6 +200,7 @@ const RuntimeDebugger = (props) => { }) } + const getAvailableWorkflows = () => { fetch(globalUrl + "/api/v1/workflows", { method: "GET", @@ -624,7 +690,7 @@ const RuntimeDebugger = (props) => {
-

Workflow Run Debugger

+

Workflow Run Debugger {totalCount !== 0 ? ` (~${totalCount})` : ""}

{selectedWorkflowExecutions.length > 0 ? diff --git a/frontend/src/views/AngularWorkflow.jsx b/frontend/src/views/AngularWorkflow.jsx index ed968653..92a57baa 100755 --- a/frontend/src/views/AngularWorkflow.jsx +++ b/frontend/src/views/AngularWorkflow.jsx @@ -1393,7 +1393,7 @@ const AngularWorkflow = (defaultprops) => { } if (streamDisabled) { - console.log("Stream disabled") + console.log("Stream disabled - send") return } @@ -2739,7 +2739,7 @@ const AngularWorkflow = (defaultprops) => { } if (streamDisabled) { - console.log("Stream disabled") + console.log("Stream listener disabled") return } @@ -2751,6 +2751,7 @@ const AngularWorkflow = (defaultprops) => { const url = `${streamUrl}/api/v1/workflows/${workflowId}/stream` while (true) { if (streamDisabled === true || streamDisabled2 === true) { + console.log("Stream disabled, breaking") break } @@ -3731,6 +3732,10 @@ const AngularWorkflow = (defaultprops) => { return } else if (data.buttonType === "set_startnode" && data.type !== "TRIGGER") { + //console.log("STARTNODE") + //event.preventDefault() + //event.stopPropagation() + const parentNode = cy.getElementById(data.attachedTo); if (parentNode !== null && parentNode !== undefined) { var oldstartnode = cy.getElementById(workflow.start); @@ -3967,8 +3972,6 @@ const AngularWorkflow = (defaultprops) => { //} curaction.app_id = curapp.id - console.log("CURAPP: ", curapp.authentication) - setAuthenticationType( curapp.authentication.type === "oauth2" && curapp.authentication.redirect_uri !== undefined && curapp.authentication.redirect_uri !== null ? { type: "oauth2", @@ -4000,7 +4003,6 @@ const AngularWorkflow = (defaultprops) => { } const tmpAuth = JSON.parse(JSON.stringify(newAppAuth)); - //console.log("FOUND AUTH OPTIONS: ", tmpAuth) const curappName = curapp.name.toLowerCase() for (let tmpAuthKey in tmpAuth) { @@ -4036,7 +4038,6 @@ const AngularWorkflow = (defaultprops) => { } } - console.log("OPTIONS: ", authenticationOptions) // Find with authenticationOption (authenticationOptions) has the highest .edited time. In this index, set the "last_modified" to true var latesttime = 0 @@ -4044,7 +4045,6 @@ const AngularWorkflow = (defaultprops) => { for (var i = 0; i < authenticationOptions.length; i++) { const authopt = authenticationOptions[i] - console.log("AUTHOPT: ", authopt) if (authopt.edited > latesttime) { latesttime = authopt.edited @@ -4052,7 +4052,6 @@ const AngularWorkflow = (defaultprops) => { } } - console.log("LATEST INDEX: ", latestindex) if (latestindex !== -1) { authenticationOptions[latestindex].last_modified = true } @@ -5933,7 +5932,7 @@ const AngularWorkflow = (defaultprops) => { if (workflow.actions.length < 4) { addSuggestionButtons(nodedata, event); } else { - console.log("Too many actions to suggest (for now)") + //console.log("Too many actions to suggest (for now)") } } } @@ -14666,6 +14665,7 @@ const AngularWorkflow = (defaultprops) => { } } + return (
{ } } + const cursearch = typeof window === "undefined" || window.location === undefined ? "" : window.location.search; + const chosenNodeId = new URLSearchParams(cursearch).get("node"); + const highlightNode = chosenNodeId !== null && chosenNodeId !== undefined && chosenNodeId !== "" && chosenNodeId === data.action.id return (
{ ); // Awful way of handling scroll - if ( - scrollConfig !== undefined && - setScrollConfig !== undefined && - Object.getOwnPropertyNames(selectedAction).length !== 0 - ) { + if (scrollConfig !== undefined && setScrollConfig !== undefined && Object.getOwnPropertyNames(selectedAction).length !== 0) { const rightSideActionView = document.getElementById("rightside_actions"); if (rightSideActionView !== undefined && rightSideActionView !== null) { - if ( - scrollConfig.top !== 0 && - scrollConfig.top !== undefined && - scrollConfig.top !== 0 - ) { + if (scrollConfig.top !== null && scrollConfig.top !== undefined && scrollConfig.top !== 0) { setTimeout(() => { - if ( - scrollConfig.selected !== undefined && - scrollConfig.selected !== null - ) { - const selectedField = document.getElementById( - scrollConfig.selected - ); + if (scrollConfig.selected !== undefined && scrollConfig.selected !== null) { + const selectedField = document.getElementById(scrollConfig.selected) if (selectedField !== undefined && selectedField !== null) { - selectedField.focus(); + selectedField.focus() } } }, 5);