You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ma...@apache.org on 2023/09/08 18:17:18 UTC
[camel-karavan] 02/02: Set image for #817
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 7d6280fb246acc37c4a5d478913bd0ec37c74778
Author: Marat Gubaidullin <ma...@talismancloud.io>
AuthorDate: Fri Sep 8 14:17:07 2023 -0400
Set image for #817
---
.../org/apache/camel/karavan/api/ImagesResource.java | 10 +++++++---
.../camel/karavan/infinispan/model/Project.java | 20 --------------------
.../apache/camel/karavan/service/ProjectService.java | 13 +++++--------
.../src/main/webui/src/api/KaravanApi.tsx | 4 ++--
.../src/main/webui/src/api/ProjectModels.ts | 6 +-----
.../src/main/webui/src/api/ProjectService.ts | 3 +++
.../src/main/webui/src/api/ServiceModels.ts | 16 ++++++++--------
.../src/main/webui/src/designer/karavan.css | 3 ++-
.../src/main/webui/src/project/DevModeToolbar.tsx | 4 ++--
.../src/main/webui/src/project/ProjectToolbar.tsx | 11 ++---------
.../src/main/webui/src/project/files/FilesTab.tsx | 7 ++++---
.../src/main/webui/src/services/ServicesPage.tsx | 8 ++++----
.../src/main/webui/src/services/ServicesTableRow.tsx | 4 ++--
13 files changed, 42 insertions(+), 67 deletions(-)
diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/ImagesResource.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/ImagesResource.java
index ae4ca231..9d4e0371 100644
--- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/ImagesResource.java
+++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/ImagesResource.java
@@ -26,6 +26,7 @@ import org.apache.camel.karavan.infinispan.model.Project;
import org.apache.camel.karavan.service.ProjectService;
import org.apache.camel.karavan.service.RegistryService;
+import java.util.Comparator;
import java.util.List;
@Path("/api/image")
@@ -46,16 +47,19 @@ public class ImagesResource {
public List<String> getImagesForProject(@HeaderParam("username") String username,
@PathParam("projectId") String projectId) throws Exception {
String pattern = registryService.getRegistryWithGroup() + "/" + projectId;
- return dockerService.getImages().stream().filter(s -> s.startsWith(pattern)).toList();
+ return dockerService.getImages().stream().filter(s -> s.startsWith(pattern)).sorted(Comparator.reverseOrder()).toList();
}
@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@Path("/{projectId}")
- public Response build(JsonObject imageName, @PathParam("projectId") String projectId) throws Exception {
+ public Response build(JsonObject data, @PathParam("projectId") String projectId) throws Exception {
try {
- projectService.setProjectImage(projectId, imageName.getString("imageName"));
+ String imageName = data.getString("imageName");
+ boolean commit = data.getBoolean("commit");
+ String message = data.getString("message");
+ projectService.setProjectImage(projectId, imageName, commit, message);
return Response.ok().entity(imageName).build();
} catch (Exception e) {
return Response.serverError().entity(e.getMessage()).build();
diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/Project.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/Project.java
index 22a7bac8..c719aa13 100644
--- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/Project.java
+++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/Project.java
@@ -32,21 +32,8 @@ public class Project {
Long lastCommitTimestamp;
@ProtoField(number = 7)
Type type;
- @ProtoField(number = 8)
- String image;
@ProtoFactory
- public Project(String projectId, String name, String description, String runtime, String lastCommit, Long lastCommitTimestamp, Type type, String image) {
- this.projectId = projectId;
- this.name = name;
- this.description = description;
- this.runtime = runtime;
- this.lastCommit = lastCommit;
- this.lastCommitTimestamp = lastCommitTimestamp;
- this.type = type;
- this.image = image;
- }
-
public Project(String projectId, String name, String description, String runtime, String lastCommit, Long lastCommitTimestamp, Type type) {
this.projectId = projectId;
this.name = name;
@@ -136,11 +123,4 @@ public class Project {
this.type = type;
}
- public String getImage() {
- return image;
- }
-
- public void setImage(String image) {
- this.image = image;
- }
}
diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/ProjectService.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/ProjectService.java
index 8d0ced7d..5ce1e34f 100644
--- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/ProjectService.java
+++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/ProjectService.java
@@ -16,6 +16,7 @@
*/
package org.apache.camel.karavan.service;
+import io.smallrye.mutiny.tuples.Tuple2;
import io.vertx.core.json.JsonObject;
import io.vertx.mutiny.core.eventbus.EventBus;
import org.apache.camel.karavan.code.CodeService;
@@ -166,12 +167,6 @@ public class ProjectService implements HealthCheck {
return infinispanService.getProjects().stream()
.filter(p -> type == null || Objects.equals(p.getType().name(), type))
.sorted(Comparator.comparing(Project::getProjectId))
- .map(project -> {
- if (Objects.equals(project.getType(), Project.Type.normal)) {
- project.setImage(getImage(files, project.getProjectId()));
- }
- return project;
- })
.collect(Collectors.toList());
} else {
return List.of();
@@ -379,15 +374,17 @@ public class ProjectService implements HealthCheck {
return file.orElse(new ProjectFile()).getCode();
}
- public void setProjectImage(String projectId, String imageName) {
+ public void setProjectImage(String projectId, String imageName, boolean commit, String message) throws Exception {
ProjectFile file = infinispanService.getProjectFile(projectId, PROJECT_COMPOSE_FILENAME);
if (file != null) {
DockerComposeService service = DockerComposeConverter.fromCode(file.getCode(), projectId);
service.setImage(imageName);
String code = DockerComposeConverter.toCode(service);
- System.out.println(code);
file.setCode(code);
infinispanService.saveProjectFile(file);
+ if (commit) {
+ commitAndPushProject(projectId, message);
+ }
}
}
}
diff --git a/karavan-web/karavan-app/src/main/webui/src/api/KaravanApi.tsx b/karavan-web/karavan-app/src/main/webui/src/api/KaravanApi.tsx
index 40601212..d6bcfcd2 100644
--- a/karavan-web/karavan-app/src/main/webui/src/api/KaravanApi.tsx
+++ b/karavan-web/karavan-app/src/main/webui/src/api/KaravanApi.tsx
@@ -371,8 +371,8 @@ export class KaravanApi {
});
}
- static async setProjectImage(projectId: string, imageName: string, after: (res: AxiosResponse<any>) => void) {
- instance.post('/api/image/' + projectId, {imageName: imageName})
+ static async setProjectImage(projectId: string, imageName: string, commit: boolean, message: string, after: (res: AxiosResponse<any>) => void) {
+ instance.post('/api/image/' + projectId, {imageName: imageName, commit: commit, message: message})
.then(res => {
after(res);
}).catch(err => {
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 05d76e69..460690b7 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
@@ -1,5 +1,3 @@
-import {v4 as uuidv4} from "uuid";
-
export class AppConfig {
version: string = '';
infrastructure: 'kubernetes' | 'docker' | 'local' = 'local';
@@ -26,9 +24,8 @@ export class Project {
lastCommit: string = '';
lastCommitTimestamp: number = 0;
type: string = ProjectType.normal;
- image: string = '';
- public constructor(projectId: string, name: string, description: string, runtime: string, lastCommit: string, type: string, image: string);
+ public constructor(projectId: string, name: string, description: string, runtime: string, lastCommit: string, type: string);
public constructor(init?: Partial<Project>);
public constructor(...args: any[]) {
if (args.length === 1) {
@@ -42,7 +39,6 @@ export class Project {
this.lastCommit = args[4];
this.lastCommitTimestamp = args[5];
this.type = args[6];
- this.image = args[7];
return;
}
}
diff --git a/karavan-web/karavan-app/src/main/webui/src/api/ProjectService.ts b/karavan-web/karavan-app/src/main/webui/src/api/ProjectService.ts
index 7bef52d9..6004cc97 100644
--- a/karavan-web/karavan-app/src/main/webui/src/api/ProjectService.ts
+++ b/karavan-web/karavan-app/src/main/webui/src/api/ProjectService.ts
@@ -232,5 +232,8 @@ export class ProjectService {
KaravanApi.getServices((any: []) => {
InfrastructureAPI.setServices(any);
});
+ KaravanApi.getImages(projectId, (images: []) => {
+ useProjectStore.setState({images: images})
+ });
}
}
\ No newline at end of file
diff --git a/karavan-web/karavan-app/src/main/webui/src/api/ServiceModels.ts b/karavan-web/karavan-app/src/main/webui/src/api/ServiceModels.ts
index 506301d7..879ee0f0 100644
--- a/karavan-web/karavan-app/src/main/webui/src/api/ServiceModels.ts
+++ b/karavan-web/karavan-app/src/main/webui/src/api/ServiceModels.ts
@@ -11,7 +11,7 @@ export class Healthcheck {
}
}
-export class DevService {
+export class DockerComposeService {
container_name: string = '';
image: string = '';
restart: string = '';
@@ -20,29 +20,29 @@ export class DevService {
environment: any = {};
healthcheck?: Healthcheck;
- public constructor(init?: Partial<DevService>) {
+ public constructor(init?: Partial<DockerComposeService>) {
Object.assign(this, init);
}
}
-export class Services {
+export class DockerCompose {
version: string = '';
- services: DevService[] = [];
+ services: DockerComposeService[] = [];
- public constructor(init?: Partial<Services>) {
+ public constructor(init?: Partial<DockerCompose>) {
Object.assign(this, init);
}
}
export class ServicesYaml {
- static yamlToServices(code: string): Services {
+ static yamlToServices(code: string): DockerCompose {
const obj = yaml.load(code);
const fromYaml = JSON.parse(JSON.stringify(obj));
- const result: Services = new Services({version: fromYaml.version});
+ const result: DockerCompose = new DockerCompose({version: fromYaml.version});
Object.keys(fromYaml.services).forEach(key => {
const o = fromYaml.services[key];
- const service = new DevService(o);
+ const service = new DockerComposeService(o);
if (!service.container_name) {
service.container_name = key;
}
diff --git a/karavan-web/karavan-app/src/main/webui/src/designer/karavan.css b/karavan-web/karavan-app/src/main/webui/src/designer/karavan.css
index 11324971..bf4d9d49 100644
--- a/karavan-web/karavan-app/src/main/webui/src/designer/karavan.css
+++ b/karavan-web/karavan-app/src/main/webui/src/designer/karavan.css
@@ -38,7 +38,8 @@
height: 36px;
}
-.karavan .pf-v5-c-switch__input:focus ~ .pf-v5-c-switch__toggle {
+.karavan .pf-v5-c-switch__input:focus ~ .pf-v5-c-switch__toggle,
+.pf-v5-c-modal-box .pf-v5-c-switch__input:focus ~ .pf-v5-c-switch__toggle {
outline: transparent;
outline-offset: 0;
}
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 bcb9bbf1..a659487a 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
@@ -45,7 +45,7 @@ export function DevModeToolbar (props: Props) {
</Tooltip>
</Label>
</FlexItem>}
- <FlexItem>
+ {!isRunning && <FlexItem>
<Tooltip content="Verbose" position={TooltipPosition.bottom}>
<Switch aria-label="verbose"
id="verbose"
@@ -53,7 +53,7 @@ export function DevModeToolbar (props: Props) {
onChange={(_, checked) => setVerbose(checked)}
/>
</Tooltip>
- </FlexItem>
+ </FlexItem>}
{!isRunning && <FlexItem>
<Tooltip content="Run in developer mode" position={TooltipPosition.bottom}>
<Button size="sm"
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 c1741c72..0dd876cc 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
@@ -1,7 +1,7 @@
import React, {useEffect} from 'react';
import {
Button,
- Checkbox,
+ Checkbox, Divider,
Flex,
FlexItem,
ToggleGroup,
@@ -139,12 +139,5 @@ export function ProjectToolbar () {
}
const isTemplates = isTemplatesProject();
- return (
- <>
- {/*{isTemplates && getTemplatesToolbar()}*/}
- {/*{!isTemplates && getProjectToolbar()}*/}
- {!isFile() && getProjectToolbar()}
- {isFile() && getFileToolbar()}
- </>
- )
+ return isFile() ? getFileToolbar() : getProjectToolbar()
}
diff --git a/karavan-web/karavan-app/src/main/webui/src/project/files/FilesTab.tsx b/karavan-web/karavan-app/src/main/webui/src/project/files/FilesTab.tsx
index 2e2d0bd8..47dc999a 100644
--- a/karavan-web/karavan-app/src/main/webui/src/project/files/FilesTab.tsx
+++ b/karavan-web/karavan-app/src/main/webui/src/project/files/FilesTab.tsx
@@ -29,12 +29,13 @@ import FileSaver from "file-saver";
import {CreateFileModal} from "./CreateFileModal";
import {DeleteFileModal} from "./DeleteFileModal";
import {UploadFileModal} from "./UploadFileModal";
+import {shallow} from "zustand/shallow";
export function FilesTab () {
- const {files} = useFilesStore();
- const {project} = useProjectStore();
- const {operation} = useFileStore();
+ const [files] = useFilesStore((s) => [s.files], shallow);
+ const [project] = useProjectStore((s) => [s.project], shallow);
+ const [operation] = useFileStore((s) => [s.operation], shallow);
function getDate(lastUpdate: number): string {
if (lastUpdate) {
diff --git a/karavan-web/karavan-app/src/main/webui/src/services/ServicesPage.tsx b/karavan-web/karavan-app/src/main/webui/src/services/ServicesPage.tsx
index 1432f9ea..16fab8b8 100644
--- a/karavan-web/karavan-app/src/main/webui/src/services/ServicesPage.tsx
+++ b/karavan-web/karavan-app/src/main/webui/src/services/ServicesPage.tsx
@@ -33,14 +33,14 @@ import {useProjectStore, useStatusesStore} from "../api/ProjectStore";
import {MainToolbar} from "../designer/MainToolbar";
import {Project, ProjectType} from "../api/ProjectModels";
import {KaravanApi} from "../api/KaravanApi";
-import {DevService, Services, ServicesYaml} from "../api/ServiceModels";
+import {DockerComposeService, DockerCompose, ServicesYaml} from "../api/ServiceModels";
import {shallow} from "zustand/shallow";
import {ProjectLogPanel} from "../project/log/ProjectLogPanel";
export function ServicesPage () {
- const [services, setServices] = useState<Services>();
+ const [services, setServices] = useState<DockerCompose>();
const [containers] = useStatusesStore((state) => [state.containers, state.setContainers], shallow);
const [operation] = useState<'create' | 'delete' | 'none'>('none');
const [loading] = useState<boolean>(false);
@@ -53,7 +53,7 @@ export function ServicesPage () {
KaravanApi.getFiles(ProjectType.services, files => {
const file = files.at(0);
if (file) {
- const services: Services = ServicesYaml.yamlToServices(file.code);
+ const services: DockerCompose = ServicesYaml.yamlToServices(file.code);
setServices(services);
}
})
@@ -117,7 +117,7 @@ export function ServicesPage () {
<Th key='action'></Th>
</Tr>
</Thead>
- {services?.services.map((service: DevService, index: number) => (
+ {services?.services.map((service: DockerComposeService, index: number) => (
<ServicesTableRow key={service.container_name} index={index} service={service} container={getContainer(service.container_name)}/>
))}
{services?.services.length === 0 && getEmptyState()}
diff --git a/karavan-web/karavan-app/src/main/webui/src/services/ServicesTableRow.tsx b/karavan-web/karavan-app/src/main/webui/src/services/ServicesTableRow.tsx
index 86e1c367..3bfebde4 100644
--- a/karavan-web/karavan-app/src/main/webui/src/services/ServicesTableRow.tsx
+++ b/karavan-web/karavan-app/src/main/webui/src/services/ServicesTableRow.tsx
@@ -8,7 +8,7 @@ import '../designer/karavan.css';
import {ExpandableRowContent, Tbody, Td, Tr} from "@patternfly/react-table";
import StopIcon from "@patternfly/react-icons/dist/js/icons/stop-icon";
import PlayIcon from "@patternfly/react-icons/dist/esm/icons/play-icon";
-import {DevService} from "../api/ServiceModels";
+import {DockerComposeService} from "../api/ServiceModels";
import {ContainerStatus} from "../api/ProjectModels";
import PauseIcon from "@patternfly/react-icons/dist/esm/icons/pause-icon";
import DeleteIcon from "@patternfly/react-icons/dist/js/icons/times-icon";
@@ -20,7 +20,7 @@ import DownIcon from "@patternfly/react-icons/dist/esm/icons/error-circle-o-icon
interface Props {
index: number
- service: DevService
+ service: DockerComposeService
container?: ContainerStatus
}