- Fix Axios keysToSnake converting user values map keys (gpuMem -> gpu_mem) - Add skipRecurseKeys to keysToSnake for values/valuesYaml fields - Add values_yaml alt json tag and Normalize() in DTOs - Check both camelCase/snake_case in enforceNamespaceValues - Read both tailLines/tail_lines query param for diagnostics - Admin users can freely choose namespace in LaunchModal (free-text input) - Block only kube-system/kube-public/kube-node-lease for admin - Regular users keep existing namespace restrictions - Add SSE streaming pod logs endpoint (backend + frontend) - New PodLogStreamer interface and K8s Follow:true implementation - SSE handler with text/event-stream output - Frontend DiagnosticsModal: Stream button, auto-scroll, live indicator - Remove per-card Refresh button from InstanceCard (redundant with page refresh) - Deploy bge-m3 on vllm-serve 0.6.0 (gpuMem=10000, status=deployed)
216 lines
8.3 KiB
Go
216 lines
8.3 KiB
Go
package dto
|
|
|
|
// CreateInstanceRequest 创建实例请求
|
|
type CreateInstanceRequest struct {
|
|
Name string `json:"name" binding:"required"`
|
|
Namespace string `json:"namespace" binding:"required"`
|
|
RegistryID string `json:"registryId" binding:"required"`
|
|
RegistryIDAlt string `json:"registry_id"`
|
|
Repository string `json:"repository" binding:"required"`
|
|
Tag string `json:"tag" binding:"required"`
|
|
Description string `json:"description"`
|
|
Values map[string]interface{} `json:"values"`
|
|
ValuesYAML string `json:"valuesYaml"`
|
|
ValuesYAMLAlt string `json:"values_yaml"`
|
|
}
|
|
|
|
// UpdateInstanceRequest 更新实例请求
|
|
type UpdateInstanceRequest struct {
|
|
Version string `json:"version"`
|
|
Description string `json:"description"`
|
|
Values map[string]interface{} `json:"values"`
|
|
ValuesYAML string `json:"valuesYaml"`
|
|
ValuesYAMLAlt string `json:"values_yaml"`
|
|
}
|
|
|
|
// Normalize 将多种命名风格的字段合并到统一字段
|
|
func (r *CreateInstanceRequest) Normalize() {
|
|
if r.RegistryID == "" {
|
|
r.RegistryID = r.RegistryIDAlt
|
|
}
|
|
if r.ValuesYAML == "" {
|
|
r.ValuesYAML = r.ValuesYAMLAlt
|
|
}
|
|
}
|
|
|
|
// Normalize 将多种命名风格的字段合并到统一字段
|
|
func (r *UpdateInstanceRequest) Normalize() {
|
|
if r.ValuesYAML == "" {
|
|
r.ValuesYAML = r.ValuesYAMLAlt
|
|
}
|
|
}
|
|
|
|
// RollbackInstanceRequest 回滚实例请求
|
|
type RollbackInstanceRequest struct {
|
|
Revision int `json:"revision" binding:"required"`
|
|
Wait bool `json:"wait"`
|
|
Timeout int `json:"timeout"` // seconds
|
|
}
|
|
|
|
// DeleteInstanceRequest 删除实例请求
|
|
type DeleteInstanceRequest struct {
|
|
KeepHistory bool `json:"keepHistory"`
|
|
Timeout int `json:"timeout"` // seconds
|
|
}
|
|
|
|
// InstanceResponse 实例响应
|
|
type InstanceResponse struct {
|
|
ID string `json:"id"`
|
|
ClusterID string `json:"clusterId"`
|
|
Name string `json:"name"`
|
|
Namespace string `json:"namespace"`
|
|
RegistryID string `json:"registryId"`
|
|
Repository string `json:"repository"`
|
|
Chart string `json:"chart"`
|
|
Version string `json:"version"`
|
|
Description string `json:"description"`
|
|
Status string `json:"status"`
|
|
WorkspaceID string `json:"workspaceId"`
|
|
OwnerID string `json:"ownerId"`
|
|
AllowedActions []string `json:"allowedActions,omitempty"`
|
|
StatusReason string `json:"statusReason,omitempty"`
|
|
LastOperation string `json:"lastOperation,omitempty"`
|
|
LastError string `json:"lastError,omitempty"`
|
|
Revision int `json:"revision"`
|
|
Values map[string]interface{} `json:"values,omitempty"`
|
|
CreatedAt string `json:"createdAt"`
|
|
UpdatedAt string `json:"updatedAt"`
|
|
}
|
|
|
|
// InstanceStatusResponse 实例状态响应
|
|
type InstanceStatusResponse struct {
|
|
ID string `json:"id"`
|
|
Name string `json:"name"`
|
|
Namespace string `json:"namespace"`
|
|
Status string `json:"status"`
|
|
Revision int `json:"revision"`
|
|
Chart string `json:"chart"`
|
|
Version string `json:"version"`
|
|
UpdatedAt string `json:"updatedAt"`
|
|
}
|
|
|
|
// ReleaseHistoryResponse Release 历史响应
|
|
type ReleaseHistoryResponse struct {
|
|
Revision int `json:"revision"`
|
|
Updated string `json:"updated"`
|
|
Status string `json:"status"`
|
|
Chart string `json:"chart"`
|
|
AppVersion string `json:"appVersion"`
|
|
Description string `json:"description"`
|
|
}
|
|
|
|
// InstanceListResponse 实例列表响应
|
|
type InstanceListResponse struct {
|
|
Instances []*InstanceResponse `json:"instances"`
|
|
Total int `json:"total"`
|
|
}
|
|
|
|
// InstanceEntryPortResponse Service 端口响应
|
|
type InstanceEntryPortResponse struct {
|
|
Name string `json:"name,omitempty"`
|
|
Protocol string `json:"protocol"`
|
|
Port int32 `json:"port"`
|
|
TargetPort string `json:"targetPort,omitempty"`
|
|
NodePort int32 `json:"nodePort,omitempty"`
|
|
}
|
|
|
|
// InstanceEntryPathResponse Ingress path 响应
|
|
type InstanceEntryPathResponse struct {
|
|
Path string `json:"path"`
|
|
ServiceName string `json:"serviceName,omitempty"`
|
|
ServicePort string `json:"servicePort,omitempty"`
|
|
}
|
|
|
|
// InstanceEntryHostResponse Ingress host 响应
|
|
type InstanceEntryHostResponse struct {
|
|
Host string `json:"host"`
|
|
Paths []InstanceEntryPathResponse `json:"paths,omitempty"`
|
|
}
|
|
|
|
// InstanceEntryTLSResponse Ingress TLS 响应
|
|
type InstanceEntryTLSResponse struct {
|
|
Hosts []string `json:"hosts,omitempty"`
|
|
SecretName string `json:"secretName,omitempty"`
|
|
}
|
|
|
|
// InstanceEntryResponse 实例入口响应
|
|
type InstanceEntryResponse struct {
|
|
Kind string `json:"kind"`
|
|
Name string `json:"name"`
|
|
Namespace string `json:"namespace"`
|
|
Type string `json:"type,omitempty"`
|
|
ClusterIP string `json:"clusterIP,omitempty"`
|
|
ExternalIPs []string `json:"externalIPs,omitempty"`
|
|
LoadBalancerIngress []string `json:"loadBalancerIngress,omitempty"`
|
|
Ports []InstanceEntryPortResponse `json:"ports,omitempty"`
|
|
Hosts []InstanceEntryHostResponse `json:"hosts,omitempty"`
|
|
TLS []InstanceEntryTLSResponse `json:"tls,omitempty"`
|
|
}
|
|
|
|
type InstanceDiagnosticsResponse struct {
|
|
InstanceName string `json:"instanceName"`
|
|
Namespace string `json:"namespace"`
|
|
Pods []InstancePodDiagnostics `json:"pods"`
|
|
Services []InstanceServiceDiagnostics `json:"services"`
|
|
Events []InstanceEventDiagnostics `json:"events"`
|
|
Logs []InstancePodLogResponse `json:"logs"`
|
|
CollectedAt string `json:"collectedAt"`
|
|
}
|
|
|
|
type InstancePodDiagnostics struct {
|
|
Name string `json:"name"`
|
|
Namespace string `json:"namespace"`
|
|
Phase string `json:"phase"`
|
|
NodeName string `json:"nodeName,omitempty"`
|
|
PodIP string `json:"podIp,omitempty"`
|
|
HostIP string `json:"hostIp,omitempty"`
|
|
RestartCount int32 `json:"restartCount"`
|
|
Containers []InstanceContainerDiagnostics `json:"containers"`
|
|
Conditions []InstanceConditionDiagnostics `json:"conditions"`
|
|
CreationTimestamp string `json:"creationTimestamp,omitempty"`
|
|
}
|
|
|
|
type InstanceContainerDiagnostics struct {
|
|
Name string `json:"name"`
|
|
Image string `json:"image"`
|
|
Ready bool `json:"ready"`
|
|
RestartCount int32 `json:"restartCount"`
|
|
State string `json:"state"`
|
|
Reason string `json:"reason,omitempty"`
|
|
Message string `json:"message,omitempty"`
|
|
}
|
|
|
|
type InstanceConditionDiagnostics struct {
|
|
Type string `json:"type"`
|
|
Status string `json:"status"`
|
|
Reason string `json:"reason,omitempty"`
|
|
Message string `json:"message,omitempty"`
|
|
}
|
|
|
|
type InstanceServiceDiagnostics struct {
|
|
Name string `json:"name"`
|
|
Namespace string `json:"namespace"`
|
|
Type string `json:"type"`
|
|
ClusterIP string `json:"clusterIP,omitempty"`
|
|
Ports []InstanceEntryPortResponse `json:"ports,omitempty"`
|
|
}
|
|
|
|
type InstanceEventDiagnostics struct {
|
|
Type string `json:"type"`
|
|
Reason string `json:"reason"`
|
|
Message string `json:"message"`
|
|
InvolvedKind string `json:"involvedKind"`
|
|
InvolvedName string `json:"involvedName"`
|
|
Count int32 `json:"count"`
|
|
FirstTimestamp string `json:"firstTimestamp,omitempty"`
|
|
LastTimestamp string `json:"lastTimestamp,omitempty"`
|
|
}
|
|
|
|
type InstancePodLogResponse struct {
|
|
Pod string `json:"pod"`
|
|
Container string `json:"container"`
|
|
TailLines int64 `json:"tailLines"`
|
|
Log string `json:"log,omitempty"`
|
|
Error string `json:"error,omitempty"`
|
|
}
|