mirror of https://github.com/ctk-hq/ctk
fix: k8s types and modals
parent
1c46e07bf3
commit
416a8fe40d
@ -0,0 +1,70 @@
|
||||
import { ChevronDownIcon, ChevronUpIcon } from "@heroicons/react/outline";
|
||||
import { styled } from "@mui/joy";
|
||||
import IconButton from "@mui/joy/IconButton";
|
||||
import { FunctionComponent, ReactElement, ReactNode } from "react";
|
||||
import { useAccordionState } from "../../../../hooks";
|
||||
|
||||
export interface IAccordionProps {
|
||||
id: string;
|
||||
title: string;
|
||||
defaultOpen?: boolean;
|
||||
children: ReactNode;
|
||||
}
|
||||
|
||||
const Root = styled("div")`
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
`;
|
||||
|
||||
const Top = styled("div")`
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
|
||||
&:hover {
|
||||
cursor: pointer;
|
||||
user-select: none;
|
||||
}
|
||||
`;
|
||||
|
||||
const Title = styled("h5")`
|
||||
font-size: 0.85rem;
|
||||
color: #374151;
|
||||
font-weight: 700;
|
||||
width: 100%;
|
||||
text-align: left;
|
||||
`;
|
||||
|
||||
const ExpandButton = styled(IconButton)`
|
||||
border-radius: ${({ theme }) => theme.spacing(2)};
|
||||
`;
|
||||
|
||||
const Bottom = styled("div")`
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
row-gap: ${({ theme }) => theme.spacing(1)};
|
||||
`;
|
||||
|
||||
const Accordion: FunctionComponent<IAccordionProps> = (
|
||||
props: IAccordionProps
|
||||
): ReactElement => {
|
||||
const { id, defaultOpen = false, children, title } = props;
|
||||
|
||||
const { open, toggle } = useAccordionState(id, defaultOpen);
|
||||
|
||||
return (
|
||||
<Root>
|
||||
<Top onClick={toggle}>
|
||||
<Title>{title}</Title>
|
||||
<ExpandButton size="sm" variant="plain">
|
||||
{open && <ChevronUpIcon className="h-5 w-5" />}
|
||||
{!open && <ChevronDownIcon className="h-5 w-5" />}
|
||||
</ExpandButton>
|
||||
</Top>
|
||||
{open && <Bottom>{children}</Bottom>}
|
||||
</Root>
|
||||
);
|
||||
};
|
||||
|
||||
export default Accordion;
|
||||
@ -0,0 +1,46 @@
|
||||
import { useCallback } from "react";
|
||||
import { CallbackFunction, IServiceNodeItem } from "../../../../types";
|
||||
import { IEditServiceForm } from "../../../../types/docker-compose";
|
||||
import {
|
||||
getFinalValues,
|
||||
getInitialValues,
|
||||
tabs,
|
||||
validationSchema
|
||||
} from "./form-utils";
|
||||
import { toaster } from "../../../../utils";
|
||||
import FormModal from "../../../FormModal";
|
||||
|
||||
interface IModalServiceProps {
|
||||
onHide: CallbackFunction;
|
||||
onAddEndpoint: CallbackFunction;
|
||||
}
|
||||
|
||||
const CreateServiceModal = (props: IModalServiceProps) => {
|
||||
const { onHide, onAddEndpoint } = props;
|
||||
|
||||
const handleCreate = useCallback(
|
||||
(finalValues: IServiceNodeItem, values: IEditServiceForm) => {
|
||||
onHide();
|
||||
onAddEndpoint(finalValues);
|
||||
toaster(
|
||||
`Created "${values.serviceName}" service successfully`,
|
||||
"success"
|
||||
);
|
||||
},
|
||||
[onAddEndpoint, onHide]
|
||||
);
|
||||
|
||||
return (
|
||||
<FormModal
|
||||
title="Create service"
|
||||
tabs={tabs}
|
||||
getInitialValues={getInitialValues}
|
||||
getFinalValues={getFinalValues}
|
||||
validationSchema={validationSchema}
|
||||
onHide={onHide}
|
||||
onCreate={handleCreate}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
export default CreateServiceModal;
|
||||
@ -0,0 +1,51 @@
|
||||
import { useState, useEffect } from "react";
|
||||
import type { CallbackFunction, IServiceNodeItem } from "../../../../types";
|
||||
import type { IEditServiceForm } from "../../../../types/docker-compose";
|
||||
import {
|
||||
getInitialValues,
|
||||
getFinalValues,
|
||||
validationSchema,
|
||||
tabs
|
||||
} from "./form-utils";
|
||||
import { toaster } from "../../../../utils";
|
||||
import FormModal from "../../../FormModal";
|
||||
|
||||
export interface IModalServiceProps {
|
||||
node: IServiceNodeItem;
|
||||
onHide: CallbackFunction;
|
||||
onUpdateEndpoint: CallbackFunction;
|
||||
}
|
||||
|
||||
const ModalServiceEdit = (props: IModalServiceProps) => {
|
||||
const { node, onHide, onUpdateEndpoint } = props;
|
||||
const [selectedNode, setSelectedNode] = useState<IServiceNodeItem>();
|
||||
|
||||
useEffect(() => {
|
||||
if (node) {
|
||||
setSelectedNode(node);
|
||||
}
|
||||
}, [node]);
|
||||
|
||||
const handleUpdate = (
|
||||
finalValues: IServiceNodeItem,
|
||||
values: IEditServiceForm
|
||||
) => {
|
||||
onUpdateEndpoint(finalValues);
|
||||
toaster(`Updated "${values.serviceName}" service successfully`, "success");
|
||||
};
|
||||
|
||||
return (
|
||||
<FormModal
|
||||
title="Edit service"
|
||||
tabs={tabs}
|
||||
getInitialValues={getInitialValues}
|
||||
getFinalValues={getFinalValues}
|
||||
validationSchema={validationSchema}
|
||||
onHide={onHide}
|
||||
onCreate={handleUpdate}
|
||||
selectedNode={selectedNode}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
export default ModalServiceEdit;
|
||||
@ -0,0 +1,295 @@
|
||||
import { styled } from "@mui/joy";
|
||||
import { TFinalFormField } from "../../../../types";
|
||||
import { SuperForm } from "../../../SuperForm";
|
||||
|
||||
const Root = styled("div")`
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
row-gap: ${({ theme }) => theme.spacing(1)};
|
||||
@media (max-width: 640px) {
|
||||
row-gap: 0;
|
||||
}
|
||||
`;
|
||||
|
||||
const General = () => {
|
||||
return (
|
||||
<Root>
|
||||
<SuperForm
|
||||
fields={[
|
||||
{
|
||||
id: "row1",
|
||||
type: "grid-row",
|
||||
fields: [
|
||||
{
|
||||
id: "serviceName",
|
||||
type: "text",
|
||||
name: "serviceName",
|
||||
label: "Service name",
|
||||
required: true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
id: "row2",
|
||||
type: "grid-row",
|
||||
fields: [
|
||||
{
|
||||
id: "imageName",
|
||||
type: "text",
|
||||
name: "imageName",
|
||||
label: "Image name"
|
||||
},
|
||||
{
|
||||
id: "imageTag",
|
||||
type: "text",
|
||||
name: "imageTag",
|
||||
label: "Image tag"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
id: "row3",
|
||||
type: "grid-row",
|
||||
fields: [
|
||||
{
|
||||
id: "containerName",
|
||||
type: "text",
|
||||
name: "containerName",
|
||||
label: "Container name"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
id: "row4",
|
||||
type: "grid-row",
|
||||
fields: [
|
||||
{
|
||||
id: "row4-column1",
|
||||
type: "grid-column",
|
||||
spans: [2, 3],
|
||||
fields: [
|
||||
{
|
||||
id: "command",
|
||||
type: "text",
|
||||
name: "command",
|
||||
label: "Command"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
id: "row5",
|
||||
type: "grid-row",
|
||||
fields: [
|
||||
{
|
||||
id: "row5-column1",
|
||||
type: "grid-column",
|
||||
spans: [2, 3],
|
||||
fields: [
|
||||
{
|
||||
id: "entrypoint",
|
||||
type: "text",
|
||||
name: "entrypoint",
|
||||
label: "Entrypoint"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
id: "row6",
|
||||
type: "grid-row",
|
||||
fields: [
|
||||
{
|
||||
id: "row6-column1",
|
||||
type: "grid-column",
|
||||
spans: [2, 3],
|
||||
fields: [
|
||||
{
|
||||
id: "envFile",
|
||||
type: "text",
|
||||
name: "envFile",
|
||||
label: "Env file"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
id: "row7",
|
||||
type: "grid-row",
|
||||
fields: [
|
||||
{
|
||||
id: "row7-column1",
|
||||
type: "grid-column",
|
||||
spans: [2, 3],
|
||||
fields: [
|
||||
{
|
||||
id: "workingDir",
|
||||
type: "text",
|
||||
name: "workingDir",
|
||||
label: "Working directory"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
id: "row8",
|
||||
type: "grid-row",
|
||||
fields: [
|
||||
{
|
||||
id: "row8-column1",
|
||||
type: "grid-column",
|
||||
spans: [2, 3],
|
||||
fields: [
|
||||
{
|
||||
id: "restart",
|
||||
type: "toggle",
|
||||
name: "restart",
|
||||
label: "Restart Policy",
|
||||
options: [
|
||||
{
|
||||
value: "no",
|
||||
text: "no"
|
||||
},
|
||||
{
|
||||
value: "always",
|
||||
text: "always"
|
||||
},
|
||||
{
|
||||
value: "on-failure",
|
||||
text: "on-failure"
|
||||
},
|
||||
{
|
||||
value: "unless-stopped",
|
||||
text: "unless-stopped"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
id: "ports",
|
||||
type: "records",
|
||||
name: "ports",
|
||||
title: "Ports",
|
||||
defaultOpen: true,
|
||||
fields: (index: number): TFinalFormField[] => [
|
||||
{
|
||||
id: `ports[${index}].hostPort`,
|
||||
type: "text",
|
||||
name: `ports[${index}].hostPort`,
|
||||
placeholder: "Host port",
|
||||
required: true
|
||||
},
|
||||
{
|
||||
id: `ports[${index}].containerPort`,
|
||||
type: "text",
|
||||
name: `ports[${index}].containerPort`,
|
||||
placeholder: "Container port"
|
||||
},
|
||||
{
|
||||
id: `ports[${index}].protocol`,
|
||||
type: "toggle",
|
||||
name: `ports[${index}].protocol`,
|
||||
label: "Protocol",
|
||||
options: [
|
||||
{
|
||||
value: "tcp",
|
||||
text: "TCP"
|
||||
},
|
||||
{
|
||||
value: "udp",
|
||||
text: "UDP"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
newValue: {
|
||||
hostPort: "",
|
||||
containerPort: "",
|
||||
protocol: ""
|
||||
}
|
||||
},
|
||||
{
|
||||
id: "dependsOn",
|
||||
type: "records",
|
||||
name: "dependsOn",
|
||||
title: "Depends on",
|
||||
fields: (index: number): TFinalFormField[] => [
|
||||
{
|
||||
id: `dependsOn[${index}]`,
|
||||
type: "text",
|
||||
name: `dependsOn[${index}]`,
|
||||
placeholder: "Service name",
|
||||
required: false
|
||||
}
|
||||
],
|
||||
newValue: ""
|
||||
},
|
||||
{
|
||||
id: "networks",
|
||||
type: "records",
|
||||
title: "Networks",
|
||||
name: "networks",
|
||||
fields: (index: number): TFinalFormField[] => [
|
||||
{
|
||||
id: `networks[${index}]`,
|
||||
type: "text",
|
||||
name: `networks[${index}]`,
|
||||
placeholder: "Network name",
|
||||
required: false
|
||||
}
|
||||
],
|
||||
newValue: ""
|
||||
},
|
||||
{
|
||||
id: "labels",
|
||||
type: "records",
|
||||
title: "Labels",
|
||||
name: "labels",
|
||||
fields: (index: number): TFinalFormField[] => [
|
||||
{
|
||||
id: `labels[${index}].key`,
|
||||
type: "text",
|
||||
name: `labels[${index}].key`,
|
||||
placeholder: "Key",
|
||||
required: true
|
||||
},
|
||||
{
|
||||
id: `labels[${index}].value`,
|
||||
type: "text",
|
||||
name: `labels[${index}].value`,
|
||||
placeholder: "Value",
|
||||
required: true
|
||||
}
|
||||
],
|
||||
newValue: { key: "", value: "" }
|
||||
},
|
||||
{
|
||||
id: "profiles",
|
||||
type: "records",
|
||||
title: "Profiles",
|
||||
name: "profiles",
|
||||
fields: (index: number): TFinalFormField[] => [
|
||||
{
|
||||
id: `profiles[${index}]`,
|
||||
name: `profiles[${index}]`,
|
||||
placeholder: "Name",
|
||||
required: true,
|
||||
type: "text"
|
||||
}
|
||||
],
|
||||
newValue: ""
|
||||
}
|
||||
]}
|
||||
/>
|
||||
</Root>
|
||||
);
|
||||
};
|
||||
|
||||
export default General;
|
||||
@ -0,0 +1,55 @@
|
||||
import type { IServiceNodeItem } from "../../../../types";
|
||||
import type { IEditServiceForm } from "../../../../types/kubernetes";
|
||||
import * as yup from "yup";
|
||||
import General from "./General";
|
||||
|
||||
export const tabs = [
|
||||
{
|
||||
value: "general",
|
||||
title: "General",
|
||||
component: General
|
||||
}
|
||||
];
|
||||
|
||||
const initialValues: IEditServiceForm = {
|
||||
serviceName: ""
|
||||
};
|
||||
|
||||
export const validationSchema = yup.object({
|
||||
serviceName: yup
|
||||
.string()
|
||||
.max(256, "Service name should be 256 characters or less")
|
||||
.required("Service name is required")
|
||||
});
|
||||
|
||||
export const getInitialValues = (node?: IServiceNodeItem): IEditServiceForm => {
|
||||
if (!node) {
|
||||
return {
|
||||
...initialValues
|
||||
};
|
||||
}
|
||||
|
||||
const { canvasConfig } = node;
|
||||
const { node_name = "" } = canvasConfig;
|
||||
|
||||
return {
|
||||
serviceName: node_name
|
||||
};
|
||||
};
|
||||
|
||||
export const getFinalValues = (
|
||||
values: IEditServiceForm,
|
||||
previous?: IServiceNodeItem
|
||||
): IServiceNodeItem => {
|
||||
return {
|
||||
key: previous?.key ?? "service",
|
||||
type: "SERVICE",
|
||||
position: previous?.position ?? { left: 0, top: 0 },
|
||||
inputs: previous?.inputs ?? ["op_source"],
|
||||
outputs: previous?.outputs ?? [],
|
||||
canvasConfig: {
|
||||
node_name: values.serviceName
|
||||
},
|
||||
serviceConfig: {}
|
||||
};
|
||||
};
|
||||
@ -0,0 +1,441 @@
|
||||
import { KeyValuePair, INodeItem, ICanvasConfig } from "../index";
|
||||
|
||||
export interface IVolumeTopLevel {
|
||||
driver: string;
|
||||
driver_opts: {
|
||||
type: string;
|
||||
o: string;
|
||||
device: string;
|
||||
};
|
||||
external: boolean;
|
||||
labels?: string[] | KeyValuePair;
|
||||
name: string;
|
||||
}
|
||||
|
||||
export interface IPAMConfig {
|
||||
subnet?: string;
|
||||
ip_range?: string;
|
||||
gateway?: string;
|
||||
aux_addresses?: Record<string, string>;
|
||||
}
|
||||
|
||||
export interface IIPAM {
|
||||
driver?: string;
|
||||
config?: IPAMConfig[];
|
||||
options?: Record<string, string>;
|
||||
}
|
||||
|
||||
export interface INetworkTopLevel {
|
||||
driver: string;
|
||||
driver_opts: KeyValuePair;
|
||||
attachable: boolean;
|
||||
enable_ipv6: boolean;
|
||||
ipam?: IIPAM;
|
||||
internal: boolean;
|
||||
labels?: string[] | KeyValuePair;
|
||||
external: boolean;
|
||||
name: string;
|
||||
}
|
||||
|
||||
export interface IService {
|
||||
build?: {
|
||||
context: string;
|
||||
dockerfile?: string;
|
||||
args?: string[] | KeyValuePair;
|
||||
ssh?: string[];
|
||||
cache_from?: string[];
|
||||
cache_to?: string[];
|
||||
extra_hosts?: string[];
|
||||
isolation?: string;
|
||||
labels?: string[] | KeyValuePair;
|
||||
shm_size?: string | number;
|
||||
target?: string;
|
||||
};
|
||||
cpu_count: string | number;
|
||||
cpu_percent: string | number;
|
||||
cpu_shares: string | number;
|
||||
cpu_period: string | number;
|
||||
cpu_quota: string | number;
|
||||
cpu_rt_runtime: string | number;
|
||||
cpu_rt_period: string | number;
|
||||
cpuset: number | number[];
|
||||
cap_add: string[];
|
||||
cap_drop: string[];
|
||||
cgroup_parent: string;
|
||||
command: string | string[];
|
||||
configs:
|
||||
| string[]
|
||||
| {
|
||||
[x: string]: {
|
||||
source: string;
|
||||
target: string;
|
||||
uid: string;
|
||||
gid: string;
|
||||
mode: number;
|
||||
};
|
||||
};
|
||||
container_name: string;
|
||||
credential_spec: KeyValuePair;
|
||||
depends_on:
|
||||
| string[]
|
||||
| {
|
||||
[key: string]: {
|
||||
condition: string;
|
||||
};
|
||||
};
|
||||
deploy?: {
|
||||
endpoint_mode?: "vip" | "dnsrr";
|
||||
labels?: string[] | KeyValuePair;
|
||||
mode?: "replicated" | "global";
|
||||
placement?: {
|
||||
constraints?: KeyValuePair[] | KeyValuePair;
|
||||
preferences?: KeyValuePair[] | KeyValuePair;
|
||||
};
|
||||
replicas?: number;
|
||||
resources?: {
|
||||
limits?: {
|
||||
cpus?: string;
|
||||
memory?: string;
|
||||
pids?: number;
|
||||
};
|
||||
reservations?: {
|
||||
cpus?: string;
|
||||
memory?: string;
|
||||
devices?: { [key: string]: string | number | string[] }[];
|
||||
};
|
||||
};
|
||||
restart_policy?: {
|
||||
condition?: "none" | "on-failure" | "any";
|
||||
delay?: string;
|
||||
max_attempts?: number;
|
||||
window?: string;
|
||||
};
|
||||
rollback_config?: {
|
||||
parallelism?: number;
|
||||
delay?: string;
|
||||
failure_action?: "continue" | "pause";
|
||||
monitor?: string;
|
||||
max_failure_ratio?: string;
|
||||
order?: "stop-first" | "start-first";
|
||||
};
|
||||
update_config?: {
|
||||
parallelism?: number;
|
||||
delay?: string;
|
||||
failure_action?: "continue" | "pause";
|
||||
monitor?: string;
|
||||
max_failure_ratio?: string;
|
||||
order?: "stop-first" | "start-first";
|
||||
};
|
||||
};
|
||||
device_cgroup_rules: string[];
|
||||
devices: string[];
|
||||
dns: string | string[];
|
||||
dns_opt: string[];
|
||||
dns_search: string | string[];
|
||||
domainname: string;
|
||||
entrypoint: string | string[];
|
||||
env_file: string | string[];
|
||||
environment: string[] | KeyValuePair;
|
||||
expose: string[];
|
||||
extends: KeyValuePair;
|
||||
external_links: string[];
|
||||
extra_hosts: string[];
|
||||
group_add: string[];
|
||||
healthcheck: {
|
||||
test: string[];
|
||||
interval: string;
|
||||
timeout: string;
|
||||
retries: number;
|
||||
start_period: string;
|
||||
};
|
||||
hostname: string;
|
||||
image: string;
|
||||
init: boolean;
|
||||
ipc: string;
|
||||
isolation: string;
|
||||
labels: string[] | KeyValuePair;
|
||||
links: string[];
|
||||
logging: {
|
||||
driver: string;
|
||||
options: KeyValuePair;
|
||||
};
|
||||
network_mode: string;
|
||||
networks:
|
||||
| string[]
|
||||
| {
|
||||
[x: string]: {
|
||||
aliases: string[];
|
||||
ipv4_address: string;
|
||||
ipv6_address: string;
|
||||
link_local_ips: string[];
|
||||
priority: number;
|
||||
};
|
||||
};
|
||||
mac_address: string;
|
||||
mem_swappiness: number;
|
||||
memswap_limit: string | number;
|
||||
oom_kill_disable: boolean;
|
||||
oom_score_adj: number;
|
||||
pid: string | number;
|
||||
platform: string;
|
||||
ports:
|
||||
| string[]
|
||||
| {
|
||||
target: number;
|
||||
host_ip: string;
|
||||
published: string | number;
|
||||
protocol: string;
|
||||
mode: string;
|
||||
};
|
||||
privileged: boolean;
|
||||
profiles?: string[];
|
||||
pull_policy: string;
|
||||
read_only: boolean;
|
||||
restart: string;
|
||||
runtime: string;
|
||||
secrets:
|
||||
| string[]
|
||||
| {
|
||||
source: string;
|
||||
target: string;
|
||||
uid: string;
|
||||
gid: string;
|
||||
mode: number;
|
||||
};
|
||||
security_opt: string[];
|
||||
shm_size: string;
|
||||
stdin_open: boolean;
|
||||
stop_grace_period: string;
|
||||
stop_signal: string;
|
||||
storage_opt: {
|
||||
size: string;
|
||||
};
|
||||
sysctls: string[] | KeyValuePair;
|
||||
tmpfs: string | string[];
|
||||
tty: boolean;
|
||||
ulimits: {
|
||||
nproc: number;
|
||||
nofile: {
|
||||
soft: number;
|
||||
hard: number;
|
||||
};
|
||||
};
|
||||
user: string;
|
||||
userns_mode: string;
|
||||
volumes:
|
||||
| string[]
|
||||
| {
|
||||
type: string;
|
||||
source: string;
|
||||
target: string;
|
||||
read_only: boolean;
|
||||
bind: {
|
||||
propagation: string;
|
||||
create_host_path: boolean;
|
||||
selinux: string;
|
||||
};
|
||||
volume: {
|
||||
nocopy: boolean;
|
||||
};
|
||||
tmpfs: {
|
||||
size: string | number;
|
||||
};
|
||||
consistency: string;
|
||||
};
|
||||
volumes_from: string[];
|
||||
working_dir: string;
|
||||
}
|
||||
|
||||
export interface IVolumeNodeItem extends INodeItem {
|
||||
outputs: string[];
|
||||
canvasConfig: ICanvasConfig;
|
||||
volumeConfig: Partial<IVolumeTopLevel>;
|
||||
}
|
||||
|
||||
export interface INetworkNodeItem extends INodeItem {
|
||||
outputs: string[];
|
||||
canvasConfig: ICanvasConfig;
|
||||
networkConfig: Partial<INetworkTopLevel>;
|
||||
}
|
||||
|
||||
export interface IProjectPayload {
|
||||
name: string;
|
||||
visibility: number;
|
||||
project_type: number;
|
||||
data: {
|
||||
canvas: {
|
||||
position: {
|
||||
top: number;
|
||||
left: number;
|
||||
scale: number;
|
||||
};
|
||||
nodes: any;
|
||||
connections: any;
|
||||
networks: any;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
export interface IGeneratePayload {
|
||||
data: {
|
||||
version: number;
|
||||
networks: Record<string, Partial<INetworkTopLevel>>;
|
||||
services: Record<string, Partial<IService>>;
|
||||
volumes: Record<string, Partial<IVolumeTopLevel>>;
|
||||
};
|
||||
}
|
||||
|
||||
export interface IEditServiceForm {
|
||||
build: {
|
||||
context: string;
|
||||
dockerfile: string;
|
||||
arguments: {
|
||||
key: string[];
|
||||
value: string[];
|
||||
}[];
|
||||
sshAuthentications: {
|
||||
id: string;
|
||||
path: string;
|
||||
}[];
|
||||
cacheFrom: string[];
|
||||
cacheTo: string[];
|
||||
extraHosts: {
|
||||
hostName: string;
|
||||
ipAddress: string;
|
||||
}[];
|
||||
isolation: string;
|
||||
labels: {
|
||||
key: string[];
|
||||
value: string[];
|
||||
}[];
|
||||
sharedMemorySize: string;
|
||||
target: string;
|
||||
};
|
||||
command: string;
|
||||
deploy: {
|
||||
/**
|
||||
* The default value for `mode` is `replicated`. However, we allow
|
||||
* it to be empty. Thus, `mode` attribute can be pruned away
|
||||
* if the user never assigned `mode` explicitly.
|
||||
*/
|
||||
mode: "" | "global" | "replicated";
|
||||
/**
|
||||
* The default value for `endpointMode` is platform dependent.
|
||||
*/
|
||||
endpointMode: "" | "vip" | "dnsrr";
|
||||
replicas: string;
|
||||
placement: {
|
||||
constraints: {
|
||||
key: string;
|
||||
value: string;
|
||||
}[];
|
||||
preferences: {
|
||||
key: string;
|
||||
value: string;
|
||||
}[];
|
||||
};
|
||||
resources: {
|
||||
limits: {
|
||||
cpus: string;
|
||||
memory: string;
|
||||
pids: string;
|
||||
};
|
||||
reservations: {
|
||||
cpus: string;
|
||||
memory: string;
|
||||
};
|
||||
};
|
||||
restartPolicy: {
|
||||
/**
|
||||
* The default value for `condition` is `any`. However, we allow
|
||||
* it to be empty. Thus, `deploy` attribute can be pruned away
|
||||
* if the user never assigned `condition` explicitly.
|
||||
*/
|
||||
condition: "" | "none" | "on-failure" | "any";
|
||||
delay: string;
|
||||
maxAttempts: string;
|
||||
window: string;
|
||||
};
|
||||
rollbackConfig: {
|
||||
parallelism: string;
|
||||
delay: string;
|
||||
failureAction: "" | "continue" | "pause";
|
||||
monitor: string;
|
||||
maxFailureRatio: string;
|
||||
order: "" | "stop-first" | "start-first";
|
||||
};
|
||||
updateConfig: {
|
||||
parallelism: string;
|
||||
delay: string;
|
||||
failureAction: "" | "continue" | "pause";
|
||||
monitor: string;
|
||||
maxFailureRatio: string;
|
||||
order: "" | "stop-first" | "start-first";
|
||||
};
|
||||
labels: {
|
||||
key: string;
|
||||
value: string;
|
||||
}[];
|
||||
};
|
||||
entrypoint: string;
|
||||
envFile: string;
|
||||
serviceName: string;
|
||||
imageName: string;
|
||||
imageTag: string;
|
||||
containerName: string;
|
||||
networks: string[];
|
||||
profiles: string[];
|
||||
ports: {
|
||||
hostPort: string;
|
||||
containerPort: string;
|
||||
protocol: "tcp" | "udp";
|
||||
}[];
|
||||
environmentVariables: {
|
||||
key: string;
|
||||
value: string;
|
||||
}[];
|
||||
restart: string;
|
||||
volumes: {
|
||||
name: string;
|
||||
containerPath: string;
|
||||
accessMode: string;
|
||||
}[];
|
||||
labels: {
|
||||
key: string;
|
||||
value: string;
|
||||
}[];
|
||||
dependsOn: string[];
|
||||
workingDir: string;
|
||||
}
|
||||
|
||||
export interface IEditVolumeForm {
|
||||
entryName: string;
|
||||
volumeName: string;
|
||||
labels: {
|
||||
key: string;
|
||||
value: string;
|
||||
}[];
|
||||
}
|
||||
|
||||
export interface IEditNetworkForm {
|
||||
entryName: string;
|
||||
networkName: string;
|
||||
driver: string;
|
||||
configurations: {
|
||||
subnet: string;
|
||||
ipRange: string;
|
||||
gateway: string;
|
||||
auxAddresses: {
|
||||
hostName: string;
|
||||
ipAddress: string;
|
||||
}[];
|
||||
}[];
|
||||
options: {
|
||||
key: string;
|
||||
value: string;
|
||||
}[];
|
||||
labels: {
|
||||
key: string;
|
||||
value: string;
|
||||
}[];
|
||||
}
|
||||
@ -0,0 +1,30 @@
|
||||
export interface IService {
|
||||
container_name: string;
|
||||
}
|
||||
|
||||
export interface IGeneratePayload {
|
||||
data: {
|
||||
services: Record<string, Partial<IService>>;
|
||||
};
|
||||
}
|
||||
|
||||
export interface IKubernetesProjectPayload {
|
||||
name: string;
|
||||
visibility: number;
|
||||
project_type: number;
|
||||
data: {
|
||||
canvas: {
|
||||
position: {
|
||||
top: number;
|
||||
left: number;
|
||||
scale: number;
|
||||
};
|
||||
nodes: any;
|
||||
connections: any;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
export interface IEditServiceForm {
|
||||
serviceName: string;
|
||||
}
|
||||
Loading…
Reference in New Issue