--- apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.14.0 name: iotdevices.iot.kube5s.ru spec: group: iot.kube5s.ru names: kind: IoTDevice listKind: IoTDeviceList plural: iotdevices singular: iotdevice scope: Namespaced versions: - additionalPrinterColumns: - jsonPath: .spec.deviceId name: DeviceID type: string - jsonPath: .status.phase name: Phase type: string - jsonPath: .spec.enabled name: Enabled type: boolean - jsonPath: .status.mqttUsername name: MQTTUser type: string - jsonPath: .metadata.creationTimestamp name: Age type: date name: v1alpha1 schema: openAPIV3Schema: description: |- IoTDevice — ресурс для регистрации IoT-устройства в платформе. Контроллер автоматически создаёт k8s Secret с MQTT-credentials. 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: IoTDeviceSpec — желаемое состояние IoT-устройства. properties: deviceId: description: |- DeviceID — уникальный идентификатор устройства внутри namespace. Используется как часть MQTT username и имени Secret. Разрешены только строчные буквы, цифры и дефис — для совместимости с k8s именами. maxLength: 48 pattern: ^[a-z0-9][a-z0-9-]*[a-z0-9]$ type: string enabled: default: true description: |- Enabled — активно ли устройство (может подключаться к MQTT). Если false — контроллер устанавливает phase=Disabled, EMQX auth отклоняет подключение. Secret с credentials НЕ удаляется — при re-enable пароль остаётся прежним. type: boolean metadata: additionalProperties: type: string description: |- Metadata — произвольные метаданные устройства (модель, локация и т.д.). Хранятся только в CRD, не влияют на логику контроллера. type: object required: - deviceId - enabled type: object status: description: IoTDeviceStatus — наблюдаемое состояние IoT-устройства (заполняет контроллер). properties: lastConnected: description: |- LastConnected — время последнего MQTT-подключения устройства. Заполняется MQTT auth-сервисом при каждом успешном CONNECT. format: date-time type: string message: description: Message — человекочитаемое сообщение о текущем статусе или ошибке. type: string mqttUsername: description: |- MQTTUsername — имя пользователя для подключения к MQTT-брокеру. Формат: {namespace}_{deviceId} — глобально уникален в рамках EMQX. type: string phase: description: 'Phase — текущее состояние: Active, Disabled, Pending, Error.' type: string secretName: description: SecretName — имя k8s Secret в том же namespace, содержащего mqtt-username и mqtt-password. type: string topicPrefix: description: |- TopicPrefix — MQTT topic prefix, на который разрешена публикация. Формат: {namespace}/ — устройство не может публиковать в чужие namespace. type: string type: object type: object served: true storage: true subresources: status: {}