Files
nchain/config/crd/bases/nchain.hanzo.ai_clouds.yaml
zeekay 27b0621f5c chore(integration): regen deepcopy+CRDs, converge explorer→indexer endpoint
Regenerate zz_generated deepcopy (controller-gen object) and config/crd/bases
(controller-gen crd) so the merged NodeCluster/Indexer/Explorer/Gateway spec
fields land in the API. Converge the Explorer indexer endpoint onto the
Indexer Service (name={indexer.Name}, port=indexerPortDefault 8091) instead of
the stale {name}-indexer:4000, and update the test.
2026-06-27 21:08:02 +00:00

678 lines
31 KiB
YAML

---
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.18.0
name: clouds.nchain.hanzo.ai
spec:
group: nchain.hanzo.ai
names:
kind: Cloud
listKind: CloudList
plural: clouds
shortNames:
- cloud
singular: cloud
scope: Namespaced
versions:
- additionalPrinterColumns:
- jsonPath: .status.phase
name: Phase
type: string
- jsonPath: .status.apiReadyReplicas
name: API
type: integer
- jsonPath: .status.webReadyReplicas
name: Web
type: integer
- jsonPath: .status.brandCount
name: Brands
type: integer
- jsonPath: .metadata.creationTimestamp
name: Age
type: date
name: v1alpha1
schema:
openAPIV3Schema:
description: |-
Cloud is the Schema for the clouds API.
It manages a multi-brand Web3 cloud platform (bootnode) with API + Web UI.
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: CloudSpec defines the desired state of Cloud.
properties:
annotations:
additionalProperties:
type: string
description: Annotations are additional annotations applied to all
managed resources.
type: object
api:
description: API configures the backend API server.
properties:
autoscaling:
description: Autoscaling configuration.
properties:
enabled:
description: Enabled controls whether HPA is deployed.
type: boolean
maxReplicas:
default: 20
description: MaxReplicas is the maximum number of replicas.
format: int32
type: integer
minReplicas:
default: 2
description: MinReplicas is the minimum number of replicas.
format: int32
type: integer
targetCPU:
default: 70
description: TargetCPU is the target CPU utilization percentage.
format: int32
type: integer
targetMemory:
description: TargetMemory is the target memory utilization
percentage.
format: int32
type: integer
type: object
image:
description: Image for the API server.
properties:
pullPolicy:
default: IfNotPresent
description: PullPolicy defines when to pull the image.
enum:
- Always
- IfNotPresent
- Never
type: string
repository:
description: Repository is the container image repository.
type: string
tag:
default: latest
description: Tag is the container image tag.
type: string
required:
- repository
type: object
replicas:
default: 3
description: Replicas for the API deployment.
format: int32
type: integer
resources:
description: Resources for the API pods.
properties:
limits:
additionalProperties:
anyOf:
- type: integer
- type: string
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
description: Limits describes the maximum amount of compute
resources allowed.
type: object
requests:
additionalProperties:
anyOf:
- type: integer
- type: string
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
description: Requests describes the minimum amount of compute
resources required.
type: object
type: object
type: object
brands:
description: |-
Brands defines the multi-tenant brand configurations.
A single API deployment serves all brands, routing by hostname.
Each brand gets its own web frontend deployment.
items:
description: BrandConfig defines per-brand configuration for multi-tenant
deployments.
properties:
domain:
description: Domain is the base domain for this brand (e.g.,
web3.hanzo.ai).
type: string
iam:
description: IAM configuration for this brand.
properties:
clientID:
description: ClientID is the OAuth client ID.
type: string
org:
description: Org is the IAM organization.
type: string
url:
description: URL is the IAM endpoint (e.g., https://hanzo.id).
type: string
required:
- clientID
- org
- url
type: object
name:
description: Name is the brand identifier (hanzo, lux, zoo,
pars).
type: string
required:
- domain
- iam
- name
type: object
minItems: 1
type: array
clusterTargets:
description: |-
ClusterTargets maps brand to the K8s cluster where nodes should be deployed.
The API uses this to create NodeCluster CRs in the right cluster.
items:
description: |-
ClusterTarget maps a brand (or all brands) to a K8s cluster where NodeCluster
CRs should be created. The API uses the target cluster's kubeconfig to create
resources in the correct cluster.
properties:
brand:
description: Brand name this target applies to (or "*" for all).
type: string
kubeconfigSecret:
description: KubeconfigSecret is the name of the Secret containing
the target cluster's kubeconfig.
type: string
namespace:
description: Namespace where NodeCluster CRs should be created
in the target cluster.
type: string
required:
- brand
- kubeconfigSecret
- namespace
type: object
type: array
database:
description: Database configures database connections.
properties:
credentialsSecret:
description: |-
CredentialsSecret is the name of the K8s Secret containing database credentials.
Expected keys: database-url, redis-url, datastore-url (optional)
type: string
required:
- credentialsSecret
type: object
env:
description: Env provides additional environment variables.
items:
description: EnvVar represents an environment variable present in
a Container.
properties:
name:
description: |-
Name of the environment variable.
May consist of any printable ASCII characters except '='.
type: string
value:
description: |-
Variable references $(VAR_NAME) are expanded
using the previously defined environment variables in the container and
any service environment variables. If a variable cannot be resolved,
the reference in the input string will be unchanged. Double $$ are reduced
to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.
"$$(VAR_NAME)" will produce the string literal "$(VAR_NAME)".
Escaped references will never be expanded, regardless of whether the variable
exists or not.
Defaults to "".
type: string
valueFrom:
description: Source for the environment variable's value. Cannot
be used if value is not empty.
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
type: object
type: array
features:
description: Features controls which platform features are enabled.
properties:
bundler:
description: Bundler enables ERC-4337 account abstraction bundling.
type: boolean
gas:
default: true
description: Gas enables gas estimation API.
type: boolean
nfts:
default: true
description: NFTs enables NFT API.
type: boolean
wallets:
default: true
description: Wallets enables smart wallet management.
type: boolean
webhooks:
default: true
description: Webhooks enables webhook subscriptions.
type: boolean
type: object
imagePullSecrets:
description: ImagePullSecrets for pulling container images.
items:
type: string
type: array
ingress:
description: Ingress configures external access for all brands.
properties:
annotations:
additionalProperties:
type: string
description: Annotations are additional annotations applied to
the Ingress resource.
type: object
clusterIssuer:
default: letsencrypt-prod
description: ClusterIssuer is the cert-manager ClusterIssuer to
use for TLS certificates.
type: string
enabled:
description: Enabled controls whether an Ingress resource is created.
type: boolean
hosts:
description: Hosts lists the hostnames for the Ingress.
items:
type: string
type: array
ingressClassName:
default: ingress
description: IngressClassName specifies the Ingress class to use.
type: string
tls:
default: true
description: TLS enables TLS termination on the Ingress.
type: boolean
type: object
kmsSecrets:
description: KMSSecrets configures KMS secret syncing.
items:
description: KMSSecretRef generates a KMSSecret CR to sync secrets
from Hanzo KMS into a Kubernetes Secret.
properties:
credentialsRef:
description: CredentialsRef references a Kubernetes Secret containing
KMS credentials.
properties:
name:
description: name is unique within a namespace to reference
a secret resource.
type: string
namespace:
description: namespace defines the space within which the
secret name must be unique.
type: string
type: object
x-kubernetes-map-type: atomic
envSlug:
description: EnvSlug identifies the KMS environment.
type: string
hostAPI:
default: https://kms.hanzo.ai/api
description: HostAPI is the KMS API endpoint.
type: string
managedSecretName:
description: ManagedSecretName is the name of the Kubernetes
Secret to create/update.
type: string
projectSlug:
description: ProjectSlug identifies the KMS project.
type: string
resyncInterval:
default: 60
description: ResyncInterval is the interval in seconds between
KMS secret re-syncs.
format: int32
minimum: 10
type: integer
secretsPath:
description: SecretsPath is the path within the KMS project.
type: string
required:
- credentialsRef
- envSlug
- managedSecretName
- projectSlug
- secretsPath
type: object
type: array
labels:
additionalProperties:
type: string
description: Labels are additional labels applied to all managed resources.
type: object
web:
description: Web configures the frontend web application.
properties:
autoscaling:
description: Autoscaling configuration.
properties:
enabled:
description: Enabled controls whether HPA is deployed.
type: boolean
maxReplicas:
default: 20
description: MaxReplicas is the maximum number of replicas.
format: int32
type: integer
minReplicas:
default: 2
description: MinReplicas is the minimum number of replicas.
format: int32
type: integer
targetCPU:
default: 70
description: TargetCPU is the target CPU utilization percentage.
format: int32
type: integer
targetMemory:
description: TargetMemory is the target memory utilization
percentage.
format: int32
type: integer
type: object
image:
description: Image for the web frontend.
properties:
pullPolicy:
default: IfNotPresent
description: PullPolicy defines when to pull the image.
enum:
- Always
- IfNotPresent
- Never
type: string
repository:
description: Repository is the container image repository.
type: string
tag:
default: latest
description: Tag is the container image tag.
type: string
required:
- repository
type: object
replicas:
default: 2
description: Replicas for the web deployment.
format: int32
type: integer
resources:
description: Resources for the web pods.
properties:
limits:
additionalProperties:
anyOf:
- type: integer
- type: string
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
description: Limits describes the maximum amount of compute
resources allowed.
type: object
requests:
additionalProperties:
anyOf:
- type: integer
- type: string
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
description: Requests describes the minimum amount of compute
resources required.
type: object
type: object
type: object
required:
- brands
- database
type: object
status:
description: CloudStatus defines the observed state of Cloud.
properties:
apiReadyReplicas:
description: APIReadyReplicas is the number of ready API replicas.
format: int32
type: integer
brandCount:
description: BrandCount is the number of configured brands.
format: int32
type: integer
conditions:
description: Conditions represent the latest observations.
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
observedGeneration:
description: ObservedGeneration is the most recent generation observed.
format: int64
type: integer
phase:
description: Phase is the current lifecycle phase.
enum:
- Pending
- Creating
- Bootstrapping
- Running
- Degraded
- Deleting
type: string
webReadyReplicas:
description: WebReadyReplicas is the number of ready web replicas.
format: int32
type: integer
type: object
type: object
served: true
storage: true
subresources:
status: {}