diff --git a/config/models/SUPPORTED_MODELS.md b/config/models/SUPPORTED_MODELS.md index 1632b596..1f9925a7 100644 --- a/config/models/SUPPORTED_MODELS.md +++ b/config/models/SUPPORTED_MODELS.md @@ -139,6 +139,7 @@ This document provides a comprehensive reference of all models supported by SGLa |-------------------------|----------------------------------------|-------------------------|---------------------------------|--------|---------|----------------|------------| | GPT-OSS 20B | `openai/gpt-oss-20b` | 20B | GPTOSSForCausalLM | 40 GB | - | No | Configured | | GPT-OSS 120B | `openai/gpt-oss-120b` | 120B | GPTOSSForCausalLM | 240 GB | - | No | Configured | +| GPT-OSS 120B Eagle3 (draft) | `nvidia/gpt-oss-120b-eagle3-long-context` | Draft for spec decoding | GptOssForCausalLM | - | - | No | Configured | | ChatGLM2 6B | `THUDM/chatglm2-6b` | 6B | ChatGLMForConditionalGeneration | 12 GB | 32K | No | Configured | | GLM-4 9B Chat | `ZhipuAI/glm-4-9b-chat` | 9B | ChatGLMForConditionalGeneration | 18 GB | 1M | No | Configured | | InternLM2 7B | `internlm/internlm2-7b` | 7B | InternLM2ForCausalLM | 14 GB | 32K | No | Configured | diff --git a/config/models/kustomization.yaml b/config/models/kustomization.yaml index e884fc7c..d888bf6e 100644 --- a/config/models/kustomization.yaml +++ b/config/models/kustomization.yaml @@ -124,6 +124,7 @@ resources: - nvidia/Llama-3.1-Nemotron-Nano-8B-v1.yaml - nvidia/NVIDIA-Nemotron-Nano-12B-v2-VL-BF16.yaml - nvidia/NVIDIA-Nemotron-Nano-9B-v2.yaml + - nvidia/gpt-oss-120b-eagle3-long-context.yaml # openai - openai/clip-vit-large-patch14-336.yaml diff --git a/config/models/nvidia/gpt-oss-120b-eagle3-long-context.yaml b/config/models/nvidia/gpt-oss-120b-eagle3-long-context.yaml new file mode 100644 index 00000000..d0a86cb9 --- /dev/null +++ b/config/models/nvidia/gpt-oss-120b-eagle3-long-context.yaml @@ -0,0 +1,22 @@ +apiVersion: ome.io/v1beta1 +kind: ClusterBaseModel +metadata: + name: gpt-oss-120b-eagle3-long-context +spec: + modelCapabilities: + - TEXT_TO_TEXT + vendor: nvidia + disabled: false + version: "1.0.0" + displayName: nvidia.gpt-oss-120b-eagle3-long-context + modelFramework: + name: transformers + version: "4.55.0" + modelFormat: + name: safetensors + version: "1.0.0" + modelArchitecture: GptOssForCausalLM + storage: + storageUri: hf://nvidia/gpt-oss-120b-eagle3-long-context + path: /raid/models/nvidia/gpt-oss-120b-eagle3-long-context + key: "hf-token" diff --git a/config/runtimes/kustomization.yaml b/config/runtimes/kustomization.yaml index 90295bb6..f7a587fb 100644 --- a/config/runtimes/kustomization.yaml +++ b/config/runtimes/kustomization.yaml @@ -8,6 +8,7 @@ resources: - srt/e5-mistral-7b-instruct-rt.yaml - srt/gpt-oss-120b-rt.yaml - srt/gpt-oss-20b-rt.yaml +- srt/openai/gpt-oss-120b-eagle3-rt.yaml - srt/kimi-k2-pd-rt.yaml - srt/meta/llama-3-1-70b-instruct-pd-rt.yaml - srt/meta/llama-3-1-70b-instruct-rt.yaml diff --git a/config/runtimes/srt/openai/gpt-oss-120b-eagle3-rt.yaml b/config/runtimes/srt/openai/gpt-oss-120b-eagle3-rt.yaml new file mode 100644 index 00000000..82a6229e --- /dev/null +++ b/config/runtimes/srt/openai/gpt-oss-120b-eagle3-rt.yaml @@ -0,0 +1,117 @@ +apiVersion: ome.io/v1beta1 +kind: ClusterServingRuntime +metadata: + name: srt-gpt-oss-120b-eagle3 +spec: + disabled: false + supportedModelFormats: + - modelFramework: + name: transformers + version: "4.55.0" + modelFormat: + name: safetensors + version: "1.0.0" + modelArchitecture: GptOssForCausalLM + autoSelect: false + priority: 1 + modelSizeRange: + min: 115B + max: 125B + draftModelSizeRange: + min: 0.1B + max: 1B + supportedDraftModelFormats: + - modelFormat: + name: safetensors + version: "1.0.0" + protocolVersions: + - openAI + engineConfig: + annotations: + prometheus.io/scrape: "true" + prometheus.io/port: "8080" + prometheus.io/path: "/metrics" + labels: + logging-forward: enabled + tolerations: + - key: "nvidia.com/gpu" + operator: "Exists" + effect: "NoSchedule" + volumes: + - name: dshm + emptyDir: + medium: Memory + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: node.kubernetes.io/instance-type + operator: In + values: + - BM.GPU.H100.8 + runner: + name: ome-container + image: docker.io/lmsysorg/sglang:v0.5.8.post1-cu130-amd64 + ports: + - containerPort: 8080 + name: http1 + protocol: TCP + command: + - /bin/bash + - '-lc' + - -- + args: + - | + python3 -m sglang.launch_server \ + --host=0.0.0.0 \ + --port=8080 \ + --enable-metrics \ + --log-requests \ + --log-requests-level=1 \ + --model-path="$MODEL_PATH" \ + --tp=2 \ + --tool-call-parser=gpt-oss \ + --reasoning-parser=gpt-oss \ + --speculative-draft-model-path="$DRAFT_MODEL_PATH" \ + --speculative-algorithm=EAGLE3 \ + --speculative-num-steps=3 \ + --speculative-eagle-topk=8 \ + --speculative-num-draft-tokens=16 + volumeMounts: + - mountPath: /dev/shm + name: dshm + resources: + requests: + cpu: 30 + memory: 256Gi + nvidia.com/gpu: 2 + limits: + cpu: 30 + memory: 256Gi + nvidia.com/gpu: 2 + readinessProbe: + httpGet: + path: /health_generate + port: 8080 + failureThreshold: 3 + successThreshold: 1 + periodSeconds: 60 + timeoutSeconds: 200 + livenessProbe: + httpGet: + path: /health + port: 8080 + failureThreshold: 5 + successThreshold: 1 + periodSeconds: 60 + timeoutSeconds: 60 + startupProbe: + httpGet: + path: /health_generate + port: 8080 + failureThreshold: 150 + successThreshold: 1 + periodSeconds: 6 + initialDelaySeconds: 60 + timeoutSeconds: 30 \ No newline at end of file diff --git a/config/samples/isvc/openai/gpt-oss-120b-eagle3.yaml b/config/samples/isvc/openai/gpt-oss-120b-eagle3.yaml new file mode 100644 index 00000000..27bece5f --- /dev/null +++ b/config/samples/isvc/openai/gpt-oss-120b-eagle3.yaml @@ -0,0 +1,17 @@ +apiVersion: ome.io/v1beta1 +kind: InferenceService +metadata: + name: gpt-oss-120b-eagle3 + namespace: ome + annotations: + ome.io/deploymentMode: RawDeployment +spec: + model: + name: gpt-oss-120b + draftModel: + name: gpt-oss-120b-eagle3-long-context + runtime: + name: srt-gpt-oss-120b-eagle3 + engine: + minReplicas: 1 + maxReplicas: 1 diff --git a/go.sum b/go.sum index 26afb49d..50ab0b11 100644 --- a/go.sum +++ b/go.sum @@ -15,221 +15,61 @@ cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKV cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.118.3/go.mod h1:Lhs3YLnBlwJ4KA6nuObNMZ/fCbOQBPuWKPoE0Wa/9Vc= -cloud.google.com/go/accessapproval v1.8.3/go.mod h1:3speETyAv63TDrDmo5lIkpVueFkQcQchkiw/TAMbBo4= -cloud.google.com/go/accesscontextmanager v1.9.3/go.mod h1:S1MEQV5YjkAKBoMekpGrkXKfrBdsi4x6Dybfq6gZ8BU= -cloud.google.com/go/aiplatform v1.74.0/go.mod h1:hVEw30CetNut5FrblYd1AJUWRVSIjoyIvp0EVUh51HA= -cloud.google.com/go/analytics v0.26.0/go.mod h1:KZWJfs8uX/+lTjdIjvT58SFa86V9KM6aPXwZKK6uNVI= -cloud.google.com/go/apigateway v1.7.3/go.mod h1:uK0iRHdl2rdTe79bHW/bTsKhhXPcFihjUdb7RzhTPf4= -cloud.google.com/go/apigeeconnect v1.7.3/go.mod h1:2ZkT5VCAqhYrDqf4dz7lGp4N/+LeNBSfou8Qs5bIuSg= -cloud.google.com/go/apigeeregistry v0.9.3/go.mod h1:oNCP2VjOeI6U8yuOuTmU4pkffdcXzR5KxeUD71gF+Dg= -cloud.google.com/go/appengine v1.9.3/go.mod h1:DtLsE/z3JufM/pCEIyVYebJ0h9UNPpN64GZQrYgOSyM= -cloud.google.com/go/area120 v0.9.3/go.mod h1:F3vxS/+hqzrjJo55Xvda3Jznjjbd+4Foo43SN5eMd8M= -cloud.google.com/go/artifactregistry v1.16.1/go.mod h1:sPvFPZhfMavpiongKwfg93EOwJ18Tnj9DIwTU9xWUgs= -cloud.google.com/go/asset v1.20.4/go.mod h1:DP09pZ+SoFWUZyPZx26xVroHk+6+9umnQv+01yfJxbM= -cloud.google.com/go/assuredworkloads v1.12.3/go.mod h1:iGBkyMGdtlsxhCi4Ys5SeuvIrPTeI6HeuEJt7qJgJT8= cloud.google.com/go/auth v0.16.1 h1:XrXauHMd30LhQYVRHLGvJiYeczweKQXZxsTbV9TiguU= cloud.google.com/go/auth v0.16.1/go.mod h1:1howDHJ5IETh/LwYs3ZxvlkXF48aSqqJUM+5o02dNOI= cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= -cloud.google.com/go/automl v1.14.4/go.mod h1:sVfsJ+g46y7QiQXpVs9nZ/h8ntdujHm5xhjHW32b3n4= -cloud.google.com/go/baremetalsolution v1.3.3/go.mod h1:uF9g08RfmXTF6ZKbXxixy5cGMGFcG6137Z99XjxLOUI= -cloud.google.com/go/batch v1.12.0/go.mod h1:CATSBh/JglNv+tEU/x21Z47zNatLQ/gpGnpyKOzbbcM= -cloud.google.com/go/beyondcorp v1.1.3/go.mod h1:3SlVKnlczNTSQFuH5SSyLuRd4KaBSc8FH/911TuF/Cc= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/bigquery v1.66.2/go.mod h1:+Yd6dRyW8D/FYEjUGodIbu0QaoEmgav7Lwhotup6njo= -cloud.google.com/go/bigtable v1.35.0/go.mod h1:EabtwwmTcOJFXp+oMZAT/jZkyDIjNwrv53TrS4DGrrM= -cloud.google.com/go/billing v1.20.1/go.mod h1:DhT80hUZ9gz5UqaxtK/LNoDELfxH73704VTce+JZqrY= -cloud.google.com/go/binaryauthorization v1.9.3/go.mod h1:f3xcb/7vWklDoF+q2EaAIS+/A/e1278IgiYxonRX+Jk= -cloud.google.com/go/certificatemanager v1.9.3/go.mod h1:O5T4Lg/dHbDHLFFooV2Mh/VsT3Mj2CzPEWRo4qw5prc= -cloud.google.com/go/channel v1.19.2/go.mod h1:syX5opXGXFt17DHCyCdbdlM464Tx0gHMi46UlEWY9Gg= -cloud.google.com/go/cloudbuild v1.22.0/go.mod h1:p99MbQrzcENHb/MqU3R6rpqFRk/X+lNG3PdZEIhM95Y= -cloud.google.com/go/clouddms v1.8.4/go.mod h1:RadeJ3KozRwy4K/gAs7W74ZU3GmGgVq5K8sRqNs3HfA= -cloud.google.com/go/cloudtasks v1.13.3/go.mod h1:f9XRvmuFTm3VhIKzkzLCPyINSU3rjjvFUsFVGR5wi24= -cloud.google.com/go/compute v1.34.0/go.mod h1:zWZwtLwZQyonEvIQBuIa0WvraMYK69J5eDCOw9VZU4g= cloud.google.com/go/compute/metadata v0.6.0 h1:A6hENjEsCDtC1k8byVsgwvVcioamEHvZ4j01OwKxG9I= cloud.google.com/go/compute/metadata v0.6.0/go.mod h1:FjyFAW1MW0C203CEOMDTu3Dk1FlqW3Rga40jzHL4hfg= -cloud.google.com/go/contactcenterinsights v1.17.1/go.mod h1:n8OiNv7buLA2AkGVkfuvtW3HU13AdTmEwAlAu46bfxY= -cloud.google.com/go/container v1.42.2/go.mod h1:y71YW7uR5Ck+9Vsbst0AF2F3UMgqmsN4SP8JR9xEsR8= -cloud.google.com/go/containeranalysis v0.13.3/go.mod h1:0SYnagA1Ivb7qPqKNYPkCtphhkJn3IzgaSp3mj+9XAY= -cloud.google.com/go/datacatalog v1.24.3/go.mod h1:Z4g33XblDxWGHngDzcpfeOU0b1ERlDPTuQoYG6NkF1s= -cloud.google.com/go/dataflow v0.10.3/go.mod h1:5EuVGDh5Tg4mDePWXMMGAG6QYAQhLNyzxdNQ0A1FfW4= -cloud.google.com/go/dataform v0.10.3/go.mod h1:8SruzxHYCxtvG53gXqDZvZCx12BlsUchuV/JQFtyTCw= -cloud.google.com/go/datafusion v1.8.3/go.mod h1:hyglMzE57KRf0Rf/N2VRPcHCwKfZAAucx+LATY6Jc6Q= -cloud.google.com/go/datalabeling v0.9.3/go.mod h1:3LDFUgOx+EuNUzDyjU7VElO8L+b5LeaZEFA/ZU1O1XU= -cloud.google.com/go/dataplex v1.22.0/go.mod h1:g166QMCGHvwc3qlTG4p34n+lHwu7JFfaNpMfI2uO7b8= -cloud.google.com/go/dataproc/v2 v2.11.0/go.mod h1:9vgGrn57ra7KBqz+B2KD+ltzEXvnHAUClFgq/ryU99g= -cloud.google.com/go/dataqna v0.9.3/go.mod h1:PiAfkXxa2LZYxMnOWVYWz3KgY7txdFg9HEMQPb4u1JA= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/datastore v1.20.0/go.mod h1:uFo3e+aEpRfHgtp5pp0+6M0o147KoPaYNaPAKpfh8Ew= -cloud.google.com/go/datastream v1.13.0/go.mod h1:GrL2+KC8mV4GjbVG43Syo5yyDXp3EH+t6N2HnZb1GOQ= -cloud.google.com/go/deploy v1.26.2/go.mod h1:XpS3sG/ivkXCfzbzJXY9DXTeCJ5r68gIyeOgVGxGNEs= -cloud.google.com/go/dialogflow v1.66.0/go.mod h1:BPiRTnnXP/tHLot5h/U62Xcp+i6ekRj/bq6uq88p+Lw= -cloud.google.com/go/dlp v1.21.0/go.mod h1:Y9HOVtPoArpL9sI1O33aN/vK9QRwDERU9PEJJfM8DvE= -cloud.google.com/go/documentai v1.35.2/go.mod h1:oh/0YXosgEq3hVhyH4ZQ7VNXPaveRO4eLVM3tBSZOsI= -cloud.google.com/go/domains v0.10.3/go.mod h1:m7sLe18p0PQab56bVH3JATYOJqyRHhmbye6gz7isC7o= -cloud.google.com/go/edgecontainer v1.4.1/go.mod h1:ubMQvXSxsvtEjJLyqcPFrdWrHfvjQxdoyt+SUrAi5ek= -cloud.google.com/go/errorreporting v0.3.2/go.mod h1:s5kjs5r3l6A8UUyIsgvAhGq6tkqyBCUss0FRpsoVTww= -cloud.google.com/go/essentialcontacts v1.7.3/go.mod h1:uimfZgDbhWNCmBpwUUPHe4vcMY2azsq/axC9f7vZFKI= -cloud.google.com/go/eventarc v1.15.1/go.mod h1:K2luolBpwaVOujZQyx6wdG4n2Xum4t0q1cMBmY1xVyI= -cloud.google.com/go/filestore v1.9.3/go.mod h1:Me0ZRT5JngT/aZPIKpIK6N4JGMzrFHRtGHd9ayUS4R4= -cloud.google.com/go/firestore v1.18.0/go.mod h1:5ye0v48PhseZBdcl0qbl3uttu7FIEwEYVaWm0UIEOEU= -cloud.google.com/go/functions v1.19.3/go.mod h1:nOZ34tGWMmwfiSJjoH/16+Ko5106x+1Iji29wzrBeOo= -cloud.google.com/go/gkebackup v1.6.3/go.mod h1:JJzGsA8/suXpTDtqI7n9RZW97PXa2CIp+n8aRC/y57k= -cloud.google.com/go/gkeconnect v0.12.1/go.mod h1:L1dhGY8LjINmWfR30vneozonQKRSIi5DWGIHjOqo58A= -cloud.google.com/go/gkehub v0.15.3/go.mod h1:nzFT/Q+4HdQES/F+FP1QACEEWR9Hd+Sh00qgiH636cU= -cloud.google.com/go/gkemulticloud v1.5.1/go.mod h1:OdmhfSPXuJ0Kn9dQ2I3Ou7XZ3QK8caV4XVOJZwrIa3s= -cloud.google.com/go/gsuiteaddons v1.7.4/go.mod h1:gpE2RUok+HUhuK7RPE/fCOEgnTffS0lCHRaAZLxAMeE= -cloud.google.com/go/iam v1.4.0/go.mod h1:gMBgqPaERlriaOV0CUl//XUzDhSfXevn4OEUbg6VRs4= -cloud.google.com/go/iap v1.10.3/go.mod h1:xKgn7bocMuCFYhzRizRWP635E2LNPnIXT7DW0TlyPJ8= -cloud.google.com/go/ids v1.5.3/go.mod h1:a2MX8g18Eqs7yxD/pnEdid42SyBUm9LIzSWf8Jux9OY= -cloud.google.com/go/iot v1.8.3/go.mod h1:dYhrZh+vUxIQ9m3uajyKRSW7moF/n0rYmA2PhYAkMFE= -cloud.google.com/go/kms v1.21.0/go.mod h1:zoFXMhVVK7lQ3JC9xmhHMoQhnjEDZFoLAr5YMwzBLtk= -cloud.google.com/go/language v1.14.3/go.mod h1:hjamj+KH//QzF561ZuU2J+82DdMlFUjmiGVWpovGGSA= -cloud.google.com/go/lifesciences v0.10.3/go.mod h1:hnUUFht+KcZcliixAg+iOh88FUwAzDQQt5tWd7iIpNg= -cloud.google.com/go/logging v1.13.0/go.mod h1:36CoKh6KA/M0PbhPKMq6/qety2DCAErbhXT62TuXALA= -cloud.google.com/go/longrunning v0.6.4/go.mod h1:ttZpLCe6e7EXvn9OxpBRx7kZEB0efv8yBO6YnVMfhJs= -cloud.google.com/go/managedidentities v1.7.3/go.mod h1:H9hO2aMkjlpY+CNnKWRh+WoQiUIDO8457wWzUGsdtLA= -cloud.google.com/go/maps v1.19.0/go.mod h1:goHUXrmzoZvQjUVd0KGhH8t3AYRm17P8b+fsyR1UAmQ= -cloud.google.com/go/mediatranslation v0.9.3/go.mod h1:KTrFV0dh7duYKDjmuzjM++2Wn6yw/I5sjZQVV5k3BAA= -cloud.google.com/go/memcache v1.11.3/go.mod h1:UeWI9cmY7hvjU1EU6dwJcQb6EFG4GaM3KNXOO2OFsbI= -cloud.google.com/go/metastore v1.14.3/go.mod h1:HlbGVOvg0ubBLVFRk3Otj3gtuzInuzO/TImOBwsKlG4= -cloud.google.com/go/monitoring v1.24.0/go.mod h1:Bd1PRK5bmQBQNnuGwHBfUamAV1ys9049oEPHnn4pcsc= -cloud.google.com/go/networkconnectivity v1.16.1/go.mod h1:GBC1iOLkblcnhcnfRV92j4KzqGBrEI6tT7LP52nZCTk= -cloud.google.com/go/networkmanagement v1.18.0/go.mod h1:yTxpAFuvQOOKgL3W7+k2Rp1bSKTxyRcZ5xNHGdHUM6w= -cloud.google.com/go/networksecurity v0.10.3/go.mod h1:G85ABVcPscEgpw+gcu+HUxNZJWjn3yhTqEU7+SsltFM= -cloud.google.com/go/notebooks v1.12.3/go.mod h1:I0pMxZct+8Rega2LYrXL8jGAGZgLchSmh8Ksc+0xNyA= -cloud.google.com/go/optimization v1.7.3/go.mod h1:GlYFp4Mju0ybK5FlOUtV6zvWC00TIScdbsPyF6Iv144= -cloud.google.com/go/orchestration v1.11.4/go.mod h1:UKR2JwogaZmDGnAcBgAQgCPn89QMqhXFUCYVhHd31vs= -cloud.google.com/go/orgpolicy v1.14.2/go.mod h1:2fTDMT3X048iFKxc6DEgkG+a/gN+68qEgtPrHItKMzo= -cloud.google.com/go/osconfig v1.14.3/go.mod h1:9D2MS1Etne18r/mAeW5jtto3toc9H1qu9wLNDG3NvQg= -cloud.google.com/go/oslogin v1.14.3/go.mod h1:fDEGODTG/W9ZGUTHTlMh8euXWC1fTcgjJ9Kcxxy14a8= -cloud.google.com/go/phishingprotection v0.9.3/go.mod h1:ylzN9HruB/X7dD50I4sk+FfYzuPx9fm5JWsYI0t7ncc= -cloud.google.com/go/policytroubleshooter v1.11.3/go.mod h1:AFHlORqh4AnMC0twc2yPKfzlozp3DO0yo9OfOd9aNOs= -cloud.google.com/go/privatecatalog v0.10.4/go.mod h1:n/vXBT+Wq8B4nSRUJNDsmqla5BYjbVxOlHzS6PjiF+w= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/pubsub v1.47.0/go.mod h1:LaENesmga+2u0nDtLkIOILskxsfvn/BXX9Ak1NFxOs8= -cloud.google.com/go/pubsublite v1.8.2/go.mod h1:4r8GSa9NznExjuLPEJlF1VjOPOpgf3IT6k8x/YgaOPI= -cloud.google.com/go/recaptchaenterprise/v2 v2.19.4/go.mod h1:WaglfocMJGkqZVdXY/FVB7OhoVRONPS4uXqtNn6HfX0= -cloud.google.com/go/recommendationengine v0.9.3/go.mod h1:QRnX5aM7DCvtqtSs7I0zay5Zfq3fzxqnsPbZF7pa1G8= -cloud.google.com/go/recommender v1.13.3/go.mod h1:6yAmcfqJRKglZrVuTHsieTFEm4ai9JtY3nQzmX4TC0Q= -cloud.google.com/go/redis v1.18.0/go.mod h1:fJ8dEQJQ7DY+mJRMkSafxQCuc8nOyPUwo9tXJqjvNEY= -cloud.google.com/go/resourcemanager v1.10.3/go.mod h1:JSQDy1JA3K7wtaFH23FBGld4dMtzqCoOpwY55XYR8gs= -cloud.google.com/go/resourcesettings v1.8.3/go.mod h1:BzgfXFHIWOOmHe6ZV9+r3OWfpHJgnqXy8jqwx4zTMLw= -cloud.google.com/go/retail v1.19.2/go.mod h1:71tRFYAcR4MhrZ1YZzaJxr030LvaZiIcupH7bXfFBcY= -cloud.google.com/go/run v1.9.0/go.mod h1:Dh0+mizUbtBOpPEzeXMM22t8qYQpyWpfmUiWQ0+94DU= -cloud.google.com/go/scheduler v1.11.4/go.mod h1:0ylvH3syJnRi8EDVo9ETHW/vzpITR/b+XNnoF+GPSz4= -cloud.google.com/go/secretmanager v1.14.5/go.mod h1:GXznZF3qqPZDGZQqETZwZqHw4R6KCaYVvcGiRBA+aqY= -cloud.google.com/go/security v1.18.3/go.mod h1:NmlSnEe7vzenMRoTLehUwa/ZTZHDQE59IPRevHcpCe4= -cloud.google.com/go/securitycenter v1.36.0/go.mod h1:AErAQqIvrSrk8cpiItJG1+ATl7SD7vQ6lgTFy/Tcs4Q= -cloud.google.com/go/servicedirectory v1.12.3/go.mod h1:dwTKSCYRD6IZMrqoBCIvZek+aOYK/6+jBzOGw8ks5aY= -cloud.google.com/go/shell v1.8.3/go.mod h1:OYcrgWF6JSp/uk76sNTtYFlMD0ho2+Cdzc7U3P/bF54= -cloud.google.com/go/spanner v1.76.1/go.mod h1:YtwoE+zObKY7+ZeDCBtZ2ukM+1/iPaMfUM+KnTh/sx0= -cloud.google.com/go/speech v1.26.0/go.mod h1:78bqDV2SgwFlP/M4n3i3PwLthFq6ta7qmyG6lUV7UCA= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.35.1/go.mod h1:M6M/3V/D3KpzMTJyPOR/HU6n2Si5QdaXYEsng2xgOs8= -cloud.google.com/go/storagetransfer v1.12.1/go.mod h1:hQqbfs8/LTmObJyCC0KrlBw8yBJ2bSFlaGila0qBMk4= -cloud.google.com/go/talent v1.8.0/go.mod h1:/gvOzSrtMcfTL/9xWhdYaZATaxUNhQ+L+3ZaGOGs7bA= -cloud.google.com/go/texttospeech v1.11.0/go.mod h1:7M2ro3I2QfIEvArFk1TJ+pqXJqhszDtxUpnIv/150As= -cloud.google.com/go/tpu v1.8.0/go.mod h1:XyNzyK1xc55WvL5rZEML0Z9/TUHDfnq0uICkQw6rWMo= -cloud.google.com/go/trace v1.11.3/go.mod h1:pt7zCYiDSQjC9Y2oqCsh9jF4GStB/hmjrYLsxRR27q8= -cloud.google.com/go/translate v1.12.3/go.mod h1:qINOVpgmgBnY4YTFHdfVO4nLrSBlpvlIyosqpGEgyEg= -cloud.google.com/go/video v1.23.3/go.mod h1:Kvh/BheubZxGZDXSb0iO6YX7ZNcaYHbLjnnaC8Qyy3g= -cloud.google.com/go/videointelligence v1.12.3/go.mod h1:dUA6V+NH7CVgX6TePq0IelVeBMGzvehxKPR4FGf1dtw= -cloud.google.com/go/vision/v2 v2.9.3/go.mod h1:weAcT8aNYSgrWWVTC2PuJTc7fcXKvUeAyDq8B6HkLSg= -cloud.google.com/go/vmmigration v1.8.3/go.mod h1:8CzUpK9eBzohgpL4RvBVtW4sY/sDliVyQonTFQfWcJ4= -cloud.google.com/go/vmwareengine v1.3.3/go.mod h1:G7vz05KGijha0c0dj1INRKyDAaQW8TRMZt/FrfOZVXc= -cloud.google.com/go/vpcaccess v1.8.3/go.mod h1:bqOhyeSh/nEmLIsIUoCiQCBHeNPNjaK9M3bIvKxFdsY= -cloud.google.com/go/webrisk v1.10.3/go.mod h1:rRAqCA5/EQOX8ZEEF4HMIrLHGTK/Y1hEQgWMnih+jAw= -cloud.google.com/go/websecurityscanner v1.7.3/go.mod h1:gy0Kmct4GNLoCePWs9xkQym1D7D59ld5AjhXrjipxSs= -cloud.google.com/go/workflows v1.13.3/go.mod h1:Xi7wggEt/ljoEcyk+CB/Oa1AHBCk0T1f5UH/exBB5CE= -code.cloudfoundry.org/clock v1.0.0/go.mod h1:QD9Lzhd/ux6eNQVUDVRJX/RKTigpewimNYBi7ivZKY8= contrib.go.opencensus.io/exporter/ocagent v0.7.1-0.20200907061046-05415f1de66d h1:LblfooH1lKOpp1hIhukktmSAxFkqMPFk9KR6iZ0MJNI= contrib.go.opencensus.io/exporter/ocagent v0.7.1-0.20200907061046-05415f1de66d/go.mod h1:IshRmMJBhDfFj5Y67nVhMYTTIze91RUeT73ipWKs/GY= contrib.go.opencensus.io/exporter/prometheus v0.4.2 h1:sqfsYl5GIY/L570iT+l93ehxaWJs2/OwXtiWwew3oAg= contrib.go.opencensus.io/exporter/prometheus v0.4.2/go.mod h1:dvEHbiKmgvbr5pjaF9fpw1KeYcjrnC1J8B+JKjsZyRQ= contrib.go.opencensus.io/exporter/zipkin v0.1.2 h1:YqE293IZrKtqPnpwDPH/lOqTWD/s3Iwabycam74JV3g= contrib.go.opencensus.io/exporter/zipkin v0.1.2/go.mod h1:mP5xM3rrgOjpn79MM8fZbj3gsxcuytSqtH0dxSWW1RE= -dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/azure-amqp-common-go/v4 v4.2.0/go.mod h1:GD3m/WPPma+621UaU6KNjKEo5Hl09z86viKwQjTpV0Q= -github.com/Azure/azure-event-hubs-go/v3 v3.6.1/go.mod h1:i2NByb9Pr2na7y8wi/XefEVKkuA2CDUjCNoWQJtTsGo= -github.com/Azure/azure-kusto-go v0.14.0/go.mod h1:wSmXIsQwBVPHDNsSQsX98nuc12VyvxoNHQa2q9t1Ce0= -github.com/Azure/azure-pipeline-go v0.2.3/go.mod h1:x841ezTBIMG6O3lAcl8ATHnsOPVl2bqk7S3ta6S6u4k= -github.com/Azure/azure-sdk-for-go v68.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.2 h1:t5+QXLCK9SVi0PPdaY0PrFvYUo24KwA0QwxnaHRSVd4= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.2/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.1 h1:LNHhpdK7hzUcx/k1LIcuh5k7k1LGIWLQfCjaneSj7Fc= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.1/go.mod h1:uE9zaUfEQT/nbQjVi2IblCG9iaLtZsuYZ8ne+PuQ02M= github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 h1:sXr+ck84g/ZlZUOZiNELInmMgOsuGwdjjVkEIde0OtY= github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= -github.com/Azure/azure-sdk-for-go/sdk/messaging/azservicebus v1.4.1/go.mod h1:4BbKA+mRmmTP8VaLfDPNF5nOdhRm5upG3AXVWfv1dxc= -github.com/Azure/azure-storage-blob-go v0.15.0/go.mod h1:vbjsVbX0dlxnRc4FFMPsS9BsJWPcne7GB7onqlPvz58= -github.com/Azure/azure-storage-queue-go v0.0.0-20230531184854-c06a8eff66fe/go.mod h1:K6am8mT+5iFXgingS9LUc7TmbsW6XBw3nxaRyaMyWc8= -github.com/Azure/go-amqp v1.0.2/go.mod h1:vZAogwdrkbyK3Mla8m/CxSc/aKdnTZ4IbPxl51Y5WZE= -github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.29/go.mod h1:ZtEzC4Jy2JDrZLxvWs8LrBWEBycl1hbT1eknI8MtfAs= -github.com/Azure/go-autorest/autorest/adal v0.9.22/go.mod h1:XuAbAEUv2Tta//+voMI038TrJBqjKam0me7qR+L8Cmk= -github.com/Azure/go-autorest/autorest/azure/auth v0.5.12/go.mod h1:84w/uV8E37feW2NCJ08uT9VBfjfUHpgLVnG2InYD6cg= -github.com/Azure/go-autorest/autorest/azure/cli v0.4.6/go.mod h1:piCfgPho7BiIDdEQ1+g4VmKyD5y+p/XtSNqE6Hc4QD0= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= -github.com/Azure/go-autorest/autorest/validation v0.3.1/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/AzureAD/microsoft-authentication-library-for-go v1.2.0 h1:hVeq+yCyUi+MsoO/CU95yqCIcdzra5ovzk8Q2BBpV2M= github.com/AzureAD/microsoft-authentication-library-for-go v1.2.0/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/DataDog/datadog-api-client-go v1.16.0/go.mod h1:PgrP2ABuJWL3Auw2iEkemAJ/r72ghG4DQQmb5sgnKW4= -github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.26.0/go.mod h1:2bIszWvQRlJVmJLiuLhukLImRjKPcYdzzsx6darK02A= -github.com/Huawei/gophercloud v1.0.21/go.mod h1:TUtAO2PE+Nj7/QdfUXbhi5Xu0uFKVccyukPA7UCxD9w= -github.com/IBM/sarama v1.41.2/go.mod h1:xdpu7sd6OE1uxNdjYTSKUfY8FaKkJES9/+EyjSgiGQk= -github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= -github.com/Masterminds/semver/v3 v3.2.1/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/NYTimes/gziphandler v1.1.1 h1:ZUDjpQae29j0ryrS0u/B8HZfJBtBQHjqw2rQ2cqUQ3I= github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= -github.com/OneOfOne/xxhash v1.2.8/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= -github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8/go.mod h1:I0gYDMZ6Z5GRU7l58bNFSkPTFN6Yl12dsUlAZ8xy98g= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= -github.com/ahmetb/gen-crd-api-reference-docs v0.3.1-0.20210609063737-0067dc6dcea2/go.mod h1:TdjdkYhlOifCQWPs1UdTma97kQQMozf5h26hTuG70u8= -github.com/alecthomas/kingpin/v2 v2.4.0/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= -github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230305170008-8188dc5388df/go.mod h1:pSwJ0fSY5KhvocuWSx4fz3BA8OrA1bQn+K1Eli3BRwM= github.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8TVTI= github.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g= github.com/antonmedv/expr v1.15.3 h1:q3hOJZNvLvhqE8OHBs1cFRdbXFNKuA+bHmRaI+AmRmI= github.com/antonmedv/expr v1.15.3/go.mod h1:0E/6TxnOlRNp81GMzX9QfDPAmHo2Phg00y4JUv1ihsE= -github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk= -github.com/arangodb/go-driver v1.6.0/go.mod h1:HQmdGkvNMVBTE3SIPSQ8T/ZddC6iwNsfMR+dDJQxIsI= -github.com/arangodb/go-velocypack v0.0.0-20200318135517-5af53c29c67e/go.mod h1:mq7Shfa/CaixoDxiyAAc5jZ6CVBAyPaNQCGS7mkj4Ho= -github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/aws/aws-sdk-go-v2 v1.41.0 h1:tNvqh1s+v0vFYdA1xq0aOJH+Y5cRyZ5upu6roPgPKd4= github.com/aws/aws-sdk-go-v2 v1.41.0/go.mod h1:MayyLB8y+buD9hZqkCW3kX1AKq07Y5pXxtgB+rRFhz0= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.1 h1:i8p8P4diljCr60PpJp6qZXNlgX4m2yQFpYk+9ZT+J4E= @@ -250,24 +90,16 @@ github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo= github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.6 h1:R0tNFJqfjHL3900cqhXuwQ+1K4G0xc9Yf8EDbFXCKEw= github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.6/go.mod h1:y/7sDdu+aJvPtGXr4xYosdpq9a6T9Z0jkXfugmti0rI= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.7/go.mod h1:1HKxVrj5wsKy/wb2v07vzTSd+YPV1sDsWxferwPK7PA= -github.com/aws/aws-sdk-go-v2/service/dynamodb v1.21.5/go.mod h1:X3ThW5RPV19hi7bnQ0RMAiBjZbzxj4rZlj+qdctbMWY= -github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.15.5/go.mod h1:7QtKdGj66zM4g5hPgxHRQgFGLGal4EgwggTw5OZH56c= -github.com/aws/aws-sdk-go-v2/service/ecr v1.17.18/go.mod h1:DQtDYmexqR+z+B6HBCvY7zK/tuXKv6Zy/IwOXOK3eow= -github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.13.17/go.mod h1:r1Vuka0kyzqN0sZm4lYTXf0Vhl+o/mTLq6vKpBBZYaQ= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.4 h1:0ryTNEdJbzUCEWkVXEXoqlXV72J5keC1GvILMOuD00E= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.4/go.mod h1:HQ4qwNZh32C3CBeO6iJLQlgtMzqeG17ziAA/3KDJFow= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.6 h1:hncKj/4gR+TPauZgTAsxOxNcvBayhUlYZ6LO/BYiQ30= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.6/go.mod h1:OiIh45tp6HdJDDJGnja0mw8ihQGz3VGrUflLqSL0SmM= -github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.7.35/go.mod h1:B3dUg0V6eJesUTi+m27NUkj7n8hdDKYUpxj8f4+TqaQ= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.16 h1:oHjJHeUy0ImIV0bsrX0X91GkV5nJAyv1l1CC9lnO0TI= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.16/go.mod h1:iRSNGgOYmiYwSCXxXaKb9HfOEj40+oTKn8pTxMlYkRM= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.6 h1:nEXUSAwyUfLTgnc9cxlDWy637qsq4UWwp3sNAfl0Z3Y= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.6/go.mod h1:HGzIULx4Ge3Do2V0FaiYKcyKzOqwrhUZgCI77NisswQ= -github.com/aws/aws-sdk-go-v2/service/kinesis v1.19.0/go.mod h1:0h3hOcyFXyjvI3wGt8C8vk2+II9XxHwFM7zH2KvLHmA= github.com/aws/aws-sdk-go-v2/service/s3 v1.87.3 h1:ETkfWcXP2KNPLecaDa++5bsQhCRa5M5sLUJa5DWYIIg= github.com/aws/aws-sdk-go-v2/service/s3 v1.87.3/go.mod h1:+/3ZTqoYb3Ur7DObD00tarKMLMuKg8iqz5CHEanqTnw= -github.com/aws/aws-sdk-go-v2/service/sqs v1.24.5/go.mod h1:RZBu4jmYz3Nikzpu/VuVvRnTEJ5a+kf36WT2fcl5Q+Q= github.com/aws/aws-sdk-go-v2/service/sso v1.29.1 h1:8OLZnVJPvjnrxEwHFg9hVUof/P4sibH+Ea4KKuqAGSg= github.com/aws/aws-sdk-go-v2/service/sso v1.29.1/go.mod h1:27M3BpVi0C02UiQh1w9nsBEit6pLhlaH3NHna6WUbDE= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.34.2 h1:gKWSTnqudpo8dAxqBqZnDoDWCiEh/40FziUjr/mo6uA= @@ -276,7 +108,6 @@ github.com/aws/aws-sdk-go-v2/service/sts v1.41.5 h1:SciGFVNZ4mHdm7gpD1dgZYnCuVdX github.com/aws/aws-sdk-go-v2/service/sts v1.41.5/go.mod h1:iW40X4QBmUxdP+fZNOpfmkdMZqsovezbAeO+Ubiv2pk= github.com/aws/smithy-go v1.24.0 h1:LpilSUItNPFr1eY85RYgTIg5eIEPtvFbskaFcmmIUnk= github.com/aws/smithy-go v1.24.0/go.mod h1:LEj2LM3rBRQJxPZTB4KuzZkaZYnZPnvgIhb4pu07mx0= -github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20221004211355-a250ad2ca1e3/go.mod h1:m06KtrZgOloUaePAQMv+Ha8kRmTnKdozTHZrweepIrw= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -285,13 +116,10 @@ github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= github.com/blendle/zapdriver v1.3.1 h1:C3dydBOWYRiOk+B8X9IVZ5IOe+7cl+tGOexN4QqHfpE= github.com/blendle/zapdriver v1.3.1/go.mod h1:mdXfREi6u5MArG4j9fewC+FGnXaBR+T4Ox4J2u4eHCc= -github.com/bradleyfalzon/ghinstallation/v2 v2.7.0/go.mod h1:ymxfmloxXBFXvvF1KpeUhOQM6Dfz9NYtfvTiJyk82UE= github.com/bytedance/sonic v1.11.6 h1:oUp34TzMlL+OY1OUWxHqsdkgC/Zfc85zGqw9siXjrc0= github.com/bytedance/sonic v1.11.6/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4= github.com/bytedance/sonic/loader v0.1.1 h1:c+e5Pt1k/cy5wMveRDyk2X4B9hF4g7an8N3zCYjJFNM= github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= -github.com/c2h5oh/datasize v0.0.0-20220606134207-859f65c6625b/go.mod h1:S/7n9copUssQ56c7aAgHqftWO4LTf4xY6CGWt8Bc+3M= -github.com/cenkalti/backoff/v3 v3.2.2/go.mod h1:cIeZDE3IrqwwJl6VUwCN6trj1oXrTS4rc0ij+ULvLYs= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -301,79 +129,44 @@ github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chai2010/gettext-go v1.0.2/go.mod h1:y+wnP2cHYaVj19NZhYKAwEMH2CI1gNHeQQ+5AjwawxA= -github.com/chrismellard/docker-credential-acr-env v0.0.0-20221002210726-e883f69e0206/go.mod h1:1UmFRnmMnVsHwD+ZntmLkoVBB1ZLa6V+XXEbF6hZCxU= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y= github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg= github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/xds/go v0.0.0-20250121191232-2f005788dc42/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= -github.com/containerd/stargz-snapshotter/estargz v0.14.3/go.mod h1:KY//uOCIkSuNAHhJogcZtrNHdKrA99/FCCRjE3HD36o= -github.com/containers/common v0.46.0/go.mod h1:zxv7KjdYddSGoWuLUVp6eSb++Ow1zmSMB2jwxuNB4cU= -github.com/coreos/go-oidc v2.3.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= github.com/coreos/go-semver v0.3.1 h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr4= github.com/coreos/go-semver v0.3.1/go.mod h1:irMmmIw/7yzSRPWryHsK7EYSg09caPQL03VsM8rvUec= github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/crossplane/crossplane-runtime v0.14.1-0.20210713194031-85b19c28ea88/go.mod h1:0sB8XOV2zy1GdZvSMY0/5QzKQJUiNSek08wbAYHJbws= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/deepmap/oapi-codegen v1.12.4/go.mod h1:3lgHGMu6myQ2vqbbTXH2H1o4eXFTGnFiDaOaKKl5yas= -github.com/denisenkom/go-mssqldb v0.12.3/go.mod h1:k0mtMFOnU+AihqFxPMiF05rtiDrorD1Vrm1KEz5hxDo= -github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= -github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= -github.com/diktyo-io/appgroup-api v1.0.1-alpha/go.mod h1:Q0UPLA6aFBogLpiOiA9+7sqnlvPES6ge/PIaQohfR8Y= -github.com/diktyo-io/networktopology-api v1.0.1-alpha/go.mod h1:a9YAoBY96ITcSMUTNPJAljMPpDcig91scxJ1smaAhEg= -github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= -github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/docker/cli v24.0.0+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v24.0.0+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker-credential-helpers v0.7.0/go.mod h1:rETQfLdHNT3foU5kuNkFR1R1V12OJRRO5lzt2D1b5X0= -github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= -github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/dysnix/predictkube-libs v0.0.4-0.20230109175007-5a82fccd31c7/go.mod h1:BQ41gAkQrowPCIk3e30mKovJQ8sXUESgiJ5IPW+19E8= -github.com/dysnix/predictkube-proto v0.0.0-20220713123213-7135dce1e9c9/go.mod h1:zTsQdEyzxs3OHHtrjf8WpmexujIMTYyCVz/38VCt0uo= github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= -github.com/eapache/go-resiliency v1.4.0/go.mod h1:5yPzW0MIvSe0JDsv0v+DvcjEv2FyD6iZYSs1ZI+iQho= github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= -github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3/go.mod h1:YvSRo5mw33fLEx1+DlK6L2VV43tJt5Eyel9n9XBcR+0= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= -github.com/elastic/go-elasticsearch/v7 v7.17.10/go.mod h1:OJ4wdbtDNk5g503kvlHLyErCgQwwzmDtaFC4XyOxXA4= github.com/emicklei/go-restful/v3 v3.12.1 h1:PJMDIM/ak7btuL8Ex0iYET9hxM3CI2sjZtzpL63nKAU= github.com/emicklei/go-restful/v3 v3.12.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.13.4/go.mod h1:kDfuBlDVsSj2MjrLEtRWtHlsWIFcGyB2RMO44Dc5GZA= -github.com/envoyproxy/go-control-plane/envoy v1.32.4/go.mod h1:Gzjc5k8JcJswLjAx1Zm+wSYE20UrLtt7JZMWiWQXQEw= -github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJPzVVHnPgRKdUdwW/KdbRt94AzgRee4= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v1.2.1/go.mod h1:d/C80l/jxXLdfEIhX1W2TmLfsJ31lvEjwamM4DxlWXU= github.com/evanphx/json-patch v5.9.0+incompatible h1:fBXyNpNMuTTDdquAq/uisOr2lShz4oaXpDTX2bLe7ls= github.com/evanphx/json-patch v5.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch/v5 v5.9.11 h1:/8HVnzMq13/3x9TPvjG08wUGqBTmZBsCWzjTM0wiaDU= github.com/evanphx/json-patch/v5 v5.9.11/go.mod h1:3j+LviiESTElxA4p3EMKAB9HXj3/XEtnUf6OZxqIQTM= -github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZMPRZwes7CROmyNKgQzC3XPs6L/G2EJLHddWejkmf4= -github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= @@ -388,20 +181,15 @@ github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU= github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y= -github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-jose/go-jose/v3 v3.0.0/go.mod h1:RNkWWRld676jZEYoV3+XK8L2ZnNSvIsxFMht0mSX+u8= -github.com/go-jose/go-jose/v4 v4.0.4/go.mod h1:NKb5HO1EZccyMpiZNbdUw/14tiXNyUJh188dfnMCAfc= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= -github.com/go-kivik/couchdb/v3 v3.4.1/go.mod h1:scodbTTSS6vOAacJXaCx6XZ57qw8YH1JOvhMwvP0vuw= -github.com/go-kivik/kivik/v3 v3.2.4/go.mod h1:AOPm24bBxkgCf6iw9Di9EX5ABAVXS+unoKXwgOVETa0= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= @@ -429,35 +217,25 @@ github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJn github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= github.com/go-playground/validator/v10 v10.20.0 h1:K9ISHbSaI0lyB2eWMPJo+kOS/FBExVwjEviJTixqxL8= github.com/go-playground/validator/v10 v10.20.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= -github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= -github.com/gobuffalo/flect v1.0.2/go.mod h1:A5msMlrHtLqh9umBSnvabjsMrCcCpAyzglnDvkbYKHs= -github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA= github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= -github.com/gocql/gocql v1.6.0/go.mod h1:3gM2c4D3AnkISwBxGnMMsS8Oy4y2lhbPRsH4xnJrHG8= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= -github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI= github.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang-jwt/jwt/v5 v5.0.0 h1:1n1XNM9hk7O9mnQoNBGolZvzebBQ7p93ULHRc28XJUE= github.com/golang-jwt/jwt/v5 v5.0.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= -github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= -github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.2.4/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -470,7 +248,6 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -490,14 +267,12 @@ github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiu github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= github.com/google/cel-go v0.23.2 h1:UdEe3CvQh3Nv+E/j9r1Y//WO0K0cSyD7/y0bzyLIMI4= github.com/google/cel-go v0.23.2/go.mod h1:52Pb6QsDbC5kvgxvZhiL9QX1oZEkcUF/ZqaPx1J5Wwo= -github.com/google/gnostic v0.6.9/go.mod h1:Nm8234We1lq6iB9OmlgNv3nH91XLLVZHCDayfA3xq+E= github.com/google/gnostic-models v0.6.9 h1:MU/8wDLif2qCXZmzncUQ/BOfxWfthHi63KqpoNbWqVw= github.com/google/gnostic-models v0.6.9/go.mod h1:CiWsm0s6BSQd1hRn8/QmxqB6BesYcbSZxsz9b0KuDBw= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -516,17 +291,9 @@ github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/go-containerregistry v0.16.1 h1:rUEt426sR6nyrL3gt+18ibRcvYpKYdpsa5ZW7MA08dQ= github.com/google/go-containerregistry v0.16.1/go.mod h1:u0qB2l7mvtWVR5kNcbFIhFY1hLbf8eeGapA+vbFDCtQ= -github.com/google/go-containerregistry/pkg/authn/k8schain v0.0.0-20230209165335-3624968304fd/go.mod h1:x5fIlj5elU+/eYF60q4eASMQ9kDc+GMFa7UU9M3mFFw= -github.com/google/go-containerregistry/pkg/authn/kubernetes v0.0.0-20230209165335-3624968304fd/go.mod h1:6pjZpt+0dg+Z0kUEn53qLtD57raiZo/bqWzsuX6dDjo= -github.com/google/go-github/v27 v27.0.6/go.mod h1:/0Gr8pJ55COkmv+S/yPKCczSkUPIM/LnFyubufRNIS0= -github.com/google/go-github/v50 v50.2.0/go.mod h1:VBY8FB6yPIjrtKhozXv4FQupxKLS6H4m6xFZlT43q8Q= -github.com/google/go-github/v55 v55.0.0/go.mod h1:JLahOTA1DnXzhxEymmFF5PP2tSS9JVNj68mSZNDwskA= -github.com/google/go-pkcs11 v0.3.0/go.mod h1:6eQoGcuNJpa7jnd5pMGdkSaQpNDYvPlXWMcjXXThLlY= -github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/mako v0.0.0-20190821191249-122f8dcef9e3/go.mod h1:YzLcVlL+NqWnmUEPuhS1LxDDwGO9WNbVlEXaF4IH35g= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= @@ -541,7 +308,6 @@ github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad/go.mod h1:vavhavw2zAx github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= -github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -551,12 +317,10 @@ github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+ github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.14.1 h1:hb0FFeiPaQskmvakKu5EbCbpntQn48jyHuvrkurSS/Q= github.com/googleapis/gax-go/v2 v2.14.1/go.mod h1:Hb/NubMaVM88SrNkvl8X/o8XWwDJEPqouaLeN2IUxoA= -github.com/gophercloud/gophercloud v1.6.0/go.mod h1:aAVqcocTSXh2vYFZ1JTvx4EQmfgzxRcNupUfxZbBNDM= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 h1:JeSE6pjso5THxAzdVpqr6/geYxZytqFMBCOtn/ujyeo= github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674/go.mod h1:r4w70xmWCQKmi1ONH4KIaBptdivuRPyosB9RmPlGEwA= -github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= @@ -566,52 +330,23 @@ github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4 github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/grpc-ecosystem/grpc-gateway/v2 v2.24.0 h1:TmHmbvxPmaegwhDubVz0lICL0J5Ka2vwTzhoePEXsGE= github.com/grpc-ecosystem/grpc-gateway/v2 v2.24.0/go.mod h1:qztMSjm835F2bXf+5HKAPIS5qsmQDqZna/PgVt4rWtI= -github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4= -github.com/hashicorp/consul/api v1.28.2/go.mod h1:KyzqzgMEya+IZPcD65YFoOVAgPpbfERu4I/tzG6/ueE= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= -github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-retryablehttp v0.7.2/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8= -github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= -github.com/hashicorp/go-secure-stdlib/parseutil v0.1.7/go.mod h1:QmrqtbKuxxSWTN3ETMPuB+VtEiBJ/A9XhoYGv8E1uD8= -github.com/hashicorp/go-secure-stdlib/strutil v0.1.2/go.mod h1:Gou2R9+il93BqX25LAKCLuM+y9U2T4hlwvT1yprcna4= -github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= -github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= -github.com/hashicorp/vault/api v1.10.0/go.mod h1:jo5Y/ET+hNyz+JnKDt8XLAdKs+AM0G5W0Vp1IrFI8N8= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20240312041847-bd984b5ce465/go.mod h1:gx7rwoVhcfuVKG5uya9Hs3Sxj7EIvldVofAWIUtGouw= -github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/influxdata/influxdb-client-go/v2 v2.12.3/go.mod h1:IrrLUbCjjfkmRuaCiGQg4m2GbkaeJDcuWoxiWdQEbA0= -github.com/influxdata/line-protocol v0.0.0-20210922203350-b1ad95c89adf/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= -github.com/influxdata/tdigest v0.0.1/go.mod h1:Z0kXnxzbTC2qrx4NaIzYkE1k66+6oEDQTvL95hQFh5Y= -github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= -github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= -github.com/jackc/pgx/v5 v5.4.3/go.mod h1:Ig06C2Vu0t5qXC60W8sqIthScaEnFvojjj9dSljmHRA= github.com/jarcoal/httpmock v1.2.0 h1:gSvTxxFR/MEMfsGrvRbdfpRUMBStovlSRLw0Ep1bwwc= github.com/jarcoal/httpmock v1.2.0/go.mod h1:oCoTsnAz4+UoOUIf5lJOWV2QQIW5UoeUI6aM2YnWAZk= -github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= -github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= -github.com/jcmturner/gofork v1.7.6/go.mod h1:1622LH6i/EZqLloHfE7IeZ0uEJwMSUyQ/nDd82IeqRo= -github.com/jcmturner/gokrb5/v8 v8.4.4/go.mod h1:1btQEpgT6k+unzCwX1KdWMEwPPkkgBtP+F6aCACiMrs= -github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= -github.com/jessevdk/go-flags v1.6.1/go.mod h1:Mk8T1hIAWpOiJiHa9rJASDK2UGWji0EuPGBnNLMooyc= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4= github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= @@ -626,8 +361,6 @@ github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1 github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/k8stopologyawareschedwg/noderesourcetopology-api v0.1.2/go.mod h1:LBzS4n6GX1C69tzSd5EibZ9cGOXFuHP7GxEMDYVe1sM= -github.com/k8stopologyawareschedwg/podfingerprint v0.2.2/go.mod h1:C23pM15t06dXg/OihGlqBvnYzLr+MXDXJ7zMfbNAyXI= github.com/kedacore/keda/v2 v2.12.1 h1:L400vIMl329NQV/QGPNpZb3UuRJKF0pJTUKv1wBmbUE= github.com/kedacore/keda/v2 v2.12.1/go.mod h1:fjNT3rc7AJvZlIj1b2UzAerr4Be5c0uAOZnmlKNKtro= github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8= @@ -650,37 +383,20 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/kubeflow/mpi-operator v0.6.0/go.mod h1:lu3cj3ESq3SdS29nbHC26TuXiTYYQYTHJ6fcy5Xv20c= -github.com/kubeflow/training-operator v1.8.1/go.mod h1:T6I15h1S09ncH5C6St/QEC7Dy6dpHZA5sPFo+VoJAvE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= -github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-ieproxy v0.0.10/go.mod h1:/NsJd+kxZBmjMc5hrJCKMbP57B84rvq9BiDRbtO9AS0= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= -github.com/microsoft/ApplicationInsights-Go v0.4.4/go.mod h1:fKRUseBqkw6bDiXTs3ESTiU/4YTIHsQS4W3fP2ieF4U= -github.com/microsoft/azure-devops-go-api/azuredevops v1.0.0-b5/go.mod h1:PoGiBqKSQK1vIfQ+yVaFcGjDySHvym6FM1cNYnwzbrY= -github.com/miekg/dns v1.1.62/go.mod h1:mvDlcItzm+br7MToIKqkglaGhlFMHJ9DTNNWONWXbNQ= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= -github.com/mitchellh/hashstructure v1.1.0/go.mod h1:xUDAozZz0Wmdiufv0uyhnHkUTN6/6d8ulp4AwfLKrmA= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/moby/spdystream v0.5.0/go.mod h1:xBAYlnt/ay+11ShkdFKNAG7LsyK/tmNBVvVOwrfMgdI= -github.com/moby/sys/mountinfo v0.6.2/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI= -github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -688,19 +404,10 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= -github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= -github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/nats-io/nats.go v1.34.0/go.mod h1:Ubdu4Nh9exXdSz0RVWRFBbRfrbSxOYd26oF0wkWclB8= -github.com/nats-io/nkeys v0.4.7/go.mod h1:kqXRgRDPlGy7nGaEDMuYzmiJCIAAWDK0IMBtDmGD0nc= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= -github.com/newrelic/newrelic-client-go v1.1.0/go.mod h1:RYMXt7hgYw7nzuXIGd2BH0F1AivgWw7WrBhNBQZEB4k= -github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo/v2 v2.23.3 h1:edHxnszytJ4lD9D5Jjc4tiDkPBZ3siDeJJkUZJJVkp0= @@ -708,31 +415,20 @@ github.com/onsi/ginkgo/v2 v2.23.3/go.mod h1:zXTP6xIp3U8aVuXN8ENK9IXRaTjFnpVB9mGm github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.36.3 h1:hID7cr8t3Wp26+cYnfcjR6HpJ00fdogN6dqZ1t6IylU= github.com/onsi/gomega v1.36.3/go.mod h1:8D9+Txp43QWKhM24yyOBEdpkzN8FvJyAwecBgsU4KU0= -github.com/open-policy-agent/cert-controller v0.12.0/go.mod h1:N5bCFXdAXMYx0PdS6ZQ9lrDQQMz+F6deoChym6VleXw= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.1.0-rc3/go.mod h1:X4pATf0uXsnn3g5aiGIsVnJBR4mxhKzfwmvK/B2NTm8= -github.com/opencontainers/runtime-spec v1.0.3-0.20220909204839-494a5a6aca78/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/selinux v1.11.0/go.mod h1:E5dMC3VPuVvVHDYmi78qvhJp8+M586T4DlDRYpFkyec= -github.com/openshift/api v0.0.0-20240625084701-0689f006bcde/go.mod h1:OOh6Qopf21pSzqNVCB5gomomBXb8o5sGKZxG2KNpaXM= github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/openzipkin/zipkin-go v0.4.2 h1:zjqfqHjUpPmB3c1GlCvvgsM1G4LkvqQbBDueDOCg/jA= github.com/openzipkin/zipkin-go v0.4.2/go.mod h1:ZeVkFjuuBiSy13y8vpSDCjMi9GoI3hPpCJSBx/EYFhY= github.com/oracle/oci-go-sdk/v65 v65.71.0 h1:eEnFD/CzcoqdAA0xu+EmK32kJL3jfV0oLYNWVzoKNyo= github.com/oracle/oci-go-sdk/v65 v65.71.0/go.mod h1:IBEV9l1qBzUpo7zgGaRUhbB05BVfcDGYRFBCPlTcPp0= -github.com/orcaman/concurrent-map/v2 v2.0.1/go.mod h1:9Eq3TG2oBe5FirmYWQfYO5iH1q0Jv47PLaNK++uCdOM= github.com/otiai10/copy v1.14.0 h1:dCI/t1iTdYGtkvCuBG2BgR6KZa83PTclw4U5n2wAllU= github.com/otiai10/copy v1.14.0/go.mod h1:ECfuL02W+/FkTWZWgQqXPWZgW9oeKCSQ5qVfSc4qc4w= github.com/otiai10/mint v1.5.1 h1:XaPLeE+9vGbuyEHem1JNk3bYc7KKqyI/na0/mLd/Kks= github.com/otiai10/mint v1.5.1/go.mod h1:MJm72SBthJjz8qhefc4z1PYEieWmy8Bku7CjcAqyUSM= -github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= -github.com/paypal/load-watcher v0.2.3/go.mod h1:+ASR2PLXHCF2H6ShnqHBkdBq3yVcFBZ18UPn0HK4n/4= github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/phayes/freeport v0.0.0-20220201140144-74d24b5ae9f5/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= -github.com/pierrec/lz4/v4 v4.1.18/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 h1:KoWmjvw+nsYOo29YJK9vDA65RGE3NrOnUtO7a+RF9HU= github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -740,11 +436,9 @@ github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= -github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/pquerna/cachecontrol v0.1.0/go.mod h1:NrUG3Z7Rdu85UNR3vm7SOsl1nFIeSiQnrHV5K9mBcUI= github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= @@ -770,7 +464,6 @@ github.com/prometheus/common v0.35.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJ github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io= github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I= -github.com/prometheus/exporter-toolkit v0.10.0/go.mod h1:+sVFzuvV5JDyw+Ih6p3zFxZNVnKQa3x5qPmDSiPu4ZY= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= @@ -782,33 +475,20 @@ github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoG github.com/prometheus/statsd_exporter v0.22.7/go.mod h1:N/TevpjkIh9ccs6nuzY3jQn9dFqnUakOjnEuMPJJJnI= github.com/prometheus/statsd_exporter v0.25.0 h1:gpVF1TMf1UqMJmBDpzBYrEaGOFMpbMBYYYUDwM38Y/I= github.com/prometheus/statsd_exporter v0.25.0/go.mod h1:HwzfSvg6ehmb0Qg71ZuFrlgj5XQt9C+MGVLz5Gt5lqc= -github.com/rabbitmq/amqp091-go v1.8.1/go.mod h1:+jPrT9iY2eLjRaMSRHUhc3z14E/l85kv/f+6luSD3pc= github.com/ray-project/kuberay/ray-operator v1.2.2 h1:wj4qe9SmJfD1ubgEaVPuAsnU/WFDvremzR8j3JslBdk= github.com/ray-project/kuberay/ray-operator v1.2.2/go.mod h1:osTiIyaDoWi5IN1f0tOOtZ4TzVf+5kJXZor8VFvcEiI= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/redis/go-redis/v9 v9.1.0/go.mod h1:urWj3He21Dj5k4TK1y59xH8Uj6ATueP8AH1cY3lZl4c= -github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= -github.com/rs/dnscache v0.0.0-20211102005908-e0241e321417/go.mod h1:qe5TWALJ8/a1Lqznoc5BDHpYX/8HU60Hm2AwRmqzxqA= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= -github.com/sagikazarmark/crypt v0.19.0/go.mod h1:c6vimRziqqERhtSe0MhIvzE1w54FrCHtrXb5NH/ja78= github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= -github.com/samber/lo v1.37.0/go.mod h1:9vaz2O4o8oOnK23pd2TrXufcbdbJIa3b6cstBWKpopA= github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/seccomp/libseccomp-golang v0.10.0/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= -github.com/segmentio/kafka-go v0.4.43/go.mod h1:d0g15xPMqoUookug0OU75DhGZxXwCFxSLeJ4uphwJzg= -github.com/segmentio/kafka-go/sasl/aws_msk_iam_v2 v0.1.0/go.mod h1:zk5DCsbNtQ0BhooxFaVpLBns0tArkR/xE+4oq2MvCq0= -github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= @@ -830,7 +510,6 @@ github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg= -github.com/spiffe/go-spiffe/v2 v2.5.0/go.mod h1:P+NxobPc6wXhVtINNtFjNWGBTreew1GBUCwT2wPmb7g= github.com/stoewer/go-strcase v1.3.0 h1:g0eASXYtp+yvN9fK8sH94oCIk0fau9uV1/ZdJ0AVEzs= github.com/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= @@ -855,42 +534,20 @@ github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf github.com/stvp/go-udp-testing v0.0.0-20201019212854-469649b16807/go.mod h1:7jxmlfBCDBXRzr0eAQJ48XC1hBu1np4CS5+cHEYfwpc= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= -github.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= -github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tmc/grpc-websocket-proxy v0.0.0-20220101234140-673ab2c3ae75 h1:6fotK7otjonDflCTK0BCfls4SPy3NcCVb5dqqmbRknE= github.com/tmc/grpc-websocket-proxy v0.0.0-20220101234140-673ab2c3ae75/go.mod h1:KO6IkyS8Y3j8OdNO85qEYBsRPuteD+YciPomcXdrMnk= -github.com/tomnomnom/linkheader v0.0.0-20180905144013-02ca5825eb80/go.mod h1:iFyPdL66DjUD96XmzVL3ZntbzcflLnznH0fr99w5VqE= -github.com/tsenart/go-tsz v0.0.0-20180814235614-0bd30b3df1c3/go.mod h1:SWZznP1z5Ki7hDT2ioqiFKEse8K9tU2OUvaRI0NeGQo= -github.com/tsenart/vegeta/v12 v12.11.1/go.mod h1:swiFmrgpqj2llHURgHYFRFN0tfrIrlnspg01HjwOnSQ= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= -github.com/ulikunitz/unixtime v0.1.2/go.mod h1:saexy7bPPO+LTD3J5HtEFSCxeDuHb0TJ3Dx8PKXOa6c= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v1.44.0/go.mod h1:f6VbjjoI3z1NDOZOv17o6RvtRSWxC77seBFc2uWtgiY= -github.com/valyala/fastjson v1.6.4/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= -github.com/vbatts/tar-split v0.11.3/go.mod h1:9QlHN18E+fEH7RdG+QAJJcuya3rqT7eXSTY7wGrAokY= -github.com/wagslane/go-password-validator v0.3.0/go.mod h1:TI1XJ6T5fRdRnHqHt14pvy1tNVnrwe7m3/f1f2fDphQ= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= -github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= -github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= -github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= -github.com/xdg/scram v1.0.5/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= -github.com/xdg/stringprep v1.0.3/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= -github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU= github.com/xiang90/probing v0.0.0-20221125231312-a49e3df8f510 h1:S2dVYn90KE98chqDkyE9Z4N61UnQd+KOfgp5Iu53llk= github.com/xiang90/probing v0.0.0-20221125231312-a49e3df8f510/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xlab/treeprint v1.2.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0= -github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a/go.mod h1:ul22v+Nro/R083muKhosV54bj5niojjWZvU8xrevuH4= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/zeebo/errs v1.4.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4= go.etcd.io/bbolt v1.3.11 h1:yGEzV1wPz2yVCLsD8ZAiGHhHVlczyC9d1rP43/VCRJ0= go.etcd.io/bbolt v1.3.11/go.mod h1:dksAq7YMXoljX0xu6VF5DMZGbhYYoLUalEiSySYAS4I= go.etcd.io/etcd/api/v3 v3.5.21 h1:A6O2/JDb3tvHhiIz3xf9nJ7REHvtEFJJ3veW3FbCnS8= @@ -907,7 +564,6 @@ go.etcd.io/etcd/raft/v3 v3.5.21 h1:dOmE0mT55dIUsX77TKBLq+RgyumsQuYeiRQnW/ylugk= go.etcd.io/etcd/raft/v3 v3.5.21/go.mod h1:fmcuY5R2SNkklU4+fKVBQi2biVp5vafMrWUEj4TJ4Cs= go.etcd.io/etcd/server/v3 v3.5.21 h1:9w0/k12majtgarGmlMVuhwXRI2ob3/d1Ik3X5TKo0yU= go.etcd.io/etcd/server/v3 v3.5.21/go.mod h1:G1mOzdwuzKT1VRL7SqRchli/qcFrtLBTAQ4lV20sXXo= -go.mongodb.org/mongo-driver v1.12.1/go.mod h1:/rGBTebI3XYboVmgz+Wv3Bcbl3aD0QF9zl6kDDw18rQ= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -918,14 +574,12 @@ go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= -go.opentelemetry.io/contrib/detectors/gcp v1.34.0/go.mod h1:cV4BMFcscUR/ckqLkbfQmF0PRsq8w/lMGzdbCSveBHo= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 h1:x7wzEgXfnzJcHDwStJT+mxOz4etr2EcexjqhBvmoakw= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0/go.mod h1:rg+RlpR5dKwaS95IyyZqj5Wd4E13lk/msnTS0Xl9lJM= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 h1:sbiXRNDSWJOTobXh5HyQKjq6wUC5tNybqjIqDpAY4CU= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0/go.mod h1:69uWxva0WgAA/4bu2Yy70SLDBwZXuQ6PbBpbsa5iZrQ= go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ= go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.44.0/go.mod h1:qcTO4xHAxZLaLxPd60TdE88rxtItPHgHWqOhOGRr0as= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.33.0 h1:Vh5HayB/0HHfOQA7Ctx69E/Y/DcQSMPpKANYVMQ7fBA= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.33.0/go.mod h1:cpgtDBaqD/6ok/UG0jT15/uKjAY8mRA53diogHBg3UI= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.33.0 h1:5pojmb1U1AogINhN3SurB+zm/nIcusopeBNp42f45QM= @@ -940,7 +594,6 @@ go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc= go.opentelemetry.io/proto/otlp v1.4.0 h1:TA9WRvW6zMwP+Ssb6fLoUIuirti1gGbP28GcKG1jgeg= go.opentelemetry.io/proto/otlp v1.4.0/go.mod h1:PPBWZIP98o2ElSqI35IHfu7hIhSwvc5N38Jw8pXuGFY= -go.starlark.net v0.0.0-20230525235612-a134d8f9ddca/go.mod h1:jxU+3+j+71eXOW14274+SmmuW82qJzl6iZSeqEtTGds= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= @@ -1111,7 +764,6 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk= golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= -golang.org/x/telemetry v0.0.0-20250710130107-8d8967aff50b/go.mod h1:4ZwOYna0/zsOKwuR5X/m0QFOJpSZvAxFfkQT+Erd9D4= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.33.0 h1:NuFncQrRcaRvVmgRkvM3j/F00gWIAlcmlB8ACEKmGIg= @@ -1178,10 +830,8 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw= gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= -gonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -1207,7 +857,6 @@ google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -1243,7 +892,6 @@ google.golang.org/genproto v0.0.0-20250303144028-a0af3efb3deb h1:ITgPrl429bc6+2Z google.golang.org/genproto v0.0.0-20250303144028-a0af3efb3deb/go.mod h1:sAo5UzpjUwgFBCzupwhcLcxHVDK7vG5IqI30YnwX2eE= google.golang.org/genproto/googleapis/api v0.0.0-20250414145226-207652e42e2e h1:UdXH7Kzbj+Vzastr5nVfccbmFsmYNygVLSPk1pEfDoY= google.golang.org/genproto/googleapis/api v0.0.0-20250414145226-207652e42e2e/go.mod h1:085qFyf2+XaZlRdCgKNCIZ3afY2p4HHZdoIRpId8F4A= -google.golang.org/genproto/googleapis/bytestream v0.0.0-20250425173222-7b384671a197/go.mod h1:h6yxum/C2qRb4txaZRLDHK8RyS0H/o2oEDeKY4onY/Y= google.golang.org/genproto/googleapis/rpc v0.0.0-20250425173222-7b384671a197 h1:29cjnHVylHwTzH66WfFZqgSQgnxzvWE+jvBwpZCLRxY= google.golang.org/genproto/googleapis/rpc v0.0.0-20250425173222-7b384671a197/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= @@ -1262,7 +910,6 @@ google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.72.0 h1:S7UkcVa60b5AAQTaO6ZKamFp1zMZSU0fGDK2WZLbBnM= google.golang.org/grpc v1.72.0/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.5.1/go.mod h1:5KF+wpkbTSbGcR9zteSqZV6fqFOWBl4Yde8En8MryZA= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1289,7 +936,6 @@ gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSPG+6V4= gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/go-jose/go-jose.v2 v2.6.3/go.mod h1:zzZDPkNNw/c9IE7Z9jr11mBZQhKQTMzoEEIoEdZlFBI= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= @@ -1308,7 +954,6 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -1328,37 +973,19 @@ k8s.io/apimachinery v0.33.7 h1:f1kF3V+Stdr+2IGB8QhrfZ6J9JkXF6e1gWX2wKP5slU= k8s.io/apimachinery v0.33.7/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM= k8s.io/apiserver v0.33.7 h1:A+3bpgxp9PUy8SEqVCrq5BoFxwUujYYwkrTXpv621cU= k8s.io/apiserver v0.33.7/go.mod h1:d7/iHfHmI7WF+z+xuMi+O1osC1lHv6irtPua/7yVPto= -k8s.io/autoscaler/cluster-autoscaler/apis v0.0.0-20240813092541-aec7b75bb683/go.mod h1:VJdfvO7iPTPM/zc5zjFFvIH3zXZKPAEItzRAB/gZrwA= -k8s.io/cli-runtime v0.31.4/go.mod h1:0/pRzAH7qc0hWx40ut1R4jLqiy2w/KnbqdaAI2eFG8U= k8s.io/client-go v0.33.7 h1:sEcU4syZnbwaiGDctJE6G/IKsuays3wjEWGuyrD7M8c= k8s.io/client-go v0.33.7/go.mod h1:0MEM10zY5dGdc3FdkyNCTKXiTr8P+2Vj65njzvE0Vhw= -k8s.io/cloud-provider v0.30.12/go.mod h1:CzV5fqBoG5HAcvgRaK/pPnOhpRAos9wwRauZawDmL14= -k8s.io/code-generator v0.32.3/go.mod h1:+mbiYID5NLsBuqxjQTygKM/DAdKpAjvBzrJd64NU1G8= k8s.io/component-base v0.33.7 h1:r3xd2l2lngeiOrQhpnD7CYtgbbrTDBnO3qyDUUfwTXw= k8s.io/component-base v0.33.7/go.mod h1:3v7hH1NvNLID9BUBAR/FqM9StQ/Sa4yBDxEzE1yvGFg= -k8s.io/component-helpers v0.31.4/go.mod h1:Ddq5GYRK/1uNoPNgJh9N5osPutvBweQEcIG6b8kcvgQ= -k8s.io/controller-manager v0.30.12/go.mod h1:vbZ0OY4XMFGJDl9lTaPGc+BDocukZzMH41iNVc5BcY8= -k8s.io/csi-translation-lib v0.30.12/go.mod h1:5lNKaS8VpgmTpH6rPAdwEbQ9HvCnpOGaqpP7OAUFj/I= -k8s.io/dynamic-resource-allocation v0.30.12/go.mod h1:+1QBI9MRebuOMtLAqCK/RB+oKCh9f+2EhAgkEOV7Fz8= -k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01 h1:pWEwq4Asjm4vjW7vcsmijwBhOr1/shsbSYiWXmNGlks= +k8s.io/gengo/v2 v2.0.0-20240911193312-2b36238f13e9 h1:si3PfKm8dDYxgfbeA6orqrtLkvvIeH8UqffFJDl0bz4= k8s.io/gengo/v2 v2.0.0-20240911193312-2b36238f13e9/go.mod h1:EJykeLsmFC60UQbYJezXkEsG2FLrt0GPNkU5iK5GWxU= -k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -k8s.io/klog/hack/tools v0.0.0-20210917071902-331d2323a192/go.mod h1:DXW3Mv8xqJvjXWiBSBHrK2O4mq5LMD0clqkv3b1g9HA= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/kms v0.33.7/go.mod h1:C1I8mjFFBNzfUZXYt9FZVJ8MJl7ynFbGgZFbBzkBJ3E= k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff h1:/usPimJzUKKu+m+TE36gUyGcf03XZEP0ZIKgKj35LS4= k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff/go.mod h1:5jIi+8yX4RIb8wk3XwBo5Pq2ccx4FP10ohkbSKCZoK8= -k8s.io/kube-scheduler v0.30.12/go.mod h1:UYX+kgypQHSmq1+hnkLgdJjmvMwQ2eg5U6Un/bDoo5Q= -k8s.io/kubectl v0.31.4/go.mod h1:0E0rpXg40Q57wRE6LB9su+4tmwx1IzZrmIEvhQPk0i4= -k8s.io/kubelet v0.30.12/go.mod h1:q68tsGhKUf3LTdvWq2Nu1XdARtaTaCQ5Xti4bIuxSXQ= -k8s.io/kubernetes v1.30.12/go.mod h1:DGWYRXHx5NhImLiR9FvIVBsOKxwKZOX6bPF/YP7TqHY= -k8s.io/metrics v0.31.4/go.mod h1:3S5m9eXJGhgEqH45t6f5pq7dbqpTbgcJvMfk9iEWlFM= -k8s.io/mount-utils v0.30.12/go.mod h1:9sCVmwGLcV1MPvbZ+rToMDnl1QcGozy+jBPd0MsQLIo= k8s.io/utils v0.0.0-20241210054802-24370beab758 h1:sdbE21q2nlQtFh65saZY+rRM6x6aJJI8IUa1AmH/qa0= k8s.io/utils v0.0.0-20241210054802-24370beab758/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -knative.dev/caching v0.0.0-20231017130712-54d0758671ef/go.mod h1:plGN+mIBKRtVxZ0vQeZ3Gt02RIaj0niwIMnQNkQHycw= -knative.dev/hack v0.0.0-20231109190034-5deaddeb51a7/go.mod h1:yk2OjGDsbEnQjfxdm0/HJKS2WqTLEFg/N6nUs6Rqx3Q= knative.dev/networking v0.0.0-20231115015815-3af9769712cd h1:VDtYz+hybqIAEp8NM2tAi2QV4D8Cc5DWLoXLi5IcZjE= knative.dev/networking v0.0.0-20231115015815-3af9769712cd/go.mod h1:HQ3rA7qrKVWvZUl6GGQefn/PzNXlX4e94KpbwBEjFcQ= knative.dev/pkg v0.0.0-20231115001034-97c7258e3a98 h1:uvOLwp5Ar7oJlaYEszh51CemuZc1sRRI14xzKhUEF3U= @@ -1374,29 +1001,19 @@ sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.2 h1:jpcvIRr3GLoUo sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.2/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw= sigs.k8s.io/controller-runtime v0.19.7 h1:DLABZfMr20A+AwCZOHhcbcu+TqBXnJZaVBri9K3EO48= sigs.k8s.io/controller-runtime v0.19.7/go.mod h1:iRmWllt8IlaLjvTTDLhRBXIEtkCK6hwVBJJsYS9Ajf4= -sigs.k8s.io/controller-runtime/tools/setup-envtest v0.0.0-20230924163057-bb09db8522fe/go.mod h1:B6HLcvOy2S1qq2eWOFm9xepiKPMIc8Z9OXSPsnUDaR4= -sigs.k8s.io/controller-tools v0.16.3/go.mod h1:AEj6k+w1kYpLZv2einOH3mj52ips4W/6FUjnB5tkJGs= -sigs.k8s.io/custom-metrics-apiserver v1.28.0/go.mod h1:1XFzUze/gMahODitr56KKM4iDee51ChVu9cTvJ5EEVI= sigs.k8s.io/gateway-api v1.2.1 h1:fZZ/+RyRb+Y5tGkwxFKuYuSRQHu9dZtbjenblleOLHM= sigs.k8s.io/gateway-api v1.2.1/go.mod h1:EpNfEXNjiYfUJypf0eZ0P5iXA9ekSGWaS1WgPaM42X0= -sigs.k8s.io/jobset v0.7.1/go.mod h1:cbBuQ6QrTU88x5PrDqcC5AI28YyTSQCIcRTLNTJoHDE= sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 h1:/Rv+M11QRah1itp8VhT6HoVx1Ray9eB4DBr+K+/sCJ8= sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3/go.mod h1:18nIHnGi6636UCz6m8i4DhaJ65T6EruyzmoQqI2BVDo= sigs.k8s.io/kueue v0.10.6 h1:r/ULCI0wXYvkbl0vliq8aS+AvOVhW2dlxzpRMudhNJ8= sigs.k8s.io/kueue v0.10.6/go.mod h1:3yzOvGI0sPOC3VL1ihVIrzc8mkSyCVTL+SrouewwRWw= -sigs.k8s.io/kustomize/api v0.17.3/go.mod h1:TuDH4mdx7jTfK61SQ/j1QZM/QWR+5rmEiNjvYlhzFhc= -sigs.k8s.io/kustomize/cmd/config v0.11.3/go.mod h1:ENTZ8Ds12gewUpdxF5PJq/9qPVQFd5VPvMIL11wrBIU= -sigs.k8s.io/kustomize/kustomize/v5 v5.1.1/go.mod h1:7kno0pHkt7k3Vg4/0IjpMxx1bzCi08gziU2CTa6UuvM= -sigs.k8s.io/kustomize/kyaml v0.17.2/go.mod h1:9V0mCjIEYjlXuCdYsSXvyoy2BTsLESH7TlGV81S282U= sigs.k8s.io/lws v0.5.1 h1:eaeMNkP0manRluQZLN32atoULaGrzP611gSLdFaHZs4= sigs.k8s.io/lws v0.5.1/go.mod h1:qprXSTTFnfmPZY3V3sUfk6ZPmAodsdoKS8XVElJ9kN0= sigs.k8s.io/randfill v0.0.0-20250304075658-069ef1bbf016/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU= sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= -sigs.k8s.io/release-utils v0.3.0/go.mod h1:J9xpziRNRI4mAeMZxPRryDodQMoMudMu6yC1aViFHU4= sigs.k8s.io/scheduler-plugins v0.30.12 h1:R02lsjv+fUu5A9odupfOcZpCrM2irc/4jP3Faf0IIiE= sigs.k8s.io/scheduler-plugins v0.30.12/go.mod h1:zBmLWNCiAzJzoNL2A6xT+tGD3dXK93aT0zcicrTLxiI= -sigs.k8s.io/security-profiles-operator v0.4.0/go.mod h1:aqtxq1T5+UWQpFEsfGCiUnY4p+s2KZoqQMETkBDlrrc= sigs.k8s.io/structured-merge-diff/v4 v4.6.0 h1:IUA9nvMmnKWcj5jl84xn+T5MnlZKThmUW1TdblaLVAc= sigs.k8s.io/structured-merge-diff/v4 v4.6.0/go.mod h1:dDy58f92j70zLsuZVuUX5Wp9vtxXpaZnkPGWeqDfCps= sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= diff --git a/pkg/apis/ome/v1beta1/inference_service.go b/pkg/apis/ome/v1beta1/inference_service.go index 04832cbb..8610ce32 100644 --- a/pkg/apis/ome/v1beta1/inference_service.go +++ b/pkg/apis/ome/v1beta1/inference_service.go @@ -34,6 +34,12 @@ type InferenceServiceSpec struct { // +optional Model *ModelRef `json:"model,omitempty"` + // DraftModel defines an optional smaller draft model for speculative decoding. + // References a BaseModel or ClusterBaseModel, just like Model. + // When set, the draft model's storage path is injected as the DRAFT_MODEL_PATH environment variable. + // +optional + DraftModel *ModelRef `json:"draftModel,omitempty"` + // Runtime defines the serving runtime environment that will be used to execute the model. // It is an inference service spec template that determines how the service should be deployed. // Runtime is optional - if not defined, the operator will automatically select the best runtime @@ -326,6 +332,7 @@ type ServingRuntimeRef struct { // +kubebuilder:printcolumn:name="Ready",type="string",JSONPath=".status.conditions[?(@.type=='Ready')].status" // +kubebuilder:printcolumn:name="BaseModel",type="string",JSONPath=".spec.model.name" // +kubebuilder:printcolumn:name="Runtime",type="string",JSONPath=".spec.runtime.name" +// +kubebuilder:printcolumn:name="DraftModel",type="string",JSONPath=".spec.draftModel.name" // +kubebuilder:printcolumn:name="Prev",type="integer",JSONPath=".status.components.engine.traffic[?(@.tag=='prev')].percent" // +kubebuilder:printcolumn:name="Latest",type="integer",JSONPath=".status.components.engine.traffic[?(@.latestRevision==true)].percent" // +kubebuilder:printcolumn:name="PrevRolledoutRevision",type="string",JSONPath=".status.components.engine.traffic[?(@.tag=='prev')].revisionName" diff --git a/pkg/apis/ome/v1beta1/servingruntime_types.go b/pkg/apis/ome/v1beta1/servingruntime_types.go index 3e1eee9f..0f7daeb9 100644 --- a/pkg/apis/ome/v1beta1/servingruntime_types.go +++ b/pkg/apis/ome/v1beta1/servingruntime_types.go @@ -60,6 +60,21 @@ type SupportedModelFormat struct { AcceleratorConfig map[string]*AcceleratorModelConfig `json:"acceleratorConfig,omitempty"` } +// SupportedDraftModelFormat describes a draft model format supported by a runtime for speculative decoding. +// All fields are optional: if set, the draft model must match; if unset, that dimension is not checked. +// +k8s:openapi-gen=true +type SupportedDraftModelFormat struct { + // ModelFormat of the draft model, e.g., "SafeTensors", "PyTorch" + // +optional + ModelFormat *ModelFormat `json:"modelFormat,omitempty"` + // ModelFramework of the draft model, e.g., "Transformers", "PyTorch" + // +optional + ModelFramework *ModelFrameworkSpec `json:"modelFramework,omitempty"` + // ModelArchitecture of the draft model, e.g., "LlamaForCausalLM", "GptOssForCausalLM" + // +optional + ModelArchitecture *string `json:"modelArchitecture,omitempty"` +} + // AcceleratorModelConfig provides accelerator-specific overrides for this model format // +k8s:openapi-gen=true type AcceleratorModelConfig struct { @@ -196,6 +211,18 @@ type ServingRuntimeSpec struct { // +optional ModelSizeRange *ModelSizeRangeSpec `json:"modelSizeRange,omitempty"` + // DraftModelSizeRange is the range of draft model sizes supported when using this runtime with + // speculative decoding. Validated only when the InferenceService specifies a draft model. + // +optional + DraftModelSizeRange *ModelSizeRangeSpec `json:"draftModelSizeRange,omitempty"` + + // SupportedDraftModelFormats lists draft model formats (format, framework, architecture) supported + // when using this runtime with speculative decoding. Validated only when the InferenceService + // specifies a draft model. If nil or empty and a draft model is specified, the runtime is incompatible. + // +optional + // +listType=atomic + SupportedDraftModelFormats []SupportedDraftModelFormat `json:"supportedDraftModelFormats,omitempty"` + // Set to true to disable use of this runtime // +optional Disabled *bool `json:"disabled,omitempty"` diff --git a/pkg/apis/ome/v1beta1/zz_generated.deepcopy.go b/pkg/apis/ome/v1beta1/zz_generated.deepcopy.go index 4583e051..cf5d1e55 100644 --- a/pkg/apis/ome/v1beta1/zz_generated.deepcopy.go +++ b/pkg/apis/ome/v1beta1/zz_generated.deepcopy.go @@ -1460,6 +1460,11 @@ func (in *InferenceServiceSpec) DeepCopyInto(out *InferenceServiceSpec) { *out = new(ModelRef) (*in).DeepCopyInto(*out) } + if in.DraftModel != nil { + in, out := &in.DraftModel, &out.DraftModel + *out = new(ModelRef) + (*in).DeepCopyInto(*out) + } if in.Runtime != nil { in, out := &in.Runtime, &out.Runtime *out = new(ServingRuntimeRef) @@ -2394,6 +2399,18 @@ func (in *ServingRuntimeSpec) DeepCopyInto(out *ServingRuntimeSpec) { *out = new(ModelSizeRangeSpec) (*in).DeepCopyInto(*out) } + if in.DraftModelSizeRange != nil { + in, out := &in.DraftModelSizeRange, &out.DraftModelSizeRange + *out = new(ModelSizeRangeSpec) + (*in).DeepCopyInto(*out) + } + if in.SupportedDraftModelFormats != nil { + in, out := &in.SupportedDraftModelFormats, &out.SupportedDraftModelFormats + *out = make([]SupportedDraftModelFormat, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } if in.Disabled != nil { in, out := &in.Disabled, &out.Disabled *out = new(bool) @@ -2520,6 +2537,36 @@ func (in *StorageSpec) DeepCopy() *StorageSpec { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *SupportedDraftModelFormat) DeepCopyInto(out *SupportedDraftModelFormat) { + *out = *in + if in.ModelFormat != nil { + in, out := &in.ModelFormat, &out.ModelFormat + *out = new(ModelFormat) + (*in).DeepCopyInto(*out) + } + if in.ModelFramework != nil { + in, out := &in.ModelFramework, &out.ModelFramework + *out = new(ModelFrameworkSpec) + (*in).DeepCopyInto(*out) + } + if in.ModelArchitecture != nil { + in, out := &in.ModelArchitecture, &out.ModelArchitecture + *out = new(string) + **out = **in + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SupportedDraftModelFormat. +func (in *SupportedDraftModelFormat) DeepCopy() *SupportedDraftModelFormat { + if in == nil { + return nil + } + out := new(SupportedDraftModelFormat) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *SupportedModelFormat) DeepCopyInto(out *SupportedModelFormat) { *out = *in diff --git a/pkg/constants/constants.go b/pkg/constants/constants.go index 8883eee5..60f00615 100644 --- a/pkg/constants/constants.go +++ b/pkg/constants/constants.go @@ -267,6 +267,7 @@ const ( TFewWeightPathEnvVarKey = "TFEW_PATH" ModelPathEnvVarKey = "MODEL_PATH" + DraftModelPathEnvVarKey = "DRAFT_MODEL_PATH" ServedModelNameEnvVarKey = "SERVED_MODEL_NAME" ParallelismSizeEnvVarKey = "PARALLELISM_SIZE" diff --git a/pkg/controller/v1beta1/inferenceservice/components/base.go b/pkg/controller/v1beta1/inferenceservice/components/base.go index efe00c40..85289636 100644 --- a/pkg/controller/v1beta1/inferenceservice/components/base.go +++ b/pkg/controller/v1beta1/inferenceservice/components/base.go @@ -34,6 +34,8 @@ type BaseComponentFields struct { RuntimeName string AcceleratorClass *v1beta1.AcceleratorClassSpec AcceleratorClassName string + DraftModel *v1beta1.BaseModelSpec + DraftModelMeta *metav1.ObjectMeta FineTunedServing bool FineTunedServingWithMergedWeights bool FineTunedWeights []*v1beta1.FineTunedWeight @@ -100,6 +102,18 @@ func UpdateVolumeMounts(b *BaseComponentFields, isvc *v1beta1.InferenceService, } } + // Add draft model volume mount if specified + if b.DraftModel != nil && b.DraftModel.Storage != nil && b.DraftModel.Storage.Path != nil && b.DraftModelMeta != nil { + if isvcutils.IsOriginalModelVolumeMountNecessary(objectMeta.Annotations) { + vm := corev1.VolumeMount{ + Name: b.DraftModelMeta.Name, + MountPath: *b.DraftModel.Storage.Path, + ReadOnly: true, + } + isvcutils.AppendVolumeMount(container, &vm) + } + } + // Add fine-tuned serving volume mounts if b.FineTunedServing { defaultModelVolumeMount := corev1.VolumeMount{ @@ -144,6 +158,14 @@ func UpdateEnvVariables(b *BaseComponentFields, isvc *v1beta1.InferenceService, {Name: constants.ModelPathEnvVarKey, Value: *b.BaseModel.Storage.Path}, }) } + + // Draft model for speculative decoding - add DRAFT_MODEL_PATH env variable + if b.DraftModel != nil && b.DraftModel.Storage != nil && b.DraftModel.Storage.Path != nil { + b.Log.Info("Adding DRAFT_MODEL_PATH env variable for speculative decoding", "inference service", isvc.Name, "namespace", isvc.Namespace) + isvcutils.AppendEnvVarsIfNotExist(container, &[]corev1.EnvVar{ + {Name: constants.DraftModelPathEnvVarKey, Value: *b.DraftModel.Storage.Path}, + }) + } } } else { // Fine-tuned serving - add vendor-specific environment variables @@ -207,6 +229,11 @@ func UpdatePodSpecNodeSelector(b *BaseComponentFields, isvc *v1beta1.InferenceSe // Add preferred node affinity for model readiness using the shared utility function isvcutils.AddNodeSelectorForModelReadyNode(podSpec, b.BaseModelMeta) + // Add node selector for draft model so pods only land on nodes with both models ready + if b.DraftModelMeta != nil { + isvcutils.AddNodeSelectorForModelReadyNode(podSpec, b.DraftModelMeta) + } + // Add node selector merged from AcceleratorClass if applicable // Only add mergedNodeSelector to engine and decoder component. mergedNodeSelector := isvcutils.MergeNodeSelector(b.Runtime, b.AcceleratorClass, isvc, componentType) @@ -240,6 +267,19 @@ func UpdatePodSpecVolumes(b *BaseComponentFields, isvc *v1beta1.InferenceService podSpec.Volumes = append(podSpec.Volumes, modelVolume) } + // Add draft model volume if specified + if b.DraftModel != nil && b.DraftModel.Storage != nil && b.DraftModel.Storage.Path != nil && b.DraftModelMeta != nil { + draftModelVolume := corev1.Volume{ + Name: b.DraftModelMeta.Name, + VolumeSource: corev1.VolumeSource{ + HostPath: &corev1.HostPathVolumeSource{ + Path: *b.DraftModel.Storage.Path, + }, + }, + } + podSpec.Volumes = append(podSpec.Volumes, draftModelVolume) + } + // Add empty model directory volume if required for fine-tuned serving if isvcutils.IsEmptyModelDirVolumeRequired(objectMeta.Annotations) { emptyModelDirVolume := corev1.Volume{ diff --git a/pkg/controller/v1beta1/inferenceservice/components/builder.go b/pkg/controller/v1beta1/inferenceservice/components/builder.go index 313e01dc..83594102 100644 --- a/pkg/controller/v1beta1/inferenceservice/components/builder.go +++ b/pkg/controller/v1beta1/inferenceservice/components/builder.go @@ -23,6 +23,8 @@ type ComponentBuilder struct { deploymentMode constants.DeploymentModeType baseModel *v1beta1.BaseModelSpec baseModelMeta *metav1.ObjectMeta + draftModel *v1beta1.BaseModelSpec + draftModelMeta *metav1.ObjectMeta runtime *v1beta1.ServingRuntimeSpec runtimeName string supportedModelFormat *v1beta1.SupportedModelFormat @@ -60,6 +62,13 @@ func (b *ComponentBuilder) WithBaseModel(spec *v1beta1.BaseModelSpec, meta *meta return b } +// WithDraftModel sets the draft model +func (b *ComponentBuilder) WithDraftModel(spec *v1beta1.BaseModelSpec, meta *metav1.ObjectMeta) *ComponentBuilder { + b.draftModel = spec + b.draftModelMeta = meta + return b +} + // WithRuntime sets the runtime func (b *ComponentBuilder) WithRuntime(spec *v1beta1.ServingRuntimeSpec, name string) *ComponentBuilder { b.runtime = spec @@ -96,6 +105,8 @@ func (b *ComponentBuilder) buildBaseFields() BaseComponentFields { DeploymentMode: b.deploymentMode, BaseModel: b.baseModel, BaseModelMeta: b.baseModelMeta, + DraftModel: b.draftModel, + DraftModelMeta: b.draftModelMeta, Runtime: b.runtime, RuntimeName: b.runtimeName, StatusManager: status.NewStatusReconciler(), @@ -114,6 +125,8 @@ func (b *ComponentBuilder) BuildEngine(spec *v1beta1.EngineSpec) Component { b.deploymentMode, b.baseModel, b.baseModelMeta, + b.draftModel, + b.draftModelMeta, spec, b.runtime, b.runtimeName, @@ -134,6 +147,8 @@ func (b *ComponentBuilder) BuildDecoder(spec *v1beta1.DecoderSpec) Component { b.deploymentMode, b.baseModel, b.baseModelMeta, + b.draftModel, + b.draftModelMeta, spec, b.runtime, b.runtimeName, @@ -203,6 +218,8 @@ func (f *ComponentBuilderFactory) CreateEngineComponent( deploymentMode constants.DeploymentModeType, baseModel *v1beta1.BaseModelSpec, baseModelMeta *metav1.ObjectMeta, + draftModel *v1beta1.BaseModelSpec, + draftModelMeta *metav1.ObjectMeta, engineSpec *v1beta1.EngineSpec, runtime *v1beta1.ServingRuntimeSpec, runtimeName string, @@ -213,6 +230,7 @@ func (f *ComponentBuilderFactory) CreateEngineComponent( return f.NewBuilder(). WithDeploymentMode(deploymentMode). WithBaseModel(baseModel, baseModelMeta). + WithDraftModel(draftModel, draftModelMeta). WithRuntime(runtime, runtimeName). WithAcceleratorClass(acceleratorClass, acceleratorClassName). WithSupportedModelFormat(supportedModelFormat). @@ -224,6 +242,8 @@ func (f *ComponentBuilderFactory) CreateDecoderComponent( deploymentMode constants.DeploymentModeType, baseModel *v1beta1.BaseModelSpec, baseModelMeta *metav1.ObjectMeta, + draftModel *v1beta1.BaseModelSpec, + draftModelMeta *metav1.ObjectMeta, decoderSpec *v1beta1.DecoderSpec, runtime *v1beta1.ServingRuntimeSpec, runtimeName string, @@ -234,6 +254,7 @@ func (f *ComponentBuilderFactory) CreateDecoderComponent( return f.NewBuilder(). WithDeploymentMode(deploymentMode). WithBaseModel(baseModel, baseModelMeta). + WithDraftModel(draftModel, draftModelMeta). WithRuntime(runtime, runtimeName). WithAcceleratorClass(acceleratorClass, acceleratorClassName). WithSupportedModelFormat(supportedModelFormat). diff --git a/pkg/controller/v1beta1/inferenceservice/components/decoder.go b/pkg/controller/v1beta1/inferenceservice/components/decoder.go index 662baad3..b04d2878 100644 --- a/pkg/controller/v1beta1/inferenceservice/components/decoder.go +++ b/pkg/controller/v1beta1/inferenceservice/components/decoder.go @@ -42,6 +42,8 @@ func NewDecoder( deploymentMode constants.DeploymentModeType, baseModel *v1beta1.BaseModelSpec, baseModelMeta *metav1.ObjectMeta, + draftModel *v1beta1.BaseModelSpec, + draftModelMeta *metav1.ObjectMeta, decoderSpec *v1beta1.DecoderSpec, runtime *v1beta1.ServingRuntimeSpec, runtimeName string, @@ -57,6 +59,8 @@ func NewDecoder( DeploymentMode: deploymentMode, BaseModel: baseModel, BaseModelMeta: baseModelMeta, + DraftModel: draftModel, + DraftModelMeta: draftModelMeta, Runtime: runtime, RuntimeName: runtimeName, StatusManager: status.NewStatusReconciler(), diff --git a/pkg/controller/v1beta1/inferenceservice/components/decoder_test.go b/pkg/controller/v1beta1/inferenceservice/components/decoder_test.go index 6c12c04f..b15cd78d 100644 --- a/pkg/controller/v1beta1/inferenceservice/components/decoder_test.go +++ b/pkg/controller/v1beta1/inferenceservice/components/decoder_test.go @@ -345,6 +345,8 @@ func TestDecoderReconcile(t *testing.T) { tt.deploymentMode, tt.baseModel, tt.baseModelMeta, + nil, // draftModel + nil, // draftModelMeta tt.decoderSpec, tt.runtime, tt.runtimeName, @@ -470,6 +472,8 @@ func TestDecoderReconcileObjectMeta(t *testing.T) { constants.RawDeployment, tt.baseModel, tt.baseModelMeta, + nil, // draftModel + nil, // draftModelMeta tt.decoderSpec, nil, // runtime tt.runtimeName, @@ -580,6 +584,8 @@ func TestDecoderWorkerPodSpec(t *testing.T) { constants.RawDeployment, nil, // baseModel nil, // baseModelMeta + nil, // draftModel + nil, // draftModelMeta tt.decoderSpec, nil, // runtime "", // runtimeName @@ -658,6 +664,8 @@ func TestDecoderComponentConfig(t *testing.T) { constants.RawDeployment, nil, // baseModel nil, // baseModelMeta + nil, // draftModel + nil, // draftModelMeta tt.decoderSpec, nil, // runtime "test-runtime", @@ -811,6 +819,8 @@ func TestDecoderAcceleratorOverride(t *testing.T) { constants.RawDeployment, nil, // baseModel nil, // baseModelMeta + nil, // draftModel + nil, // draftModelMeta tt.decoderSpec, tt.runtime, "test-runtime", @@ -1184,6 +1194,8 @@ func TestDecoderResourceMerging(t *testing.T) { constants.RawDeployment, nil, // baseModel nil, // baseModelMeta + nil, // draftModel + nil, // draftModelMeta tt.decoderSpec, tt.runtime, "test-runtime", @@ -1365,6 +1377,8 @@ func TestDecoderAffinityMerging(t *testing.T) { constants.RawDeployment, nil, // baseModel nil, // baseModelMeta + nil, // draftModel + nil, // draftModelMeta tt.decoderSpec, nil, // runtime "test-runtime", diff --git a/pkg/controller/v1beta1/inferenceservice/components/engine.go b/pkg/controller/v1beta1/inferenceservice/components/engine.go index 71539ce5..00f0d8f8 100644 --- a/pkg/controller/v1beta1/inferenceservice/components/engine.go +++ b/pkg/controller/v1beta1/inferenceservice/components/engine.go @@ -43,6 +43,8 @@ func NewEngine( deploymentMode constants.DeploymentModeType, baseModel *v1beta1.BaseModelSpec, baseModelMeta *metav1.ObjectMeta, + draftModel *v1beta1.BaseModelSpec, + draftModelMeta *metav1.ObjectMeta, engineSpec *v1beta1.EngineSpec, runtime *v1beta1.ServingRuntimeSpec, runtimeName string, @@ -58,6 +60,8 @@ func NewEngine( DeploymentMode: deploymentMode, BaseModel: baseModel, BaseModelMeta: baseModelMeta, + DraftModel: draftModel, + DraftModelMeta: draftModelMeta, Runtime: runtime, RuntimeName: runtimeName, StatusManager: status.NewStatusReconciler(), diff --git a/pkg/controller/v1beta1/inferenceservice/components/engine_test.go b/pkg/controller/v1beta1/inferenceservice/components/engine_test.go index 4fd0fe40..867d0e73 100644 --- a/pkg/controller/v1beta1/inferenceservice/components/engine_test.go +++ b/pkg/controller/v1beta1/inferenceservice/components/engine_test.go @@ -699,6 +699,8 @@ func TestEngineReconcile(t *testing.T) { tt.deploymentMode, tt.baseModel, tt.baseModelMeta, + nil, // draftModel + nil, // draftModelMeta tt.engineSpec, nil, // runtime tt.runtimeName, @@ -880,6 +882,8 @@ func TestEngineReconcileObjectMeta(t *testing.T) { constants.RawDeployment, tt.baseModel, tt.baseModelMeta, + nil, // draftModel + nil, // draftModelMeta tt.engineSpec, nil, // runtime tt.runtimeName, @@ -1019,6 +1023,8 @@ func TestEngineWorkerPodSpec(t *testing.T) { constants.RawDeployment, nil, // baseModel nil, // baseModelMeta + nil, // draftModel + nil, // draftModelMeta tt.engineSpec, nil, // runtime "", // runtimeName @@ -1216,6 +1222,8 @@ func TestEngineResourceMerging(t *testing.T) { constants.RawDeployment, nil, // baseModel nil, // baseModelMeta + nil, // draftModel + nil, // draftModelMeta tt.engineSpec, tt.runtime, "test-runtime", @@ -1397,6 +1405,8 @@ func TestEngineAffinityMerging(t *testing.T) { constants.RawDeployment, nil, // baseModel nil, // baseModelMeta + nil, // draftModel + nil, // draftModelMeta tt.engineSpec, nil, // runtime "test-runtime", diff --git a/pkg/controller/v1beta1/inferenceservice/controller.go b/pkg/controller/v1beta1/inferenceservice/controller.go index 6b371be0..8444ba25 100644 --- a/pkg/controller/v1beta1/inferenceservice/controller.go +++ b/pkg/controller/v1beta1/inferenceservice/controller.go @@ -222,6 +222,19 @@ func (r *InferenceServiceReconciler) Reconcile(ctx context.Context, req ctrl.Req return reconcile.Result{}, err } + // Step 1b: Reconcile optional draft model (for speculative decoding) + draftModel, draftModelMeta, err := isvcutils.ReconcileDraftModel(r.Client, isvc) + if err != nil { + r.Log.Error(err, "Failed to reconcile draft model", "Name", isvc.Name) + r.Recorder.Eventf(isvc, v1.EventTypeWarning, "DraftModelReconcileError", err.Error()) + return reconcile.Result{}, err + } + if draftModel != nil { + r.Log.Info("Draft model configured for speculative decoding", + "draftModel", isvc.Spec.DraftModel.Name, + "inferenceService", isvc.Name) + } + // Step 2: Get runtime spec (either specified or auto-selected based on model) var rt *v1beta1.ServingRuntimeSpec var rtName string @@ -231,7 +244,7 @@ func (r *InferenceServiceReconciler) Reconcile(ctx context.Context, req ctrl.Req // Validate specified runtime rtName = isvc.Spec.Runtime.Name userSpecifiedRuntime = true - if err := r.RuntimeSelector.ValidateRuntime(ctx, rtName, baseModel, isvc); err != nil { + if err := r.RuntimeSelector.ValidateRuntime(ctx, rtName, baseModel, draftModel, isvc); err != nil { r.Log.Error(err, "Runtime validation failed", "runtime", rtName, "model", isvc.Spec.Model.Name) r.Recorder.Eventf(isvc, v1.EventTypeWarning, "RuntimeValidationError", "Runtime %s does not support model %s: %v", rtName, isvc.Spec.Model.Name, err) @@ -303,6 +316,8 @@ func (r *InferenceServiceReconciler) Reconcile(ctx context.Context, req ctrl.Req engineDeploymentMode, baseModel, baseModelMeta, + draftModel, + draftModelMeta, mergedEngine, rt, rtName, @@ -334,6 +349,8 @@ func (r *InferenceServiceReconciler) Reconcile(ctx context.Context, req ctrl.Req decoderDeploymentMode, baseModel, baseModelMeta, + draftModel, + draftModelMeta, mergedDecoder, rt, rtName, diff --git a/pkg/controller/v1beta1/inferenceservice/utils/reconciliation.go b/pkg/controller/v1beta1/inferenceservice/utils/reconciliation.go index 618b4df0..3f8e91d5 100644 --- a/pkg/controller/v1beta1/inferenceservice/utils/reconciliation.go +++ b/pkg/controller/v1beta1/inferenceservice/utils/reconciliation.go @@ -65,6 +65,25 @@ func ReconcileBaseModel(cl client.Client, isvc *v1beta1.InferenceService) (*v1be return baseModel, baseModelMeta, nil } +// ReconcileDraftModel retrieves and validates the optional draft model for an InferenceService. +// Returns (nil, nil, nil) when no draft model is specified. +func ReconcileDraftModel(cl client.Client, isvc *v1beta1.InferenceService) (*v1beta1.BaseModelSpec, *metav1.ObjectMeta, error) { + if isvc.Spec.DraftModel == nil || isvc.Spec.DraftModel.Name == "" { + return nil, nil, nil + } + + draftModel, draftModelMeta, err := GetBaseModel(cl, isvc.Spec.DraftModel.Name, isvc.Namespace) + if err != nil { + return nil, nil, fmt.Errorf("failed to get draft model %s: %w", isvc.Spec.DraftModel.Name, err) + } + + if draftModel.Disabled != nil && *draftModel.Disabled { + return nil, nil, fmt.Errorf("specified draft model %s is disabled", isvc.Spec.DraftModel.Name) + } + + return draftModel, draftModelMeta, nil +} + // MergeRuntimeSpecs merges the runtime and isvc specs to get final engine, decoder, and router specs func MergeRuntimeSpecs(isvc *v1beta1.InferenceService, runtime *v1beta1.ServingRuntimeSpec, log logr.Logger) (*v1beta1.EngineSpec, *v1beta1.DecoderSpec, *v1beta1.RouterSpec, error) { var runtimeEngine *v1beta1.EngineSpec diff --git a/pkg/openapi/openapi_generated.go b/pkg/openapi/openapi_generated.go index 586b07b4..71e506b9 100644 --- a/pkg/openapi/openapi_generated.go +++ b/pkg/openapi/openapi_generated.go @@ -85,6 +85,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "github.com/sgl-project/ome/pkg/apis/ome/v1beta1.ServingRuntimeSpec": schema_pkg_apis_ome_v1beta1_ServingRuntimeSpec(ref), "github.com/sgl-project/ome/pkg/apis/ome/v1beta1.ServingRuntimeStatus": schema_pkg_apis_ome_v1beta1_ServingRuntimeStatus(ref), "github.com/sgl-project/ome/pkg/apis/ome/v1beta1.StorageSpec": schema_pkg_apis_ome_v1beta1_StorageSpec(ref), + "github.com/sgl-project/ome/pkg/apis/ome/v1beta1.SupportedDraftModelFormat": schema_pkg_apis_ome_v1beta1_SupportedDraftModelFormat(ref), "github.com/sgl-project/ome/pkg/apis/ome/v1beta1.SupportedModelFormat": schema_pkg_apis_ome_v1beta1_SupportedModelFormat(ref), "github.com/sgl-project/ome/pkg/apis/ome/v1beta1.SupportedRuntime": schema_pkg_apis_ome_v1beta1_SupportedRuntime(ref), "github.com/sgl-project/ome/pkg/apis/ome/v1beta1.TensorParallelismConfig": schema_pkg_apis_ome_v1beta1_TensorParallelismConfig(ref), @@ -931,6 +932,7 @@ func schema_pkg_apis_ome_v1beta1_AcceleratorResource(ref common.ReferenceCallbac }, }, }, + }, }, Dependencies: []string{ @@ -3648,6 +3650,7 @@ func schema_pkg_apis_ome_v1beta1_HuggingFaceSecretReference(ref common.Reference }, }, }, + }, }, } @@ -3811,6 +3814,12 @@ func schema_pkg_apis_ome_v1beta1_InferenceServiceSpec(ref common.ReferenceCallba Ref: ref("github.com/sgl-project/ome/pkg/apis/ome/v1beta1.ModelRef"), }, }, + "draftModel": { + SchemaProps: spec.SchemaProps{ + Description: "DraftModel defines an optional smaller draft model for speculative decoding. References a BaseModel or ClusterBaseModel, just like Model. When set, the draft model's storage path is injected as the DRAFT_MODEL_PATH environment variable.", + Ref: ref("github.com/sgl-project/ome/pkg/apis/ome/v1beta1.ModelRef"), + }, + }, "runtime": { SchemaProps: spec.SchemaProps{ Description: "Runtime defines the serving runtime environment that will be used to execute the model. It is an inference service spec template that determines how the service should be deployed. Runtime is optional - if not defined, the operator will automatically select the best runtime based on the model's size, architecture, format, quantization, and framework.", @@ -4597,6 +4606,7 @@ func schema_pkg_apis_ome_v1beta1_ModelFormat(ref common.ReferenceCallback) commo }, }, }, + }, }, } @@ -4638,6 +4648,7 @@ func schema_pkg_apis_ome_v1beta1_ModelFrameworkSpec(ref common.ReferenceCallback }, }, }, + }, }, } @@ -4692,6 +4703,7 @@ func schema_pkg_apis_ome_v1beta1_ModelRef(ref common.ReferenceCallback) common.O }, }, }, + }, }, } @@ -5094,6 +5106,7 @@ func schema_pkg_apis_ome_v1beta1_ModelSpec(ref common.ReferenceCallback) common. }, }, }, + }, }, Dependencies: []string{ @@ -5231,6 +5244,7 @@ func schema_pkg_apis_ome_v1beta1_ObjectReference(ref common.ReferenceCallback) c }, }, }, + }, }, } @@ -6188,6 +6202,7 @@ func schema_pkg_apis_ome_v1beta1_PredictorExtensionSpec(ref common.ReferenceCall }, }, }, + }, }, Dependencies: []string{ @@ -7694,6 +7709,7 @@ func schema_pkg_apis_ome_v1beta1_RunnerSpec(ref common.ReferenceCallback) common }, }, }, + }, }, Dependencies: []string{ @@ -7724,6 +7740,7 @@ func schema_pkg_apis_ome_v1beta1_ScalerAuthenticationRef(ref common.ReferenceCal }, }, }, + }, }, } @@ -8087,6 +8104,7 @@ func schema_pkg_apis_ome_v1beta1_ServingRuntimeRef(ref common.ReferenceCallback) }, }, }, + }, }, } @@ -8124,6 +8142,31 @@ func schema_pkg_apis_ome_v1beta1_ServingRuntimeSpec(ref common.ReferenceCallback Ref: ref("github.com/sgl-project/ome/pkg/apis/ome/v1beta1.ModelSizeRangeSpec"), }, }, + "draftModelSizeRange": { + SchemaProps: spec.SchemaProps{ + Description: "DraftModelSizeRange is the range of draft model sizes supported when using this runtime with speculative decoding. Validated only when the InferenceService specifies a draft model.", + Ref: ref("github.com/sgl-project/ome/pkg/apis/ome/v1beta1.ModelSizeRangeSpec"), + }, + }, + "supportedDraftModelFormats": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-list-type": "atomic", + }, + }, + SchemaProps: spec.SchemaProps{ + Description: "SupportedDraftModelFormats lists draft model formats (format, framework, architecture) supported when using this runtime with speculative decoding. Validated only when the InferenceService specifies a draft model. If nil or empty and a draft model is specified, the runtime is incompatible.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("github.com/sgl-project/ome/pkg/apis/ome/v1beta1.SupportedDraftModelFormat"), + }, + }, + }, + }, + }, "disabled": { SchemaProps: spec.SchemaProps{ Description: "Set to true to disable use of this runtime", @@ -8358,7 +8401,7 @@ func schema_pkg_apis_ome_v1beta1_ServingRuntimeSpec(ref common.ReferenceCallback }, }, Dependencies: []string{ - "github.com/sgl-project/ome/pkg/apis/ome/v1beta1.AcceleratorRequirements", "github.com/sgl-project/ome/pkg/apis/ome/v1beta1.DecoderSpec", "github.com/sgl-project/ome/pkg/apis/ome/v1beta1.EngineSpec", "github.com/sgl-project/ome/pkg/apis/ome/v1beta1.ModelSizeRangeSpec", "github.com/sgl-project/ome/pkg/apis/ome/v1beta1.RouterSpec", "github.com/sgl-project/ome/pkg/apis/ome/v1beta1.SupportedModelFormat", "github.com/sgl-project/ome/pkg/apis/ome/v1beta1.WorkerPodSpec", "k8s.io/api/core/v1.Affinity", "k8s.io/api/core/v1.Container", "k8s.io/api/core/v1.LocalObjectReference", "k8s.io/api/core/v1.Toleration", "k8s.io/api/core/v1.Volume"}, + "github.com/sgl-project/ome/pkg/apis/ome/v1beta1.AcceleratorRequirements", "github.com/sgl-project/ome/pkg/apis/ome/v1beta1.DecoderSpec", "github.com/sgl-project/ome/pkg/apis/ome/v1beta1.EngineSpec", "github.com/sgl-project/ome/pkg/apis/ome/v1beta1.ModelSizeRangeSpec", "github.com/sgl-project/ome/pkg/apis/ome/v1beta1.RouterSpec", "github.com/sgl-project/ome/pkg/apis/ome/v1beta1.SupportedDraftModelFormat", "github.com/sgl-project/ome/pkg/apis/ome/v1beta1.SupportedModelFormat", "github.com/sgl-project/ome/pkg/apis/ome/v1beta1.WorkerPodSpec", "k8s.io/api/core/v1.Affinity", "k8s.io/api/core/v1.Container", "k8s.io/api/core/v1.LocalObjectReference", "k8s.io/api/core/v1.Toleration", "k8s.io/api/core/v1.Volume"}, } } @@ -8466,6 +8509,40 @@ func schema_pkg_apis_ome_v1beta1_StorageSpec(ref common.ReferenceCallback) commo } } +func schema_pkg_apis_ome_v1beta1_SupportedDraftModelFormat(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "SupportedDraftModelFormat describes a draft model format supported by a runtime for speculative decoding. All fields are optional: if set, the draft model must match; if unset, that dimension is not checked.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "modelFormat": { + SchemaProps: spec.SchemaProps{ + Description: "ModelFormat of the draft model, e.g., \"SafeTensors\", \"PyTorch\"", + Ref: ref("github.com/sgl-project/ome/pkg/apis/ome/v1beta1.ModelFormat"), + }, + }, + "modelFramework": { + SchemaProps: spec.SchemaProps{ + Description: "ModelFramework of the draft model, e.g., \"Transformers\", \"PyTorch\"", + Ref: ref("github.com/sgl-project/ome/pkg/apis/ome/v1beta1.ModelFrameworkSpec"), + }, + }, + "modelArchitecture": { + SchemaProps: spec.SchemaProps{ + Description: "ModelArchitecture of the draft model, e.g., \"LlamaForCausalLM\", \"GptOssForCausalLM\"", + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + Dependencies: []string{ + "github.com/sgl-project/ome/pkg/apis/ome/v1beta1.ModelFormat", "github.com/sgl-project/ome/pkg/apis/ome/v1beta1.ModelFrameworkSpec"}, + } +} + func schema_pkg_apis_ome_v1beta1_SupportedModelFormat(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ diff --git a/pkg/openapi/swagger.json b/pkg/openapi/swagger.json index 3ab9cd4e..93981f30 100644 --- a/pkg/openapi/swagger.json +++ b/pkg/openapi/swagger.json @@ -2101,6 +2101,10 @@ "description": "Decoder defines the decoder spec This is specifically used for PD (Prefill-Decode) disaggregated serving deployments. Similar to Engine in structure, it allows for container and pod specifications, but is only utilized when implementing the disaggregated serving pattern to separate the prefill and decode phases of inference.", "$ref": "#/definitions/v1beta1.DecoderSpec" }, + "draftModel": { + "description": "DraftModel defines an optional smaller draft model for speculative decoding. References a BaseModel or ClusterBaseModel, just like Model. When set, the draft model's storage path is injected as the DRAFT_MODEL_PATH environment variable.", + "$ref": "#/definitions/v1beta1.ModelRef" + }, "engine": { "description": "Engine defines the serving engine spec This provides detailed container and pod specifications for model serving. It allows defining the model runner (container spec), as well as complete pod specifications including init containers, sidecar containers, and other pod-level configurations. Engine can also be configured for multi-node deployments using leader and worker specifications.", "$ref": "#/definitions/v1beta1.EngineSpec" @@ -4559,6 +4563,10 @@ "description": "Set DNS policy for the pod. Defaults to \"ClusterFirst\". Valid values are 'ClusterFirstWithHostNet', 'ClusterFirst', 'Default' or 'None'. DNS parameters given in DNSConfig will be merged with the policy selected with DNSPolicy. To have DNS options set along with hostNetwork, you have to specify DNS policy explicitly to 'ClusterFirstWithHostNet'.", "type": "string" }, + "draftModelSizeRange": { + "description": "DraftModelSizeRange is the range of draft model sizes supported when using this runtime with speculative decoding. Validated only when the InferenceService specifies a draft model.", + "$ref": "#/definitions/v1beta1.ModelSizeRangeSpec" + }, "engineConfig": { "description": "Engine configuration for this runtime", "$ref": "#/definitions/v1beta1.EngineSpec" @@ -4622,6 +4630,15 @@ "description": "If specified, the pod will be dispatched by specified scheduler. If not specified, the pod will be dispatched by default scheduler.", "type": "string" }, + "supportedDraftModelFormats": { + "description": "SupportedDraftModelFormats lists draft model formats (format, framework, architecture) supported when using this runtime with speculative decoding. Validated only when the InferenceService specifies a draft model. If nil or empty and a draft model is specified, the runtime is incompatible.", + "type": "array", + "items": { + "default": {}, + "$ref": "#/definitions/v1beta1.SupportedDraftModelFormat" + }, + "x-kubernetes-list-type": "atomic" + }, "supportedModelFormats": { "description": "Model formats and version supported by this runtime", "type": "array", @@ -4713,6 +4730,24 @@ } } }, + "v1beta1.SupportedDraftModelFormat": { + "description": "SupportedDraftModelFormat describes a draft model format supported by a runtime for speculative decoding. All fields are optional: if set, the draft model must match; if unset, that dimension is not checked.", + "type": "object", + "properties": { + "modelArchitecture": { + "description": "ModelArchitecture of the draft model, e.g., \"LlamaForCausalLM\", \"GptOssForCausalLM\"", + "type": "string" + }, + "modelFormat": { + "description": "ModelFormat of the draft model, e.g., \"SafeTensors\", \"PyTorch\"", + "$ref": "#/definitions/v1beta1.ModelFormat" + }, + "modelFramework": { + "description": "ModelFramework of the draft model, e.g., \"Transformers\", \"PyTorch\"", + "$ref": "#/definitions/v1beta1.ModelFrameworkSpec" + } + } + }, "v1beta1.SupportedModelFormat": { "type": "object", "required": [ diff --git a/pkg/runtimeselector/README.md b/pkg/runtimeselector/README.md index 42e8b624..486a55f5 100644 --- a/pkg/runtimeselector/README.md +++ b/pkg/runtimeselector/README.md @@ -41,7 +41,7 @@ type Selector interface { GetCompatibleRuntimes(ctx context.Context, model *v1beta1.BaseModelSpec, isvc *v1beta1.InferenceService, namespace string) ([]RuntimeMatch, error) // Validate a specific runtime choice - ValidateRuntime(ctx context.Context, runtimeName string, model *v1beta1.BaseModelSpec, isvc *v1beta1.InferenceService) error + ValidateRuntime(ctx context.Context, runtimeName string, model *v1beta1.BaseModelSpec, draftModel *v1beta1.BaseModelSpec, isvc *v1beta1.InferenceService) error // Get runtime spec by name GetRuntime(ctx context.Context, name string, namespace string) (*v1beta1.ServingRuntimeSpec, bool, error) @@ -70,10 +70,10 @@ Handles compatibility checking: ```go type RuntimeMatcher interface { // Check basic compatibility - IsCompatible(runtime *v1beta1.ServingRuntimeSpec, model *v1beta1.BaseModelSpec, isvc *v1beta1.InferenceService, runtimeName string) (bool, error) + IsCompatible(runtime *v1beta1.ServingRuntimeSpec, model *v1beta1.BaseModelSpec, draftModel *v1beta1.BaseModelSpec, isvc *v1beta1.InferenceService, runtimeName string) (bool, error) // Get detailed compatibility report - GetCompatibilityDetails(runtime *v1beta1.ServingRuntimeSpec, model *v1beta1.BaseModelSpec, isvc *v1beta1.InferenceService, runtimeName string) (*CompatibilityReport, error) + GetCompatibilityDetails(runtime *v1beta1.ServingRuntimeSpec, model *v1beta1.BaseModelSpec, draftModel *v1beta1.BaseModelSpec, isvc *v1beta1.InferenceService, runtimeName string) (*CompatibilityReport, error) } ``` @@ -204,7 +204,7 @@ func (r *InferenceServiceReconciler) Reconcile(ctx context.Context, req ctrl.Req if isvc.Spec.Runtime != nil && isvc.Spec.Runtime.Name != "" { // Validate specified runtime rtName = isvc.Spec.Runtime.Name - if err := r.RuntimeSelector.ValidateRuntime(ctx, rtName, baseModel, isvc); err != nil { + if err := r.RuntimeSelector.ValidateRuntime(ctx, rtName, baseModel, draftModel, isvc); err != nil { return reconcile.Result{}, fmt.Errorf("runtime validation failed: %w", err) } @@ -250,7 +250,7 @@ func (v *InferenceServiceValidator) ValidateCreate(ctx context.Context, obj runt // Check if runtime can be selected/validated (with accelerator awareness) if isvc.Spec.Runtime != nil && isvc.Spec.Runtime.Name != "" { - if err := v.RuntimeSelector.ValidateRuntime(ctx, isvc.Spec.Runtime.Name, baseModel, isvc); err != nil { + if err := v.RuntimeSelector.ValidateRuntime(ctx, isvc.Spec.Runtime.Name, baseModel, draftModel, isvc); err != nil { return nil, fmt.Errorf("invalid runtime selection: %w", err) } } else { diff --git a/pkg/runtimeselector/matcher.go b/pkg/runtimeselector/matcher.go index 4e80744e..640ab217 100644 --- a/pkg/runtimeselector/matcher.go +++ b/pkg/runtimeselector/matcher.go @@ -26,7 +26,7 @@ func NewDefaultRuntimeMatcher(config *Config) RuntimeMatcher { } // IsCompatible checks if a runtime can serve a model. -func (m *DefaultRuntimeMatcher) IsCompatible(runtime *v1beta1.ServingRuntimeSpec, model *v1beta1.BaseModelSpec, isvc *v1beta1.InferenceService, runtimeName string) (bool, error) { +func (m *DefaultRuntimeMatcher) IsCompatible(runtime *v1beta1.ServingRuntimeSpec, model *v1beta1.BaseModelSpec, draftModel *v1beta1.BaseModelSpec, isvc *v1beta1.InferenceService, runtimeName string) (bool, error) { // Quick checks first if runtime.IsDisabled() { return false, &RuntimeDisabledError{RuntimeName: runtimeName} @@ -44,11 +44,23 @@ func (m *DefaultRuntimeMatcher) IsCompatible(runtime *v1beta1.ServingRuntimeSpec // Check if any supported format matches for _, format := range runtime.SupportedModelFormats { if m.compareSupportedModelFormats(model, format) { - // Found a matching format, now check model size if specified - if err := m.checkModelSize(runtime, model, runtimeName); err == nil { - return true, nil + // Found a matching format, now check main model size if specified + if err := m.checkModelSize(runtime, model, runtimeName); err != nil { + // If model size check failed, continue checking other formats + continue } - // If model size check failed, continue checking other formats + // When draft model is used, validate draft format then draft size + if draftModel != nil { + if !m.draftModelFormatSupported(runtime, model, draftModel) { + continue + } + if runtime.DraftModelSizeRange != nil { + if err := m.checkDraftModelSize(runtime, draftModel, runtimeName); err != nil { + continue + } + } + } + return true, nil } } @@ -57,7 +69,7 @@ func (m *DefaultRuntimeMatcher) IsCompatible(runtime *v1beta1.ServingRuntimeSpec } // GetCompatibilityDetails returns detailed compatibility information. -func (m *DefaultRuntimeMatcher) GetCompatibilityDetails(runtime *v1beta1.ServingRuntimeSpec, model *v1beta1.BaseModelSpec, isvc *v1beta1.InferenceService, runtimeName string) (*CompatibilityReport, error) { +func (m *DefaultRuntimeMatcher) GetCompatibilityDetails(runtime *v1beta1.ServingRuntimeSpec, model *v1beta1.BaseModelSpec, draftModel *v1beta1.BaseModelSpec, isvc *v1beta1.InferenceService, runtimeName string) (*CompatibilityReport, error) { ctx := context.Background() logger := log.FromContext(ctx) @@ -108,7 +120,7 @@ func (m *DefaultRuntimeMatcher) GetCompatibilityDetails(runtime *v1beta1.Serving return report, nil } - // Check model size compatibility + // Check main model size compatibility if model.ModelParameterSize != nil && runtime.ModelSizeRange != nil { modelSize := parseModelSize(*model.ModelParameterSize) minSize := parseModelSize(*runtime.ModelSizeRange.Min) @@ -124,6 +136,45 @@ func (m *DefaultRuntimeMatcher) GetCompatibilityDetails(runtime *v1beta1.Serving report.MatchDetails.SizeMatch = true } + // Check draft model format when draft model is used + if draftModel != nil { + if len(runtime.SupportedDraftModelFormats) == 0 { + report.IncompatibilityReasons = append(report.IncompatibilityReasons, + "runtime does not declare supported draft model formats") + return report, nil + } + draftFormatMatch := false + for _, df := range runtime.SupportedDraftModelFormats { + if m.compareSupportedDraftModelFormats(draftModel, model, df) { + draftFormatMatch = true + break + } + } + if !draftFormatMatch { + report.IncompatibilityReasons = append(report.IncompatibilityReasons, + "draft model format not in supported draft formats") + return report, nil + } + } + + // Check draft model size when draft model is used and runtime defines draftModelSizeRange + if draftModel != nil && runtime.DraftModelSizeRange != nil { + if draftModel.ModelParameterSize == nil { + report.IncompatibilityReasons = append(report.IncompatibilityReasons, + "draft model does not specify size, but runtime has draft model size constraints") + return report, nil + } + draftSize := parseModelSize(*draftModel.ModelParameterSize) + minDraft := parseModelSize(*runtime.DraftModelSizeRange.Min) + maxDraft := parseModelSize(*runtime.DraftModelSizeRange.Max) + if draftSize < minDraft || draftSize > maxDraft { + report.IncompatibilityReasons = append(report.IncompatibilityReasons, + fmt.Sprintf("draft model size %s is outside supported draft range [%s, %s]", + *draftModel.ModelParameterSize, *runtime.DraftModelSizeRange.Min, *runtime.DraftModelSizeRange.Max)) + return report, nil + } + } + // At this point, runtime supports the model report.IsCompatible = true @@ -640,6 +691,97 @@ func (m *DefaultRuntimeMatcher) checkModelSize(runtime *v1beta1.ServingRuntimeSp return nil } +// draftModelFormatSupported returns true if the runtime declares supported draft formats and at least one matches the draft model. +// Uses effective draft format: if draft does not specify a format (ModelFormat.Name empty), main model's format is used. +func (m *DefaultRuntimeMatcher) draftModelFormatSupported(runtime *v1beta1.ServingRuntimeSpec, model *v1beta1.BaseModelSpec, draftModel *v1beta1.BaseModelSpec) bool { + if len(runtime.SupportedDraftModelFormats) == 0 { + return false + } + for _, df := range runtime.SupportedDraftModelFormats { + if m.compareSupportedDraftModelFormats(draftModel, model, df) { + return true + } + } + return false +} + +// compareSupportedDraftModelFormats checks if a draft model matches a supported draft format. +// All fields on the runtime format are optional: if set, the draft must match; if unset, that dimension is not checked. +// Effective draft format: if draftModel.ModelFormat.Name is empty, mainModel.ModelFormat is used so format is never nil for comparison. +// If the runtime entry has all fields nil, it matches any draft. +func (m *DefaultRuntimeMatcher) compareSupportedDraftModelFormats(draftModel, mainModel *v1beta1.BaseModelSpec, format v1beta1.SupportedDraftModelFormat) bool { + // All fields nil on runtime => match any draft + if format.ModelFormat == nil && format.ModelFramework == nil && format.ModelArchitecture == nil { + return true + } + + // Effective draft format: draft's format if specified, else main model's (never nil for comparison) + effectiveFormat := &draftModel.ModelFormat + if draftModel.ModelFormat.Name == "" { + effectiveFormat = &mainModel.ModelFormat + } + + // Check format (only if runtime specifies it) + if format.ModelFormat != nil { + if effectiveFormat.Name != format.ModelFormat.Name { + return false + } + if format.ModelFormat.Version != nil && effectiveFormat.Version != nil { + if !m.compareModelFormatVersions(format.ModelFormat, effectiveFormat) { + return false + } + } else if (format.ModelFormat.Version == nil) != (effectiveFormat.Version == nil) { + return false + } + } + + // Check framework (only if runtime specifies it) + if format.ModelFramework != nil { + if draftModel.ModelFramework == nil { + return false + } + if format.ModelFramework.Name != draftModel.ModelFramework.Name { + return false + } + if format.ModelFramework.Version != nil && draftModel.ModelFramework.Version != nil { + if !m.compareModelFrameworkVersions(format.ModelFramework, draftModel.ModelFramework) { + return false + } + } else if (format.ModelFramework.Version == nil) != (draftModel.ModelFramework.Version == nil) { + return false + } + } + + // Check architecture (only if runtime specifies it) + if format.ModelArchitecture != nil { + if draftModel.ModelArchitecture == nil || *draftModel.ModelArchitecture != *format.ModelArchitecture { + return false + } + } + + return true +} + +// checkDraftModelSize verifies the draft model size is within the runtime's supported draft model range. +func (m *DefaultRuntimeMatcher) checkDraftModelSize(runtime *v1beta1.ServingRuntimeSpec, draftModel *v1beta1.BaseModelSpec, runtimeName string) error { + if draftModel.ModelParameterSize == nil || runtime.DraftModelSizeRange == nil { + return nil + } + draftSize := parseModelSize(*draftModel.ModelParameterSize) + minSize := parseModelSize(*runtime.DraftModelSizeRange.Min) + maxSize := parseModelSize(*runtime.DraftModelSizeRange.Max) + if draftSize < minSize || draftSize > maxSize { + return &RuntimeCompatibilityError{ + RuntimeName: runtimeName, + ModelName: "", + ModelFormat: draftModel.ModelFormat.Name, + Reason: fmt.Sprintf("draft model size %s is outside supported draft range [%s, %s]", + *draftModel.ModelParameterSize, *runtime.DraftModelSizeRange.Min, *runtime.DraftModelSizeRange.Max), + } + } + return nil +} + // Helper functions // getRuntimeSelectorOperator returns a string representation of the RuntimeSelectorOperator. diff --git a/pkg/runtimeselector/matcher_test.go b/pkg/runtimeselector/matcher_test.go index de4e9b5c..a010980a 100644 --- a/pkg/runtimeselector/matcher_test.go +++ b/pkg/runtimeselector/matcher_test.go @@ -425,7 +425,7 @@ func TestRuntimeSupportsModel(t *testing.T) { t.Run(tt.name, func(t *testing.T) { matcher := NewDefaultRuntimeMatcher(NewConfig(nil)) isvc := &v1beta1.InferenceService{} - report, err := matcher.GetCompatibilityDetails(tt.srSpec, tt.baseModel, isvc, tt.runtimeName) + report, err := matcher.GetCompatibilityDetails(tt.srSpec, tt.baseModel, nil, isvc, tt.runtimeName) assert.NoError(t, err) @@ -684,7 +684,7 @@ func TestGetCompatibilityDetails(t *testing.T) { } isvc := &v1beta1.InferenceService{} - report, err := matcher.GetCompatibilityDetails(runtime, baseModel, isvc, "test-runtime") + report, err := matcher.GetCompatibilityDetails(runtime, baseModel, nil, isvc, "test-runtime") assert.NoError(t, err) assert.False(t, report.IsCompatible) assert.Contains(t, report.IncompatibilityReasons, "runtime is disabled") @@ -707,7 +707,7 @@ func TestGetCompatibilityDetails(t *testing.T) { } isvc := &v1beta1.InferenceService{} - report, err := matcher.GetCompatibilityDetails(runtime, baseModel, isvc, "test-runtime") + report, err := matcher.GetCompatibilityDetails(runtime, baseModel, nil, isvc, "test-runtime") assert.NoError(t, err) assert.True(t, report.IsCompatible) // Runtime is compatible, just not auto-selectable assert.NotEmpty(t, report.Warnings) @@ -736,7 +736,7 @@ func TestGetCompatibilityDetails(t *testing.T) { } isvc := &v1beta1.InferenceService{} - report, err := matcher.GetCompatibilityDetails(runtime, baseModel, isvc, "test-runtime") + report, err := matcher.GetCompatibilityDetails(runtime, baseModel, nil, isvc, "test-runtime") assert.NoError(t, err) assert.True(t, report.IsCompatible) assert.NotEmpty(t, report.Warnings) @@ -786,13 +786,13 @@ func TestMatcherPicksRuntimeByModelSize(t *testing.T) { }, } - smallReport, err := matcher.GetCompatibilityDetails(smallRuntime, model, isvc, "small-runtime") + smallReport, err := matcher.GetCompatibilityDetails(smallRuntime, model, nil, isvc, "small-runtime") assert.NoError(t, err) assert.False(t, smallReport.IsCompatible) assert.False(t, smallReport.MatchDetails.SizeMatch) assert.NotEmpty(t, smallReport.IncompatibilityReasons) - midReport, err := matcher.GetCompatibilityDetails(midRuntime, model, isvc, "mid-runtime") + midReport, err := matcher.GetCompatibilityDetails(midRuntime, model, nil, isvc, "mid-runtime") assert.NoError(t, err) assert.True(t, midReport.IsCompatible) assert.True(t, midReport.MatchDetails.SizeMatch) @@ -834,7 +834,7 @@ func TestGetCompatibilityDetails_AcceleratorClasses(t *testing.T) { cls := "nvidia-a100" isvc := &v1beta1.InferenceService{Spec: v1beta1.InferenceServiceSpec{AcceleratorSelector: &v1beta1.AcceleratorSelector{AcceleratorClass: &cls}}} - report, err := matcher.GetCompatibilityDetails(rt, baseModel, isvc, "rt") + report, err := matcher.GetCompatibilityDetails(rt, baseModel, nil, isvc, "rt") assert.NoError(t, err) assert.True(t, report.IsCompatible) }) @@ -844,7 +844,7 @@ func TestGetCompatibilityDetails_AcceleratorClasses(t *testing.T) { cls := "H100" isvc := &v1beta1.InferenceService{Spec: v1beta1.InferenceServiceSpec{AcceleratorSelector: &v1beta1.AcceleratorSelector{AcceleratorClass: &cls}}} - report, err := matcher.GetCompatibilityDetails(rt, baseModel, isvc, "rt") + report, err := matcher.GetCompatibilityDetails(rt, baseModel, nil, isvc, "rt") assert.NoError(t, err) assert.False(t, report.IsCompatible) assert.NotEmpty(t, report.IncompatibilityReasons) @@ -863,7 +863,7 @@ func TestGetCompatibilityDetails_AcceleratorClasses(t *testing.T) { cls := "H100" isvc := &v1beta1.InferenceService{Spec: v1beta1.InferenceServiceSpec{Engine: &v1beta1.EngineSpec{AcceleratorOverride: &v1beta1.AcceleratorSelector{AcceleratorClass: &cls}}}} - report, err := matcher.GetCompatibilityDetails(rt, baseModel, isvc, "rt") + report, err := matcher.GetCompatibilityDetails(rt, baseModel, nil, isvc, "rt") assert.NoError(t, err) assert.True(t, report.IsCompatible) }) @@ -873,7 +873,7 @@ func TestGetCompatibilityDetails_AcceleratorClasses(t *testing.T) { cls := "H100" isvc := &v1beta1.InferenceService{Spec: v1beta1.InferenceServiceSpec{Decoder: &v1beta1.DecoderSpec{AcceleratorOverride: &v1beta1.AcceleratorSelector{AcceleratorClass: &cls}}}} - report, err := matcher.GetCompatibilityDetails(rt, baseModel, isvc, "rt") + report, err := matcher.GetCompatibilityDetails(rt, baseModel, nil, isvc, "rt") assert.NoError(t, err) assert.False(t, report.IsCompatible) }) @@ -881,7 +881,7 @@ func TestGetCompatibilityDetails_AcceleratorClasses(t *testing.T) { t.Run("no accelerator classes in runtime => compatible", func(t *testing.T) { rt := mkRuntime([]string{}) // empty means no restriction isvc := &v1beta1.InferenceService{} - report, err := matcher.GetCompatibilityDetails(rt, baseModel, isvc, "rt") + report, err := matcher.GetCompatibilityDetails(rt, baseModel, nil, isvc, "rt") assert.NoError(t, err) assert.True(t, report.IsCompatible) }) @@ -895,7 +895,7 @@ func TestIsCompatible_DisabledAndAcceleratorErrors(t *testing.T) { t.Run("disabled runtime returns error", func(t *testing.T) { rt := &v1beta1.ServingRuntimeSpec{Disabled: ptr(true)} - ok, err := matcher.IsCompatible(rt, baseModel, isvc, "rt") + ok, err := matcher.IsCompatible(rt, baseModel, nil, isvc, "rt") assert.False(t, ok) assert.Error(t, err) assert.True(t, IsRuntimeDisabledError(err)) @@ -909,7 +909,7 @@ func TestIsCompatible_DisabledAndAcceleratorErrors(t *testing.T) { cls := "H100" isvc := &v1beta1.InferenceService{Spec: v1beta1.InferenceServiceSpec{AcceleratorSelector: &v1beta1.AcceleratorSelector{AcceleratorClass: &cls}}} - ok, err := matcher.IsCompatible(rt, baseModel, isvc, "rt") + ok, err := matcher.IsCompatible(rt, baseModel, nil, isvc, "rt") assert.False(t, ok) assert.Error(t, err) assert.True(t, IsRuntimeCompatibilityError(err)) @@ -922,12 +922,223 @@ func TestIsCompatible_DisabledAndAcceleratorErrors(t *testing.T) { AcceleratorRequirements: &v1beta1.AcceleratorRequirements{}, } model := &v1beta1.BaseModelSpec{ModelFormat: v1beta1.ModelFormat{Name: "pytorch"}, ModelParameterSize: ptr("70B")} - ok, err := matcher.IsCompatible(rt, model, isvc, "rt") + ok, err := matcher.IsCompatible(rt, model, nil, isvc, "rt") assert.False(t, ok) assert.NoError(t, err) }) } +func TestIsCompatible_DraftModelSizeRange(t *testing.T) { + matcher := NewDefaultRuntimeMatcher(NewConfig(nil)) + isvc := &v1beta1.InferenceService{} + ptrStr := func(s string) *string { return &s } + + // Runtime with separate main and draft size ranges (e.g. Eagle3 speculative decoding) + // Must declare supported draft formats so draft format check passes before size check + rt := &v1beta1.ServingRuntimeSpec{ + SupportedModelFormats: []v1beta1.SupportedModelFormat{ + {ModelFormat: &v1beta1.ModelFormat{Name: "safetensors"}}, + }, + SupportedDraftModelFormats: []v1beta1.SupportedDraftModelFormat{ + {ModelFormat: &v1beta1.ModelFormat{Name: "safetensors"}}, + }, + ModelSizeRange: &v1beta1.ModelSizeRangeSpec{Min: ptrStr("115B"), Max: ptrStr("125B")}, + DraftModelSizeRange: &v1beta1.ModelSizeRangeSpec{Min: ptrStr("60B"), Max: ptrStr("70B")}, + AcceleratorRequirements: &v1beta1.AcceleratorRequirements{}, + } + + t.Run("main and draft in range => compatible", func(t *testing.T) { + baseModel := &v1beta1.BaseModelSpec{ModelFormat: v1beta1.ModelFormat{Name: "safetensors"}, ModelParameterSize: ptrStr("120B")} + draftModel := &v1beta1.BaseModelSpec{ModelFormat: v1beta1.ModelFormat{Name: "safetensors"}, ModelParameterSize: ptrStr("63.08B")} + ok, err := matcher.IsCompatible(rt, baseModel, draftModel, isvc, "eagle3-rt") + assert.NoError(t, err) + assert.True(t, ok) + }) + + t.Run("main in range, draft out of range => incompatible", func(t *testing.T) { + baseModel := &v1beta1.BaseModelSpec{ModelFormat: v1beta1.ModelFormat{Name: "safetensors"}, ModelParameterSize: ptrStr("120B")} + draftModel := &v1beta1.BaseModelSpec{ModelFormat: v1beta1.ModelFormat{Name: "safetensors"}, ModelParameterSize: ptrStr("80B")} + ok, err := matcher.IsCompatible(rt, baseModel, draftModel, isvc, "eagle3-rt") + assert.NoError(t, err) + assert.False(t, ok) + report, _ := matcher.GetCompatibilityDetails(rt, baseModel, draftModel, isvc, "eagle3-rt") + assert.NotNil(t, report) + assert.False(t, report.IsCompatible) + assert.Contains(t, report.IncompatibilityReasons[0], "draft model size") + assert.Contains(t, report.IncompatibilityReasons[0], "outside supported draft range") + }) + + t.Run("main out of range, draft in range => incompatible", func(t *testing.T) { + baseModel := &v1beta1.BaseModelSpec{ModelFormat: v1beta1.ModelFormat{Name: "safetensors"}, ModelParameterSize: ptrStr("63B")} + draftModel := &v1beta1.BaseModelSpec{ModelFormat: v1beta1.ModelFormat{Name: "safetensors"}, ModelParameterSize: ptrStr("63B")} + ok, err := matcher.IsCompatible(rt, baseModel, draftModel, isvc, "eagle3-rt") + assert.NoError(t, err) + assert.False(t, ok) + report, _ := matcher.GetCompatibilityDetails(rt, baseModel, draftModel, isvc, "eagle3-rt") + assert.NotNil(t, report) + assert.False(t, report.IsCompatible) + assert.Contains(t, report.IncompatibilityReasons[0], "model size") + assert.Contains(t, report.IncompatibilityReasons[0], "outside supported range") + }) + + t.Run("no draft model => only main size checked", func(t *testing.T) { + baseModel := &v1beta1.BaseModelSpec{ModelFormat: v1beta1.ModelFormat{Name: "safetensors"}, ModelParameterSize: ptrStr("120B")} + ok, err := matcher.IsCompatible(rt, baseModel, nil, isvc, "eagle3-rt") + assert.NoError(t, err) + assert.True(t, ok) + }) +} + +func TestIsCompatible_DraftModelSupportedFormats(t *testing.T) { + matcher := NewDefaultRuntimeMatcher(NewConfig(nil)) + isvc := &v1beta1.InferenceService{} + + t.Run("draft present, runtime has no SupportedDraftModelFormats => incompatible", func(t *testing.T) { + rt := &v1beta1.ServingRuntimeSpec{ + SupportedModelFormats: []v1beta1.SupportedModelFormat{{ModelFormat: &v1beta1.ModelFormat{Name: "safetensors"}}}, + AcceleratorRequirements: &v1beta1.AcceleratorRequirements{}, + // SupportedDraftModelFormats nil/empty + } + baseModel := &v1beta1.BaseModelSpec{ModelFormat: v1beta1.ModelFormat{Name: "safetensors"}} + draftModel := &v1beta1.BaseModelSpec{ModelFormat: v1beta1.ModelFormat{Name: "safetensors"}} + ok, err := matcher.IsCompatible(rt, baseModel, draftModel, isvc, "rt") + assert.NoError(t, err) + assert.False(t, ok) + report, _ := matcher.GetCompatibilityDetails(rt, baseModel, draftModel, isvc, "rt") + assert.Contains(t, report.IncompatibilityReasons, "runtime does not declare supported draft model formats") + }) + + t.Run("draft present, runtime has matching SupportedDraftModelFormats entry => compatible", func(t *testing.T) { + rt := &v1beta1.ServingRuntimeSpec{ + SupportedModelFormats: []v1beta1.SupportedModelFormat{ + {ModelFormat: &v1beta1.ModelFormat{Name: "safetensors"}}, + }, + SupportedDraftModelFormats: []v1beta1.SupportedDraftModelFormat{ + {ModelFormat: &v1beta1.ModelFormat{Name: "safetensors"}}, + }, + AcceleratorRequirements: &v1beta1.AcceleratorRequirements{}, + } + baseModel := &v1beta1.BaseModelSpec{ModelFormat: v1beta1.ModelFormat{Name: "safetensors"}} + draftModel := &v1beta1.BaseModelSpec{ModelFormat: v1beta1.ModelFormat{Name: "safetensors"}} + ok, err := matcher.IsCompatible(rt, baseModel, draftModel, isvc, "rt") + assert.NoError(t, err) + assert.True(t, ok) + }) + + t.Run("draft present, draft format not in SupportedDraftModelFormats => incompatible", func(t *testing.T) { + rt := &v1beta1.ServingRuntimeSpec{ + SupportedModelFormats: []v1beta1.SupportedModelFormat{ + {ModelFormat: &v1beta1.ModelFormat{Name: "safetensors"}}, + }, + SupportedDraftModelFormats: []v1beta1.SupportedDraftModelFormat{ + {ModelFormat: &v1beta1.ModelFormat{Name: "pytorch"}}, // only pytorch draft + }, + AcceleratorRequirements: &v1beta1.AcceleratorRequirements{}, + } + baseModel := &v1beta1.BaseModelSpec{ModelFormat: v1beta1.ModelFormat{Name: "safetensors"}} + draftModel := &v1beta1.BaseModelSpec{ModelFormat: v1beta1.ModelFormat{Name: "safetensors"}} + ok, err := matcher.IsCompatible(rt, baseModel, draftModel, isvc, "rt") + assert.NoError(t, err) + assert.False(t, ok) + report, _ := matcher.GetCompatibilityDetails(rt, baseModel, draftModel, isvc, "rt") + assert.Contains(t, report.IncompatibilityReasons, "draft model format not in supported draft formats") + }) + + t.Run("draft present, optional fields: entry with only modelArchitecture set, draft matches => compatible", func(t *testing.T) { + arch := "GptOssForCausalLM" + rt := &v1beta1.ServingRuntimeSpec{ + SupportedModelFormats: []v1beta1.SupportedModelFormat{ + {ModelFormat: &v1beta1.ModelFormat{Name: "safetensors"}}, + }, + SupportedDraftModelFormats: []v1beta1.SupportedDraftModelFormat{ + {ModelArchitecture: &arch}, + }, + AcceleratorRequirements: &v1beta1.AcceleratorRequirements{}, + } + baseModel := &v1beta1.BaseModelSpec{ModelFormat: v1beta1.ModelFormat{Name: "safetensors"}} + draftModel := &v1beta1.BaseModelSpec{ + ModelFormat: v1beta1.ModelFormat{Name: "safetensors"}, + ModelArchitecture: &arch, + } + ok, err := matcher.IsCompatible(rt, baseModel, draftModel, isvc, "rt") + assert.NoError(t, err) + assert.True(t, ok) + }) + + t.Run("draft present, optional fields: entry with only modelArchitecture set, draft differs => incompatible", func(t *testing.T) { + arch := "GptOssForCausalLM" + rt := &v1beta1.ServingRuntimeSpec{ + SupportedModelFormats: []v1beta1.SupportedModelFormat{ + {ModelFormat: &v1beta1.ModelFormat{Name: "safetensors"}}, + }, + SupportedDraftModelFormats: []v1beta1.SupportedDraftModelFormat{ + {ModelArchitecture: &arch}, + }, + AcceleratorRequirements: &v1beta1.AcceleratorRequirements{}, + } + baseModel := &v1beta1.BaseModelSpec{ModelFormat: v1beta1.ModelFormat{Name: "safetensors"}} + otherArch := "LlamaForCausalLM" + draftModel := &v1beta1.BaseModelSpec{ + ModelFormat: v1beta1.ModelFormat{Name: "safetensors"}, + ModelArchitecture: &otherArch, + } + ok, err := matcher.IsCompatible(rt, baseModel, draftModel, isvc, "rt") + assert.NoError(t, err) + assert.False(t, ok) + }) + + t.Run("default format: draft omits ModelFormat, main has safetensors, runtime supports safetensors draft => compatible", func(t *testing.T) { + rt := &v1beta1.ServingRuntimeSpec{ + SupportedModelFormats: []v1beta1.SupportedModelFormat{ + {ModelFormat: &v1beta1.ModelFormat{Name: "safetensors"}}, + }, + SupportedDraftModelFormats: []v1beta1.SupportedDraftModelFormat{ + {ModelFormat: &v1beta1.ModelFormat{Name: "safetensors"}}, + }, + AcceleratorRequirements: &v1beta1.AcceleratorRequirements{}, + } + baseModel := &v1beta1.BaseModelSpec{ModelFormat: v1beta1.ModelFormat{Name: "safetensors"}} + draftModel := &v1beta1.BaseModelSpec{} // no ModelFormat set (empty name) => defaults to main's + ok, err := matcher.IsCompatible(rt, baseModel, draftModel, isvc, "rt") + assert.NoError(t, err) + assert.True(t, ok) + }) + + t.Run("default format: draft specifies different format => incompatible", func(t *testing.T) { + rt := &v1beta1.ServingRuntimeSpec{ + SupportedModelFormats: []v1beta1.SupportedModelFormat{ + {ModelFormat: &v1beta1.ModelFormat{Name: "safetensors"}}, + }, + SupportedDraftModelFormats: []v1beta1.SupportedDraftModelFormat{ + {ModelFormat: &v1beta1.ModelFormat{Name: "safetensors"}}, + }, + AcceleratorRequirements: &v1beta1.AcceleratorRequirements{}, + } + baseModel := &v1beta1.BaseModelSpec{ModelFormat: v1beta1.ModelFormat{Name: "safetensors"}} + draftModel := &v1beta1.BaseModelSpec{ModelFormat: v1beta1.ModelFormat{Name: "pytorch"}} + ok, err := matcher.IsCompatible(rt, baseModel, draftModel, isvc, "rt") + assert.NoError(t, err) + assert.False(t, ok) + }) + + t.Run("runtime entry with all fields nil => matches any draft", func(t *testing.T) { + rt := &v1beta1.ServingRuntimeSpec{ + SupportedModelFormats: []v1beta1.SupportedModelFormat{ + {ModelFormat: &v1beta1.ModelFormat{Name: "safetensors"}}, + }, + SupportedDraftModelFormats: []v1beta1.SupportedDraftModelFormat{ + {}, // all nil => match any draft + }, + AcceleratorRequirements: &v1beta1.AcceleratorRequirements{}, + } + baseModel := &v1beta1.BaseModelSpec{ModelFormat: v1beta1.ModelFormat{Name: "safetensors"}} + draftModel := &v1beta1.BaseModelSpec{ModelFormat: v1beta1.ModelFormat{Name: "pytorch"}} + ok, err := matcher.IsCompatible(rt, baseModel, draftModel, isvc, "rt") + assert.NoError(t, err) + assert.True(t, ok) + }) +} + func TestCompareModelFormatVersions(t *testing.T) { ptrToString := func(s string) *string { return &s } ptrToRuntimeOp := func(s string) *v1beta1.RuntimeSelectorOperator { @@ -1418,7 +1629,7 @@ func TestGetCompatibilityDetails_DetailedFormatMismatch(t *testing.T) { } isvc := &v1beta1.InferenceService{} - report, err := matcher.GetCompatibilityDetails(runtime, model, isvc, "test-runtime") + report, err := matcher.GetCompatibilityDetails(runtime, model, nil, isvc, "test-runtime") assert.NoError(t, err) assert.False(t, report.IsCompatible) assert.NotEmpty(t, report.IncompatibilityReasons) @@ -1436,7 +1647,7 @@ func TestGetCompatibilityDetails_DetailedFormatMismatch(t *testing.T) { } isvc := &v1beta1.InferenceService{} - report, err := matcher.GetCompatibilityDetails(runtime, model, isvc, "test-runtime") + report, err := matcher.GetCompatibilityDetails(runtime, model, nil, isvc, "test-runtime") assert.NoError(t, err) assert.False(t, report.IsCompatible) assert.NotEmpty(t, report.IncompatibilityReasons) diff --git a/pkg/runtimeselector/selector.go b/pkg/runtimeselector/selector.go index 0fa7f4f7..54ee5bf2 100644 --- a/pkg/runtimeselector/selector.go +++ b/pkg/runtimeselector/selector.go @@ -61,8 +61,8 @@ func (s *defaultSelector) SelectRuntime(ctx context.Context, model *v1beta1.Base // Check namespace runtimes for _, rt := range collection.NamespaceRuntimes { - if compatible, _ := s.matcher.IsCompatible(&rt.Spec, model, isvc, rt.Name); !compatible { - report, _ := s.matcher.GetCompatibilityDetails(&rt.Spec, model, isvc, rt.Name) + if compatible, _ := s.matcher.IsCompatible(&rt.Spec, model, nil, isvc, rt.Name); !compatible { + report, _ := s.matcher.GetCompatibilityDetails(&rt.Spec, model, nil, isvc, rt.Name) if report != nil && len(report.IncompatibilityReasons) > 0 { excludedRuntimes[rt.Name] = fmt.Errorf("%s", report.IncompatibilityReasons[0]) } @@ -71,8 +71,8 @@ func (s *defaultSelector) SelectRuntime(ctx context.Context, model *v1beta1.Base // Check cluster runtimes for _, rt := range collection.ClusterRuntimes { - if compatible, _ := s.matcher.IsCompatible(&rt.Spec, model, isvc, rt.Name); !compatible { - report, _ := s.matcher.GetCompatibilityDetails(&rt.Spec, model, isvc, rt.Name) + if compatible, _ := s.matcher.IsCompatible(&rt.Spec, model, nil, isvc, rt.Name); !compatible { + report, _ := s.matcher.GetCompatibilityDetails(&rt.Spec, model, nil, isvc, rt.Name) if report != nil && len(report.IncompatibilityReasons) > 0 { excludedRuntimes[rt.Name] = fmt.Errorf("%s", report.IncompatibilityReasons[0]) } @@ -147,7 +147,7 @@ func (s *defaultSelector) GetCompatibleRuntimes(ctx context.Context, model *v1be } // ValidateRuntime checks if a specific runtime supports a model. -func (s *defaultSelector) ValidateRuntime(ctx context.Context, runtimeName string, model *v1beta1.BaseModelSpec, isvc *v1beta1.InferenceService) error { +func (s *defaultSelector) ValidateRuntime(ctx context.Context, runtimeName string, model *v1beta1.BaseModelSpec, draftModel *v1beta1.BaseModelSpec, isvc *v1beta1.InferenceService) error { namespace := isvc.Namespace logger := log.FromContext(ctx) logger.V(1).Info("Validating runtime", @@ -175,14 +175,14 @@ func (s *defaultSelector) ValidateRuntime(ctx context.Context, runtimeName strin } // Check compatibility - compatible, err := s.matcher.IsCompatible(runtimeSpec, model, isvc, runtimeName) + compatible, err := s.matcher.IsCompatible(runtimeSpec, model, draftModel, isvc, runtimeName) if err != nil { return err } if !compatible { // Get detailed compatibility report for better error message - report, _ := s.matcher.GetCompatibilityDetails(runtimeSpec, model, isvc, runtimeName) + report, _ := s.matcher.GetCompatibilityDetails(runtimeSpec, model, draftModel, isvc, runtimeName) reason := "incompatible model format" if report != nil && len(report.IncompatibilityReasons) > 0 { @@ -224,8 +224,8 @@ func (s *defaultSelector) evaluateRuntime(ctx context.Context, spec *v1beta1.Ser return nil } - // Check basic compatibility (mimics RuntimeSupportsModel) - report, err := s.matcher.GetCompatibilityDetails(spec, model, isvc, name) + // Check basic compatibility (mimics RuntimeSupportsModel). + report, err := s.matcher.GetCompatibilityDetails(spec, model, nil, isvc, name) if err != nil { logger.Error(err, "Failed to get compatibility details", "runtime", name) return nil diff --git a/pkg/runtimeselector/selector_test.go b/pkg/runtimeselector/selector_test.go index 503b338f..2aff3a5e 100644 --- a/pkg/runtimeselector/selector_test.go +++ b/pkg/runtimeselector/selector_test.go @@ -943,12 +943,12 @@ func TestValidateRuntime_DisabledAndNoAutoSelect(t *testing.T) { isvc := &v1beta1.InferenceService{ObjectMeta: metav1.ObjectMeta{Namespace: "default"}} // Disabled should return RuntimeDisabledError - err := selector.ValidateRuntime(ctx, "rt-disabled", model, isvc) + err := selector.ValidateRuntime(ctx, "rt-disabled", model, nil, isvc) assert.Error(t, err) assert.True(t, IsRuntimeDisabledError(err)) // NoAutoSelect should return nil (compatible), even though auto-select is false - assert.NoError(t, selector.ValidateRuntime(ctx, "rt-no-auto", model, isvc)) + assert.NoError(t, selector.ValidateRuntime(ctx, "rt-no-auto", model, nil, isvc)) } func TestGetSupportedModelFormat_CustomRuntime(t *testing.T) { diff --git a/pkg/runtimeselector/types.go b/pkg/runtimeselector/types.go index 1fc683d4..3e23b805 100644 --- a/pkg/runtimeselector/types.go +++ b/pkg/runtimeselector/types.go @@ -22,7 +22,7 @@ type Selector interface { // ValidateRuntime checks if a specific runtime supports a model. // It returns nil if the runtime is compatible, or an error explaining why it's not. - ValidateRuntime(ctx context.Context, runtimeName string, model *v1beta1.BaseModelSpec, isvc *v1beta1.InferenceService) error + ValidateRuntime(ctx context.Context, runtimeName string, model *v1beta1.BaseModelSpec, draftModel *v1beta1.BaseModelSpec, isvc *v1beta1.InferenceService) error // GetRuntime fetches a specific runtime by name. // Returns the runtime spec and whether it's cluster-scoped. @@ -116,11 +116,11 @@ type RuntimeCollection struct { type RuntimeMatcher interface { // IsCompatible checks if a runtime can serve a model. // Returns true if compatible, false otherwise. - IsCompatible(runtime *v1beta1.ServingRuntimeSpec, model *v1beta1.BaseModelSpec, isvc *v1beta1.InferenceService, runtimeName string) (bool, error) + IsCompatible(runtime *v1beta1.ServingRuntimeSpec, model *v1beta1.BaseModelSpec, draftModel *v1beta1.BaseModelSpec, isvc *v1beta1.InferenceService, runtimeName string) (bool, error) // GetCompatibilityDetails returns detailed compatibility information. // This includes specific reasons for compatibility or incompatibility. - GetCompatibilityDetails(runtime *v1beta1.ServingRuntimeSpec, model *v1beta1.BaseModelSpec, isvc *v1beta1.InferenceService, runtimeName string) (*CompatibilityReport, error) + GetCompatibilityDetails(runtime *v1beta1.ServingRuntimeSpec, model *v1beta1.BaseModelSpec, draftModel *v1beta1.BaseModelSpec, isvc *v1beta1.InferenceService, runtimeName string) (*CompatibilityReport, error) } // CompatibilityReport provides detailed compatibility analysis. diff --git a/pkg/webhook/admission/isvc/inference_service_validation.go b/pkg/webhook/admission/isvc/inference_service_validation.go index 84a9ad22..0d414aa4 100644 --- a/pkg/webhook/admission/isvc/inference_service_validation.go +++ b/pkg/webhook/admission/isvc/inference_service_validation.go @@ -398,10 +398,23 @@ func (v *InferenceServiceValidator) resolveModelAndRuntime(ctx context.Context, return warnings, fmt.Errorf("model %s is disabled", isvc.Spec.Model.Name) } + // Resolve optional draft model for speculative decoding + var draftModel *v1beta1.BaseModelSpec + if isvc.Spec.DraftModel != nil && isvc.Spec.DraftModel.Name != "" { + dm, _, err := isvcutils.GetBaseModel(v.Client, isvc.Spec.DraftModel.Name, isvc.Namespace) + if err != nil { + return warnings, fmt.Errorf("failed to resolve draft model %s: %w", isvc.Spec.DraftModel.Name, err) + } + if dm.Disabled != nil && *dm.Disabled { + return warnings, fmt.Errorf("draft model %s is disabled", isvc.Spec.DraftModel.Name) + } + draftModel = dm + } + // Check runtime selection/validation if isvc.Spec.Runtime != nil && isvc.Spec.Runtime.Name != "" { - // Validate specified runtime - if err := v.RuntimeSelector.ValidateRuntime(ctx, isvc.Spec.Runtime.Name, baseModel, isvc); err != nil { + // Validate specified runtime (including draft model size when draft is set) + if err := v.RuntimeSelector.ValidateRuntime(ctx, isvc.Spec.Runtime.Name, baseModel, draftModel, isvc); err != nil { return warnings, fmt.Errorf("runtime %s does not support model %s: %w", isvc.Spec.Runtime.Name, isvc.Spec.Model.Name, err) }