|
@@ -0,0 +1,385 @@
|
|
|
|
|
+---
|
|
|
|
|
+apiVersion: apiextensions.k8s.io/v1
|
|
|
|
|
+kind: CustomResourceDefinition
|
|
|
|
|
+metadata:
|
|
|
|
|
+ annotations:
|
|
|
|
|
+ controller-gen.kubebuilder.io/version: v0.20.1
|
|
|
|
|
+ name: externaltools.locostack.com
|
|
|
|
|
+spec:
|
|
|
|
|
+ group: locostack.com
|
|
|
|
|
+ names:
|
|
|
|
|
+ kind: ExternalTool
|
|
|
|
|
+ listKind: ExternalToolList
|
|
|
|
|
+ plural: externaltools
|
|
|
|
|
+ shortNames:
|
|
|
|
|
+ - et
|
|
|
|
|
+ singular: externaltool
|
|
|
|
|
+ scope: Namespaced
|
|
|
|
|
+ versions:
|
|
|
|
|
+ - additionalPrinterColumns:
|
|
|
|
|
+ - jsonPath: .status.conditions[?(@.type=='Ready')].status
|
|
|
|
|
+ name: Ready
|
|
|
|
|
+ type: string
|
|
|
|
|
+ name: v1alpha1
|
|
|
|
|
+ schema:
|
|
|
|
|
+ openAPIV3Schema:
|
|
|
|
|
+ description: ExternalTool is the Schema for the externaltools API
|
|
|
|
|
+ properties:
|
|
|
|
|
+ apiVersion:
|
|
|
|
|
+ description: |-
|
|
|
|
|
+ APIVersion defines the versioned schema of this representation of an object.
|
|
|
|
|
+ Servers should convert recognized schemas to the latest internal value, and
|
|
|
|
|
+ may reject unrecognized values.
|
|
|
|
|
+ More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
|
|
|
|
|
+ type: string
|
|
|
|
|
+ kind:
|
|
|
|
|
+ description: |-
|
|
|
|
|
+ Kind is a string value representing the REST resource this object represents.
|
|
|
|
|
+ Servers may infer this from the endpoint the client submits requests to.
|
|
|
|
|
+ Cannot be updated.
|
|
|
|
|
+ In CamelCase.
|
|
|
|
|
+ More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
|
|
|
|
|
+ type: string
|
|
|
|
|
+ metadata:
|
|
|
|
|
+ type: object
|
|
|
|
|
+ spec:
|
|
|
|
|
+ description: spec defines the desired state of ExternalTool
|
|
|
|
|
+ properties:
|
|
|
|
|
+ auth:
|
|
|
|
|
+ description: |-
|
|
|
|
|
+ auth describes how to authenticate to the remote MCP server.
|
|
|
|
|
+ Omit only for unauthenticated endpoints.
|
|
|
|
|
+ properties:
|
|
|
|
|
+ apiKey:
|
|
|
|
|
+ description: apiKeySecretRef references a Secret key holding an
|
|
|
|
|
+ API key and the header name to carry it in.
|
|
|
|
|
+ properties:
|
|
|
|
|
+ headerName:
|
|
|
|
|
+ description: headerName is the HTTP header used to carry the
|
|
|
|
|
+ key.
|
|
|
|
|
+ type: string
|
|
|
|
|
+ secretRef:
|
|
|
|
|
+ description: secretRef references the Secret key holding the
|
|
|
|
|
+ API key value.
|
|
|
|
|
+ properties:
|
|
|
|
|
+ key:
|
|
|
|
|
+ description: The key of the secret to select from. Must
|
|
|
|
|
+ be a valid secret key.
|
|
|
|
|
+ type: string
|
|
|
|
|
+ name:
|
|
|
|
|
+ default: ""
|
|
|
|
|
+ description: |-
|
|
|
|
|
+ Name of the referent.
|
|
|
|
|
+ This field is effectively required, but due to backwards compatibility is
|
|
|
|
|
+ allowed to be empty. Instances of this type with an empty value here are
|
|
|
|
|
+ almost certainly wrong.
|
|
|
|
|
+ More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
|
|
|
|
|
+ type: string
|
|
|
|
|
+ optional:
|
|
|
|
|
+ description: Specify whether the Secret or its key must
|
|
|
|
|
+ be defined
|
|
|
|
|
+ type: boolean
|
|
|
|
|
+ required:
|
|
|
|
|
+ - key
|
|
|
|
|
+ type: object
|
|
|
|
|
+ x-kubernetes-map-type: atomic
|
|
|
|
|
+ required:
|
|
|
|
|
+ - secretRef
|
|
|
|
|
+ type: object
|
|
|
|
|
+ bearerToken:
|
|
|
|
|
+ description: |-
|
|
|
|
|
+ bearerTokenSecretRef references a Secret key holding a bearer token.
|
|
|
|
|
+ Injected as Authorization: Bearer <token> on every request.
|
|
|
|
|
+ properties:
|
|
|
|
|
+ key:
|
|
|
|
|
+ description: The key of the secret to select from. Must be
|
|
|
|
|
+ a valid secret key.
|
|
|
|
|
+ type: string
|
|
|
|
|
+ name:
|
|
|
|
|
+ default: ""
|
|
|
|
|
+ description: |-
|
|
|
|
|
+ Name of the referent.
|
|
|
|
|
+ This field is effectively required, but due to backwards compatibility is
|
|
|
|
|
+ allowed to be empty. Instances of this type with an empty value here are
|
|
|
|
|
+ almost certainly wrong.
|
|
|
|
|
+ More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
|
|
|
|
|
+ type: string
|
|
|
|
|
+ optional:
|
|
|
|
|
+ description: Specify whether the Secret or its key must be
|
|
|
|
|
+ defined
|
|
|
|
|
+ type: boolean
|
|
|
|
|
+ required:
|
|
|
|
|
+ - key
|
|
|
|
|
+ type: object
|
|
|
|
|
+ x-kubernetes-map-type: atomic
|
|
|
|
|
+ headers:
|
|
|
|
|
+ description: |-
|
|
|
|
|
+ headers are arbitrary HTTP headers sourced from Secrets.
|
|
|
|
|
+ Use for providers requiring multiple credentials or non-standard auth schemes.
|
|
|
|
|
+ items:
|
|
|
|
|
+ description: |-
|
|
|
|
|
+ HTTPHeaderSpec defines an HTTP header whose value is sourced from a Secret.
|
|
|
|
|
+ Used wherever arbitrary headers must be sent with outbound requests without
|
|
|
|
|
+ inlining credential values into the CR.
|
|
|
|
|
+ properties:
|
|
|
|
|
+ name:
|
|
|
|
|
+ description: name is the HTTP header name (e.g. X-Api-Key,
|
|
|
|
|
+ Authorization).
|
|
|
|
|
+ type: string
|
|
|
|
|
+ valueFrom:
|
|
|
|
|
+ description: valueFrom is the source for the header value
|
|
|
|
|
+ — typically a secretKeyRef.
|
|
|
|
|
+ properties:
|
|
|
|
|
+ configMapKeyRef:
|
|
|
|
|
+ description: Selects a key of a ConfigMap.
|
|
|
|
|
+ properties:
|
|
|
|
|
+ key:
|
|
|
|
|
+ description: The key to select.
|
|
|
|
|
+ type: string
|
|
|
|
|
+ name:
|
|
|
|
|
+ default: ""
|
|
|
|
|
+ description: |-
|
|
|
|
|
+ Name of the referent.
|
|
|
|
|
+ This field is effectively required, but due to backwards compatibility is
|
|
|
|
|
+ allowed to be empty. Instances of this type with an empty value here are
|
|
|
|
|
+ almost certainly wrong.
|
|
|
|
|
+ More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
|
|
|
|
|
+ type: string
|
|
|
|
|
+ optional:
|
|
|
|
|
+ description: Specify whether the ConfigMap or its
|
|
|
|
|
+ key must be defined
|
|
|
|
|
+ type: boolean
|
|
|
|
|
+ required:
|
|
|
|
|
+ - key
|
|
|
|
|
+ type: object
|
|
|
|
|
+ x-kubernetes-map-type: atomic
|
|
|
|
|
+ fieldRef:
|
|
|
|
|
+ description: |-
|
|
|
|
|
+ Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,
|
|
|
|
|
+ spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.
|
|
|
|
|
+ properties:
|
|
|
|
|
+ apiVersion:
|
|
|
|
|
+ description: Version of the schema the FieldPath
|
|
|
|
|
+ is written in terms of, defaults to "v1".
|
|
|
|
|
+ type: string
|
|
|
|
|
+ fieldPath:
|
|
|
|
|
+ description: Path of the field to select in the
|
|
|
|
|
+ specified API version.
|
|
|
|
|
+ type: string
|
|
|
|
|
+ required:
|
|
|
|
|
+ - fieldPath
|
|
|
|
|
+ type: object
|
|
|
|
|
+ x-kubernetes-map-type: atomic
|
|
|
|
|
+ fileKeyRef:
|
|
|
|
|
+ description: |-
|
|
|
|
|
+ FileKeyRef selects a key of the env file.
|
|
|
|
|
+ Requires the EnvFiles feature gate to be enabled.
|
|
|
|
|
+ properties:
|
|
|
|
|
+ key:
|
|
|
|
|
+ description: |-
|
|
|
|
|
+ The key within the env file. An invalid key will prevent the pod from starting.
|
|
|
|
|
+ The keys defined within a source may consist of any printable ASCII characters except '='.
|
|
|
|
|
+ During Alpha stage of the EnvFiles feature gate, the key size is limited to 128 characters.
|
|
|
|
|
+ type: string
|
|
|
|
|
+ optional:
|
|
|
|
|
+ default: false
|
|
|
|
|
+ description: |-
|
|
|
|
|
+ Specify whether the file or its key must be defined. If the file or key
|
|
|
|
|
+ does not exist, then the env var is not published.
|
|
|
|
|
+ If optional is set to true and the specified key does not exist,
|
|
|
|
|
+ the environment variable will not be set in the Pod's containers.
|
|
|
|
|
+
|
|
|
|
|
+ If optional is set to false and the specified key does not exist,
|
|
|
|
|
+ an error will be returned during Pod creation.
|
|
|
|
|
+ type: boolean
|
|
|
|
|
+ path:
|
|
|
|
|
+ description: |-
|
|
|
|
|
+ The path within the volume from which to select the file.
|
|
|
|
|
+ Must be relative and may not contain the '..' path or start with '..'.
|
|
|
|
|
+ type: string
|
|
|
|
|
+ volumeName:
|
|
|
|
|
+ description: The name of the volume mount containing
|
|
|
|
|
+ the env file.
|
|
|
|
|
+ type: string
|
|
|
|
|
+ required:
|
|
|
|
|
+ - key
|
|
|
|
|
+ - path
|
|
|
|
|
+ - volumeName
|
|
|
|
|
+ type: object
|
|
|
|
|
+ x-kubernetes-map-type: atomic
|
|
|
|
|
+ resourceFieldRef:
|
|
|
|
|
+ description: |-
|
|
|
|
|
+ Selects a resource of the container: only resources limits and requests
|
|
|
|
|
+ (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.
|
|
|
|
|
+ properties:
|
|
|
|
|
+ containerName:
|
|
|
|
|
+ description: 'Container name: required for volumes,
|
|
|
|
|
+ optional for env vars'
|
|
|
|
|
+ type: string
|
|
|
|
|
+ divisor:
|
|
|
|
|
+ anyOf:
|
|
|
|
|
+ - type: integer
|
|
|
|
|
+ - type: string
|
|
|
|
|
+ description: Specifies the output format of the
|
|
|
|
|
+ exposed resources, defaults to "1"
|
|
|
|
|
+ pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
|
|
|
|
|
+ x-kubernetes-int-or-string: true
|
|
|
|
|
+ resource:
|
|
|
|
|
+ description: 'Required: resource to select'
|
|
|
|
|
+ type: string
|
|
|
|
|
+ required:
|
|
|
|
|
+ - resource
|
|
|
|
|
+ type: object
|
|
|
|
|
+ x-kubernetes-map-type: atomic
|
|
|
|
|
+ secretKeyRef:
|
|
|
|
|
+ description: Selects a key of a secret in the pod's
|
|
|
|
|
+ namespace
|
|
|
|
|
+ properties:
|
|
|
|
|
+ key:
|
|
|
|
|
+ description: The key of the secret to select from. Must
|
|
|
|
|
+ be a valid secret key.
|
|
|
|
|
+ type: string
|
|
|
|
|
+ name:
|
|
|
|
|
+ default: ""
|
|
|
|
|
+ description: |-
|
|
|
|
|
+ Name of the referent.
|
|
|
|
|
+ This field is effectively required, but due to backwards compatibility is
|
|
|
|
|
+ allowed to be empty. Instances of this type with an empty value here are
|
|
|
|
|
+ almost certainly wrong.
|
|
|
|
|
+ More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
|
|
|
|
|
+ type: string
|
|
|
|
|
+ optional:
|
|
|
|
|
+ description: Specify whether the Secret or its key
|
|
|
|
|
+ must be defined
|
|
|
|
|
+ type: boolean
|
|
|
|
|
+ required:
|
|
|
|
|
+ - key
|
|
|
|
|
+ type: object
|
|
|
|
|
+ x-kubernetes-map-type: atomic
|
|
|
|
|
+ type: object
|
|
|
|
|
+ required:
|
|
|
|
|
+ - name
|
|
|
|
|
+ - valueFrom
|
|
|
|
|
+ type: object
|
|
|
|
|
+ type: array
|
|
|
|
|
+ type: object
|
|
|
|
|
+ endpoint:
|
|
|
|
|
+ description: endpoint is the base URL of the remote MCP server (e.g.
|
|
|
|
|
+ https://tools.example.com/mcp).
|
|
|
|
|
+ pattern: ^https?://
|
|
|
|
|
+ type: string
|
|
|
|
|
+ stackRef:
|
|
|
|
|
+ description: stackRef associates this tool with a stack.
|
|
|
|
|
+ properties:
|
|
|
|
|
+ name:
|
|
|
|
|
+ default: ""
|
|
|
|
|
+ description: |-
|
|
|
|
|
+ Name of the referent.
|
|
|
|
|
+ This field is effectively required, but due to backwards compatibility is
|
|
|
|
|
+ allowed to be empty. Instances of this type with an empty value here are
|
|
|
|
|
+ almost certainly wrong.
|
|
|
|
|
+ More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
|
|
|
|
|
+ type: string
|
|
|
|
|
+ type: object
|
|
|
|
|
+ x-kubernetes-map-type: atomic
|
|
|
|
|
+ toolName:
|
|
|
|
|
+ description: |-
|
|
|
|
|
+ toolName is the logical name for this tool as seen by the gateway and agents.
|
|
|
|
|
+ Used as the mcp_servers key in the LiteLLM config.
|
|
|
|
|
+ type: string
|
|
|
|
|
+ transport:
|
|
|
|
|
+ default: http
|
|
|
|
|
+ description: transport is the MCP transport protocol spoken by the
|
|
|
|
|
+ remote server.
|
|
|
|
|
+ enum:
|
|
|
|
|
+ - sse
|
|
|
|
|
+ - http
|
|
|
|
|
+ type: string
|
|
|
|
|
+ required:
|
|
|
|
|
+ - endpoint
|
|
|
|
|
+ - toolName
|
|
|
|
|
+ type: object
|
|
|
|
|
+ status:
|
|
|
|
|
+ description: status defines the observed state of ExternalTool
|
|
|
|
|
+ properties:
|
|
|
|
|
+ conditions:
|
|
|
|
|
+ description: |-
|
|
|
|
|
+ conditions represent the current state of the ExternalTool resource.
|
|
|
|
|
+ Each condition has a unique type and reflects the status of a specific aspect of the resource.
|
|
|
|
|
+
|
|
|
|
|
+ Standard condition types include:
|
|
|
|
|
+ - "Available": the resource is fully functional
|
|
|
|
|
+ - "Progressing": the resource is being created or updated
|
|
|
|
|
+ - "Degraded": the resource failed to reach or maintain its desired state
|
|
|
|
|
+
|
|
|
|
|
+ The status of each condition is one of True, False, or Unknown.
|
|
|
|
|
+ items:
|
|
|
|
|
+ description: Condition contains details for one aspect of the current
|
|
|
|
|
+ state of this API Resource.
|
|
|
|
|
+ properties:
|
|
|
|
|
+ lastTransitionTime:
|
|
|
|
|
+ description: |-
|
|
|
|
|
+ lastTransitionTime is the last time the condition transitioned from one status to another.
|
|
|
|
|
+ This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable.
|
|
|
|
|
+ format: date-time
|
|
|
|
|
+ type: string
|
|
|
|
|
+ message:
|
|
|
|
|
+ description: |-
|
|
|
|
|
+ message is a human readable message indicating details about the transition.
|
|
|
|
|
+ This may be an empty string.
|
|
|
|
|
+ maxLength: 32768
|
|
|
|
|
+ type: string
|
|
|
|
|
+ observedGeneration:
|
|
|
|
|
+ description: |-
|
|
|
|
|
+ observedGeneration represents the .metadata.generation that the condition was set based upon.
|
|
|
|
|
+ For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date
|
|
|
|
|
+ with respect to the current state of the instance.
|
|
|
|
|
+ format: int64
|
|
|
|
|
+ minimum: 0
|
|
|
|
|
+ type: integer
|
|
|
|
|
+ reason:
|
|
|
|
|
+ description: |-
|
|
|
|
|
+ reason contains a programmatic identifier indicating the reason for the condition's last transition.
|
|
|
|
|
+ Producers of specific condition types may define expected values and meanings for this field,
|
|
|
|
|
+ and whether the values are considered a guaranteed API.
|
|
|
|
|
+ The value should be a CamelCase string.
|
|
|
|
|
+ This field may not be empty.
|
|
|
|
|
+ maxLength: 1024
|
|
|
|
|
+ minLength: 1
|
|
|
|
|
+ pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$
|
|
|
|
|
+ type: string
|
|
|
|
|
+ status:
|
|
|
|
|
+ description: status of the condition, one of True, False, Unknown.
|
|
|
|
|
+ enum:
|
|
|
|
|
+ - "True"
|
|
|
|
|
+ - "False"
|
|
|
|
|
+ - Unknown
|
|
|
|
|
+ type: string
|
|
|
|
|
+ type:
|
|
|
|
|
+ description: type of condition in CamelCase or in foo.example.com/CamelCase.
|
|
|
|
|
+ maxLength: 316
|
|
|
|
|
+ pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$
|
|
|
|
|
+ type: string
|
|
|
|
|
+ required:
|
|
|
|
|
+ - lastTransitionTime
|
|
|
|
|
+ - message
|
|
|
|
|
+ - reason
|
|
|
|
|
+ - status
|
|
|
|
|
+ - type
|
|
|
|
|
+ type: object
|
|
|
|
|
+ type: array
|
|
|
|
|
+ x-kubernetes-list-map-keys:
|
|
|
|
|
+ - type
|
|
|
|
|
+ x-kubernetes-list-type: map
|
|
|
|
|
+ observedGeneration:
|
|
|
|
|
+ description: observedGeneration is the .metadata.generation last reconciled.
|
|
|
|
|
+ format: int64
|
|
|
|
|
+ type: integer
|
|
|
|
|
+ type: object
|
|
|
|
|
+ required:
|
|
|
|
|
+ - spec
|
|
|
|
|
+ type: object
|
|
|
|
|
+ served: true
|
|
|
|
|
+ storage: true
|
|
|
|
|
+ subresources:
|
|
|
|
|
+ status: {}
|