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 1d2d77cd1a8331fb617a84e9cbd435bca7529441 Author: Marat Gubaidullin <marat.gubaidul...@gmail.com> AuthorDate: Thu Aug 10 16:33:33 2023 -0400 Implements in Kubernetes #839 --- .../camel/karavan/kubernetes/PodEventHandler.java | 22 +++++++++++++--- .../apache/camel/karavan/service/CamelService.java | 14 +++++++++- .../apache/camel/karavan/service/EventService.java | 2 +- .../apache/camel/karavan/service/GitService.java | 18 ++++++------- .../camel/karavan/service/ScheduledService.java | 2 +- .../camel-main-docker-application.properties | 3 +++ .../camel-main-kubernetes-application.properties | 14 ++++++++-- .../camel-main-openshift-application.properties | 13 ++++++++-- .../src/main/webui/src/api/ProjectModels.ts | 1 - .../src/main/webui/src/api/ProjectStore.ts | 6 +++++ .../src/main/webui/src/dashboard/DashboardPage.tsx | 2 +- .../webui/src/designer/route/DslConnections.tsx | 4 +-- .../webui/src/designer/route/DslProperties.tsx | 13 +++++++--- .../main/webui/src/designer/route/DslSelector.tsx | 3 ++- .../src/main/webui/src/designer/utils/CamelUi.tsx | 1 - .../src/main/webui/src/project/DevModeToolbar.tsx | 30 ++++++++++++---------- .../src/main/webui/src/project/ProjectPage.tsx | 12 ++------- .../src/main/webui/src/project/ProjectToolbar.tsx | 16 +++++------- .../src/main/webui/src/project/file/FileEditor.tsx | 16 ++++-------- .../webui/src/project/pipeline/ProjectStatus.tsx | 4 +-- .../src/main/webui/src/project/trace/TraceTab.tsx | 1 - ....sh => camel-main-builder-script-kubernetes.sh} | 11 ++++---- ...t.sh => camel-main-builder-script-openshift.sh} | 11 ++++---- .../resources/quarkus-builder-script-kubernetes.sh | 2 +- .../resources/quarkus-builder-script-openshift.sh | 2 +- .../spring-boot-builder-script-kubernetes.sh | 2 +- .../spring-boot-builder-script-openshift.sh | 2 +- 27 files changed, 135 insertions(+), 92 deletions(-) diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/PodEventHandler.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/PodEventHandler.java index 5d9417ac..3a684ef9 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/PodEventHandler.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/PodEventHandler.java @@ -12,10 +12,14 @@ import org.apache.camel.karavan.infinispan.model.ContainerStatus; import org.jboss.logging.Logger; import java.util.List; +import java.util.Map; +import java.util.Objects; import static org.apache.camel.karavan.service.CodeService.DEFAULT_CONTAINER_RESOURCES; import static org.apache.camel.karavan.shared.Constants.LABEL_PROJECT_ID; +import static org.apache.camel.karavan.shared.Constants.RELOAD_TRY_COUNT; import static org.apache.camel.karavan.shared.EventType.CONTAINER_STATUS; +import static org.apache.camel.karavan.shared.EventType.DEVMODE_CONTAINER_READY; public class PodEventHandler implements ResourceEventHandler<Pod> { @@ -47,9 +51,18 @@ public class PodEventHandler implements ResourceEventHandler<Pod> { public void onUpdate(Pod oldPod, Pod newPod) { try { LOGGER.info("onUpdate " + newPod.getMetadata().getName()); - ContainerStatus ps = getPodStatus(newPod); - if (ps != null) { - eventBus.send(CONTAINER_STATUS, JsonObject.mapFrom(ps)); + if (!newPod.isMarkedForDeletion() && newPod.getMetadata().getDeletionTimestamp() == null) { + ContainerStatus ps = getPodStatus(newPod); + if (ps != null) { + eventBus.send(CONTAINER_STATUS, JsonObject.mapFrom(ps)); + if (Objects.equals(ps.getState(), ContainerStatus.State.running.name())) { + Map<String, Object> message = Map.of( + LABEL_PROJECT_ID, ps.getProjectId(), + RELOAD_TRY_COUNT, 1 + ); + eventBus.publish(DEVMODE_CONTAINER_READY, JsonObject.mapFrom(message)); + } + } } } catch (Exception e){ LOGGER.error(e.getMessage(), e.getCause()); @@ -63,6 +76,7 @@ public class PodEventHandler implements ResourceEventHandler<Pod> { String deployment = pod.getMetadata().getLabels().get("app"); String projectId = deployment != null ? deployment : pod.getMetadata().getLabels().get(LABEL_PROJECT_ID); infinispanService.deleteContainerStatus(projectId, kubernetesService.environment, pod.getMetadata().getName()); + infinispanService.deleteCamelStatuses(projectId, kubernetesService.environment); } catch (Exception e){ LOGGER.error(e.getMessage(), e.getCause()); } @@ -93,7 +107,7 @@ public class PodEventHandler implements ResourceEventHandler<Pod> { requestMemory + " / " + limitMemory, requestCpu + " / " + limitCpu, creationTimestamp); - + status.setContainerId(pod.getMetadata().getName()); if (ready) { status.setState(ContainerStatus.State.running.name()); } else { diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/CamelService.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/CamelService.java index d3f06f5d..e76fcb30 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/CamelService.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/CamelService.java @@ -34,10 +34,14 @@ import org.jboss.logging.Logger; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; import java.util.Arrays; +import java.util.Map; import java.util.Objects; import java.util.concurrent.ExecutionException; +import static org.apache.camel.karavan.shared.Constants.LABEL_PROJECT_ID; +import static org.apache.camel.karavan.shared.Constants.RELOAD_TRY_COUNT; import static org.apache.camel.karavan.shared.EventType.CONTAINER_STATUS; +import static org.apache.camel.karavan.shared.EventType.DEVMODE_CONTAINER_READY; @ApplicationScoped public class CamelService { @@ -123,11 +127,19 @@ public class CamelService { @ConsumeEvent(value = CMD_COLLECT_CAMEL_STATUS, blocking = true, ordered = true) public void collectCamelStatuses(JsonObject data) { CamelStatusRequest dms = data.mapTo(CamelStatusRequest.class); + String projectId = dms.getProjectId(); + if (infinispanService.getCamelStatus(projectId, environment, CamelStatus.Name.context.name()) == null) { + Map<String, Object> message = Map.of( + LABEL_PROJECT_ID, projectId, + RELOAD_TRY_COUNT, 1 + ); + eventBus.publish(DEVMODE_CONTAINER_READY, JsonObject.mapFrom(message)); + } Arrays.stream(CamelStatus.Name.values()).forEach(statusName -> { String containerName = dms.getContainerName(); String status = getCamelStatus(containerName, statusName); if (status != null) { - CamelStatus cs = new CamelStatus(dms.getProjectId(), containerName, statusName, status, environment); + CamelStatus cs = new CamelStatus(projectId, containerName, statusName, status, environment); infinispanService.saveCamelStatus(cs); } }); diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/EventService.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/EventService.java index 26fabfb2..03da9dce 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/EventService.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/EventService.java @@ -86,7 +86,7 @@ public class EventService { ContainerStatus status = infinispanService.getContainerStatus(projectId, environment, projectId); CamelStatus cs = infinispanService.getCamelStatus(projectId, environment, CamelStatus.Name.context.name()); if (status != null - && !status.getCodeLoaded() + && !Objects.equals(status.getCodeLoaded(), Boolean.TRUE) && status.getContainerId() != null && status.getState().equals(ContainerStatus.State.running.name()) && camelIsStarted(cs)) { diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/GitService.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/GitService.java index d7d85a13..2ce35d23 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/GitService.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/GitService.java @@ -132,21 +132,21 @@ public class GitService { public GitConfig getGitConfig() { String propertiesPrefix = "karavan."; - String branch = ConfigProvider.getConfig().getValue(propertiesPrefix + "git.branch", String.class); + String branch = ConfigProvider.getConfig().getValue(propertiesPrefix + "git-branch", String.class); if (ConfigService.inKubernetes()) { LOGGER.info("inKubernetes " + kubernetesService.getNamespace()); Secret secret = kubernetesService.getKaravanSecret(); - String uri = new String(Base64.getDecoder().decode(secret.getData().get("git.repository").getBytes(StandardCharsets.UTF_8))); - String username = new String(Base64.getDecoder().decode(secret.getData().get("git.username").getBytes(StandardCharsets.UTF_8))); - String password = new String(Base64.getDecoder().decode(secret.getData().get("git.password").getBytes(StandardCharsets.UTF_8))); - if (secret.getData().containsKey("git.branch")) { - branch = new String(Base64.getDecoder().decode(secret.getData().get("git.branch").getBytes(StandardCharsets.UTF_8))); + String uri = new String(Base64.getDecoder().decode(secret.getData().get("git-repository").getBytes(StandardCharsets.UTF_8))); + String username = new String(Base64.getDecoder().decode(secret.getData().get("git-username").getBytes(StandardCharsets.UTF_8))); + String password = new String(Base64.getDecoder().decode(secret.getData().get("git-password").getBytes(StandardCharsets.UTF_8))); + if (secret.getData().containsKey("git-branch")) { + branch = new String(Base64.getDecoder().decode(secret.getData().get("git-branch").getBytes(StandardCharsets.UTF_8))); } return new GitConfig(uri, username, password, branch); } else { - String uri = ConfigProvider.getConfig().getValue(propertiesPrefix + "git.repository", String.class); - String username = ConfigProvider.getConfig().getValue(propertiesPrefix + "git.username", String.class); - String password = ConfigProvider.getConfig().getValue(propertiesPrefix + "git.password", String.class); + String uri = ConfigProvider.getConfig().getValue(propertiesPrefix + "git-repository", String.class); + String username = ConfigProvider.getConfig().getValue(propertiesPrefix + "git-username", String.class); + String password = ConfigProvider.getConfig().getValue(propertiesPrefix + "git-password", String.class); return new GitConfig(uri, username, password, branch); } } diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/ScheduledService.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/ScheduledService.java index 296f9fbe..10108b2d 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/ScheduledService.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/ScheduledService.java @@ -92,7 +92,7 @@ public class ScheduledService { } } - @Scheduled(every = "{karavan.git.pull.interval}", concurrentExecution = Scheduled.ConcurrentExecution.SKIP) + @Scheduled(every = "{karavan.git-pull-interval}", concurrentExecution = Scheduled.ConcurrentExecution.SKIP) void pullCommitsFromGit() { projectService.pullCommits(); } diff --git a/karavan-web/karavan-app/src/main/resources/snippets/camel-main-docker-application.properties b/karavan-web/karavan-app/src/main/resources/snippets/camel-main-docker-application.properties index c446e92d..acceb597 100644 --- a/karavan-web/karavan-app/src/main/resources/snippets/camel-main-docker-application.properties +++ b/karavan-web/karavan-app/src/main/resources/snippets/camel-main-docker-application.properties @@ -7,3 +7,6 @@ camel.jbang.version=4.0.0-RC2 camel.jbang.dependencies=camel-console,camel-platform-http-main camel.health.enabled=true camel.health.exposure-level=full +camel.server.enabled=true +camel.server.healthCheckEnabled=true +camel.server.devConsoleEnabled=true diff --git a/karavan-web/karavan-app/src/main/resources/snippets/camel-main-kubernetes-application.properties b/karavan-web/karavan-app/src/main/resources/snippets/camel-main-kubernetes-application.properties index 26fff7c6..6f6a9a91 100644 --- a/karavan-web/karavan-app/src/main/resources/snippets/camel-main-kubernetes-application.properties +++ b/karavan-web/karavan-app/src/main/resources/snippets/camel-main-kubernetes-application.properties @@ -7,8 +7,18 @@ camel.jbang.version=4.0.0-RC2 camel.jbang.dependencies=camel-console,camel-platform-http-main camel.health.enabled=true camel.health.exposure-level=full +camel.server.enabled=true +camel.server.healthCheckEnabled=true +camel.server.devConsoleEnabled=true +label.runtime=app.kubernetes.io/runtime +jib.from.image=gcr.io/distroless/java17@sha256:3a4ea21bd7b412b8b6ae61313b39337d8f03bb6844013810e8e4625d8c765edb jkube.version=1.13.1 -jkube.build.strategy=jib +jkube.skip.build=true +jkube.namespace=default jkube.imagePullPolicy=IfNotPresent +jkube.enricher.jkube-controller.type=Deployment jkube.enricher.jkube-controller.replicaCount=1 -jkube.enricher.jkube-service.port=80 \ No newline at end of file +jkube.enricher.jkube-service.port=80 +jkube.enricher.jkube-project-label.group=karavan +jkube.enricher.jkube-project-label.provider=karavan +jkube.recreate=true \ No newline at end of file diff --git a/karavan-web/karavan-app/src/main/resources/snippets/camel-main-openshift-application.properties b/karavan-web/karavan-app/src/main/resources/snippets/camel-main-openshift-application.properties index 6997a260..6f6a9a91 100644 --- a/karavan-web/karavan-app/src/main/resources/snippets/camel-main-openshift-application.properties +++ b/karavan-web/karavan-app/src/main/resources/snippets/camel-main-openshift-application.properties @@ -7,9 +7,18 @@ camel.jbang.version=4.0.0-RC2 camel.jbang.dependencies=camel-console,camel-platform-http-main camel.health.enabled=true camel.health.exposure-level=full +camel.server.enabled=true +camel.server.healthCheckEnabled=true +camel.server.devConsoleEnabled=true +label.runtime=app.kubernetes.io/runtime +jib.from.image=gcr.io/distroless/java17@sha256:3a4ea21bd7b412b8b6ae61313b39337d8f03bb6844013810e8e4625d8c765edb jkube.version=1.13.1 -jkube.build.strategy=jib +jkube.skip.build=true +jkube.namespace=default jkube.imagePullPolicy=IfNotPresent jkube.enricher.jkube-controller.type=Deployment jkube.enricher.jkube-controller.replicaCount=1 -jkube.enricher.jkube-service.port=80 \ No newline at end of file +jkube.enricher.jkube-service.port=80 +jkube.enricher.jkube-project-label.group=karavan +jkube.enricher.jkube-project-label.provider=karavan +jkube.recreate=true \ No newline at end of file diff --git a/karavan-web/karavan-app/src/main/webui/src/api/ProjectModels.ts b/karavan-web/karavan-app/src/main/webui/src/api/ProjectModels.ts index 82a89413..0c8893b5 100644 --- a/karavan-web/karavan-app/src/main/webui/src/api/ProjectModels.ts +++ b/karavan-web/karavan-app/src/main/webui/src/api/ProjectModels.ts @@ -70,7 +70,6 @@ export class ServiceStatus { export class ContainerStatus { containerName: string = ''; containerId: string = ''; - lifeCycle: string = ''; state: string = ''; deployment: string = ''; projectId: string = ''; diff --git a/karavan-web/karavan-app/src/main/webui/src/api/ProjectStore.ts b/karavan-web/karavan-app/src/main/webui/src/api/ProjectStore.ts index deebf7ee..eba4c0c4 100644 --- a/karavan-web/karavan-app/src/main/webui/src/api/ProjectStore.ts +++ b/karavan-web/karavan-app/src/main/webui/src/api/ProjectStore.ts @@ -118,6 +118,8 @@ interface FileState { setEditAdvancedProperties: (editAdvancedProperties: boolean) => void; addProperty: string; setAddProperty: (addProperty: string) => void; + mode: "design" | "code", + setMode: (mode: "design" | "code") => void; } export const useFileStore = create<FileState>((set) => ({ @@ -125,6 +127,10 @@ export const useFileStore = create<FileState>((set) => ({ operation: "none", editAdvancedProperties: false, addProperty: '', + mode: "design", + setMode: (mode: "design" | "code") => { + set(() => ({mode: mode})); + }, setFile: (operation: "create" | "select" | "delete"| "none" | "copy" | "upload", file?: ProjectFile) => { set((state: FileState) => ({ file: file, diff --git a/karavan-web/karavan-app/src/main/webui/src/dashboard/DashboardPage.tsx b/karavan-web/karavan-app/src/main/webui/src/dashboard/DashboardPage.tsx index b338b3bc..30dad19e 100644 --- a/karavan-web/karavan-app/src/main/webui/src/dashboard/DashboardPage.tsx +++ b/karavan-web/karavan-app/src/main/webui/src/dashboard/DashboardPage.tsx @@ -325,7 +325,7 @@ export const DashboardPage = () => { <Badge className="badge">{container.type}</Badge> </Td> <Td style={{verticalAlign: "middle"}}> - <Label color={container.lifeCycle === 'ready' ? "green" : 'grey'}> + <Label color={container.state === 'running' ? "green" : 'grey'}> {container.containerName} </Label> </Td> diff --git a/karavan-web/karavan-app/src/main/webui/src/designer/route/DslConnections.tsx b/karavan-web/karavan-app/src/main/webui/src/designer/route/DslConnections.tsx index 5280bc12..938042d4 100644 --- a/karavan-web/karavan-app/src/main/webui/src/designer/route/DslConnections.tsx +++ b/karavan-web/karavan-app/src/main/webui/src/designer/route/DslConnections.tsx @@ -126,7 +126,7 @@ export class DslConnections extends React.Component<Props, State> { const imageX = incomingX - r + 5; const imageY = fromY - r + 5; return ( - <div style={{display: "block", position: "absolute", top: imageY, left: imageX}}> + <div key={pos.step.uuid + "-icon"} style={{display: "block", position: "absolute", top: imageY, left: imageX}}> {CamelUi.getConnectionIcon(pos.step)} </div> ) @@ -212,7 +212,7 @@ export class DslConnections extends React.Component<Props, State> { const imageX = outgoingX - r + 5; const imageY = outgoingY - r + 5; return ( - <div style={{display: "block", position: "absolute", top: imageY, left: imageX}}> + <div key={pos.step.uuid + "-icon"} style={{display: "block", position: "absolute", top: imageY, left: imageX}}> {CamelUi.getConnectionIcon(pos.step)} </div> ) diff --git a/karavan-web/karavan-app/src/main/webui/src/designer/route/DslProperties.tsx b/karavan-web/karavan-app/src/main/webui/src/designer/route/DslProperties.tsx index 435480de..f10a0eec 100644 --- a/karavan-web/karavan-app/src/main/webui/src/designer/route/DslProperties.tsx +++ b/karavan-web/karavan-app/src/main/webui/src/designer/route/DslProperties.tsx @@ -33,7 +33,7 @@ import {Integration, CamelElement} from "karavan-core/lib/model/IntegrationDefin import {CamelDefinitionApiExt} from "karavan-core/lib/api/CamelDefinitionApiExt"; import {CamelUtil} from "karavan-core/lib/api/CamelUtil"; import {CamelUi, RouteToCreate} from "../utils/CamelUi"; -import {CamelMetadataApi, PropertyMeta} from "karavan-core/lib/model/CamelMetadata"; +import {CamelMetadataApi, DataFormats, PropertyMeta} from "karavan-core/lib/model/CamelMetadata"; import {IntegrationHeader} from "../utils/KaravanComponents"; import CloneIcon from "@patternfly/react-icons/dist/esm/icons/clone-icon"; @@ -170,7 +170,7 @@ export class DslProperties extends React.Component<Props, State> { getPropertyFields = (properties: PropertyMeta[]) => { return (<> - {this.state.step && !['MarshalDefinition', 'UnmarshalDefinition'].includes(this.state.step.dslName) && properties.map((property: PropertyMeta) => + {properties.map((property: PropertyMeta) => <DslPropertyField key={property.name} integration={this.props.integration} property={property} @@ -186,7 +186,11 @@ export class DslProperties extends React.Component<Props, State> { } render() { - const properties = this.getProperties(); + const dataFormats = DataFormats.map(value => value[0]); + const dataFormatElement = this.state.step !== undefined && ['MarshalDefinition', 'UnmarshalDefinition'].includes(this.state.step.dslName); + const properties = !dataFormatElement + ? this.getProperties() + : this.getProperties().filter(p => !dataFormats.includes(p.name)); const propertiesMain = properties.filter(p => !p.label.includes("advanced")); const propertiesAdvanced = properties.filter(p => p.label.includes("advanced")); return ( @@ -196,7 +200,8 @@ export class DslProperties extends React.Component<Props, State> { {this.state.step === undefined && <IntegrationHeader integration={this.props.integration}/>} {this.state.step && this.getComponentHeader()} {this.getPropertyFields(propertiesMain)} - {propertiesAdvanced.length > 0 && + {this.state.step && !['MarshalDefinition', 'UnmarshalDefinition'].includes(this.state.step.dslName) + && propertiesAdvanced.length > 0 && <ExpandableSection toggleText={'Advanced properties'} onToggle={isExpanded => this.setState({isShowAdvanced: !this.state.isShowAdvanced})} diff --git a/karavan-web/karavan-app/src/main/webui/src/designer/route/DslSelector.tsx b/karavan-web/karavan-app/src/main/webui/src/designer/route/DslSelector.tsx index 3baca8d8..eb66e7ec 100644 --- a/karavan-web/karavan-app/src/main/webui/src/designer/route/DslSelector.tsx +++ b/karavan-web/karavan-app/src/main/webui/src/designer/route/DslSelector.tsx @@ -99,7 +99,7 @@ export class DslSelector extends React.Component<Props, State> { </CardBody> <CardFooter className="footer-labels"> <div style={{display: "flex", flexDirection: "row", justifyContent: "start"}}> - {labels.map(label => <Badge isRead className="labels">{label}</Badge>)} + {labels.map(label => <Badge key={label} isRead className="labels">{label}</Badge>)} </div> </CardFooter> @@ -179,6 +179,7 @@ export class DslSelector extends React.Component<Props, State> { <PageSection variant={this.props.dark ? "darker" : "light"}> {isEip && <ToggleGroup aria-label="Labels" isCompact> {eipLabels.map(eipLabel => <ToggleGroupItem + key={eipLabel} text={eipLabel} buttonId={eipLabel} isSelected={this.state.selectedLabels.includes(eipLabel)} diff --git a/karavan-web/karavan-app/src/main/webui/src/designer/utils/CamelUi.tsx b/karavan-web/karavan-app/src/main/webui/src/designer/utils/CamelUi.tsx index a94ed0ac..8d4157c4 100644 --- a/karavan-web/karavan-app/src/main/webui/src/designer/utils/CamelUi.tsx +++ b/karavan-web/karavan-app/src/main/webui/src/designer/utils/CamelUi.tsx @@ -88,7 +88,6 @@ import { WorkflowIcon } from "./KaravanIcons"; import React from "react"; -import {Icon} from "@patternfly/react-core"; const StepElements: string[] = [ "AggregateDefinition", diff --git a/karavan-web/karavan-app/src/main/webui/src/project/DevModeToolbar.tsx b/karavan-web/karavan-app/src/main/webui/src/project/DevModeToolbar.tsx index 9401aeb0..e8462d90 100644 --- a/karavan-web/karavan-app/src/main/webui/src/project/DevModeToolbar.tsx +++ b/karavan-web/karavan-app/src/main/webui/src/project/DevModeToolbar.tsx @@ -4,22 +4,22 @@ import '../designer/karavan.css'; import RocketIcon from "@patternfly/react-icons/dist/esm/icons/rocket-icon"; import ReloadIcon from "@patternfly/react-icons/dist/esm/icons/bolt-icon"; import DeleteIcon from "@patternfly/react-icons/dist/esm/icons/trash-icon"; -import {useDevModeStore, useLogStore, useProjectStore, useStatusesStore} from "../api/ProjectStore"; +import {useAppConfigStore, useDevModeStore, useLogStore, useProjectStore, useStatusesStore} from "../api/ProjectStore"; import {ProjectService} from "../api/ProjectService"; import {shallow} from "zustand/shallow"; import UpIcon from "@patternfly/react-icons/dist/esm/icons/check-circle-icon"; import DownIcon from "@patternfly/react-icons/dist/esm/icons/error-circle-o-icon"; import StopIcon from "@patternfly/react-icons/dist/js/icons/stop-icon"; - interface Props { reloadOnly?: boolean } export const DevModeToolbar = (props: Props) => { + const [config] = useAppConfigStore((state) => [state.config], shallow) const [status] = useDevModeStore((state) => [state.status], shallow) - const [project ] = useProjectStore((state) => [state.project], shallow) + const [project] = useProjectStore((state) => [state.project], shallow) const [containers] = useStatusesStore((state) => [state.containers], shallow); const [verbose, setVerbose] = useState(false); @@ -27,7 +27,7 @@ export const DevModeToolbar = (props: Props) => { const commands = containerStatus?.commands || ['run']; const isRunning = containerStatus?.state === 'running'; const inTransit = containerStatus?.inTransit; - const isLoading= status === 'wip'; + const isLoading = status === 'wip'; const color = containerStatus?.state === 'running' ? "green" : "grey"; const icon = isRunning ? <UpIcon/> : <DownIcon/>; return (<Flex className="toolbar" direction={{default: "row"}} alignItems={{default: "alignItemsCenter"}}> @@ -76,16 +76,18 @@ export const DevModeToolbar = (props: Props) => { </Button> </Tooltip> </FlexItem>} - <FlexItem> - <Tooltip content="Stop container" position={TooltipPosition.bottom}> - <Button isSmall - isDisabled={!commands.includes('stop') || inTransit} - variant={"control"} - icon={<StopIcon/>} - onClick={() => ProjectService.stopDevModeContainer(project)}> - </Button> - </Tooltip> - </FlexItem> + {config.infrastructure !== 'kubernetes' && + <FlexItem> + <Tooltip content="Stop container" position={TooltipPosition.bottom}> + <Button isSmall + isDisabled={!commands.includes('stop') || inTransit} + variant={"control"} + icon={<StopIcon/>} + onClick={() => ProjectService.stopDevModeContainer(project)}> + </Button> + </Tooltip> + </FlexItem> + } <FlexItem> <Tooltip content="Delete container" position={TooltipPosition.bottom}> <Button isSmall diff --git a/karavan-web/karavan-app/src/main/webui/src/project/ProjectPage.tsx b/karavan-web/karavan-app/src/main/webui/src/project/ProjectPage.tsx index 976123ef..a71af8cd 100644 --- a/karavan-web/karavan-app/src/main/webui/src/project/ProjectPage.tsx +++ b/karavan-web/karavan-app/src/main/webui/src/project/ProjectPage.tsx @@ -1,4 +1,4 @@ -import React, {useEffect, useState} from 'react'; +import React, {useState} from 'react'; import { PageSection, } from '@patternfly/react-core'; @@ -64,14 +64,6 @@ export const ProjectPage = () => { } } - - function tools () { - return <ProjectToolbar - mode={mode} - setMode={mode => setMode(mode)} - /> - } - function isBuildIn(): boolean { return ['kamelets', 'templates'].includes(project.projectId); } @@ -87,7 +79,7 @@ export const ProjectPage = () => { return ( <PageSection key={key} className="kamelet-section project-page" padding={{default: 'noPadding'}}> <PageSection className="tools-section" padding={{default: 'noPadding'}}> - <MainToolbar title={<ProjectTitle/>} tools={tools()}/> + <MainToolbar title={<ProjectTitle/>} tools={<ProjectToolbar/>}/> </PageSection> {showFilePanel && <FileEditor/>} {!showFilePanel && <ProjectPanel/>} diff --git a/karavan-web/karavan-app/src/main/webui/src/project/ProjectToolbar.tsx b/karavan-web/karavan-app/src/main/webui/src/project/ProjectToolbar.tsx index daed745b..748a1594 100644 --- a/karavan-web/karavan-app/src/main/webui/src/project/ProjectToolbar.tsx +++ b/karavan-web/karavan-app/src/main/webui/src/project/ProjectToolbar.tsx @@ -22,16 +22,13 @@ import {shallow} from "zustand/shallow"; import {ProjectModelApi} from "karavan-core/lib/api/ProjectModelApi"; import {ProjectModel, ProjectProperty} from "karavan-core/lib/model/ProjectModel"; -interface Props { - mode: "design" | "code", - setMode: (mode: "design" | "code") => void, -} -export const ProjectToolbar = (props: Props) => { +export const ProjectToolbar = () => { const [project, isPushing] = useProjectStore((state) => [state.project, state.isPushing], shallow ) - const [file, editAdvancedProperties, setEditAdvancedProperties, setAddProperty] = useFileStore((state) => - [state.file, state.editAdvancedProperties, state.setEditAdvancedProperties, state.setAddProperty], shallow ) + const [file, editAdvancedProperties, setEditAdvancedProperties, setAddProperty, mode, setMode] + = useFileStore((state) => + [state.file, state.editAdvancedProperties, state.setEditAdvancedProperties, state.setAddProperty, state.mode, state.setMode], shallow ) useEffect(() => { }, [project, file]); @@ -72,7 +69,6 @@ export const ProjectToolbar = (props: Props) => { } function getFileToolbar() { - const { mode} = props; return <Toolbar id="toolbar-group-types"> <ToolbarContent> <Flex className="toolbar" direction={{default: "row"}} alignItems={{default: "alignItemsCenter"}}> @@ -80,9 +76,9 @@ export const ProjectToolbar = (props: Props) => { {isYaml() && <FlexItem> <ToggleGroup> <ToggleGroupItem text="Design" buttonId="design" isSelected={mode === "design"} - onChange={s => props.setMode("design")}/> + onChange={s => setMode("design")}/> <ToggleGroupItem text="Code" buttonId="code" isSelected={mode === "code"} - onChange={s => props.setMode("code")}/> + onChange={s => setMode("code")}/> </ToggleGroup> </FlexItem>} diff --git a/karavan-web/karavan-app/src/main/webui/src/project/file/FileEditor.tsx b/karavan-web/karavan-app/src/main/webui/src/project/file/FileEditor.tsx index fce383d6..0f2fe9e2 100644 --- a/karavan-web/karavan-app/src/main/webui/src/project/file/FileEditor.tsx +++ b/karavan-web/karavan-app/src/main/webui/src/project/file/FileEditor.tsx @@ -14,28 +14,22 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import React, {useState} from 'react'; -import { - CodeBlockCode, - CodeBlock, Skeleton -} from '@patternfly/react-core'; +import React from 'react'; import '../../designer/karavan.css'; import Editor from "@monaco-editor/react"; import {CamelDefinitionYaml} from "karavan-core/lib/api/CamelDefinitionYaml"; import {ProjectFile, ProjectFileTypes} from "../../api/ProjectModels"; -import {useAppConfigStore, useFilesStore, useFileStore, useProjectStore} from "../../api/ProjectStore"; +import {useFilesStore, useFileStore, useProjectStore} from "../../api/ProjectStore"; import {KaravanDesigner} from "../../designer/KaravanDesigner"; import {ProjectService} from "../../api/ProjectService"; import {PropertiesTable} from "./PropertiesTable"; +import {shallow} from "zustand/shallow"; export const FileEditor = () => { - const [editAdvancedProperties] = useState<boolean>(false); - const {file, operation} = useFileStore(); - const [mode, setMode] = useState<"design" | "code">("design"); - const [key, setKey] = useState<string>(''); + const [file, operation, mode] = useFileStore((state) => + [state.file, state.operation, state.mode, state.setMode], shallow ) const {project} = useProjectStore(); - const {config} = useAppConfigStore(); function save (name: string, code: string) { if (file) { diff --git a/karavan-web/karavan-app/src/main/webui/src/project/pipeline/ProjectStatus.tsx b/karavan-web/karavan-app/src/main/webui/src/project/pipeline/ProjectStatus.tsx index ba26da23..b59ac766 100644 --- a/karavan-web/karavan-app/src/main/webui/src/project/pipeline/ProjectStatus.tsx +++ b/karavan-web/karavan-app/src/main/webui/src/project/pipeline/ProjectStatus.tsx @@ -198,9 +198,9 @@ export class ProjectStatus extends React.Component<Props, State> { {podStatuses.length === 0 && <Label icon={<DownIcon/>} color={"grey"}>No pods</Label>} <LabelGroup numLabels={2} isVertical> {podStatuses.map(pod => { - const ready = pod.lifeCycle === 'ready'; + const ready = pod.state === 'running'; return ( - <Tooltip key={pod.containerName} content={pod.lifeCycle}> + <Tooltip key={pod.containerName} content={pod.state}> <Label icon={ready ? <UpIcon/> : <DownIcon/>} color={ready ? "green" : "red"}> <Button variant="link" onClick={e => { diff --git a/karavan-web/karavan-app/src/main/webui/src/project/trace/TraceTab.tsx b/karavan-web/karavan-app/src/main/webui/src/project/trace/TraceTab.tsx index 7363832a..f10bf0ab 100644 --- a/karavan-web/karavan-app/src/main/webui/src/project/trace/TraceTab.tsx +++ b/karavan-web/karavan-app/src/main/webui/src/project/trace/TraceTab.tsx @@ -57,7 +57,6 @@ export const TraceTab = () => { if (refreshTrace) { KaravanApi.getDevModeStatus(projectId, "trace", res => { if (res.status === 200) { - console.log(JSON.parse(res.data.status)) setTrace(JSON.parse(res.data.status)); } else { setTrace({}); diff --git a/karavan-web/karavan-cli/src/main/resources/spring-boot-builder-script-openshift.sh b/karavan-web/karavan-cli/src/main/resources/camel-main-builder-script-kubernetes.sh similarity index 63% copy from karavan-web/karavan-cli/src/main/resources/spring-boot-builder-script-openshift.sh copy to karavan-web/karavan-cli/src/main/resources/camel-main-builder-script-kubernetes.sh index 8b81f918..fb3a074f 100644 --- a/karavan-web/karavan-cli/src/main/resources/spring-boot-builder-script-openshift.sh +++ b/karavan-web/karavan-cli/src/main/resources/camel-main-builder-script-kubernetes.sh @@ -14,16 +14,17 @@ fi cd ${CHECKOUT_DIR}/$(inputs.params.project) -entrypoint -Dcamel.jbang.version=$CAMEL_VERSION camel@apache/camel export --local-kamelet-dir=${KAMELETS_DIR} +jbang -Dcamel.jbang.version=$CAMEL_VERSION camel@apache/camel export --local-kamelet-dir=${KAMELETS_DIR} export LAST_COMMIT=$(git rev-parse --short HEAD) export DATE=$(date '+%Y%m%d%H%M%S') export TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token) export NAMESPACE=$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace) -mvn package package oc:build oc:push oc:resource oc:apply \ - -Popenshift \ +mvn package jib:build k8s:resource k8s:apply \ -Djkube.namespace=${NAMESPACE} \ - -Djkube.docker.push.registry=${IMAGE_REGISTRY} \ - -Djkube.generator.name=${IMAGE_REGISTRY}/${NAMESPACE}/$(inputs.params.project):${DATE} \ + -Djib.allowInsecureRegistries=true \ + -Djib.to.image=${IMAGE_REGISTRY}/${IMAGE_GROUP}/$(inputs.params.project):${DATE} \ + -Djib.to.auth.username=${IMAGE_REGISTRY_USERNAME} \ + -Djib.to.auth.password=${IMAGE_REGISTRY_PASSWORD} \ --settings=$MAVEN_SETTINGS \ No newline at end of file diff --git a/karavan-web/karavan-cli/src/main/resources/spring-boot-builder-script-openshift.sh b/karavan-web/karavan-cli/src/main/resources/camel-main-builder-script-openshift.sh similarity index 63% copy from karavan-web/karavan-cli/src/main/resources/spring-boot-builder-script-openshift.sh copy to karavan-web/karavan-cli/src/main/resources/camel-main-builder-script-openshift.sh index 8b81f918..ebad0494 100644 --- a/karavan-web/karavan-cli/src/main/resources/spring-boot-builder-script-openshift.sh +++ b/karavan-web/karavan-cli/src/main/resources/camel-main-builder-script-openshift.sh @@ -14,16 +14,17 @@ fi cd ${CHECKOUT_DIR}/$(inputs.params.project) -entrypoint -Dcamel.jbang.version=$CAMEL_VERSION camel@apache/camel export --local-kamelet-dir=${KAMELETS_DIR} +jbang -Dcamel.jbang.version=$CAMEL_VERSION camel@apache/camel export --local-kamelet-dir=${KAMELETS_DIR} export LAST_COMMIT=$(git rev-parse --short HEAD) export DATE=$(date '+%Y%m%d%H%M%S') export TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token) export NAMESPACE=$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace) -mvn package package oc:build oc:push oc:resource oc:apply \ - -Popenshift \ +mvn package jib:build oc:resource oc:apply \ -Djkube.namespace=${NAMESPACE} \ - -Djkube.docker.push.registry=${IMAGE_REGISTRY} \ - -Djkube.generator.name=${IMAGE_REGISTRY}/${NAMESPACE}/$(inputs.params.project):${DATE} \ + -Djib.allowInsecureRegistries=true \ + -Djib.to.image=${IMAGE_REGISTRY}/${IMAGE_GROUP}/$(inputs.params.project):${DATE} \ + -Djib.to.auth.username=${IMAGE_REGISTRY_USERNAME} \ + -Djib.to.auth.password=${IMAGE_REGISTRY_PASSWORD} \ --settings=$MAVEN_SETTINGS \ No newline at end of file diff --git a/karavan-web/karavan-cli/src/main/resources/quarkus-builder-script-kubernetes.sh b/karavan-web/karavan-cli/src/main/resources/quarkus-builder-script-kubernetes.sh index bcbd3630..b62a8981 100644 --- a/karavan-web/karavan-cli/src/main/resources/quarkus-builder-script-kubernetes.sh +++ b/karavan-web/karavan-cli/src/main/resources/quarkus-builder-script-kubernetes.sh @@ -14,7 +14,7 @@ fi cd ${CHECKOUT_DIR}/$(inputs.params.project) -entrypoint -Dcamel.jbang.version=$CAMEL_VERSION camel@apache/camel export --local-kamelet-dir=${KAMELETS_DIR} +jbang -Dcamel.jbang.version=$CAMEL_VERSION camel@apache/camel export --local-kamelet-dir=${KAMELETS_DIR} export LAST_COMMIT=$(git rev-parse --short HEAD) export DATE=$(date '+%Y%m%d%H%M%S') diff --git a/karavan-web/karavan-cli/src/main/resources/quarkus-builder-script-openshift.sh b/karavan-web/karavan-cli/src/main/resources/quarkus-builder-script-openshift.sh index 8cfc517c..17669aae 100644 --- a/karavan-web/karavan-cli/src/main/resources/quarkus-builder-script-openshift.sh +++ b/karavan-web/karavan-cli/src/main/resources/quarkus-builder-script-openshift.sh @@ -14,7 +14,7 @@ fi cd ${CHECKOUT_DIR}/$(inputs.params.project) -entrypoint -Dcamel.jbang.version=$CAMEL_VERSION camel@apache/camel export --local-kamelet-dir=${KAMELETS_DIR} +jbang -Dcamel.jbang.version=$CAMEL_VERSION camel@apache/camel export --local-kamelet-dir=${KAMELETS_DIR} export LAST_COMMIT=$(git rev-parse --short HEAD) export DATE=$(date '+%Y%m%d%H%M%S') diff --git a/karavan-web/karavan-cli/src/main/resources/spring-boot-builder-script-kubernetes.sh b/karavan-web/karavan-cli/src/main/resources/spring-boot-builder-script-kubernetes.sh index 2e175498..51f4ccc4 100644 --- a/karavan-web/karavan-cli/src/main/resources/spring-boot-builder-script-kubernetes.sh +++ b/karavan-web/karavan-cli/src/main/resources/spring-boot-builder-script-kubernetes.sh @@ -14,7 +14,7 @@ fi cd ${CHECKOUT_DIR}/$(inputs.params.project) -entrypoint -Dcamel.jbang.version=$CAMEL_VERSION camel@apache/camel export --local-kamelet-dir=${KAMELETS_DIR} +jbang -Dcamel.jbang.version=$CAMEL_VERSION camel@apache/camel export --local-kamelet-dir=${KAMELETS_DIR} export LAST_COMMIT=$(git rev-parse --short HEAD) export DATE=$(date '+%Y%m%d%H%M%S') diff --git a/karavan-web/karavan-cli/src/main/resources/spring-boot-builder-script-openshift.sh b/karavan-web/karavan-cli/src/main/resources/spring-boot-builder-script-openshift.sh index 8b81f918..236abc22 100644 --- a/karavan-web/karavan-cli/src/main/resources/spring-boot-builder-script-openshift.sh +++ b/karavan-web/karavan-cli/src/main/resources/spring-boot-builder-script-openshift.sh @@ -14,7 +14,7 @@ fi cd ${CHECKOUT_DIR}/$(inputs.params.project) -entrypoint -Dcamel.jbang.version=$CAMEL_VERSION camel@apache/camel export --local-kamelet-dir=${KAMELETS_DIR} +jbang -Dcamel.jbang.version=$CAMEL_VERSION camel@apache/camel export --local-kamelet-dir=${KAMELETS_DIR} export LAST_COMMIT=$(git rev-parse --short HEAD) export DATE=$(date '+%Y%m%d%H%M%S')