This is an automated email from the ASF dual-hosted git repository.

marat pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-karavan.git

commit 32fd842bdbda2f5a17c85123a88923158f1f1383
Author: Marat Gubaidullin <ma...@talismancloud.io>
AuthorDate: Wed Jul 10 12:05:06 2024 -0400

    Route Config in Topology
    
    topology
---
 .../src/main/webui/src/topology/TopologyApi.tsx    |  27 ++++-
 .../src/main/webui/src/topology/TopologyStore.ts   |   2 +-
 karavan-core/src/core/api/TopologyUtils.ts         |  13 ++-
 karavan-designer/public/example/demo.camel.yaml    | 113 ++++++++++++---------
 karavan-designer/src/App.tsx                       |   2 +-
 karavan-designer/src/topology/TopologyApi.tsx      |  27 ++++-
 karavan-space/src/topology/TopologyApi.tsx         |  27 ++++-
 karavan-space/src/topology/TopologyStore.ts        |   2 +-
 8 files changed, 148 insertions(+), 65 deletions(-)

diff --git a/karavan-app/src/main/webui/src/topology/TopologyApi.tsx 
b/karavan-app/src/main/webui/src/topology/TopologyApi.tsx
index 26d5c40c..174ad6a6 100644
--- a/karavan-app/src/main/webui/src/topology/TopologyApi.tsx
+++ b/karavan-app/src/main/webui/src/topology/TopologyApi.tsx
@@ -234,11 +234,13 @@ export function getRestEdges(rest: TopologyRestNode[], 
tins: TopologyIncomingNod
 export function getInternalEdges(tons: TopologyOutgoingNode[], tins: 
TopologyIncomingNode[]): EdgeModel[] {
     const result: EdgeModel[] = [];
     tons.filter(ton => ton.type === 'internal').forEach((ton, index) => {
-        const uri: string = (ton.step as any).uri;
-        if (uri.startsWith("direct") || uri.startsWith("seda")) {
-            const name = (ton.step as any).parameters.name;
+        const step = (ton.step as any);
+        if (step?.dslName === 'DeadLetterChannelDefinition') {
+            const parts = step.deadLetterUri?.split(":");
+            const uri: string = parts[0];
+            const name: string = parts[1];
             const target = TopologyUtils.getRouteIdByUriAndName(tins, uri, 
name);
-                const node: EdgeModel = {
+            const node: EdgeModel = {
                 id: 'internal-' + ton.id + '-' + index,
                 type: 'edge',
                 source: 'route-' + ton.routeId,
@@ -247,6 +249,21 @@ export function getInternalEdges(tons: 
TopologyOutgoingNode[], tins: TopologyInc
                 animationSpeed: EdgeAnimationSpeed.medium
             }
             if (target) result.push(node);
+        } else {
+            const uri: string = (ton.step as any).uri;
+            if (uri?.startsWith("direct") || uri?.startsWith("seda")) {
+                const name = (ton.step as any).parameters.name;
+                const target = TopologyUtils.getRouteIdByUriAndName(tins, uri, 
name);
+                const node: EdgeModel = {
+                    id: 'internal-' + ton.id + '-' + index,
+                    type: 'edge',
+                    source: 'route-' + ton.routeId,
+                    target: target,
+                    edgeStyle: EdgeStyle.solid,
+                    animationSpeed: EdgeAnimationSpeed.medium
+                }
+                if (target) result.push(node);
+            }
         }
     });
     return result;
@@ -308,7 +325,7 @@ export function getModel(files: IntegrationFile[], 
grouping?: boolean): Model {
     edges.push(...getRestEdges(trestns, tins));
     edges.push(...getInternalEdges(tons, tins));
     edges.push(...getInternalEdges(trcons, tins));
-    edges.push(...getExternalEdges(tons,tins));
+    // edges.push(...getExternalEdges(tons,tins));
 
     return {nodes: nodes, edges: edges, graph: {id: 'g1', type: 'graph', 
layout: 'Dagre'}};
 }
diff --git a/karavan-app/src/main/webui/src/topology/TopologyStore.ts 
b/karavan-app/src/main/webui/src/topology/TopologyStore.ts
index 63b7ed4f..0ba80503 100644
--- a/karavan-app/src/main/webui/src/topology/TopologyStore.ts
+++ b/karavan-app/src/main/webui/src/topology/TopologyStore.ts
@@ -56,7 +56,7 @@ export const useTopologyStore = 
createWithEqualityFn<TopologyState>((set) => ({
             return {nodeData: nodeData};
         });
     },
-    showGroups: false,
+    showGroups: true,
     setShowGroups: (showGroups: boolean) => {
         set((state: TopologyState) => {
             return {showGroups: showGroups};
diff --git a/karavan-core/src/core/api/TopologyUtils.ts 
b/karavan-core/src/core/api/TopologyUtils.ts
index 4d0b22e0..4ec740a9 100644
--- a/karavan-core/src/core/api/TopologyUtils.ts
+++ b/karavan-core/src/core/api/TopologyUtils.ts
@@ -272,9 +272,20 @@ export class TopologyUtils {
                         const type = 
TopologyUtils.isElementInternalComponent(e) ? 'internal' : 'external';
                         const connectorType = 
TopologyUtils.getConnectorType(e);
                         const uniqueUri = TopologyUtils.getUniqueUri(e);
-                        result.push(new TopologyOutgoingNode(id, type, 
connectorType, rc.id || 'default', title, filename, e, uniqueUri));
+                        result.push(new TopologyOutgoingNode(id, type, 
connectorType, rc.id || 'undefined', title, filename, e, uniqueUri));
                     })
                 })
+                if (rc.errorHandler?.deadLetterChannel) {
+                    const e = rc.errorHandler?.deadLetterChannel
+                    const id = 'outgoing-' + rc.id + '-' + e.id;
+                    const title = CamelDisplayUtil.getStepDescription(e);
+                    const type = (e?.deadLetterUri?.startsWith('direct:') || 
e?.deadLetterUri?.startsWith('seda:') )
+                        ? 'internal'
+                        : 'external';
+                    const connectorType = 'component';
+                    const uniqueUri = e?.deadLetterUri
+                    result.push(new TopologyOutgoingNode(id, type, 
connectorType, rc.id || 'undefined', title, filename, e, uniqueUri));
+                }
             })
 
         })
diff --git a/karavan-designer/public/example/demo.camel.yaml 
b/karavan-designer/public/example/demo.camel.yaml
index ef7ef78f..c41432b0 100644
--- a/karavan-designer/public/example/demo.camel.yaml
+++ b/karavan-designer/public/example/demo.camel.yaml
@@ -1,55 +1,76 @@
 - route:
-    id: route-b0b7
-    nodePrefixId: route-dfc
+    id: route-654e
+    description: Error Handler
+    nodePrefixId: route-a06
     from:
-      id: from-70b1
-      uri: kamelet:timer-source
+      id: from-6dd1
+      description: DLQ
+      uri: direct
       parameters:
-        message: Hello
-        period: 1
+        name: dlq
       steps:
-        - to:
-            id: to-df39
-            uri: amqp
-        - to:
-            id: to-1600
-            uri: kamelet:kafka-sink
-        - choice:
-            id: choice-41b7
-            when:
-              - id: when-29c0
-                expression:
-                  simple:
-                    id: simple-289b
-                steps:
-                  - aggregate:
-                      id: aggregate-1193
-                      completionSize: 121212
-                      completionTimeout: "{{bean:beanName.method}}"
-                      steps:
-                        - bean:
-                            id: bean-a9e0
-                        - to:
-                            id: to-df17
-                            uri: amqp
-            otherwise:
-              id: otherwise-b00c
-              steps:
-                - aggregate:
-                    id: aggregate-46cb
-                    completionSize: 1
-                    steps:
-                      - to:
-                          id: to-5565
-                          uri: activemq
+        - log:
+            id: log-bf00
+            message: "ERROR: ${exception}"
 - route:
-    id: test
+    id: route-c11a
+    description: From
+    nodePrefixId: route-ae1
+    autoStartup: true
     from:
-      id: from-aeed
-      uri: direct
+      id: from-b6f1
+      description: Command received
+      uri: kamelet:kafka-not-secured-source
       parameters:
-        name: test
+        topic: wh_commands
+        bootstrapServers: kafka:9092
+        autoCommitEnable: true
+        consumerGroup: lightstep
       steps:
+        - setVariable:
+            id: setVariable-61a9
+            description: Set command
+            name: command
+            expression:
+              simple:
+                id: simple-965d
+                expression: ${body}
+        - setBody:
+            id: setBody-0515
+            description: Prepare message
+            expression:
+              groovy:
+                id: groovy-bb4f
+                expression: >-
+
+        - log:
+            id: log-7190
+            description: Log message
+            message: "Message: ${body}"
         - to:
-            id: to-1daf
-            uri: kamelet:aws-bedrock-agent-runtime-sink
+            id: to-bb55
+            description: Call
+            uri: netty
+            parameters:
+              protocol: tcp
+- route:
+    id: route-42e3
+    description: Events from box
+    nodePrefixId: route-de0
+    autoStartup: false
+    from:
+      id: from-5b8a
+      description: Event received
+      uri: netty
+      parameters:
+        protocol: tcp
+
+      steps:
+        - log:
+            id: log-63db
+            message: ${body}
+- routeConfiguration:
+    errorHandler:
+      deadLetterChannel:
+        id: deadLetterChannel-3bf9
+        deadLetterUri: direct:dlq
diff --git a/karavan-designer/src/App.tsx b/karavan-designer/src/App.tsx
index bc6d9f7b..b7344e30 100644
--- a/karavan-designer/src/App.tsx
+++ b/karavan-designer/src/App.tsx
@@ -58,7 +58,7 @@ class MenuItem {
 
 export function App() {
 
-    const [pageId, setPageId] = useState<string>('designer');
+    const [pageId, setPageId] = useState<string>('topology');
     const [name, setName] = useState<string>('example.yaml');
     const [key, setKey] = useState<string>('');
     const [yaml, setYaml] = useState<string>('');
diff --git a/karavan-designer/src/topology/TopologyApi.tsx 
b/karavan-designer/src/topology/TopologyApi.tsx
index fa5ca2d2..b297b186 100644
--- a/karavan-designer/src/topology/TopologyApi.tsx
+++ b/karavan-designer/src/topology/TopologyApi.tsx
@@ -82,13 +82,13 @@ export function getRoutes(tins: TopologyRouteNode[]): 
NodeModel[] {
             width: NODE_DIAMETER,
             height: NODE_DIAMETER,
             shape: NodeShape.rect,
-            status: NodeStatus.default,
             data: {
                 isAlternate: false,
                 type: 'route',
                 icon: 'route',
                 step: tin.route,
                 routeId: tin.routeId,
+                autoStartup: tin.route.autoStartup !== false,
                 fileName: tin.fileName,
             }
         }
@@ -234,11 +234,13 @@ export function getRestEdges(rest: TopologyRestNode[], 
tins: TopologyIncomingNod
 export function getInternalEdges(tons: TopologyOutgoingNode[], tins: 
TopologyIncomingNode[]): EdgeModel[] {
     const result: EdgeModel[] = [];
     tons.filter(ton => ton.type === 'internal').forEach((ton, index) => {
-        const uri: string = (ton.step as any).uri;
-        if (uri.startsWith("direct") || uri.startsWith("seda")) {
-            const name = (ton.step as any).parameters.name;
+        const step = (ton.step as any);
+        if (step?.dslName === 'DeadLetterChannelDefinition') {
+            const parts = step.deadLetterUri?.split(":");
+            const uri: string = parts[0];
+            const name: string = parts[1];
             const target = TopologyUtils.getRouteIdByUriAndName(tins, uri, 
name);
-                const node: EdgeModel = {
+            const node: EdgeModel = {
                 id: 'internal-' + ton.id + '-' + index,
                 type: 'edge',
                 source: 'route-' + ton.routeId,
@@ -247,6 +249,21 @@ export function getInternalEdges(tons: 
TopologyOutgoingNode[], tins: TopologyInc
                 animationSpeed: EdgeAnimationSpeed.medium
             }
             if (target) result.push(node);
+        } else {
+            const uri: string = (ton.step as any).uri;
+            if (uri?.startsWith("direct") || uri?.startsWith("seda")) {
+                const name = (ton.step as any).parameters.name;
+                const target = TopologyUtils.getRouteIdByUriAndName(tins, uri, 
name);
+                const node: EdgeModel = {
+                    id: 'internal-' + ton.id + '-' + index,
+                    type: 'edge',
+                    source: 'route-' + ton.routeId,
+                    target: target,
+                    edgeStyle: EdgeStyle.solid,
+                    animationSpeed: EdgeAnimationSpeed.medium
+                }
+                if (target) result.push(node);
+            }
         }
     });
     return result;
diff --git a/karavan-space/src/topology/TopologyApi.tsx 
b/karavan-space/src/topology/TopologyApi.tsx
index 26d5c40c..174ad6a6 100644
--- a/karavan-space/src/topology/TopologyApi.tsx
+++ b/karavan-space/src/topology/TopologyApi.tsx
@@ -234,11 +234,13 @@ export function getRestEdges(rest: TopologyRestNode[], 
tins: TopologyIncomingNod
 export function getInternalEdges(tons: TopologyOutgoingNode[], tins: 
TopologyIncomingNode[]): EdgeModel[] {
     const result: EdgeModel[] = [];
     tons.filter(ton => ton.type === 'internal').forEach((ton, index) => {
-        const uri: string = (ton.step as any).uri;
-        if (uri.startsWith("direct") || uri.startsWith("seda")) {
-            const name = (ton.step as any).parameters.name;
+        const step = (ton.step as any);
+        if (step?.dslName === 'DeadLetterChannelDefinition') {
+            const parts = step.deadLetterUri?.split(":");
+            const uri: string = parts[0];
+            const name: string = parts[1];
             const target = TopologyUtils.getRouteIdByUriAndName(tins, uri, 
name);
-                const node: EdgeModel = {
+            const node: EdgeModel = {
                 id: 'internal-' + ton.id + '-' + index,
                 type: 'edge',
                 source: 'route-' + ton.routeId,
@@ -247,6 +249,21 @@ export function getInternalEdges(tons: 
TopologyOutgoingNode[], tins: TopologyInc
                 animationSpeed: EdgeAnimationSpeed.medium
             }
             if (target) result.push(node);
+        } else {
+            const uri: string = (ton.step as any).uri;
+            if (uri?.startsWith("direct") || uri?.startsWith("seda")) {
+                const name = (ton.step as any).parameters.name;
+                const target = TopologyUtils.getRouteIdByUriAndName(tins, uri, 
name);
+                const node: EdgeModel = {
+                    id: 'internal-' + ton.id + '-' + index,
+                    type: 'edge',
+                    source: 'route-' + ton.routeId,
+                    target: target,
+                    edgeStyle: EdgeStyle.solid,
+                    animationSpeed: EdgeAnimationSpeed.medium
+                }
+                if (target) result.push(node);
+            }
         }
     });
     return result;
@@ -308,7 +325,7 @@ export function getModel(files: IntegrationFile[], 
grouping?: boolean): Model {
     edges.push(...getRestEdges(trestns, tins));
     edges.push(...getInternalEdges(tons, tins));
     edges.push(...getInternalEdges(trcons, tins));
-    edges.push(...getExternalEdges(tons,tins));
+    // edges.push(...getExternalEdges(tons,tins));
 
     return {nodes: nodes, edges: edges, graph: {id: 'g1', type: 'graph', 
layout: 'Dagre'}};
 }
diff --git a/karavan-space/src/topology/TopologyStore.ts 
b/karavan-space/src/topology/TopologyStore.ts
index 63b7ed4f..0ba80503 100644
--- a/karavan-space/src/topology/TopologyStore.ts
+++ b/karavan-space/src/topology/TopologyStore.ts
@@ -56,7 +56,7 @@ export const useTopologyStore = 
createWithEqualityFn<TopologyState>((set) => ({
             return {nodeData: nodeData};
         });
     },
-    showGroups: false,
+    showGroups: true,
     setShowGroups: (showGroups: boolean) => {
         set((state: TopologyState) => {
             return {showGroups: showGroups};

Reply via email to