This is an automated email from the ASF dual-hosted git repository.
ricardozanini pushed a commit to branch main
in repository
https://gitbox.apache.org/repos/asf/incubator-kie-kogito-serverless-operator.git
The following commit(s) were added to refs/heads/main by this push:
new cccb7b20 [KOGITO-9940] Add E2E test cases for platform configured with
Job Service and Data Index in a combination of scenarios with ephemeral and
postgreSQL persistence in dev and production profiles (#337)
cccb7b20 is described below
commit cccb7b205e3f8f3419859c80bacd4adc00f29f4f
Author: Jordi Gil <[email protected]>
AuthorDate: Wed Jan 24 18:54:25 2024 -0500
[KOGITO-9940] Add E2E test cases for platform configured with Job Service
and Data Index in a combination of scenarios with ephemeral and postgreSQL
persistence in dev and production profiles (#337)
---
.github/workflows/e2e.yml | 6 +
controllers/platform/services/services.go | 8 +-
test/e2e/helpers.go | 143 +++++++++++++
test/e2e/platform_test.go | 123 +++++++++++
test/e2e/workflow_test.go | 224 +++------------------
.../dev/ephemeral/02-sonataflow_platform.yaml | 32 +++
.../services/dev/ephemeral/kustomization.yaml | 20 ++
.../03-sonataflow_callbackstatetimeouts.sw.yaml | 81 ++++++++
.../services/dev/postgreSQL/01-postgres.yaml | 86 ++++++++
.../dev/postgreSQL/02-sonataflow_platform.yaml | 55 +++++
.../services/dev/postgreSQL/kustomization.yaml | 32 +++
.../04-sonataflow_callbackstatetimeouts.sw.yaml | 81 ++++++++
.../prod/ephemeral/02-sonataflow_platform.yaml | 33 +++
.../services/prod/ephemeral/kustomization.yaml | 20 ++
.../03-sonataflow_callbackstatetimeouts.sw.yaml | 81 ++++++++
.../services/prod/postgreSQL/01-postgres.yaml | 86 ++++++++
.../prod/postgreSQL/02-sonataflow_platform.yaml | 55 +++++
.../services/prod/postgreSQL/kustomization.yaml | 32 +++
.../04-sonataflow_callbackstatetimeouts.sw.yaml | 81 ++++++++
test/yaml.go | 4 +
20 files changed, 1084 insertions(+), 199 deletions(-)
diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml
index 82e78b3a..e76ad9e2 100644
--- a/.github/workflows/e2e.yml
+++ b/.github/workflows/e2e.yml
@@ -67,6 +67,12 @@ jobs:
kubectl get pods -A
# TODO: install the operator-sdk first, then cache the installation
+
+ - name: Deploy operator
+ run: |
+ make deploy IMG=${{ env.OPERATOR_IMAGE_NAME }}
+ kubectl wait pod -A -l control-plane=controller-manager --for
condition=Ready
+
- name: Run tests
run: |
make test-e2e
diff --git a/controllers/platform/services/services.go
b/controllers/platform/services/services.go
index 1e1a9424..3637c275 100644
--- a/controllers/platform/services/services.go
+++ b/controllers/platform/services/services.go
@@ -116,9 +116,13 @@ func (d DataIndexHandler) GetEnvironmentVariables()
[]corev1.EnvVar {
func (d DataIndexHandler) GetPodResourceRequirements()
corev1.ResourceRequirements {
return corev1.ResourceRequirements{
- Limits: corev1.ResourceList{
+ Requests: corev1.ResourceList{
corev1.ResourceCPU: resource.MustParse("100m"),
- corev1.ResourceMemory: resource.MustParse("256Mi"),
+ corev1.ResourceMemory: resource.MustParse("1Gi"),
+ },
+ Limits: corev1.ResourceList{
+ corev1.ResourceCPU: resource.MustParse("200m"),
+ corev1.ResourceMemory: resource.MustParse("1Gi"),
},
}
}
diff --git a/test/e2e/helpers.go b/test/e2e/helpers.go
new file mode 100644
index 00000000..75b03997
--- /dev/null
+++ b/test/e2e/helpers.go
@@ -0,0 +1,143 @@
+// Copyright 2024 Apache Software Foundation (ASF)
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package e2e
+
+import (
+ "encoding/json"
+ "fmt"
+ "net/url"
+ "os"
+ "os/exec"
+ "strconv"
+ "strings"
+
+ "github.com/apache/incubator-kie-kogito-serverless-operator/test"
+ "github.com/apache/incubator-kie-kogito-serverless-operator/test/utils"
+
+ //nolint:golint
+ //nolint:revive
+ . "github.com/onsi/ginkgo/v2"
+
+ //nolint:golint
+ //nolint:revive
+ . "github.com/onsi/gomega"
+)
+
+type health struct {
+ Status string `json:"status"`
+}
+
+var (
+ upStatus string = "UP"
+)
+
+func verifyHealthStatusInPod(name string, namespace string) {
+ // iterate over all containers to find the one that responds to the
HTTP health endpoint
+ Expect(name).NotTo(BeEmpty(), "pod name is empty")
+ cmd := exec.Command("kubectl", "get", "pod", name, "-n", namespace,
"-o", `jsonpath={.spec.containers[*].name}`)
+ output, err := utils.Run(cmd)
+ Expect(err).NotTo(HaveOccurred())
+ var errs error
+ for _, cname := range strings.Split(string(output), " ") {
+ var h *health
+ h, err = getHealthStatusInContainer(name, cname, namespace)
+ if err == nil {
+ Expect(h.Status).To(Equal(upStatus))
+ return
+ }
+ if len(errs.Error()) > 0 {
+ errs = fmt.Errorf("%v; %w", err, errs)
+ } else {
+ errs = err
+ }
+ }
+ Expect(errs).NotTo(HaveOccurred(), fmt.Sprintf("No container was found
that could respond to the health endpoint %v", errs))
+
+}
+
+func getHealthStatusInContainer(podName string, containerName string, ns
string) (*health, error) {
+ h := health{}
+ cmd := exec.Command("kubectl", "exec", "-t", podName, "-n", ns, "-c",
containerName, "--", "curl", "-s", "localhost:8080/q/health")
+ output, err := utils.Run(cmd)
+ Expect(err).NotTo(HaveOccurred())
+ err = json.Unmarshal(output, &h)
+ if err != nil {
+ return nil, fmt.Errorf("failed to execute curl command against
health endpoint in container %s:%v with output %s", containerName, err, output)
+ }
+ return &h, nil
+}
+func verifyWorkflowIsInRunningStateInNamespace(workflowName string, ns string)
bool {
+ cmd := exec.Command("kubectl", "get", "workflow", workflowName, "-n",
ns, "-o", "jsonpath={.status.conditions[?(@.type=='Running')].status}")
+ response, err := utils.Run(cmd)
+ if err != nil {
+ GinkgoWriter.Println(fmt.Errorf("failed to check if greeting
workflow is running: %v", err))
+ return false
+ }
+ GinkgoWriter.Println(fmt.Sprintf("Got response %s", response))
+
+ if len(strings.TrimSpace(string(response))) == 0 {
+ GinkgoWriter.Println(fmt.Errorf("empty response %v", err))
+ return false
+ }
+ status, err := strconv.ParseBool(string(response))
+ if err != nil {
+ GinkgoWriter.Println(fmt.Errorf("failed to parse result %v",
err))
+ return false
+ }
+ return status
+}
+
+func verifyWorkflowIsInRunningState(workflowName string, targetNamespace
string) bool {
+ return verifyWorkflowIsInRunningStateInNamespace(workflowName,
targetNamespace)
+}
+
+func verifyWorkflowIsAddressable(workflowName string, targetNamespace string)
bool {
+ cmd := exec.Command("kubectl", "get", "workflow", workflowName, "-n",
targetNamespace, "-o", "jsonpath={.status.address.url}")
+ if response, err := utils.Run(cmd); err != nil {
+ GinkgoWriter.Println(fmt.Errorf("failed to check if greeting
workflow is running: %v", err))
+ return false
+ } else {
+ GinkgoWriter.Println(fmt.Sprintf("Got response %s", response))
+ if len(strings.TrimSpace(string(response))) > 0 {
+ _, err := url.ParseRequestURI(string(response))
+ if err != nil {
+ GinkgoWriter.Println(fmt.Errorf("failed to
parse result %v", err))
+ return false
+ }
+ // The response is a valid URL so the test is passed
+ return true
+ }
+ return false
+ }
+}
+
+const (
+ minikubePlatform = "minikube"
+ openshiftPlatform = "openshift"
+)
+
+func getSonataFlowPlatformFilename() string {
+ if getClusterPlatform() == openshiftPlatform {
+ return test.GetPlatformOpenshiftE2eTest()
+ }
+ return test.GetPlatformMinikubeE2eTest()
+}
+
+func getClusterPlatform() string {
+ if v, ok := os.LookupEnv("CLUSTER_PLATFORM"); ok {
+ return v
+ }
+ return minikubePlatform
+}
diff --git a/test/e2e/platform_test.go b/test/e2e/platform_test.go
new file mode 100644
index 00000000..e9b8edf1
--- /dev/null
+++ b/test/e2e/platform_test.go
@@ -0,0 +1,123 @@
+// Copyright 2024 Apache Software Foundation (ASF)
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package e2e
+
+import (
+ //nolint:golint
+ //nolint:revive
+ "bytes"
+ "fmt"
+ "math/rand"
+ "os/exec"
+ "path/filepath"
+ "strings"
+ "time"
+
+ "github.com/apache/incubator-kie-kogito-serverless-operator/test"
+ "github.com/apache/incubator-kie-kogito-serverless-operator/test/utils"
+ . "github.com/onsi/ginkgo/v2"
+
+ //nolint:golint
+ //nolint:revive
+ . "github.com/onsi/gomega"
+)
+
+const (
+ ephemeral = "ephemeral"
+ postgreSQL = "postgreSQL"
+ dev = "dev"
+ production = "prod"
+)
+
+var _ = Describe("Validate the persistence", Ordered, func() {
+
+ var (
+ projectDir string
+ targetNamespace string
+ )
+
+ BeforeEach(func() {
+ targetNamespace = fmt.Sprintf("test-%d", rand.Intn(1024)+1)
+ cmd := exec.Command("kubectl", "create", "namespace",
targetNamespace)
+ _, err := utils.Run(cmd)
+ Expect(err).NotTo(HaveOccurred())
+ })
+ AfterEach(func() {
+ // Remove resources in test namespace with no failure
+ if !CurrentSpecReport().Failed() && len(targetNamespace) > 0 {
+ cmd := exec.Command("kubectl", "delete", "namespace",
targetNamespace, "--wait")
+ _, err := utils.Run(cmd)
+ Expect(err).NotTo(HaveOccurred())
+ }
+ })
+ var _ = Context("with platform services", func() {
+
+ DescribeTable("when creating a simple workflow",
func(testcaseDir string, profile string, persistenceType string) {
+ By("Deploy the SonataFlowPlatform CR")
+ var manifests []byte
+ EventuallyWithOffset(1, func() error {
+ var err error
+ cmd := exec.Command("kubectl", "kustomize",
filepath.Join(projectDir,
+ testcaseDir, profile, persistenceType))
+ manifests, err = utils.Run(cmd)
+ return err
+ }, time.Minute, time.Second).Should(Succeed())
+ cmd := exec.Command("kubectl", "create", "-n",
targetNamespace, "-f", "-")
+ cmd.Stdin = bytes.NewBuffer(manifests)
+ _, err := utils.Run(cmd)
+ Expect(err).NotTo(HaveOccurred())
+ By("Wait for SonatatFlowPlatform CR to complete
deployment")
+ // wait for service deployments to be ready
+ EventuallyWithOffset(1, func() error {
+ cmd = exec.Command("kubectl", "wait", "pod",
"-n", targetNamespace, "-l", "app=sonataflow-platform", "--for",
"condition=Ready", "--timeout=5s")
+ _, err = utils.Run(cmd)
+ return err
+ }, 10*time.Minute, 5).Should(Succeed())
+ By("Evaluate status of service's health endpoint")
+ cmd = exec.Command("kubectl", "get", "pod", "-l",
"app=sonataflow-platform", "-n", targetNamespace,
"-ojsonpath={.items[*].metadata.name}")
+ output, err := utils.Run(cmd)
+ Expect(err).NotTo(HaveOccurred())
+ // remove the last CR that is added by default as the
last character of the string.
+ for _, pn := range strings.Split(string(output), " ") {
+ verifyHealthStatusInPod(pn, targetNamespace)
+ }
+ By("Deploy the SonataFlow CR")
+ cmd = exec.Command("kubectl", "create", "-n",
targetNamespace, "-f", filepath.Join(projectDir,
+ testcaseDir, profile, persistenceType,
"sonataflow"))
+ manifests, err = utils.Run(cmd)
+ Expect(err).NotTo(HaveOccurred())
+
+ By("Retrieve SonataFlow CR name")
+ cmd = exec.Command("kubectl", "get", "sonataflow",
"-n", targetNamespace, `-ojsonpath={.items[*].metadata.name}`)
+ output, err = utils.Run(cmd)
+ Expect(err).NotTo(HaveOccurred())
+ sfNames := strings.TrimRight(string(output), " ")
+
+ By("Evaluate status of SonataFlow CR")
+ for _, sf := range strings.Split(string(sfNames), " ") {
+ Expect(sf).NotTo(BeEmpty(), "sonataflow name is
empty")
+ EventuallyWithOffset(1, func() bool {
+ return
verifyWorkflowIsInRunningStateInNamespace(sf, targetNamespace)
+ }, 5*time.Minute, 5).Should(BeTrue())
+ }
+ },
+ Entry("with both Job Service and Data Index and
ephemeral persistence and the workflow in a dev profile",
test.GetSonataFlowE2EPlatformServicesDirectory(), dev, ephemeral),
+ Entry("with both Job Service and Data Index and
ephemeral persistence and the workflow in a production profile",
test.GetSonataFlowE2EPlatformServicesDirectory(), production, ephemeral),
+ Entry("with both Job Service and Data Index and
postgreSQL persistence and the workflow in a dev profile",
test.GetSonataFlowE2EPlatformServicesDirectory(), dev, postgreSQL),
+ Entry("with both Job Service and Data Index and
postgreSQL persistence and the workflow in a production profile",
test.GetSonataFlowE2EPlatformServicesDirectory(), production, postgreSQL),
+ )
+
+ })
+})
diff --git a/test/e2e/workflow_test.go b/test/e2e/workflow_test.go
index a43caede..b84282e3 100644
--- a/test/e2e/workflow_test.go
+++ b/test/e2e/workflow_test.go
@@ -21,12 +21,9 @@ package e2e
import (
"fmt"
- "net/url"
- "os"
+ "math/rand"
"os/exec"
"path/filepath"
- "strconv"
- "strings"
"time"
"github.com/apache/incubator-kie-kogito-serverless-operator/test"
@@ -41,136 +38,22 @@ import (
. "github.com/onsi/gomega"
)
-// namespace store the ns where the Operator and Operand will be executed
-const namespace = "sonataflow-operator-system"
+var _ = Describe("SonataFlow Operator", func() {
-const (
- minikubePlatform = "minikube"
- openshiftPlatform = "openshift"
-)
-
-var _ = Describe("SonataFlow Operator", Ordered, func() {
-
- BeforeAll(func() {
-
- // Now, let's ensure that all namespaces can raise a Warn when
we apply the manifests
- // and that the namespace where the Operator and Operand will
run are enforced as
- // restricted so that we can ensure that both can be admitted
and run with the enforcement
-
- // See: https://kubernetes.io/docs/tutorials/security/seccomp/
-
- /*
- TODO: Uncomment to enable when
https://issues.redhat.com/browse/KOGITO-9110 will be available
- By("labeling all namespaces to warn when we
apply the manifest if would violate the PodStandards")
- cmd = exec.Command("kubectl", "label",
"--overwrite", "ns", "--all",
-
"pod-security.kubernetes.io/audit=restricted",
-
"pod-security.kubernetes.io/enforce-version=v1.22",
-
"pod-security.kubernetes.io/warn=restricted")
- _, err := utils.Run(cmd)
- ExpectWithOffset(1, err).NotTo(HaveOccurred())
-
- By("labeling enforce the namespace where the
Operator and Operand(s) will run")
- cmd = exec.Command("kubectl", "label",
"--overwrite", "ns", namespace,
-
"pod-security.kubernetes.io/audit=restricted",
-
"pod-security.kubernetes.io/enforce-version=v1.22",
-
"pod-security.kubernetes.io/enforce=restricted")
- _, err = utils.Run(cmd)
- Expect(err).To(Not(HaveOccurred()))
-
- */
-
- var controllerPodName string
- operatorImageName, err := utils.GetOperatorImageName()
- ExpectWithOffset(1, err).NotTo(HaveOccurred())
-
- By("deploying the controller-manager")
- cmd := exec.Command("make", "deploy", fmt.Sprintf("IMG=%s",
operatorImageName))
-
- outputMake, err := utils.Run(cmd)
- fmt.Println(string(outputMake))
- ExpectWithOffset(1, err).NotTo(HaveOccurred())
-
- /* // TODO: Uncomment to enable when
https://issues.redhat.com/browse/KOGITO-9110 will be available
-
- By("validating that manager Pod/container(s) are restricted")
- // Get Podsecurity violation lines
- lines, err := utils.StringToLines(string(outputMake))
- ExpectWithOffset(1, err).NotTo(HaveOccurred())
- var violationLines []string
- applySeccompProfilePatch := false
- for _, line := range lines {
- if strings.Contains(line, "Warning: would violate
PodSecurity") {
- if strings.Contains(line, "must set
securityContext.seccompProfile.type to") {
- // Ignore this violation as it is
expected
- applySeccompProfilePatch = true
- } else {
- violationLines = append(violationLines,
line)
- }
- }
- }
- Expect(violationLines).To(BeEmpty())
-
- if applySeccompProfilePatch {
- By("Applying seccompProfile")
- cmd = exec.Command("kubectl", "patch", "deployment",
"sonataflow-operator-controller-manager", "-p",
`{"spec":{"template":{"spec":{"securityContext":{"seccompProfile":{"type":"RuntimeDefault"}}}}}}`,
"-n", namespace)
+ var targetNamespace string
+ BeforeEach(func() {
+ targetNamespace = fmt.Sprintf("test-%d", rand.Intn(1024)+1)
+ cmd := exec.Command("kubectl", "create", "namespace",
targetNamespace)
+ _, err := utils.Run(cmd)
+ Expect(err).NotTo(HaveOccurred())
+ })
+ AfterEach(func() {
+ // Remove resources in test namespace
+ if !CurrentGinkgoTestDescription().Failed &&
len(targetNamespace) > 0 {
+ cmd := exec.Command("kubectl", "delete", "namespace",
targetNamespace, "--wait")
_, err := utils.Run(cmd)
- if utils.IsDebugEnabled() {
- err = utils.OutputDeployment(namespace,
"sonataflow-operator-controller-manager")
- }
- ExpectWithOffset(1, err).NotTo(HaveOccurred())
+ Expect(err).NotTo(HaveOccurred())
}
- */
-
- By("validating that the controller-manager pod is running as
expected")
- verifyControllerUp := func() error {
- var podOutput []byte
- var err error
-
- if utils.IsDebugEnabled() {
- err = utils.OutputAllPods()
- err = utils.OutputAllEvents(namespace)
- }
-
- // Get pod name
- cmd = exec.Command("kubectl", "get",
- "pods", "-l",
"control-plane=controller-manager",
- "-o", "go-template={{ range .items }}{{ if not
.metadata.deletionTimestamp }}{{ .metadata.name }}"+
- "{{ \"\\n\" }}{{ end }}{{ end }}",
- "-n", namespace,
- )
- podOutput, err = utils.Run(cmd)
- fmt.Println(string(podOutput))
- ExpectWithOffset(2, err).NotTo(HaveOccurred())
- podNames := utils.GetNonEmptyLines(string(podOutput))
- if len(podNames) != 1 {
- return fmt.Errorf("expect 1 controller pods
running, but got %d", len(podNames))
- }
- controllerPodName = podNames[0]
- ExpectWithOffset(2,
controllerPodName).Should(ContainSubstring("controller-manager"))
-
- // Validate pod status
- cmd = exec.Command("kubectl", "get",
- "pods", controllerPodName, "-o",
"jsonpath={.status.phase}",
- "-n", namespace,
- )
- status, err := utils.Run(cmd)
- fmt.Println(string(status))
- ExpectWithOffset(2, err).NotTo(HaveOccurred())
- if string(status) != "Running" {
- return fmt.Errorf("controller pod in %s
status", status)
- }
- return nil
- }
- EventuallyWithOffset(1, verifyControllerUp, 2*time.Minute,
time.Second).Should(Succeed())
- })
-
- AfterAll(func() {
- By("removing manager namespace")
- cmd := exec.Command("make", "undeploy")
- _, _ = utils.Run(cmd)
- By("uninstalling CRDs")
- cmd = exec.Command("make", "uninstall")
- _, _ = utils.Run(cmd)
})
Describe("ensure that Operator and Operand(s) can run in restricted
namespaces", func() {
@@ -180,17 +63,17 @@ var _ = Describe("SonataFlow Operator", Ordered, func() {
By("creating an instance of the SonataFlow Operand(CR)")
EventuallyWithOffset(1, func() error {
cmd := exec.Command("kubectl", "apply", "-f",
filepath.Join(projectDir,
-
"test/testdata/"+test.SonataFlowSimpleOpsYamlCR), "-n", namespace)
+
"test/testdata/"+test.SonataFlowSimpleOpsYamlCR), "-n", targetNamespace)
_, err := utils.Run(cmd)
return err
}, 2*time.Minute, time.Second).Should(Succeed())
By("check the workflow is in running state")
- EventuallyWithOffset(1, func() bool { return
verifyWorkflowIsInRunningState("simple") }, 15*time.Minute,
30*time.Second).Should(BeTrue())
+ EventuallyWithOffset(1, func() bool { return
verifyWorkflowIsInRunningState("simple", targetNamespace) }, 15*time.Minute,
30*time.Second).Should(BeTrue())
EventuallyWithOffset(1, func() error {
cmd := exec.Command("kubectl", "delete", "-f",
filepath.Join(projectDir,
-
"test/testdata/"+test.SonataFlowSimpleOpsYamlCR), "-n", namespace)
+
"test/testdata/"+test.SonataFlowSimpleOpsYamlCR), "-n", targetNamespace)
_, err := utils.Run(cmd)
return err
}, 2*time.Minute, time.Second).Should(Succeed())
@@ -200,7 +83,7 @@ var _ = Describe("SonataFlow Operator", Ordered, func() {
By("creating external resources DataInputSchema
configMap")
EventuallyWithOffset(1, func() error {
cmd := exec.Command("kubectl", "apply", "-f",
filepath.Join(projectDir,
-
"test/testdata/"+test.SonataFlowGreetingsDataInputSchemaConfig), "-n",
namespace)
+
"test/testdata/"+test.SonataFlowGreetingsDataInputSchemaConfig), "-n",
targetNamespace)
_, err := utils.Run(cmd)
return err
}, 2*time.Minute, time.Second).Should(Succeed())
@@ -208,17 +91,17 @@ var _ = Describe("SonataFlow Operator", Ordered, func() {
By("creating an instance of the SonataFlow Operand(CR)")
EventuallyWithOffset(1, func() error {
cmd := exec.Command("kubectl", "apply", "-f",
filepath.Join(projectDir,
-
"test/testdata/"+test.SonataFlowGreetingsWithDataInputSchemaCR), "-n",
namespace)
+
"test/testdata/"+test.SonataFlowGreetingsWithDataInputSchemaCR), "-n",
targetNamespace)
_, err := utils.Run(cmd)
return err
}, 2*time.Minute, time.Second).Should(Succeed())
By("check the workflow is in running state")
- EventuallyWithOffset(1, func() bool { return
verifyWorkflowIsInRunningState("greeting") }, 15*time.Minute,
30*time.Second).Should(BeTrue())
+ EventuallyWithOffset(1, func() bool { return
verifyWorkflowIsInRunningState("greeting", targetNamespace) }, 15*time.Minute,
30*time.Second).Should(BeTrue())
EventuallyWithOffset(1, func() error {
cmd := exec.Command("kubectl", "delete", "-f",
filepath.Join(projectDir,
-
"test/testdata/"+test.SonataFlowGreetingsWithDataInputSchemaCR), "-n",
namespace)
+
"test/testdata/"+test.SonataFlowGreetingsWithDataInputSchemaCR), "-n",
targetNamespace)
_, err := utils.Run(cmd)
return err
}, 2*time.Minute, time.Second).Should(Succeed())
@@ -229,82 +112,29 @@ var _ = Describe("SonataFlow Operator", Ordered, func() {
By("creating an instance of the SonataFlow Workflow in
DevMode")
EventuallyWithOffset(1, func() error {
cmd := exec.Command("kubectl", "apply", "-f",
filepath.Join(projectDir,
-
test.GetSonataFlowE2eOrderProcessingFolder()), "-n", namespace)
+
test.GetSonataFlowE2eOrderProcessingFolder()), "-n", targetNamespace)
_, err := utils.Run(cmd)
return err
}, 2*time.Minute, time.Second).Should(Succeed())
By("check the workflow is in running state")
- EventuallyWithOffset(1, func() bool { return
verifyWorkflowIsInRunningState("orderprocessing") }, 10*time.Minute,
30*time.Second).Should(BeTrue())
+ EventuallyWithOffset(1, func() bool { return
verifyWorkflowIsInRunningState("orderprocessing", targetNamespace) },
10*time.Minute, 30*time.Second).Should(BeTrue())
- cmdLog := exec.Command("kubectl", "logs",
"orderprocessing", "-n", namespace)
+ cmdLog := exec.Command("kubectl", "logs",
"orderprocessing", "-n", targetNamespace)
if responseLog, errLog := utils.Run(cmdLog); errLog ==
nil {
GinkgoWriter.Println(fmt.Sprintf("devmode
podlog %s", responseLog))
}
By("check that the workflow is addressable")
- EventuallyWithOffset(1, func() bool { return
verifyWorkflowIsAddressable("orderprocessing") }, 10*time.Minute,
30*time.Second).Should(BeTrue())
+ EventuallyWithOffset(1, func() bool { return
verifyWorkflowIsAddressable("orderprocessing", targetNamespace) },
10*time.Minute, 30*time.Second).Should(BeTrue())
EventuallyWithOffset(1, func() error {
cmd := exec.Command("kubectl", "delete", "-f",
filepath.Join(projectDir,
-
test.GetSonataFlowE2eOrderProcessingFolder()), "-n", namespace)
+
test.GetSonataFlowE2eOrderProcessingFolder()), "-n", targetNamespace)
_, err := utils.Run(cmd)
return err
}, 2*time.Minute, time.Second).Should(Succeed())
})
})
-})
-func verifyWorkflowIsInRunningState(workflowName string) bool {
- cmd := exec.Command("kubectl", "get", "workflow", workflowName, "-n",
namespace, "-o", "jsonpath={.status.conditions[?(@.type=='Running')].status}")
- if response, err := utils.Run(cmd); err != nil {
- GinkgoWriter.Println(fmt.Errorf("failed to check if greeting
workflow is running: %v", err))
- return false
- } else {
- GinkgoWriter.Println(fmt.Sprintf("Got response %s", response))
-
- if len(strings.TrimSpace(string(response))) > 0 {
- status, err := strconv.ParseBool(string(response))
- if err != nil {
- GinkgoWriter.Println(fmt.Errorf("failed to
parse result %v", err))
- return false
- }
- return status
- }
- return false
- }
-}
-
-func verifyWorkflowIsAddressable(workflowName string) bool {
- cmd := exec.Command("kubectl", "get", "workflow", workflowName, "-n",
namespace, "-o", "jsonpath={.status.address.url}")
- if response, err := utils.Run(cmd); err != nil {
- GinkgoWriter.Println(fmt.Errorf("failed to check if greeting
workflow is running: %v", err))
- return false
- } else {
- GinkgoWriter.Println(fmt.Sprintf("Got response %s", response))
- if len(strings.TrimSpace(string(response))) > 0 {
- _, err := url.ParseRequestURI(string(response))
- if err != nil {
- GinkgoWriter.Println(fmt.Errorf("failed to
parse result %v", err))
- return false
- }
- // The response is a valid URL so the test is passed
- return true
- }
- return false
- }
-}
-
-func getSonataFlowPlatformFilename() string {
- if getClusterPlatform() == openshiftPlatform {
- return test.GetPlatformOpenshiftE2eTest()
- }
- return test.GetPlatformMinikubeE2eTest()
-}
-
-func getClusterPlatform() string {
- if v, ok := os.LookupEnv("CLUSTER_PLATFORM"); ok {
- return v
- }
- return minikubePlatform
-}
+})
diff --git
a/test/testdata/platform/services/dev/ephemeral/02-sonataflow_platform.yaml
b/test/testdata/platform/services/dev/ephemeral/02-sonataflow_platform.yaml
new file mode 100644
index 00000000..73d49562
--- /dev/null
+++ b/test/testdata/platform/services/dev/ephemeral/02-sonataflow_platform.yaml
@@ -0,0 +1,32 @@
+# Copyright 2024 Apache Software Foundation (ASF)
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+apiVersion: sonataflow.org/v1alpha08
+kind: SonataFlowPlatform
+metadata:
+ name: sonataflow-platform
+spec:
+ build:
+ template:
+ buildArgs:
+ - name: QUARKUS_EXTENSION
+ value:
org.kie.kogito:kogito-addons-quarkus-jobs-knative-eventing:999-SNAPSHOT
+ config:
+ strategyOptions:
+ KanikoBuildCacheEnabled: "true"
+ services:
+ dataIndex:
+ enabled: false
+ jobService:
+ enabled: false
diff --git a/test/testdata/platform/services/dev/ephemeral/kustomization.yaml
b/test/testdata/platform/services/dev/ephemeral/kustomization.yaml
new file mode 100644
index 00000000..5441bfce
--- /dev/null
+++ b/test/testdata/platform/services/dev/ephemeral/kustomization.yaml
@@ -0,0 +1,20 @@
+# Copyright 2024 Apache Software Foundation (ASF)
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+resources:
+- 02-sonataflow_platform.yaml
+
+sortOptions:
+ order: fifo
+
diff --git
a/test/testdata/platform/services/dev/ephemeral/sonataflow/03-sonataflow_callbackstatetimeouts.sw.yaml
b/test/testdata/platform/services/dev/ephemeral/sonataflow/03-sonataflow_callbackstatetimeouts.sw.yaml
new file mode 100644
index 00000000..8bc8a77d
--- /dev/null
+++
b/test/testdata/platform/services/dev/ephemeral/sonataflow/03-sonataflow_callbackstatetimeouts.sw.yaml
@@ -0,0 +1,81 @@
+# Copyright 2024 Apache Software Foundation (ASF)
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+apiVersion: sonataflow.org/v1alpha08
+kind: SonataFlow
+metadata:
+ name: callbackstatetimeouts
+ annotations:
+ sonataflow.org/description: Callback State Timeouts Example k8s
+ sonataflow.org/version: 0.0.1
+ sonataflow.org/profile: dev
+spec:
+ flow:
+ start: PrintStartMessage
+ events:
+ - name: callbackEvent
+ source: ''
+ type: callback_event_type
+ functions:
+ - name: systemOut
+ type: custom
+ operation: sysout
+ states:
+ - name: PrintStartMessage
+ type: operation
+ actions:
+ - name: printSystemOut
+ functionRef:
+ refName: systemOut
+ arguments:
+ message: "${\"callback-state-timeouts: \" +
$WORKFLOW.instanceId + \" has started.\"}"
+ transition: CallbackState
+ - name: CallbackState
+ type: callback
+ action:
+ name: callbackAction
+ functionRef:
+ refName: systemOut
+ arguments:
+ message: "${\"callback-state-timeouts: \" + $WORKFLOW.instanceId
+ \" has executed the callbackFunction.\"}"
+ eventRef: callbackEvent
+ transition: CheckEventArrival
+ timeouts:
+ eventTimeout: PT30S
+ - name: CheckEventArrival
+ type: switch
+ dataConditions:
+ - condition: "${ .eventData != null }"
+ transition: EventArrived
+ defaultCondition:
+ transition: EventNotArrived
+ - name: EventArrived
+ type: inject
+ data:
+ exitMessage: "The callback event has arrived."
+ transition: PrintExitMessage
+ - name: EventNotArrived
+ type: inject
+ data:
+ exitMessage: "The callback event has not arrived, and the timeout
has overdue."
+ transition: PrintExitMessage
+ - name: PrintExitMessage
+ type: operation
+ actions:
+ - name: printSystemOut
+ functionRef:
+ refName: systemOut
+ arguments:
+ message: "${\"callback-state-timeouts: \" +
$WORKFLOW.instanceId + \" has finalized. \" + .exitMessage + \" eventData: \" +
.eventData}"
+ end: true
diff --git a/test/testdata/platform/services/dev/postgreSQL/01-postgres.yaml
b/test/testdata/platform/services/dev/postgreSQL/01-postgres.yaml
new file mode 100644
index 00000000..662de4c7
--- /dev/null
+++ b/test/testdata/platform/services/dev/postgreSQL/01-postgres.yaml
@@ -0,0 +1,86 @@
+# Copyright 2024 Apache Software Foundation (ASF)
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+---
+apiVersion: v1
+kind: PersistentVolumeClaim
+metadata:
+ labels:
+ app.kubernetes.io/name: postgres
+ name: postgres-pvc
+spec:
+ accessModes:
+ - ReadWriteOnce
+ resources:
+ requests:
+ storage: 1Gi
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ labels:
+ app.kubernetes.io/name: postgres
+ name: postgres
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app.kubernetes.io/name: postgres
+ template:
+ metadata:
+ labels:
+ app.kubernetes.io/name: postgres
+ spec:
+ containers:
+ - name: postgres
+ image: postgres:13.2-alpine
+ imagePullPolicy: 'IfNotPresent'
+ ports:
+ - containerPort: 5432
+ volumeMounts:
+ - name: storage
+ mountPath: /var/lib/postgresql/data
+ envFrom:
+ - secretRef:
+ name: postgres-secrets
+ readinessProbe:
+ exec:
+ command: ["pg_isready"]
+ initialDelaySeconds: 15
+ timeoutSeconds: 2
+ livenessProbe:
+ exec:
+ command: ["pg_isready"]
+ initialDelaySeconds: 15
+ timeoutSeconds: 2
+ resources:
+ limits:
+ memory: "256Mi"
+ cpu: "500m"
+ volumes:
+ - name: storage
+ persistentVolumeClaim:
+ claimName: postgres-pvc
+---
+apiVersion: v1
+kind: Service
+metadata:
+ labels:
+ app.kubernetes.io/name: postgres
+ name: postgres
+spec:
+ selector:
+ app.kubernetes.io/name: postgres
+ ports:
+ - port: 5432
diff --git
a/test/testdata/platform/services/dev/postgreSQL/02-sonataflow_platform.yaml
b/test/testdata/platform/services/dev/postgreSQL/02-sonataflow_platform.yaml
new file mode 100644
index 00000000..15fd97df
--- /dev/null
+++ b/test/testdata/platform/services/dev/postgreSQL/02-sonataflow_platform.yaml
@@ -0,0 +1,55 @@
+# Copyright 2024 Apache Software Foundation (ASF)
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+apiVersion: sonataflow.org/v1alpha08
+kind: SonataFlowPlatform
+metadata:
+ name: sonataflow-platform
+spec:
+ build:
+ template:
+ buildArgs:
+ - name: QUARKUS_EXTENSIONS
+ value:
org.kie.kogito:kogito-addons-quarkus-jobs-knative-eventing:999-SNAPSHOT
+ services:
+ dataIndex:
+ enabled: false
+ persistence:
+ postgresql:
+ jdbcUrl:
jdbc:postgresql://postgres:5432/sonataflow?currentSchema=data-index-service
+ secretRef:
+ name: postgres-secrets
+ userKey: POSTGRES_USER
+ passwordKey: POSTGRES_PASSWORD
+ podTemplate:
+ initContainers:
+ - name: init-postgres
+ image: registry.access.redhat.com/ubi9/ubi-minimal:latest
+ imagePullPolicy: IfNotPresent
+ command: [ 'sh', '-c', 'until (echo 1 > /dev/tcp/postgres.$(cat
/var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local/5432)
>/dev/null 2>&1; do echo "Waiting for postgres server"; sleep 3; done;' ]
+ jobService:
+ enabled: false
+ persistence:
+ postgresql:
+ jdbcUrl:
jdbc:postgresql://postgres:5432/sonataflow?currentSchema=jobs-service
+ secretRef:
+ name: postgres-secrets
+ userKey: POSTGRES_USER
+ passwordKey: POSTGRES_PASSWORD
+ podTemplate:
+ initContainers:
+ - name: init-postgres
+ image: registry.access.redhat.com/ubi9/ubi-minimal:latest
+ imagePullPolicy: IfNotPresent
+ command: [ 'sh', '-c', 'until (echo 1 > /dev/tcp/postgres.$(cat
/var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local/5432)
>/dev/null 2>&1; do echo "Waiting for postgres server"; sleep 3; done;' ]
diff --git a/test/testdata/platform/services/dev/postgreSQL/kustomization.yaml
b/test/testdata/platform/services/dev/postgreSQL/kustomization.yaml
new file mode 100644
index 00000000..d3fd127c
--- /dev/null
+++ b/test/testdata/platform/services/dev/postgreSQL/kustomization.yaml
@@ -0,0 +1,32 @@
+# Copyright 2024 Apache Software Foundation (ASF)
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+resources:
+- 01-postgres.yaml
+- 02-sonataflow_platform.yaml
+
+generatorOptions:
+ disableNameSuffixHash: true
+
+secretGenerator:
+ - name: postgres-secrets
+ literals:
+ - POSTGRES_USER=sonataflow
+ - POSTGRES_PASSWORD=sonataflow
+ - POSTGRES_DATABASE=sonataflow
+ - PGDATA=/var/lib/pgsql/data/userdata
+
+sortOptions:
+ order: fifo
+
diff --git
a/test/testdata/platform/services/dev/postgreSQL/sonataflow/04-sonataflow_callbackstatetimeouts.sw.yaml
b/test/testdata/platform/services/dev/postgreSQL/sonataflow/04-sonataflow_callbackstatetimeouts.sw.yaml
new file mode 100644
index 00000000..8bc8a77d
--- /dev/null
+++
b/test/testdata/platform/services/dev/postgreSQL/sonataflow/04-sonataflow_callbackstatetimeouts.sw.yaml
@@ -0,0 +1,81 @@
+# Copyright 2024 Apache Software Foundation (ASF)
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+apiVersion: sonataflow.org/v1alpha08
+kind: SonataFlow
+metadata:
+ name: callbackstatetimeouts
+ annotations:
+ sonataflow.org/description: Callback State Timeouts Example k8s
+ sonataflow.org/version: 0.0.1
+ sonataflow.org/profile: dev
+spec:
+ flow:
+ start: PrintStartMessage
+ events:
+ - name: callbackEvent
+ source: ''
+ type: callback_event_type
+ functions:
+ - name: systemOut
+ type: custom
+ operation: sysout
+ states:
+ - name: PrintStartMessage
+ type: operation
+ actions:
+ - name: printSystemOut
+ functionRef:
+ refName: systemOut
+ arguments:
+ message: "${\"callback-state-timeouts: \" +
$WORKFLOW.instanceId + \" has started.\"}"
+ transition: CallbackState
+ - name: CallbackState
+ type: callback
+ action:
+ name: callbackAction
+ functionRef:
+ refName: systemOut
+ arguments:
+ message: "${\"callback-state-timeouts: \" + $WORKFLOW.instanceId
+ \" has executed the callbackFunction.\"}"
+ eventRef: callbackEvent
+ transition: CheckEventArrival
+ timeouts:
+ eventTimeout: PT30S
+ - name: CheckEventArrival
+ type: switch
+ dataConditions:
+ - condition: "${ .eventData != null }"
+ transition: EventArrived
+ defaultCondition:
+ transition: EventNotArrived
+ - name: EventArrived
+ type: inject
+ data:
+ exitMessage: "The callback event has arrived."
+ transition: PrintExitMessage
+ - name: EventNotArrived
+ type: inject
+ data:
+ exitMessage: "The callback event has not arrived, and the timeout
has overdue."
+ transition: PrintExitMessage
+ - name: PrintExitMessage
+ type: operation
+ actions:
+ - name: printSystemOut
+ functionRef:
+ refName: systemOut
+ arguments:
+ message: "${\"callback-state-timeouts: \" +
$WORKFLOW.instanceId + \" has finalized. \" + .exitMessage + \" eventData: \" +
.eventData}"
+ end: true
diff --git
a/test/testdata/platform/services/prod/ephemeral/02-sonataflow_platform.yaml
b/test/testdata/platform/services/prod/ephemeral/02-sonataflow_platform.yaml
new file mode 100644
index 00000000..8f77082b
--- /dev/null
+++ b/test/testdata/platform/services/prod/ephemeral/02-sonataflow_platform.yaml
@@ -0,0 +1,33 @@
+# Copyright 2024 Apache Software Foundation (ASF)
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+apiVersion: sonataflow.org/v1alpha08
+kind: SonataFlowPlatform
+metadata:
+ name: sonataflow-platform
+spec:
+ build:
+ template:
+ buildArgs:
+ - name: QUARKUS_EXTENSION
+ value:
org.kie.kogito:kogito-addons-quarkus-jobs-knative-eventing:999-SNAPSHOT
+ config:
+ strategyOptions:
+ KanikoBuildCacheEnabled: "true"
+ services:
+ dataIndex:
+ enabled: true
+ jobService:
+ enabled: true
+
diff --git a/test/testdata/platform/services/prod/ephemeral/kustomization.yaml
b/test/testdata/platform/services/prod/ephemeral/kustomization.yaml
new file mode 100644
index 00000000..5441bfce
--- /dev/null
+++ b/test/testdata/platform/services/prod/ephemeral/kustomization.yaml
@@ -0,0 +1,20 @@
+# Copyright 2024 Apache Software Foundation (ASF)
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+resources:
+- 02-sonataflow_platform.yaml
+
+sortOptions:
+ order: fifo
+
diff --git
a/test/testdata/platform/services/prod/ephemeral/sonataflow/03-sonataflow_callbackstatetimeouts.sw.yaml
b/test/testdata/platform/services/prod/ephemeral/sonataflow/03-sonataflow_callbackstatetimeouts.sw.yaml
new file mode 100644
index 00000000..249ee2c1
--- /dev/null
+++
b/test/testdata/platform/services/prod/ephemeral/sonataflow/03-sonataflow_callbackstatetimeouts.sw.yaml
@@ -0,0 +1,81 @@
+# Copyright 2024 Apache Software Foundation (ASF)
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+apiVersion: sonataflow.org/v1alpha08
+kind: SonataFlow
+metadata:
+ name: callbackstatetimeouts
+ annotations:
+ sonataflow.org/description: Callback State Timeouts Example k8s
+ sonataflow.org/version: 0.0.1
+ sonataflow.org/profile: prod
+spec:
+ flow:
+ start: PrintStartMessage
+ events:
+ - name: callbackEvent
+ source: ''
+ type: callback_event_type
+ functions:
+ - name: systemOut
+ type: custom
+ operation: sysout
+ states:
+ - name: PrintStartMessage
+ type: operation
+ actions:
+ - name: printSystemOut
+ functionRef:
+ refName: systemOut
+ arguments:
+ message: "${\"callback-state-timeouts: \" +
$WORKFLOW.instanceId + \" has started.\"}"
+ transition: CallbackState
+ - name: CallbackState
+ type: callback
+ action:
+ name: callbackAction
+ functionRef:
+ refName: systemOut
+ arguments:
+ message: "${\"callback-state-timeouts: \" + $WORKFLOW.instanceId
+ \" has executed the callbackFunction.\"}"
+ eventRef: callbackEvent
+ transition: CheckEventArrival
+ timeouts:
+ eventTimeout: PT30S
+ - name: CheckEventArrival
+ type: switch
+ dataConditions:
+ - condition: "${ .eventData != null }"
+ transition: EventArrived
+ defaultCondition:
+ transition: EventNotArrived
+ - name: EventArrived
+ type: inject
+ data:
+ exitMessage: "The callback event has arrived."
+ transition: PrintExitMessage
+ - name: EventNotArrived
+ type: inject
+ data:
+ exitMessage: "The callback event has not arrived, and the timeout
has overdue."
+ transition: PrintExitMessage
+ - name: PrintExitMessage
+ type: operation
+ actions:
+ - name: printSystemOut
+ functionRef:
+ refName: systemOut
+ arguments:
+ message: "${\"callback-state-timeouts: \" +
$WORKFLOW.instanceId + \" has finalized. \" + .exitMessage + \" eventData: \" +
.eventData}"
+ end: true
diff --git a/test/testdata/platform/services/prod/postgreSQL/01-postgres.yaml
b/test/testdata/platform/services/prod/postgreSQL/01-postgres.yaml
new file mode 100644
index 00000000..662de4c7
--- /dev/null
+++ b/test/testdata/platform/services/prod/postgreSQL/01-postgres.yaml
@@ -0,0 +1,86 @@
+# Copyright 2024 Apache Software Foundation (ASF)
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+---
+apiVersion: v1
+kind: PersistentVolumeClaim
+metadata:
+ labels:
+ app.kubernetes.io/name: postgres
+ name: postgres-pvc
+spec:
+ accessModes:
+ - ReadWriteOnce
+ resources:
+ requests:
+ storage: 1Gi
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ labels:
+ app.kubernetes.io/name: postgres
+ name: postgres
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app.kubernetes.io/name: postgres
+ template:
+ metadata:
+ labels:
+ app.kubernetes.io/name: postgres
+ spec:
+ containers:
+ - name: postgres
+ image: postgres:13.2-alpine
+ imagePullPolicy: 'IfNotPresent'
+ ports:
+ - containerPort: 5432
+ volumeMounts:
+ - name: storage
+ mountPath: /var/lib/postgresql/data
+ envFrom:
+ - secretRef:
+ name: postgres-secrets
+ readinessProbe:
+ exec:
+ command: ["pg_isready"]
+ initialDelaySeconds: 15
+ timeoutSeconds: 2
+ livenessProbe:
+ exec:
+ command: ["pg_isready"]
+ initialDelaySeconds: 15
+ timeoutSeconds: 2
+ resources:
+ limits:
+ memory: "256Mi"
+ cpu: "500m"
+ volumes:
+ - name: storage
+ persistentVolumeClaim:
+ claimName: postgres-pvc
+---
+apiVersion: v1
+kind: Service
+metadata:
+ labels:
+ app.kubernetes.io/name: postgres
+ name: postgres
+spec:
+ selector:
+ app.kubernetes.io/name: postgres
+ ports:
+ - port: 5432
diff --git
a/test/testdata/platform/services/prod/postgreSQL/02-sonataflow_platform.yaml
b/test/testdata/platform/services/prod/postgreSQL/02-sonataflow_platform.yaml
new file mode 100644
index 00000000..75acb6d7
--- /dev/null
+++
b/test/testdata/platform/services/prod/postgreSQL/02-sonataflow_platform.yaml
@@ -0,0 +1,55 @@
+# Copyright 2024 Apache Software Foundation (ASF)
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+apiVersion: sonataflow.org/v1alpha08
+kind: SonataFlowPlatform
+metadata:
+ name: sonataflow-platform
+spec:
+ build:
+ template:
+ buildArgs:
+ - name: QUARKUS_EXTENSIONS
+ value:
org.kie.kogito:kogito-addons-quarkus-jobs-knative-eventing:999-SNAPSHOT
+ services:
+ dataIndex:
+ enabled: true
+ persistence:
+ postgresql:
+ jdbcUrl:
jdbc:postgresql://postgres:5432/sonataflow?currentSchema=data-index-service
+ secretRef:
+ name: postgres-secrets
+ userKey: POSTGRES_USER
+ passwordKey: POSTGRES_PASSWORD
+ podTemplate:
+ initContainers:
+ - name: init-postgres
+ image: registry.access.redhat.com/ubi9/ubi-minimal:latest
+ imagePullPolicy: IfNotPresent
+ command: [ 'sh', '-c', 'until (echo 1 > /dev/tcp/postgres.$(cat
/var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local/5432)
>/dev/null 2>&1; do echo "Waiting for postgres server"; sleep 3; done;' ]
+ jobService:
+ enabled: true
+ persistence:
+ postgresql:
+ jdbcUrl:
jdbc:postgresql://postgres:5432/sonataflow?currentSchema=jobs-service
+ secretRef:
+ name: postgres-secrets
+ userKey: POSTGRES_USER
+ passwordKey: POSTGRES_PASSWORD
+ podTemplate:
+ initContainers:
+ - name: init-postgres
+ image: registry.access.redhat.com/ubi9/ubi-minimal:latest
+ imagePullPolicy: IfNotPresent
+ command: [ 'sh', '-c', 'until (echo 1 > /dev/tcp/postgres.$(cat
/var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local/5432)
>/dev/null 2>&1; do echo "Waiting for postgres server"; sleep 3; done;' ]
diff --git a/test/testdata/platform/services/prod/postgreSQL/kustomization.yaml
b/test/testdata/platform/services/prod/postgreSQL/kustomization.yaml
new file mode 100644
index 00000000..d3fd127c
--- /dev/null
+++ b/test/testdata/platform/services/prod/postgreSQL/kustomization.yaml
@@ -0,0 +1,32 @@
+# Copyright 2024 Apache Software Foundation (ASF)
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+resources:
+- 01-postgres.yaml
+- 02-sonataflow_platform.yaml
+
+generatorOptions:
+ disableNameSuffixHash: true
+
+secretGenerator:
+ - name: postgres-secrets
+ literals:
+ - POSTGRES_USER=sonataflow
+ - POSTGRES_PASSWORD=sonataflow
+ - POSTGRES_DATABASE=sonataflow
+ - PGDATA=/var/lib/pgsql/data/userdata
+
+sortOptions:
+ order: fifo
+
diff --git
a/test/testdata/platform/services/prod/postgreSQL/sonataflow/04-sonataflow_callbackstatetimeouts.sw.yaml
b/test/testdata/platform/services/prod/postgreSQL/sonataflow/04-sonataflow_callbackstatetimeouts.sw.yaml
new file mode 100644
index 00000000..249ee2c1
--- /dev/null
+++
b/test/testdata/platform/services/prod/postgreSQL/sonataflow/04-sonataflow_callbackstatetimeouts.sw.yaml
@@ -0,0 +1,81 @@
+# Copyright 2024 Apache Software Foundation (ASF)
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+apiVersion: sonataflow.org/v1alpha08
+kind: SonataFlow
+metadata:
+ name: callbackstatetimeouts
+ annotations:
+ sonataflow.org/description: Callback State Timeouts Example k8s
+ sonataflow.org/version: 0.0.1
+ sonataflow.org/profile: prod
+spec:
+ flow:
+ start: PrintStartMessage
+ events:
+ - name: callbackEvent
+ source: ''
+ type: callback_event_type
+ functions:
+ - name: systemOut
+ type: custom
+ operation: sysout
+ states:
+ - name: PrintStartMessage
+ type: operation
+ actions:
+ - name: printSystemOut
+ functionRef:
+ refName: systemOut
+ arguments:
+ message: "${\"callback-state-timeouts: \" +
$WORKFLOW.instanceId + \" has started.\"}"
+ transition: CallbackState
+ - name: CallbackState
+ type: callback
+ action:
+ name: callbackAction
+ functionRef:
+ refName: systemOut
+ arguments:
+ message: "${\"callback-state-timeouts: \" + $WORKFLOW.instanceId
+ \" has executed the callbackFunction.\"}"
+ eventRef: callbackEvent
+ transition: CheckEventArrival
+ timeouts:
+ eventTimeout: PT30S
+ - name: CheckEventArrival
+ type: switch
+ dataConditions:
+ - condition: "${ .eventData != null }"
+ transition: EventArrived
+ defaultCondition:
+ transition: EventNotArrived
+ - name: EventArrived
+ type: inject
+ data:
+ exitMessage: "The callback event has arrived."
+ transition: PrintExitMessage
+ - name: EventNotArrived
+ type: inject
+ data:
+ exitMessage: "The callback event has not arrived, and the timeout
has overdue."
+ transition: PrintExitMessage
+ - name: PrintExitMessage
+ type: operation
+ actions:
+ - name: printSystemOut
+ functionRef:
+ refName: systemOut
+ arguments:
+ message: "${\"callback-state-timeouts: \" +
$WORKFLOW.instanceId + \" has finalized. \" + .exitMessage + \" eventData: \" +
.eventData}"
+ end: true
diff --git a/test/yaml.go b/test/yaml.go
index 812c9054..5edbc605 100644
--- a/test/yaml.go
+++ b/test/yaml.go
@@ -218,6 +218,10 @@ func GetSonataFlowE2eOrderProcessingFolder() string {
return e2eSamples + sonataFlowOrderProcessingFolder
}
+func GetSonataFlowE2EPlatformServicesDirectory() string {
+ return filepath.Join(getTestDataDir(), "platform", "services")
+}
+
// getTestDataDir gets the testdata directory containing every sample out
there from test/testdata.
// It should be used for every testing unit within the module.
func getTestDataDir() string {
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]