feat: add network swarm json

This commit is contained in:
Mauricio Siu
2024-05-18 17:59:04 -06:00
parent 506fe074df
commit baecc49d86
7 changed files with 2505 additions and 59 deletions

View File

@@ -109,6 +109,16 @@ const ServiceModeSwarmSchema = z
})
.strict();
const NetworkSwarmSchema = z.array(
z
.object({
Target: z.string().optional(),
Aliases: z.array(z.string()).optional(),
DriverOpts: z.object({}).optional(),
})
.strict(),
);
const LabelsSwarmSchema = z.record(z.string());
const createStringToJSONSchema = (schema: z.ZodTypeAny) => {
@@ -165,6 +175,7 @@ const addSwarmSettings = z.object({
).nullable(),
modeSwarm: createStringToJSONSchema(ServiceModeSwarmSchema).nullable(),
labelsSwarm: createStringToJSONSchema(LabelsSwarmSchema).nullable(),
networkSwarm: createStringToJSONSchema(NetworkSwarmSchema).nullable(),
});
type AddSwarmSettings = z.infer<typeof addSwarmSettings>;
@@ -195,6 +206,7 @@ export const AddSwarmSettings = ({ applicationId }: Props) => {
rollbackConfigSwarm: null,
modeSwarm: null,
labelsSwarm: null,
networkSwarm: null,
},
resolver: zodResolver(addSwarmSettings),
});
@@ -223,6 +235,9 @@ export const AddSwarmSettings = ({ applicationId }: Props) => {
labelsSwarm: data.labelsSwarm
? JSON.stringify(data.labelsSwarm, null, 2)
: null,
networkSwarm: data.networkSwarm
? JSON.stringify(data.networkSwarm, null, 2)
: null,
});
}
}, [form, form.reset, data]);
@@ -237,6 +252,7 @@ export const AddSwarmSettings = ({ applicationId }: Props) => {
rollbackConfigSwarm: data.rollbackConfigSwarm,
modeSwarm: data.modeSwarm,
labelsSwarm: data.labelsSwarm,
networkSwarm: data.networkSwarm,
})
.then(async () => {
toast.success("Swarm settings updated");
@@ -618,12 +634,69 @@ export const AddSwarmSettings = ({ applicationId }: Props) => {
</FormItem>
)}
/>
<FormField
control={form.control}
name="networkSwarm"
render={({ field }) => (
<FormItem className="relative max-lg:px-4 lg:pl-6 ">
<FormLabel>Network</FormLabel>
<TooltipProvider delayDuration={0}>
<Tooltip>
<TooltipTrigger asChild>
<FormDescription className="break-all w-fit flex flex-row gap-1 items-center">
Check the interface
<HelpCircle className="size-4 text-muted-foreground" />
</FormDescription>
</TooltipTrigger>
<TooltipContent
className="w-full z-[999]"
align="start"
side="bottom"
>
<code>
<pre>
{`[
{
"Target" : string | undefined;
"Aliases" : string[] | undefined;
"DriverOpts" : { [key: string]: string } | undefined;
}
]`}
</pre>
</code>
</TooltipContent>
</Tooltip>
</TooltipProvider>
<FormControl>
<Textarea
className="font-mono [field-sizing:content;] min-h-[18.5rem]"
placeholder={`[
{
"Target" : "dokploy-network",
"Aliases" : ["dokploy-network"],
"DriverOpts" : {
"com.docker.network.driver.mtu" : "1500",
"com.docker.network.driver.host_binding" : "true",
"com.docker.network.driver.mtu" : "1500",
"com.docker.network.driver.host_binding" : "true"
}
}
]`}
{...field}
value={field?.value || ""}
/>
</FormControl>
<pre>
<FormMessage />
</pre>
</FormItem>
)}
/>
<FormField
control={form.control}
name="labelsSwarm"
render={({ field }) => (
<FormItem className="relative max-lg:px-4 lg:pl-6 ">
<FormItem className="relative max-lg:px-4 lg:pr-6 ">
<FormLabel>Labels</FormLabel>
<TooltipProvider delayDuration={0}>
<Tooltip>
@@ -650,7 +723,7 @@ export const AddSwarmSettings = ({ applicationId }: Props) => {
</TooltipProvider>
<FormControl>
<Textarea
className="font-mono [field-sizing:content;]"
className="font-mono [field-sizing:content;] min-h-[18.5rem]"
placeholder={`{
"com.example.app.name" : "my-app",
"com.example.app.version" : "1.0.0"

View File

@@ -0,0 +1 @@
ALTER TABLE "application" ADD COLUMN "networkSwarm" json;

File diff suppressed because it is too large Load Diff

View File

@@ -92,6 +92,13 @@
"when": 1716015716708,
"tag": "0012_chubby_umar",
"breakpoints": true
},
{
"idx": 13,
"version": "6",
"when": 1716076179443,
"tag": "0013_blushing_starjammers",
"breakpoints": true
}
]
}

View File

@@ -79,6 +79,12 @@ interface ServiceModeSwarm {
GlobalJob?: {} | undefined;
}
interface NetworkSwarm {
Target?: string | undefined;
Aliases?: string[] | undefined;
DriverOpts?: { [key: string]: string } | undefined;
}
interface LabelsSwarm {
[name: string]: string;
}
@@ -129,6 +135,7 @@ export const applications = pgTable("application", {
rollbackConfigSwarm: json("rollbackConfigSwarm").$type<UpdateConfigSwarm>(),
modeSwarm: json("modeSwarm").$type<ServiceModeSwarm>(),
labelsSwarm: json("labelsSwarm").$type<LabelsSwarm>(),
networkSwarm: json("networkSwarm").$type<NetworkSwarm[]>(),
//
replicas: integer("replicas").default(1).notNull(),
applicationStatus: applicationStatus("applicationStatus")
@@ -242,6 +249,16 @@ const ServiceModeSwarmSchema = z
})
.strict();
const NetworkSwarmSchema = z.array(
z
.object({
Target: z.string().optional(),
Aliases: z.array(z.string()).optional(),
DriverOpts: z.object({}).optional(),
})
.strict(),
);
const LabelsSwarmSchema = z.record(z.string());
const createSchema = createInsertSchema(applications, {
@@ -287,61 +304,7 @@ const createSchema = createInsertSchema(applications, {
rollbackConfigSwarm: UpdateConfigSwarmSchema.nullable(),
modeSwarm: ServiceModeSwarmSchema.nullable(),
labelsSwarm: LabelsSwarmSchema.nullable(),
// restartPolicySwarm: z
// .object({
// Condition: z.string().optional(),
// Delay: z.number().optional(),
// MaxAttempts: z.number().optional(),
// Window: z.number().optional(),
// })
// .strict()
// .nullable(),
// placementSwarm: z
// .object({
// Constraints: z.array(z.string()).optional(),
// Preferences: z.array(PreferenceSchema).optional(),
// MaxReplicas: z.number().optional(),
// Platforms: z.array(PlatformSchema).optional(),
// })
// .strict()
// .nullable(),
// updateConfigSwarm: z
// .object({
// Parallelism: z.number(),
// Delay: z.number().optional(),
// FailureAction: z.string().optional(),
// Monitor: z.number().optional(),
// MaxFailureRatio: z.number().optional(),
// Order: z.string(),
// })
// .strict()
// .nullable(),
// rollbackConfigSwarm: z
// .object({
// Parallelism: z.number(),
// Delay: z.number().optional(),
// FailureAction: z.string().optional(),
// Monitor: z.number().optional(),
// MaxFailureRatio: z.number().optional(),
// Order: z.string(),
// })
// .strict()
// .nullable(),
// modeSwarm: z
// .object({
// Replicated: ReplicatedSchema.optional(),
// Global: z.object({}).optional(),
// ReplicatedJob: ReplicatedJobSchema.optional(),
// GlobalJob: z.object({}).optional(),
// })
// .strict()
// .nullable(),
// labelsSwarm: z
// .object({
// })
// .strict()
// .nullable(),
networkSwarm: NetworkSwarmSchema.nullable(),
});
export const apiCreateApplication = createSchema.pick({

View File

@@ -73,6 +73,7 @@ export const mechanizeDockerContainer = async (
cpuReservation,
command,
ports,
networkSwarm,
} = application;
const resources = calculateResources({
@@ -92,6 +93,7 @@ export const mechanizeDockerContainer = async (
Mode,
RollbackConfig,
UpdateConfig,
Networks,
} = generateConfigContainer(application);
const bindsMount = generateBindMounts(mounts);
@@ -134,7 +136,7 @@ export const mechanizeDockerContainer = async (
: {}),
Labels,
},
Networks: [{ Target: "dokploy-network" }],
Networks,
RestartPolicy,
Placement,
Resources: {

View File

@@ -210,6 +210,7 @@ export const generateConfigContainer = (application: ApplicationNested) => {
labelsSwarm,
replicas,
mounts,
networkSwarm,
} = application;
const haveMounts = mounts.length > 0;
@@ -265,6 +266,13 @@ export const generateConfigContainer = (application: ApplicationNested) => {
Order: "start-first",
},
}),
...(networkSwarm
? {
Networks: networkSwarm,
}
: {
Networks: [{ Target: "dokploy-network" }],
}),
};
};