This commit is contained in:
2026-06-25 14:43:13 -05:00
parent 6f77fac58e
commit aaa6a9ee26
25 changed files with 1542 additions and 67 deletions

View File

@@ -60,6 +60,22 @@ export const hostSchema = z.object({
tags: z.array(z.string()).default([]),
notes: z.string().optional(),
visibility: visibilitySchema.default('shared'),
groupId: z.string().nullable().optional(),
sourceType: z.enum(['manual', 'vmware']).optional().default('manual'),
sourceConnectionId: z.string().nullable().optional(),
sourceRef: z.string().max(300).optional().default('')
});
export const vcenterConnectionSchema = z.object({
name: z.string().min(1).max(120),
baseUrl: z.string().url(),
username: z.string().min(1).max(200),
password: z.string().optional().default(''),
apiMode: z.enum(['auto', 'api', 'rest']).optional().default('auto'),
requestTimeoutMs: z.coerce.number().int().min(1000).max(120000).optional().default(20000),
allowUntrustedTls: z.boolean().optional().default(false),
enabled: z.boolean().optional().default(true),
visibility: visibilitySchema.default('shared'),
groupId: z.string().nullable().optional()
});
@@ -70,6 +86,7 @@ const vcenterFilterSchema = z.object({
});
export const vcenterPreviewSchema = z.object({
connectionId: z.string().nullable().optional(),
filter: vcenterFilterSchema.optional().default({}),
limit: z.coerce.number().int().min(1).max(500).optional().default(100)
});
@@ -84,6 +101,23 @@ export const vcenterImportSchema = vcenterPreviewSchema.extend({
tags: z.array(z.string().max(80)).optional().default([])
});
export const hostGroupRuleSchema = z.object({
field: z.enum(['name', 'fqdn', 'address', 'tags', 'transport', 'sourceType', 'osFamily']).default('name'),
operator: z.enum(['contains', 'equals', 'startsWith', 'endsWith']).default('contains'),
value: z.string().min(1).max(200)
});
export const hostGroupSchema = z.object({
name: z.string().min(1).max(160),
description: z.string().max(600).optional().default(''),
mode: z.enum(['manual', 'dynamic']).default('manual'),
matchMode: z.enum(['all', 'any']).optional().default('all'),
rules: z.array(hostGroupRuleSchema).optional().default([]),
hostIds: z.array(z.string()).optional().default([]),
visibility: visibilitySchema.default('shared'),
groupId: z.string().nullable().optional()
});
export const folderSchema = z.object({
parentId: z.string().nullable().optional(),
name: z.string().min(1),
@@ -310,8 +344,11 @@ const scriptPayloadSchema = z.object({
});
export const scriptTestRunSchema = z.object({
hostId: z.string().min(1),
hostId: z.string().optional().default(''),
hostGroupId: z.string().optional().default(''),
credentialId: z.string().min(1)
}).refine((value) => Boolean(value.hostId || value.hostGroupId), {
message: 'Choose a host or host group.'
});
const runPlanPayloadSchema = z.object({
@@ -323,7 +360,8 @@ const runPlanPayloadSchema = z.object({
groupId: z.string().nullable().optional(),
group_id: z.string().nullable().optional(),
parallel: z.boolean().or(z.number()).default(true),
hostIds: z.array(z.string()).optional()
hostIds: z.array(z.string()).optional(),
hostGroupIds: z.array(z.string()).optional()
});
export function normalizeScriptPayload(body) {
@@ -347,6 +385,7 @@ export function normalizeRunPlanPayload(body) {
visibility: parsed.visibility,
groupId: parsed.visibility === 'group' ? parsed.groupId ?? parsed.group_id ?? null : null,
parallel: Boolean(parsed.parallel),
hostIds: parsed.hostIds || []
hostIds: parsed.hostIds || [],
hostGroupIds: parsed.hostGroupIds || []
};
}