Kindsys: Target k8s style resource definitions (#67008)

Co-authored-by: sam boyer <sdboyer@grafana.com>
This commit is contained in:
Ryan McKinley 2023-04-27 13:32:38 -07:00 committed by GitHub
parent b71b778d0d
commit ca1f79b9ba
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
80 changed files with 1991 additions and 640 deletions

1
.github/CODEOWNERS vendored
View File

@ -473,7 +473,6 @@ lerna.json @grafana/frontend-ops
/scripts/trigger_docker_build.sh @grafana/grafana-delivery /scripts/trigger_docker_build.sh @grafana/grafana-delivery
/scripts/trigger_grafana_packer.sh @grafana/grafana-delivery /scripts/trigger_grafana_packer.sh @grafana/grafana-delivery
/scripts/trigger_windows_build.sh @grafana/grafana-delivery /scripts/trigger_windows_build.sh @grafana/grafana-delivery
/scripts/validate-devenv-dashboards.sh @grafana/grafana-delivery
/scripts/verify-repo-update/ @grafana/grafana-delivery /scripts/verify-repo-update/ @grafana/grafana-delivery
/scripts/webpack/ @grafana/frontend-ops /scripts/webpack/ @grafana/frontend-ops

View File

@ -13,6 +13,57 @@ title: Dashboard kind
A Grafana dashboard. A Grafana dashboard.
| Property | Type | Required | Default | Description |
|------------|---------------------|----------|---------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `metadata` | [object](#metadata) | **Yes** | | metadata contains embedded CommonMetadata and can be extended with custom string fields<br/>TODO: use CommonMetadata instead of redefining here; currently needs to be defined here<br/>without external reference as using the CommonMetadata reference breaks thema codegen. |
| `spec` | [object](#spec) | **Yes** | | |
| `status` | [object](#status) | **Yes** | | |
### Metadata
metadata contains embedded CommonMetadata and can be extended with custom string fields
TODO: use CommonMetadata instead of redefining here; currently needs to be defined here
without external reference as using the CommonMetadata reference breaks thema codegen.
It extends [_kubeObjectMetadata](#_kubeobjectmetadata).
| Property | Type | Required | Default | Description |
|---------------------|------------------------|----------|---------|-----------------------------------------------------------------------------------------------------------------------------------------|
| `createdBy` | string | **Yes** | | |
| `creationTimestamp` | string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* |
| `extraFields` | [object](#extrafields) | **Yes** | | extraFields is reserved for any fields that are pulled from the API server metadata but do not have concrete fields in the CUE metadata |
| `finalizers` | string[] | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* |
| `labels` | map[string]string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* |
| `resourceVersion` | string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* |
| `uid` | string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* |
| `updateTimestamp` | string | **Yes** | | |
| `updatedBy` | string | **Yes** | | |
| `deletionTimestamp` | string | No | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* |
### _kubeObjectMetadata
_kubeObjectMetadata is metadata found in a kubernetes object's metadata field.
It is not exhaustive and only includes fields which may be relevant to a kind's implementation,
As it is also intended to be generic enough to function with any API Server.
| Property | Type | Required | Default | Description |
|---------------------|-------------------|----------|---------|-------------|
| `creationTimestamp` | string | **Yes** | | |
| `finalizers` | string[] | **Yes** | | |
| `labels` | map[string]string | **Yes** | | |
| `resourceVersion` | string | **Yes** | | |
| `uid` | string | **Yes** | | |
| `deletionTimestamp` | string | No | | |
### ExtraFields
extraFields is reserved for any fields that are pulled from the API server metadata but do not have concrete fields in the CUE metadata
| Property | Type | Required | Default | Description |
|----------|------|----------|---------|-------------|
### Spec
| Property | Type | Required | Default | Description | | Property | Type | Required | Default | Description |
|------------------------|---------------------------------------------|----------|-----------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| |------------------------|---------------------------------------------|----------|-----------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `editable` | boolean | **Yes** | `true` | Whether a dashboard is editable or not. | | `editable` | boolean | **Yes** | `true` | Whether a dashboard is editable or not. |
@ -608,4 +659,34 @@ TODO this appears to be spread all over in the frontend. Concepts will likely ne
| `refresh_intervals` | string[] | **Yes** | `[5s 10s 30s 1m 5m 15m 30m 1h 2h 1d]` | Selectable intervals for auto-refresh. | | `refresh_intervals` | string[] | **Yes** | `[5s 10s 30s 1m 5m 15m 30m 1h 2h 1d]` | Selectable intervals for auto-refresh. |
| `time_options` | string[] | **Yes** | `[5m 15m 1h 6h 12h 24h 2d 7d 30d]` | TODO docs | | `time_options` | string[] | **Yes** | `[5m 15m 1h 6h 12h 24h 2d 7d 30d]` | TODO docs |
### Status
| Property | Type | Required | Default | Description |
|--------------------|----------------------------------------------------------------------------------|----------|---------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `additionalFields` | [object](#additionalfields) | **Yes** | | additionalFields is reserved for future use |
| `operatorStates` | map[string][joinSchema.status.#OperatorState](#joinschema.status.#operatorstate) | No | | operatorStates is a map of operator ID to operator state evaluations.<br/>Any operator which consumes this kind SHOULD add its state evaluation information to this field. |
### AdditionalFields
additionalFields is reserved for future use
| Property | Type | Required | Default | Description |
|----------|------|----------|---------|-------------|
### JoinSchema.Status.#OperatorState
| Property | Type | Required | Default | Description |
|--------------------|--------------------|----------|---------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `lastEvaluation` | string | **Yes** | | lastEvaluation is the ResourceVersion last evaluated |
| `state` | string | **Yes** | | state describes the state of the lastEvaluation.<br/>It is limited to three possible states for machine evaluation.<br/>Possible values are: `success`, `in_progress`, `failed`. |
| `descriptiveState` | string | No | | descriptiveState is an optional more descriptive state field which has no requirements on format |
| `details` | [object](#details) | No | | details contains any extra information that is operator-specific |
### Details
details contains any extra information that is operator-specific
| Property | Type | Required | Default | Description |
|----------|------|----------|---------|-------------|

View File

@ -13,6 +13,57 @@ title: LibraryPanel kind
A standalone panel A standalone panel
| Property | Type | Required | Default | Description |
|------------|---------------------|----------|---------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `metadata` | [object](#metadata) | **Yes** | | metadata contains embedded CommonMetadata and can be extended with custom string fields<br/>TODO: use CommonMetadata instead of redefining here; currently needs to be defined here<br/>without external reference as using the CommonMetadata reference breaks thema codegen. |
| `spec` | [object](#spec) | **Yes** | | |
| `status` | [object](#status) | **Yes** | | |
### Metadata
metadata contains embedded CommonMetadata and can be extended with custom string fields
TODO: use CommonMetadata instead of redefining here; currently needs to be defined here
without external reference as using the CommonMetadata reference breaks thema codegen.
It extends [_kubeObjectMetadata](#_kubeobjectmetadata).
| Property | Type | Required | Default | Description |
|---------------------|------------------------|----------|---------|-----------------------------------------------------------------------------------------------------------------------------------------|
| `createdBy` | string | **Yes** | | |
| `creationTimestamp` | string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* |
| `extraFields` | [object](#extrafields) | **Yes** | | extraFields is reserved for any fields that are pulled from the API server metadata but do not have concrete fields in the CUE metadata |
| `finalizers` | string[] | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* |
| `labels` | map[string]string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* |
| `resourceVersion` | string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* |
| `uid` | string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* |
| `updateTimestamp` | string | **Yes** | | |
| `updatedBy` | string | **Yes** | | |
| `deletionTimestamp` | string | No | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* |
### _kubeObjectMetadata
_kubeObjectMetadata is metadata found in a kubernetes object's metadata field.
It is not exhaustive and only includes fields which may be relevant to a kind's implementation,
As it is also intended to be generic enough to function with any API Server.
| Property | Type | Required | Default | Description |
|---------------------|-------------------|----------|---------|-------------|
| `creationTimestamp` | string | **Yes** | | |
| `finalizers` | string[] | **Yes** | | |
| `labels` | map[string]string | **Yes** | | |
| `resourceVersion` | string | **Yes** | | |
| `uid` | string | **Yes** | | |
| `deletionTimestamp` | string | No | | |
### ExtraFields
extraFields is reserved for any fields that are pulled from the API server metadata but do not have concrete fields in the CUE metadata
| Property | Type | Required | Default | Description |
|----------|------|----------|---------|-------------|
### Spec
| Property | Type | Required | Default | Description | | Property | Type | Required | Default | Description |
|-----------------|-------------------------------------------------|----------|---------|--------------------------------------------------------------------------------------------------------------------------------------| |-----------------|-------------------------------------------------|----------|---------|--------------------------------------------------------------------------------------------------------------------------------------|
| `model` | [object](#model) | **Yes** | | TODO: should be the same panel schema defined in dashboard<br/>Typescript: Omit<Panel, 'gridPos' &#124; 'id' &#124; 'libraryPanel'>; | | `model` | [object](#model) | **Yes** | | TODO: should be the same panel schema defined in dashboard<br/>Typescript: Omit<Panel, 'gridPos' &#124; 'id' &#124; 'libraryPanel'>; |
@ -53,4 +104,34 @@ Typescript: Omit<Panel, 'gridPos' | 'id' | 'libraryPanel'>;
| Property | Type | Required | Default | Description | | Property | Type | Required | Default | Description |
|----------|------|----------|---------|-------------| |----------|------|----------|---------|-------------|
### Status
| Property | Type | Required | Default | Description |
|--------------------|----------------------------------------------------------------------------------|----------|---------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `additionalFields` | [object](#additionalfields) | **Yes** | | additionalFields is reserved for future use |
| `operatorStates` | map[string][joinSchema.status.#OperatorState](#joinschema.status.#operatorstate) | No | | operatorStates is a map of operator ID to operator state evaluations.<br/>Any operator which consumes this kind SHOULD add its state evaluation information to this field. |
### AdditionalFields
additionalFields is reserved for future use
| Property | Type | Required | Default | Description |
|----------|------|----------|---------|-------------|
### JoinSchema.Status.#OperatorState
| Property | Type | Required | Default | Description |
|--------------------|--------------------|----------|---------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `lastEvaluation` | string | **Yes** | | lastEvaluation is the ResourceVersion last evaluated |
| `state` | string | **Yes** | | state describes the state of the lastEvaluation.<br/>It is limited to three possible states for machine evaluation.<br/>Possible values are: `success`, `in_progress`, `failed`. |
| `descriptiveState` | string | No | | descriptiveState is an optional more descriptive state field which has no requirements on format |
| `details` | [object](#details) | No | | details contains any extra information that is operator-specific |
### Details
details contains any extra information that is operator-specific
| Property | Type | Required | Default | Description |
|----------|------|----------|---------|-------------|

View File

@ -13,6 +13,57 @@ title: Playlist kind
A playlist is a series of dashboards that is automatically rotated in the browser, on a configurable interval. A playlist is a series of dashboards that is automatically rotated in the browser, on a configurable interval.
| Property | Type | Required | Default | Description |
|------------|---------------------|----------|---------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `metadata` | [object](#metadata) | **Yes** | | metadata contains embedded CommonMetadata and can be extended with custom string fields<br/>TODO: use CommonMetadata instead of redefining here; currently needs to be defined here<br/>without external reference as using the CommonMetadata reference breaks thema codegen. |
| `spec` | [object](#spec) | **Yes** | | |
| `status` | [object](#status) | **Yes** | | |
### Metadata
metadata contains embedded CommonMetadata and can be extended with custom string fields
TODO: use CommonMetadata instead of redefining here; currently needs to be defined here
without external reference as using the CommonMetadata reference breaks thema codegen.
It extends [_kubeObjectMetadata](#_kubeobjectmetadata).
| Property | Type | Required | Default | Description |
|---------------------|------------------------|----------|---------|-----------------------------------------------------------------------------------------------------------------------------------------|
| `createdBy` | string | **Yes** | | |
| `creationTimestamp` | string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* |
| `extraFields` | [object](#extrafields) | **Yes** | | extraFields is reserved for any fields that are pulled from the API server metadata but do not have concrete fields in the CUE metadata |
| `finalizers` | string[] | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* |
| `labels` | map[string]string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* |
| `resourceVersion` | string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* |
| `uid` | string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* |
| `updateTimestamp` | string | **Yes** | | |
| `updatedBy` | string | **Yes** | | |
| `deletionTimestamp` | string | No | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* |
### _kubeObjectMetadata
_kubeObjectMetadata is metadata found in a kubernetes object's metadata field.
It is not exhaustive and only includes fields which may be relevant to a kind's implementation,
As it is also intended to be generic enough to function with any API Server.
| Property | Type | Required | Default | Description |
|---------------------|-------------------|----------|---------|-------------|
| `creationTimestamp` | string | **Yes** | | |
| `finalizers` | string[] | **Yes** | | |
| `labels` | map[string]string | **Yes** | | |
| `resourceVersion` | string | **Yes** | | |
| `uid` | string | **Yes** | | |
| `deletionTimestamp` | string | No | | |
### ExtraFields
extraFields is reserved for any fields that are pulled from the API server metadata but do not have concrete fields in the CUE metadata
| Property | Type | Required | Default | Description |
|----------|------|----------|---------|-------------|
### Spec
| Property | Type | Required | Default | Description | | Property | Type | Required | Default | Description |
|------------|---------------------------------|----------|---------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------| |------------|---------------------------------|----------|---------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `interval` | string | **Yes** | `5m` | Interval sets the time between switching views in a playlist.<br/>FIXME: Is this based on a standardized format or what options are available? Can datemath be used? | | `interval` | string | **Yes** | `5m` | Interval sets the time between switching views in a playlist.<br/>FIXME: Is this based on a standardized format or what options are available? Can datemath be used? |
@ -28,4 +79,34 @@ A playlist is a series of dashboards that is automatically rotated in the browse
| `value` | string | **Yes** | | Value depends on type and describes the playlist item.<br/><br/> - dashboard_by_id: The value is an internal numerical identifier set by Grafana. This<br/> is not portable as the numerical identifier is non-deterministic between different instances.<br/> Will be replaced by dashboard_by_uid in the future. (deprecated)<br/> - dashboard_by_tag: The value is a tag which is set on any number of dashboards. All<br/> dashboards behind the tag will be added to the playlist.<br/> - dashboard_by_uid: The value is the dashboard UID | | `value` | string | **Yes** | | Value depends on type and describes the playlist item.<br/><br/> - dashboard_by_id: The value is an internal numerical identifier set by Grafana. This<br/> is not portable as the numerical identifier is non-deterministic between different instances.<br/> Will be replaced by dashboard_by_uid in the future. (deprecated)<br/> - dashboard_by_tag: The value is a tag which is set on any number of dashboards. All<br/> dashboards behind the tag will be added to the playlist.<br/> - dashboard_by_uid: The value is the dashboard UID |
| `title` | string | No | | Title is an unused property -- it will be removed in the future | | `title` | string | No | | Title is an unused property -- it will be removed in the future |
### Status
| Property | Type | Required | Default | Description |
|--------------------|----------------------------------------------------------------------------------|----------|---------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `additionalFields` | [object](#additionalfields) | **Yes** | | additionalFields is reserved for future use |
| `operatorStates` | map[string][joinSchema.status.#OperatorState](#joinschema.status.#operatorstate) | No | | operatorStates is a map of operator ID to operator state evaluations.<br/>Any operator which consumes this kind SHOULD add its state evaluation information to this field. |
### AdditionalFields
additionalFields is reserved for future use
| Property | Type | Required | Default | Description |
|----------|------|----------|---------|-------------|
### JoinSchema.Status.#OperatorState
| Property | Type | Required | Default | Description |
|--------------------|--------------------|----------|---------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `lastEvaluation` | string | **Yes** | | lastEvaluation is the ResourceVersion last evaluated |
| `state` | string | **Yes** | | state describes the state of the lastEvaluation.<br/>It is limited to three possible states for machine evaluation.<br/>Possible values are: `success`, `in_progress`, `failed`. |
| `descriptiveState` | string | No | | descriptiveState is an optional more descriptive state field which has no requirements on format |
| `details` | [object](#details) | No | | details contains any extra information that is operator-specific |
### Details
details contains any extra information that is operator-specific
| Property | Type | Required | Default | Description |
|----------|------|----------|---------|-------------|

View File

@ -13,6 +13,57 @@ title: Preferences kind
The user or team frontend preferences The user or team frontend preferences
| Property | Type | Required | Default | Description |
|------------|---------------------|----------|---------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `metadata` | [object](#metadata) | **Yes** | | metadata contains embedded CommonMetadata and can be extended with custom string fields<br/>TODO: use CommonMetadata instead of redefining here; currently needs to be defined here<br/>without external reference as using the CommonMetadata reference breaks thema codegen. |
| `spec` | [object](#spec) | **Yes** | | |
| `status` | [object](#status) | **Yes** | | |
### Metadata
metadata contains embedded CommonMetadata and can be extended with custom string fields
TODO: use CommonMetadata instead of redefining here; currently needs to be defined here
without external reference as using the CommonMetadata reference breaks thema codegen.
It extends [_kubeObjectMetadata](#_kubeobjectmetadata).
| Property | Type | Required | Default | Description |
|---------------------|------------------------|----------|---------|-----------------------------------------------------------------------------------------------------------------------------------------|
| `createdBy` | string | **Yes** | | |
| `creationTimestamp` | string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* |
| `extraFields` | [object](#extrafields) | **Yes** | | extraFields is reserved for any fields that are pulled from the API server metadata but do not have concrete fields in the CUE metadata |
| `finalizers` | string[] | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* |
| `labels` | map[string]string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* |
| `resourceVersion` | string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* |
| `uid` | string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* |
| `updateTimestamp` | string | **Yes** | | |
| `updatedBy` | string | **Yes** | | |
| `deletionTimestamp` | string | No | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* |
### _kubeObjectMetadata
_kubeObjectMetadata is metadata found in a kubernetes object's metadata field.
It is not exhaustive and only includes fields which may be relevant to a kind's implementation,
As it is also intended to be generic enough to function with any API Server.
| Property | Type | Required | Default | Description |
|---------------------|-------------------|----------|---------|-------------|
| `creationTimestamp` | string | **Yes** | | |
| `finalizers` | string[] | **Yes** | | |
| `labels` | map[string]string | **Yes** | | |
| `resourceVersion` | string | **Yes** | | |
| `uid` | string | **Yes** | | |
| `deletionTimestamp` | string | No | | |
### ExtraFields
extraFields is reserved for any fields that are pulled from the API server metadata but do not have concrete fields in the CUE metadata
| Property | Type | Required | Default | Description |
|----------|------|----------|---------|-------------|
### Spec
| Property | Type | Required | Default | Description | | Property | Type | Required | Default | Description |
|--------------------|---------------------------------------------------|----------|---------|---------------------------------------------------------------------------------| |--------------------|---------------------------------------------------|----------|---------|---------------------------------------------------------------------------------|
| `homeDashboardUID` | string | No | | UID for the home dashboard | | `homeDashboardUID` | string | No | | UID for the home dashboard |
@ -28,4 +79,34 @@ The user or team frontend preferences
|-----------|--------|----------|---------|---------------------------------------------| |-----------|--------|----------|---------|---------------------------------------------|
| `homeTab` | string | No | | one of: '' &#124; 'query' &#124; 'starred'; | | `homeTab` | string | No | | one of: '' &#124; 'query' &#124; 'starred'; |
### Status
| Property | Type | Required | Default | Description |
|--------------------|----------------------------------------------------------------------------------|----------|---------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `additionalFields` | [object](#additionalfields) | **Yes** | | additionalFields is reserved for future use |
| `operatorStates` | map[string][joinSchema.status.#OperatorState](#joinschema.status.#operatorstate) | No | | operatorStates is a map of operator ID to operator state evaluations.<br/>Any operator which consumes this kind SHOULD add its state evaluation information to this field. |
### AdditionalFields
additionalFields is reserved for future use
| Property | Type | Required | Default | Description |
|----------|------|----------|---------|-------------|
### JoinSchema.Status.#OperatorState
| Property | Type | Required | Default | Description |
|--------------------|--------------------|----------|---------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `lastEvaluation` | string | **Yes** | | lastEvaluation is the ResourceVersion last evaluated |
| `state` | string | **Yes** | | state describes the state of the lastEvaluation.<br/>It is limited to three possible states for machine evaluation.<br/>Possible values are: `success`, `in_progress`, `failed`. |
| `descriptiveState` | string | No | | descriptiveState is an optional more descriptive state field which has no requirements on format |
| `details` | [object](#details) | No | | details contains any extra information that is operator-specific |
### Details
details contains any extra information that is operator-specific
| Property | Type | Required | Default | Description |
|----------|------|----------|---------|-------------|

View File

@ -13,6 +13,57 @@ title: PublicDashboard kind
Public dashboard configuration Public dashboard configuration
| Property | Type | Required | Default | Description |
|------------|---------------------|----------|---------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `metadata` | [object](#metadata) | **Yes** | | metadata contains embedded CommonMetadata and can be extended with custom string fields<br/>TODO: use CommonMetadata instead of redefining here; currently needs to be defined here<br/>without external reference as using the CommonMetadata reference breaks thema codegen. |
| `spec` | [object](#spec) | **Yes** | | |
| `status` | [object](#status) | **Yes** | | |
### Metadata
metadata contains embedded CommonMetadata and can be extended with custom string fields
TODO: use CommonMetadata instead of redefining here; currently needs to be defined here
without external reference as using the CommonMetadata reference breaks thema codegen.
It extends [_kubeObjectMetadata](#_kubeobjectmetadata).
| Property | Type | Required | Default | Description |
|---------------------|------------------------|----------|---------|-----------------------------------------------------------------------------------------------------------------------------------------|
| `createdBy` | string | **Yes** | | |
| `creationTimestamp` | string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* |
| `extraFields` | [object](#extrafields) | **Yes** | | extraFields is reserved for any fields that are pulled from the API server metadata but do not have concrete fields in the CUE metadata |
| `finalizers` | string[] | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* |
| `labels` | map[string]string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* |
| `resourceVersion` | string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* |
| `uid` | string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* |
| `updateTimestamp` | string | **Yes** | | |
| `updatedBy` | string | **Yes** | | |
| `deletionTimestamp` | string | No | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* |
### _kubeObjectMetadata
_kubeObjectMetadata is metadata found in a kubernetes object's metadata field.
It is not exhaustive and only includes fields which may be relevant to a kind's implementation,
As it is also intended to be generic enough to function with any API Server.
| Property | Type | Required | Default | Description |
|---------------------|-------------------|----------|---------|-------------|
| `creationTimestamp` | string | **Yes** | | |
| `finalizers` | string[] | **Yes** | | |
| `labels` | map[string]string | **Yes** | | |
| `resourceVersion` | string | **Yes** | | |
| `uid` | string | **Yes** | | |
| `deletionTimestamp` | string | No | | |
### ExtraFields
extraFields is reserved for any fields that are pulled from the API server metadata but do not have concrete fields in the CUE metadata
| Property | Type | Required | Default | Description |
|----------|------|----------|---------|-------------|
### Spec
| Property | Type | Required | Default | Description | | Property | Type | Required | Default | Description |
|------------------------|---------|----------|---------|-----------------------------------------------------------------| |------------------------|---------|----------|---------|-----------------------------------------------------------------|
| `annotationsEnabled` | boolean | **Yes** | | Flag that indicates if annotations are enabled | | `annotationsEnabled` | boolean | **Yes** | | Flag that indicates if annotations are enabled |
@ -22,4 +73,34 @@ Public dashboard configuration
| `uid` | string | **Yes** | | Unique public dashboard identifier | | `uid` | string | **Yes** | | Unique public dashboard identifier |
| `accessToken` | string | No | | Unique public access token | | `accessToken` | string | No | | Unique public access token |
### Status
| Property | Type | Required | Default | Description |
|--------------------|----------------------------------------------------------------------------------|----------|---------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `additionalFields` | [object](#additionalfields) | **Yes** | | additionalFields is reserved for future use |
| `operatorStates` | map[string][joinSchema.status.#OperatorState](#joinschema.status.#operatorstate) | No | | operatorStates is a map of operator ID to operator state evaluations.<br/>Any operator which consumes this kind SHOULD add its state evaluation information to this field. |
### AdditionalFields
additionalFields is reserved for future use
| Property | Type | Required | Default | Description |
|----------|------|----------|---------|-------------|
### JoinSchema.Status.#OperatorState
| Property | Type | Required | Default | Description |
|--------------------|--------------------|----------|---------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `lastEvaluation` | string | **Yes** | | lastEvaluation is the ResourceVersion last evaluated |
| `state` | string | **Yes** | | state describes the state of the lastEvaluation.<br/>It is limited to three possible states for machine evaluation.<br/>Possible values are: `success`, `in_progress`, `failed`. |
| `descriptiveState` | string | No | | descriptiveState is an optional more descriptive state field which has no requirements on format |
| `details` | [object](#details) | No | | details contains any extra information that is operator-specific |
### Details
details contains any extra information that is operator-specific
| Property | Type | Required | Default | Description |
|----------|------|----------|---------|-------------|

View File

@ -13,6 +13,57 @@ title: ServiceAccount kind
system account system account
| Property | Type | Required | Default | Description |
|------------|---------------------|----------|---------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `metadata` | [object](#metadata) | **Yes** | | metadata contains embedded CommonMetadata and can be extended with custom string fields<br/>TODO: use CommonMetadata instead of redefining here; currently needs to be defined here<br/>without external reference as using the CommonMetadata reference breaks thema codegen. |
| `spec` | [object](#spec) | **Yes** | | |
| `status` | [object](#status) | **Yes** | | |
### Metadata
metadata contains embedded CommonMetadata and can be extended with custom string fields
TODO: use CommonMetadata instead of redefining here; currently needs to be defined here
without external reference as using the CommonMetadata reference breaks thema codegen.
It extends [_kubeObjectMetadata](#_kubeobjectmetadata).
| Property | Type | Required | Default | Description |
|---------------------|------------------------|----------|---------|-----------------------------------------------------------------------------------------------------------------------------------------|
| `createdBy` | string | **Yes** | | |
| `creationTimestamp` | string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* |
| `extraFields` | [object](#extrafields) | **Yes** | | extraFields is reserved for any fields that are pulled from the API server metadata but do not have concrete fields in the CUE metadata |
| `finalizers` | string[] | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* |
| `labels` | map[string]string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* |
| `resourceVersion` | string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* |
| `uid` | string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* |
| `updateTimestamp` | string | **Yes** | | |
| `updatedBy` | string | **Yes** | | |
| `deletionTimestamp` | string | No | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* |
### _kubeObjectMetadata
_kubeObjectMetadata is metadata found in a kubernetes object's metadata field.
It is not exhaustive and only includes fields which may be relevant to a kind's implementation,
As it is also intended to be generic enough to function with any API Server.
| Property | Type | Required | Default | Description |
|---------------------|-------------------|----------|---------|-------------|
| `creationTimestamp` | string | **Yes** | | |
| `finalizers` | string[] | **Yes** | | |
| `labels` | map[string]string | **Yes** | | |
| `resourceVersion` | string | **Yes** | | |
| `uid` | string | **Yes** | | |
| `deletionTimestamp` | string | No | | |
### ExtraFields
extraFields is reserved for any fields that are pulled from the API server metadata but do not have concrete fields in the CUE metadata
| Property | Type | Required | Default | Description |
|----------|------|----------|---------|-------------|
### Spec
| Property | Type | Required | Default | Description | | Property | Type | Required | Default | Description |
|-----------------|--------------------|----------|---------|-----------------------------------------------------------------------------------------------------------------------------------------| |-----------------|--------------------|----------|---------|-----------------------------------------------------------------------------------------------------------------------------------------|
| `avatarUrl` | string | **Yes** | | AvatarUrl is the service account's avatar URL. It allows the frontend to display a picture in front<br/>of the service account. | | `avatarUrl` | string | **Yes** | | AvatarUrl is the service account's avatar URL. It allows the frontend to display a picture in front<br/>of the service account. |
@ -24,8 +75,36 @@ system account
| `role` | string | **Yes** | | OrgRole is a Grafana Organization Role which can be 'Viewer', 'Editor', 'Admin'.<br/>Possible values are: `Admin`, `Editor`, `Viewer`. | | `role` | string | **Yes** | | OrgRole is a Grafana Organization Role which can be 'Viewer', 'Editor', 'Admin'.<br/>Possible values are: `Admin`, `Editor`, `Viewer`. |
| `tokens` | integer | **Yes** | | Tokens is the number of active tokens for the service account.<br/>Tokens are used to authenticate the service account against Grafana. | | `tokens` | integer | **Yes** | | Tokens is the number of active tokens for the service account.<br/>Tokens are used to authenticate the service account against Grafana. |
| `accessControl` | map[string]boolean | No | | AccessControl metadata associated with a given resource. | | `accessControl` | map[string]boolean | No | | AccessControl metadata associated with a given resource. |
| `created` | string | No | | Created indicates when the service account was created. |
| `teams` | string[] | No | | Teams is a list of teams the service account belongs to. | | `teams` | string[] | No | | Teams is a list of teams the service account belongs to. |
| `updated` | string | No | | Updated indicates when the service account was updated. |
### Status
| Property | Type | Required | Default | Description |
|--------------------|----------------------------------------------------------------------------------|----------|---------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `additionalFields` | [object](#additionalfields) | **Yes** | | additionalFields is reserved for future use |
| `operatorStates` | map[string][joinSchema.status.#OperatorState](#joinschema.status.#operatorstate) | No | | operatorStates is a map of operator ID to operator state evaluations.<br/>Any operator which consumes this kind SHOULD add its state evaluation information to this field. |
### AdditionalFields
additionalFields is reserved for future use
| Property | Type | Required | Default | Description |
|----------|------|----------|---------|-------------|
### JoinSchema.Status.#OperatorState
| Property | Type | Required | Default | Description |
|--------------------|--------------------|----------|---------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `lastEvaluation` | string | **Yes** | | lastEvaluation is the ResourceVersion last evaluated |
| `state` | string | **Yes** | | state describes the state of the lastEvaluation.<br/>It is limited to three possible states for machine evaluation.<br/>Possible values are: `success`, `in_progress`, `failed`. |
| `descriptiveState` | string | No | | descriptiveState is an optional more descriptive state field which has no requirements on format |
| `details` | [object](#details) | No | | details contains any extra information that is operator-specific |
### Details
details contains any extra information that is operator-specific
| Property | Type | Required | Default | Description |
|----------|------|----------|---------|-------------|

View File

@ -13,16 +13,95 @@ title: Team kind
A team is a named grouping of Grafana users to which access control rules may be assigned. A team is a named grouping of Grafana users to which access control rules may be assigned.
| Property | Type | Required | Default | Description |
|------------|---------------------|----------|---------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `metadata` | [object](#metadata) | **Yes** | | metadata contains embedded CommonMetadata and can be extended with custom string fields<br/>TODO: use CommonMetadata instead of redefining here; currently needs to be defined here<br/>without external reference as using the CommonMetadata reference breaks thema codegen. |
| `spec` | [object](#spec) | **Yes** | | |
| `status` | [object](#status) | **Yes** | | |
### Metadata
metadata contains embedded CommonMetadata and can be extended with custom string fields
TODO: use CommonMetadata instead of redefining here; currently needs to be defined here
without external reference as using the CommonMetadata reference breaks thema codegen.
It extends [_kubeObjectMetadata](#_kubeobjectmetadata).
| Property | Type | Required | Default | Description |
|---------------------|------------------------|----------|---------|-----------------------------------------------------------------------------------------------------------------------------------------|
| `createdBy` | string | **Yes** | | |
| `creationTimestamp` | string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* |
| `extraFields` | [object](#extrafields) | **Yes** | | extraFields is reserved for any fields that are pulled from the API server metadata but do not have concrete fields in the CUE metadata |
| `finalizers` | string[] | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* |
| `labels` | map[string]string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* |
| `resourceVersion` | string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* |
| `uid` | string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* |
| `updateTimestamp` | string | **Yes** | | |
| `updatedBy` | string | **Yes** | | |
| `deletionTimestamp` | string | No | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* |
### _kubeObjectMetadata
_kubeObjectMetadata is metadata found in a kubernetes object's metadata field.
It is not exhaustive and only includes fields which may be relevant to a kind's implementation,
As it is also intended to be generic enough to function with any API Server.
| Property | Type | Required | Default | Description |
|---------------------|-------------------|----------|---------|-------------|
| `creationTimestamp` | string | **Yes** | | |
| `finalizers` | string[] | **Yes** | | |
| `labels` | map[string]string | **Yes** | | |
| `resourceVersion` | string | **Yes** | | |
| `uid` | string | **Yes** | | |
| `deletionTimestamp` | string | No | | |
### ExtraFields
extraFields is reserved for any fields that are pulled from the API server metadata but do not have concrete fields in the CUE metadata
| Property | Type | Required | Default | Description |
|----------|------|----------|---------|-------------|
### Spec
| Property | Type | Required | Default | Description | | Property | Type | Required | Default | Description |
|-----------------|--------------------|----------|---------|----------------------------------------------------------| |-----------------|--------------------|----------|---------|----------------------------------------------------------|
| `created` | string | **Yes** | | Created indicates when the team was created. |
| `memberCount` | integer | **Yes** | | MemberCount is the number of the team members. | | `memberCount` | integer | **Yes** | | MemberCount is the number of the team members. |
| `name` | string | **Yes** | | Name of the team. | | `name` | string | **Yes** | | Name of the team. |
| `orgId` | integer | **Yes** | | OrgId is the ID of an organisation the team belongs to. | | `orgId` | integer | **Yes** | | OrgId is the ID of an organisation the team belongs to. |
| `permission` | integer | **Yes** | | Possible values are: `0`, `1`, `2`, `4`. | | `permission` | integer | **Yes** | | Possible values are: `0`, `1`, `2`, `4`. |
| `updated` | string | **Yes** | | Updated indicates when the team was updated. |
| `accessControl` | map[string]boolean | No | | AccessControl metadata associated with a given resource. | | `accessControl` | map[string]boolean | No | | AccessControl metadata associated with a given resource. |
| `avatarUrl` | string | No | | AvatarUrl is the team's avatar URL. | | `avatarUrl` | string | No | | AvatarUrl is the team's avatar URL. |
| `email` | string | No | | Email of the team. | | `email` | string | No | | Email of the team. |
### Status
| Property | Type | Required | Default | Description |
|--------------------|----------------------------------------------------------------------------------|----------|---------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `additionalFields` | [object](#additionalfields) | **Yes** | | additionalFields is reserved for future use |
| `operatorStates` | map[string][joinSchema.status.#OperatorState](#joinschema.status.#operatorstate) | No | | operatorStates is a map of operator ID to operator state evaluations.<br/>Any operator which consumes this kind SHOULD add its state evaluation information to this field. |
### AdditionalFields
additionalFields is reserved for future use
| Property | Type | Required | Default | Description |
|----------|------|----------|---------|-------------|
### JoinSchema.Status.#OperatorState
| Property | Type | Required | Default | Description |
|--------------------|--------------------|----------|---------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `lastEvaluation` | string | **Yes** | | lastEvaluation is the ResourceVersion last evaluated |
| `state` | string | **Yes** | | state describes the state of the lastEvaluation.<br/>It is limited to three possible states for machine evaluation.<br/>Possible values are: `success`, `in_progress`, `failed`. |
| `descriptiveState` | string | No | | descriptiveState is an optional more descriptive state field which has no requirements on format |
| `details` | [object](#details) | No | | details contains any extra information that is operator-specific |
### Details
details contains any extra information that is operator-specific
| Property | Type | Required | Default | Description |
|----------|------|----------|---------|-------------|

View File

@ -61,8 +61,6 @@ Some stable features are enabled by default. You can disable a stable feature by
| `renderAuthJWT` | Uses JWT-based auth for rendering instead of relying on remote cache | | `renderAuthJWT` | Uses JWT-based auth for rendering instead of relying on remote cache |
| `enableElasticsearchBackendQuerying` | Enable the processing of queries and responses in the Elasticsearch data source through backend | | `enableElasticsearchBackendQuerying` | Enable the processing of queries and responses in the Elasticsearch data source through backend |
| `enableDatagridEditing` | Enables the edit functionality in the datagrid panel | | `enableDatagridEditing` | Enables the edit functionality in the datagrid panel |
| `publicDashboards` | Enables public access to dashboards |
| `publicDashboardsEmailSharing` | Enables public dashboard sharing to be restricted to only allowed emails |
## Alpha feature toggles ## Alpha feature toggles
@ -73,6 +71,8 @@ Alpha features might be changed or removed without prior notice.
| ---------------------------------- | -------------------------------------------------------------------------------------------------------------- | | ---------------------------------- | -------------------------------------------------------------------------------------------------------------- |
| `live-service-web-worker` | This will use a webworker thread to processes events rather than the main thread | | `live-service-web-worker` | This will use a webworker thread to processes events rather than the main thread |
| `queryOverLive` | Use Grafana Live WebSocket to execute backend queries | | `queryOverLive` | Use Grafana Live WebSocket to execute backend queries |
| `publicDashboards` | Enables public access to dashboards |
| `publicDashboardsEmailSharing` | Enables public dashboard sharing to be restricted to only allowed emails |
| `lokiLive` | Support WebSocket streaming for loki (early prototype) | | `lokiLive` | Support WebSocket streaming for loki (early prototype) |
| `storage` | Configurable storage for dashboards, datasources, and resources | | `storage` | Configurable storage for dashboards, datasources, and resources |
| `newTraceViewHeader` | Shows the new trace view header | | `newTraceViewHeader` | Shows the new trace view header |

14
go.mod
View File

@ -22,10 +22,7 @@ replace github.com/deepmap/oapi-codegen => github.com/spinillos/oapi-codegen v1.
// hoist a replace statement. // hoist a replace statement.
replace k8s.io/client-go => k8s.io/client-go v0.25.3 replace k8s.io/client-go => k8s.io/client-go v0.25.3
require ( require k8s.io/apimachinery v0.26.2
k8s.io/apiextensions-apiserver v0.26.2 // indirect
k8s.io/apimachinery v0.26.2
)
require ( require (
cloud.google.com/go/storage v1.28.1 cloud.google.com/go/storage v1.28.1
@ -266,7 +263,7 @@ require (
github.com/grafana/dataplane/examples v0.0.0-20230404174214-4d6fd58a18ad github.com/grafana/dataplane/examples v0.0.0-20230404174214-4d6fd58a18ad
github.com/grafana/dataplane/sdata v0.0.6 github.com/grafana/dataplane/sdata v0.0.6
github.com/grafana/go-mssqldb v0.9.1 github.com/grafana/go-mssqldb v0.9.1
github.com/grafana/kindsys v0.0.0-20230414093523-5df3e256ebc0 github.com/grafana/kindsys v0.0.0-20230427152021-bb328815be7a
github.com/grafana/thema v0.0.0-20230417103609-99b482c479fe github.com/grafana/thema v0.0.0-20230417103609-99b482c479fe
github.com/redis/go-redis/v9 v9.0.2 github.com/redis/go-redis/v9 v9.0.2
github.com/weaveworks/common v0.0.0-20230208133027-16871410fca4 github.com/weaveworks/common v0.0.0-20230208133027-16871410fca4
@ -297,8 +294,10 @@ require (
github.com/drone/drone-go v1.7.1 // indirect github.com/drone/drone-go v1.7.1 // indirect
github.com/drone/envsubst v1.0.3 // indirect github.com/drone/envsubst v1.0.3 // indirect
github.com/drone/runner-go v1.12.0 // indirect github.com/drone/runner-go v1.12.0 // indirect
github.com/emicklei/go-restful/v3 v3.9.0 // indirect
github.com/envoyproxy/go-control-plane v0.10.3 // indirect github.com/envoyproxy/go-control-plane v0.10.3 // indirect
github.com/envoyproxy/protoc-gen-validate v0.6.13 // indirect github.com/envoyproxy/protoc-gen-validate v0.6.13 // indirect
github.com/fsnotify/fsnotify v1.6.0 // indirect
github.com/go-asn1-ber/asn1-ber v1.5.4 // indirect github.com/go-asn1-ber/asn1-ber v1.5.4 // indirect
github.com/google/go-querystring v1.1.0 // indirect github.com/google/go-querystring v1.1.0 // indirect
github.com/google/gofuzz v1.2.0 // indirect github.com/google/gofuzz v1.2.0 // indirect
@ -337,11 +336,8 @@ require (
go.opentelemetry.io/otel/metric v0.37.0 // indirect go.opentelemetry.io/otel/metric v0.37.0 // indirect
go.starlark.net v0.0.0-20221020143700-22309ac47eac // indirect go.starlark.net v0.0.0-20221020143700-22309ac47eac // indirect
gopkg.in/fsnotify/fsnotify.v1 v1.4.7 // indirect gopkg.in/fsnotify/fsnotify.v1 v1.4.7 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect k8s.io/api v0.26.2 // indirect
k8s.io/klog/v2 v2.80.1 // indirect
k8s.io/utils v0.0.0-20221107191617-1a15be271d1d // indirect k8s.io/utils v0.0.0-20221107191617-1a15be271d1d // indirect
sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect
sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect
) )
require ( require (

23
go.sum
View File

@ -739,10 +739,10 @@ github.com/elazarl/goproxy v0.0.0-20220115173737-adb46da277ac/go.mod h1:Ro8st/El
github.com/elazarl/goproxy/ext v0.0.0-20190711103511-473e67f1d7d2/go.mod h1:gNh8nYJoAm43RfaxurUnxr+N1PwuFV3ZMl/efxlIlY8= github.com/elazarl/goproxy/ext v0.0.0-20190711103511-473e67f1d7d2/go.mod h1:gNh8nYJoAm43RfaxurUnxr+N1PwuFV3ZMl/efxlIlY8=
github.com/elazarl/goproxy/ext v0.0.0-20220115173737-adb46da277ac h1:9yrT5tmn9Zc0ytWPASlaPwQfQMQYnRf0RSDe1XvHw0Q= github.com/elazarl/goproxy/ext v0.0.0-20220115173737-adb46da277ac h1:9yrT5tmn9Zc0ytWPASlaPwQfQMQYnRf0RSDe1XvHw0Q=
github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
github.com/emicklei/go-restful v2.9.5+incompatible h1:spTtZBk5DYEvbxMVutUuTyh1Ao2r4iyvLdACqsl/Ljk=
github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
github.com/emicklei/go-restful/v3 v3.8.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/emicklei/go-restful/v3 v3.8.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE= github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE=
github.com/emicklei/go-restful/v3 v3.9.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
github.com/emicklei/proto v1.10.0 h1:pDGyFRVV5RvV+nkBK9iy3q67FBy9Xa7vwrOTE+g5aGw= github.com/emicklei/proto v1.10.0 h1:pDGyFRVV5RvV+nkBK9iy3q67FBy9Xa7vwrOTE+g5aGw=
github.com/emicklei/proto v1.10.0/go.mod h1:rn1FgRS/FANiZdD2djyH7TMA9jdRDcYQ9IEN9yvjX0A= github.com/emicklei/proto v1.10.0/go.mod h1:rn1FgRS/FANiZdD2djyH7TMA9jdRDcYQ9IEN9yvjX0A=
github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg= github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg=
@ -786,6 +786,7 @@ github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4
github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU=
github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=
github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=
github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw=
github.com/fsouza/fake-gcs-server v1.7.0/go.mod h1:5XIRs4YvwNbNoz+1JF8j6KLAyDh7RHGAyAK3EP2EsNk= github.com/fsouza/fake-gcs-server v1.7.0/go.mod h1:5XIRs4YvwNbNoz+1JF8j6KLAyDh7RHGAyAK3EP2EsNk=
github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA=
github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY=
@ -1268,8 +1269,6 @@ github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/ad
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/grafana/alerting v0.0.0-20230418161049-5f374e58cb32 h1:LdPoVBj+CA5oHLeUejDzqy8/c4Fa0UfTtCcOHka0Jws=
github.com/grafana/alerting v0.0.0-20230418161049-5f374e58cb32/go.mod h1:nHfrSTdV7/l74N5/ezqlQ+JwSvIChhN3G5+PjCfwG/E=
github.com/grafana/alerting v0.0.0-20230426173942-011a41e1fbe2 h1:teRmmE08bSnvyh3e+adfv/6RA1ZZdhTCmNL9Ckfm1Rk= github.com/grafana/alerting v0.0.0-20230426173942-011a41e1fbe2 h1:teRmmE08bSnvyh3e+adfv/6RA1ZZdhTCmNL9Ckfm1Rk=
github.com/grafana/alerting v0.0.0-20230426173942-011a41e1fbe2/go.mod h1:nHfrSTdV7/l74N5/ezqlQ+JwSvIChhN3G5+PjCfwG/E= github.com/grafana/alerting v0.0.0-20230426173942-011a41e1fbe2/go.mod h1:nHfrSTdV7/l74N5/ezqlQ+JwSvIChhN3G5+PjCfwG/E=
github.com/grafana/codejen v0.0.3 h1:tAWxoTUuhgmEqxJPOLtJoxlPBbMULFwKFOcRsPRPXDw= github.com/grafana/codejen v0.0.3 h1:tAWxoTUuhgmEqxJPOLtJoxlPBbMULFwKFOcRsPRPXDw=
@ -1296,8 +1295,8 @@ github.com/grafana/grafana-plugin-sdk-go v0.94.0/go.mod h1:3VXz4nCv6wH5SfgB3mlW3
github.com/grafana/grafana-plugin-sdk-go v0.114.0/go.mod h1:D7x3ah+1d4phNXpbnOaxa/osSaZlwh9/ZUnGGzegRbk= github.com/grafana/grafana-plugin-sdk-go v0.114.0/go.mod h1:D7x3ah+1d4phNXpbnOaxa/osSaZlwh9/ZUnGGzegRbk=
github.com/grafana/grafana-plugin-sdk-go v0.159.0 h1:tjqzTe/wz+1zzaeHpOJvBvSvZFx/bJUSHj6WA8HJqhE= github.com/grafana/grafana-plugin-sdk-go v0.159.0 h1:tjqzTe/wz+1zzaeHpOJvBvSvZFx/bJUSHj6WA8HJqhE=
github.com/grafana/grafana-plugin-sdk-go v0.159.0/go.mod h1:7/F3lL/w3MGuZTwu0jam5oL/4zNOQmhs2k8WZ9VlzhI= github.com/grafana/grafana-plugin-sdk-go v0.159.0/go.mod h1:7/F3lL/w3MGuZTwu0jam5oL/4zNOQmhs2k8WZ9VlzhI=
github.com/grafana/kindsys v0.0.0-20230414093523-5df3e256ebc0 h1:Or8DllkxKq3+kLXAS/tkr5K2Yv745c6K2rRvslGWGd4= github.com/grafana/kindsys v0.0.0-20230427152021-bb328815be7a h1:i2YhC6eTyDp+7Ftv5c6VZDUQskmKX4oIPGf38qfiZiU=
github.com/grafana/kindsys v0.0.0-20230414093523-5df3e256ebc0/go.mod h1:GNcfpy5+SY6RVbNGQW264gC0r336Dm+0zgQ5vt6+M8Y= github.com/grafana/kindsys v0.0.0-20230427152021-bb328815be7a/go.mod h1:GNcfpy5+SY6RVbNGQW264gC0r336Dm+0zgQ5vt6+M8Y=
github.com/grafana/phlare/api v0.1.4-0.20230426005640-f90edba05413 h1:bBzCezZNRyYlJpXTkyZdY4fpPxHZUdyeyRWzhtw/P6I= github.com/grafana/phlare/api v0.1.4-0.20230426005640-f90edba05413 h1:bBzCezZNRyYlJpXTkyZdY4fpPxHZUdyeyRWzhtw/P6I=
github.com/grafana/phlare/api v0.1.4-0.20230426005640-f90edba05413/go.mod h1:IvwuGG9xa/h96UH/exgvsfy3zE+ZpctkNT9o5aaGdrU= github.com/grafana/phlare/api v0.1.4-0.20230426005640-f90edba05413/go.mod h1:IvwuGG9xa/h96UH/exgvsfy3zE+ZpctkNT9o5aaGdrU=
github.com/grafana/prometheus-alertmanager v0.25.1-0.20230308154952-78fedf89728b h1:VQOGGGJ2lKcVPANyzIESKYhSeA0QIvUQwfA3CbrkDfA= github.com/grafana/prometheus-alertmanager v0.25.1-0.20230308154952-78fedf89728b h1:VQOGGGJ2lKcVPANyzIESKYhSeA0QIvUQwfA3CbrkDfA=
@ -1642,15 +1641,8 @@ github.com/lestrrat-go/httpcc v1.0.1/go.mod h1:qiltp3Mt56+55GPVCbTdM9MlqhvzyuL6W
github.com/lestrrat-go/iter v1.0.1/go.mod h1:zIdgO1mRKhn8l9vrZJZz9TUMMFbQbLeTsbqPDrJ/OJc= github.com/lestrrat-go/iter v1.0.1/go.mod h1:zIdgO1mRKhn8l9vrZJZz9TUMMFbQbLeTsbqPDrJ/OJc=
github.com/lestrrat-go/jwx v1.2.25/go.mod h1:zoNuZymNl5lgdcu6P7K6ie2QRll5HVfF4xwxBBK1NxY= github.com/lestrrat-go/jwx v1.2.25/go.mod h1:zoNuZymNl5lgdcu6P7K6ie2QRll5HVfF4xwxBBK1NxY=
github.com/lestrrat-go/option v1.0.0/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= github.com/lestrrat-go/option v1.0.0/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I=
github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/lib/pq v1.10.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/lib/pq v1.10.6 h1:jbk+ZieJ0D7EVGJYpL9QTz7/YW6UHbmdnZWYyK5cdBs= github.com/lib/pq v1.10.6 h1:jbk+ZieJ0D7EVGJYpL9QTz7/YW6UHbmdnZWYyK5cdBs=
github.com/lib/pq v1.10.6/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.10.6/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw=
github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM=
github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4=
github.com/linkedin/goavro/v2 v2.10.0 h1:eTBIRoInBM88gITGXYtUSqqxLTFXfOsJBiX8ZMW0o4U= github.com/linkedin/goavro/v2 v2.10.0 h1:eTBIRoInBM88gITGXYtUSqqxLTFXfOsJBiX8ZMW0o4U=
@ -2935,6 +2927,7 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220908150016-7ac13a9a928d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908150016-7ac13a9a928d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
@ -3271,8 +3264,7 @@ k8s.io/api v0.21.1/go.mod h1:FstGROTmsSHBarKc8bylzXih8BLNYTiS3TZcsoEDg2s=
k8s.io/api v0.22.4/go.mod h1:Rgs+9gIGYC5laXQSZZ9JqT5NevNgoGiOdVWi1BAB3qk= k8s.io/api v0.22.4/go.mod h1:Rgs+9gIGYC5laXQSZZ9JqT5NevNgoGiOdVWi1BAB3qk=
k8s.io/api v0.25.3/go.mod h1:o42gKscFrEVjHdQnyRenACrMtbuJsVdP+WVjqejfzmI= k8s.io/api v0.25.3/go.mod h1:o42gKscFrEVjHdQnyRenACrMtbuJsVdP+WVjqejfzmI=
k8s.io/api v0.26.2 h1:dM3cinp3PGB6asOySalOZxEG4CZ0IAdJsrYZXE/ovGQ= k8s.io/api v0.26.2 h1:dM3cinp3PGB6asOySalOZxEG4CZ0IAdJsrYZXE/ovGQ=
k8s.io/apiextensions-apiserver v0.26.2 h1:/yTG2B9jGY2Q70iGskMf41qTLhL9XeNN2KhI0uDgwko= k8s.io/api v0.26.2/go.mod h1:1kjMQsFE+QHPfskEcVNgL3+Hp88B80uj0QtSOlj8itU=
k8s.io/apiextensions-apiserver v0.26.2/go.mod h1:Y7UPgch8nph8mGCuVk0SK83LnS8Esf3n6fUBgew8SH8=
k8s.io/apimachinery v0.0.0-20190809020650-423f5d784010/go.mod h1:Waf/xTS2FGRrgXCkO5FP3XxTOWh0qLf2QhL1qFZZ/R8= k8s.io/apimachinery v0.0.0-20190809020650-423f5d784010/go.mod h1:Waf/xTS2FGRrgXCkO5FP3XxTOWh0qLf2QhL1qFZZ/R8=
k8s.io/apimachinery v0.17.5/go.mod h1:ioIo1G/a+uONV7Tv+ZmCbMG1/a3kVw5YcDdncd8ugQ0= k8s.io/apimachinery v0.17.5/go.mod h1:ioIo1G/a+uONV7Tv+ZmCbMG1/a3kVw5YcDdncd8ugQ0=
k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU=
@ -3302,6 +3294,7 @@ k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUc
k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
k8s.io/klog v0.3.1/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.3.1/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
k8s.io/klog v0.4.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= k8s.io/klog v0.4.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I=
k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8=
k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I=
k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE=
k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=
@ -3311,7 +3304,6 @@ k8s.io/klog/v2 v2.9.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec=
k8s.io/klog/v2 v2.20.0/go.mod h1:Gm8eSIfQN6457haJuPaMxZw4wyP5k+ykPFlrhQDvhvw= k8s.io/klog/v2 v2.20.0/go.mod h1:Gm8eSIfQN6457haJuPaMxZw4wyP5k+ykPFlrhQDvhvw=
k8s.io/klog/v2 v2.70.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/klog/v2 v2.70.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=
k8s.io/klog/v2 v2.80.1 h1:atnLQ121W371wYYFawwYx1aEY2eUfs4l3J72wtgAwV4= k8s.io/klog/v2 v2.80.1 h1:atnLQ121W371wYYFawwYx1aEY2eUfs4l3J72wtgAwV4=
k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=
k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058/go.mod h1:nfDlWeOsu3pUf4yWGL+ERqohP4YsZcBJXWMK+gkzOA4= k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058/go.mod h1:nfDlWeOsu3pUf4yWGL+ERqohP4YsZcBJXWMK+gkzOA4=
k8s.io/kube-openapi v0.0.0-20190722073852-5e22f3d471e6/go.mod h1:RZvgC8MSN6DjiMV6oIfEE9pDL9CYXokkfaCKZeHm3nc= k8s.io/kube-openapi v0.0.0-20190722073852-5e22f3d471e6/go.mod h1:RZvgC8MSN6DjiMV6oIfEE9pDL9CYXokkfaCKZeHm3nc=
k8s.io/kube-openapi v0.0.0-20200316234421-82d701f24f9d/go.mod h1:F+5wygcW0wmRTnM3cOgIqGivxkwSWIWT5YdsDbeAOaU= k8s.io/kube-openapi v0.0.0-20200316234421-82d701f24f9d/go.mod h1:F+5wygcW0wmRTnM3cOgIqGivxkwSWIWT5YdsDbeAOaU=
@ -3337,6 +3329,7 @@ sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyz
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg=
sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k= sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k=
sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0=
sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e h1:4Z09Hglb792X0kfOBBJUPFEyvVfQWrYT/l8h5EKA6JQ=
sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI=
sigs.k8s.io/structured-merge-diff/v2 v2.0.1/go.mod h1:Wb7vfKAodbKgf6tn1Kl0VvGj7mRH6DGaRcixXEJXTsE= sigs.k8s.io/structured-merge-diff/v2 v2.0.1/go.mod h1:Wb7vfKAodbKgf6tn1Kl0VvGj7mRH6DGaRcixXEJXTsE=
sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=

View File

@ -16,91 +16,83 @@ lineage: seqs: [
schemas: [ schemas: [
// 0.0 // 0.0
{ {
@grafana(TSVeneer="type") spec: {
// Unique numeric identifier for the dashboard.
// TODO must isolate or remove identifiers local to a Grafana instance...?
id?: int64
// Unique dashboard identifier that can be generated by anyone. string (8-40)
uid?: string
// Title of dashboard.
title?: string
// Description of dashboard.
description?: string
// This property should only be used in dashboards defined by plugins. It is a quick check
// to see if the version has changed since the last time. Unclear why using the version property
// is insufficient.
revision?: int64 @grafanamaturity(NeedsExpertReview)
// For dashboards imported from the https://grafana.com/grafana/dashboards/ portal
gnetId?: string @grafanamaturity(NeedsExpertReview)
// Tags associated with dashboard.
tags?: [...string] @grafanamaturity(NeedsExpertReview)
// Theme of dashboard.
style: "light" | *"dark" @grafanamaturity(NeedsExpertReview)
// Timezone of dashboard. Accepts IANA TZDB zone ID or "browser" or "utc".
timezone?: string | *"browser"
// Whether a dashboard is editable or not.
editable: bool | *true
// Configuration of dashboard cursor sync behavior.
graphTooltip: #DashboardCursorSync
// Time range for dashboard, e.g. last 6 hours, last 7 days, etc
time?: {
from: string | *"now-6h"
to: string | *"now"
} @grafanamaturity(NeedsExpertReview)
// Unique numeric identifier for the dashboard.
// TODO must isolate or remove identifiers local to a Grafana instance...?
id?: int64
// Unique dashboard identifier that can be generated by anyone. string (8-40)
uid?: string
// Title of dashboard.
title?: string
// Description of dashboard.
description?: string
// This property should only be used in dashboards defined by plugins. It is a quick check
// to see if the version has changed since the last time. Unclear why using the version property
// is insufficient.
revision?: int64 @grafanamaturity(NeedsExpertReview)
// For dashboards imported from the https://grafana.com/grafana/dashboards/ portal
gnetId?: string @grafanamaturity(NeedsExpertReview)
// Tags associated with dashboard.
tags?: [...string] @grafanamaturity(NeedsExpertReview)
// Theme of dashboard.
style: "light" | *"dark" @grafanamaturity(NeedsExpertReview)
// Timezone of dashboard. Accepts IANA TZDB zone ID or "browser" or "utc".
timezone?: string | *"browser"
// Whether a dashboard is editable or not.
editable: bool | *true
// Configuration of dashboard cursor sync behavior.
graphTooltip: #DashboardCursorSync
// Time range for dashboard, e.g. last 6 hours, last 7 days, etc
time?: {
from: string | *"now-6h"
to: string | *"now"
} @grafanamaturity(NeedsExpertReview)
// TODO docs
// TODO this appears to be spread all over in the frontend. Concepts will likely need tidying in tandem with schema changes
timepicker?: {
// Whether timepicker is collapsed or not.
collapse: bool | *false
// Whether timepicker is enabled or not.
enable: bool | *true
// Whether timepicker is visible or not.
hidden: bool | *false
// Selectable intervals for auto-refresh.
refresh_intervals: [...string] | *["5s", "10s", "30s", "1m", "5m", "15m", "30m", "1h", "2h", "1d"]
// TODO docs // TODO docs
time_options: [...string] | *["5m", "15m", "1h", "6h", "12h", "24h", "2d", "7d", "30d"] // TODO this appears to be spread all over in the frontend. Concepts will likely need tidying in tandem with schema changes
} @grafanamaturity(NeedsExpertReview) timepicker?: {
// The month that the fiscal year starts on. 0 = January, 11 = December // Whether timepicker is collapsed or not.
fiscalYearStartMonth?: uint8 & <12 | *0 collapse: bool | *false
// When set to true, the dashboard will redraw panels at an interval matching the pixel width. // Whether timepicker is enabled or not.
// This will keep data "moving left" regardless of the query refresh rate. This setting helps enable: bool | *true
// avoid dashboards presenting stale live data // Whether timepicker is visible or not.
liveNow?: bool @grafanamaturity(NeedsExpertReview) hidden: bool | *false
// TODO docs // Selectable intervals for auto-refresh.
weekStart?: string @grafanamaturity(NeedsExpertReview) refresh_intervals: [...string] | *["5s", "10s", "30s", "1m", "5m", "15m", "30m", "1h", "2h", "1d"]
// TODO docs
time_options: [...string] | *["5m", "15m", "1h", "6h", "12h", "24h", "2d", "7d", "30d"]
} @grafanamaturity(NeedsExpertReview)
// The month that the fiscal year starts on. 0 = January, 11 = December
fiscalYearStartMonth?: uint8 & <12 | *0
// When set to true, the dashboard will redraw panels at an interval matching the pixel width.
// This will keep data "moving left" regardless of the query refresh rate. This setting helps
// avoid dashboards presenting stale live data
liveNow?: bool @grafanamaturity(NeedsExpertReview)
// TODO docs
weekStart?: string @grafanamaturity(NeedsExpertReview)
// Refresh rate of dashboard. Represented via interval string, e.g. "5s", "1m", "1h", "1d". // Refresh rate of dashboard. Represented via interval string, e.g. "5s", "1m", "1h", "1d".
refresh?: string | false refresh?: string | false
// Version of the JSON schema, incremented each time a Grafana update brings // Version of the JSON schema, incremented each time a Grafana update brings
// changes to said schema. // changes to said schema.
// TODO this is the existing schema numbering system. It will be replaced by Thema's themaVersion // TODO this is the existing schema numbering system. It will be replaced by Thema's themaVersion
schemaVersion: uint16 | *36 schemaVersion: uint16 | *36
// Version of the dashboard, incremented each time the dashboard is updated. // Version of the dashboard, incremented each time the dashboard is updated.
version?: uint32 @grafanamaturity(NeedsExpertReview) version?: uint32 @grafanamaturity(NeedsExpertReview)
panels?: [...(#Panel | #RowPanel | #GraphPanel | #HeatmapPanel)] @grafanamaturity(NeedsExpertReview) panels?: [...(#Panel | #RowPanel | #GraphPanel | #HeatmapPanel)] @grafanamaturity(NeedsExpertReview)
// TODO docs // TODO docs
templating?: { templating?: {
list?: [...#VariableModel] @grafanamaturity(NeedsExpertReview) list?: [...#VariableModel] @grafanamaturity(NeedsExpertReview)
} }
// TODO -- should not be a public interface on its own, but required for Veneer // TODO docs
#AnnotationContainer: { annotations?: #AnnotationContainer
// annoying... but required so that the list is defined using the nested Veneer
@grafana(TSVeneer="type")
list?: [...#AnnotationQuery] @grafanamaturity(NeedsExpertReview) // TODO docs
} @cuetsy(kind="interface") links?: [...#DashboardLink] @grafanamaturity(NeedsExpertReview)
// TODO docs snapshot?: #Snapshot @grafanamaturity(NeedsExpertReview)
annotations?: #AnnotationContainer } @cuetsy(kind="interface") @grafana(TSVeneer="type")
// TODO docs
links?: [...#DashboardLink] @grafanamaturity(NeedsExpertReview)
snapshot?: #Snapshot @grafanamaturity(NeedsExpertReview)
/////////////////////////////////////// ///////////////////////////////////////
// Definitions (referenced above) are declared below // Definitions (referenced above) are declared below
@ -131,6 +123,14 @@ lineage: seqs: [
ids: [...uint8] ids: [...uint8]
} @cuetsy(kind="interface") } @cuetsy(kind="interface")
// TODO -- should not be a public interface on its own, but required for Veneer
#AnnotationContainer: {
// annoying... but required so that the list is defined using the nested Veneer
@grafana(TSVeneer="type")
list?: [...#AnnotationQuery] @grafanamaturity(NeedsExpertReview)
} @cuetsy(kind="interface")
// TODO docs // TODO docs
// FROM: AnnotationQuery in grafana-data/src/types/annotations.ts // FROM: AnnotationQuery in grafana-data/src/types/annotations.ts
#AnnotationQuery: { #AnnotationQuery: {

View File

@ -38,10 +38,14 @@ func main() {
// All the jennies that comprise the core kinds generator pipeline // All the jennies that comprise the core kinds generator pipeline
coreKindsGen.Append( coreKindsGen.Append(
codegen.LatestJenny(cuectx.GoCoreKindParentPath, codegen.GoTypesJenny{}), &codegen.ResourceGoTypesJenny{},
&codegen.SubresourceGoTypesJenny{},
codegen.CoreKindJenny(cuectx.GoCoreKindParentPath, nil), codegen.CoreKindJenny(cuectx.GoCoreKindParentPath, nil),
codegen.BaseCoreRegistryJenny(filepath.Join("pkg", "registry", "corekind"), cuectx.GoCoreKindParentPath), codegen.BaseCoreRegistryJenny(filepath.Join("pkg", "registry", "corekind"), cuectx.GoCoreKindParentPath),
codegen.LatestMajorsOrXJenny(cuectx.TSCoreKindParentPath, codegen.TSTypesJenny{}), codegen.LatestMajorsOrXJenny(
cuectx.TSCoreKindParentPath,
true, // forcing group so that we ignore the top level resource (for now)
codegen.TSResourceJenny{}),
codegen.TSVeneerIndexJenny(filepath.Join("packages", "grafana-schema", "src")), codegen.TSVeneerIndexJenny(filepath.Join("packages", "grafana-schema", "src")),
codegen.DocsJenny(filepath.Join("docs", "sources", "developers", "kinds", "core")), codegen.DocsJenny(filepath.Join("docs", "sources", "developers", "kinds", "core")),
) )

View File

@ -14,35 +14,35 @@ lineage: seqs: [
schemas: [ schemas: [
// 0.0 // 0.0
{ {
@grafana(TSVeneer="type") spec: {
// Folder UID
folderUid?: string @grafanamaturity(ToMetadata="sys")
// Folder UID // Library element UID
folderUid?: string @grafanamaturity(ToMetadata="sys") uid: string
// Library element UID // Panel name (also saved in the model)
uid: string name: string & strings.MinRunes(1)
// Panel name (also saved in the model) // Panel description
name: string & strings.MinRunes(1) description?: string
// Panel description // The panel type (from inside the model)
description?: string type: string & strings.MinRunes(1)
// The panel type (from inside the model) // Dashboard version when this was saved (zero if unknown)
type: string & strings.MinRunes(1) schemaVersion?: uint16
// Dashboard version when this was saved (zero if unknown) // panel version, incremented each time the dashboard is updated.
schemaVersion?: uint16 version: int64 @grafanamaturity(NeedsExpertReview)
// panel version, incremented each time the dashboard is updated. // TODO: should be the same panel schema defined in dashboard
version: int64 @grafanamaturity(NeedsExpertReview) // Typescript: Omit<Panel, 'gridPos' | 'id' | 'libraryPanel'>;
model: {...}
// TODO: should be the same panel schema defined in dashboard // Object storage metadata
// Typescript: Omit<Panel, 'gridPos' | 'id' | 'libraryPanel'>; meta?: #LibraryElementDTOMeta @grafanamaturity(ToMetadata="sys")
model: {...} } @cuetsy(kind="interface") @grafana(TSVeneer="type")
// Object storage metadata
meta?: #LibraryElementDTOMeta @grafanamaturity(ToMetadata="sys")
#LibraryElementDTOMetaUser: { #LibraryElementDTOMetaUser: {
id: int64 id: int64

View File

@ -9,20 +9,22 @@ lineage: seqs: [
schemas: [ schemas: [
//0.0 //0.0
{ {
// Unique playlist identifier. Generated on creation, either by the spec: {
// creator of the playlist of by the application. // Unique playlist identifier. Generated on creation, either by the
uid: string // creator of the playlist of by the application.
uid: string
// Name of the playlist. // Name of the playlist.
name: string name: string
// Interval sets the time between switching views in a playlist. // Interval sets the time between switching views in a playlist.
// FIXME: Is this based on a standardized format or what options are available? Can datemath be used? // FIXME: Is this based on a standardized format or what options are available? Can datemath be used?
interval: string | *"5m" interval: string | *"5m"
// The ordered list of items that the playlist will iterate over. // The ordered list of items that the playlist will iterate over.
// FIXME! This should not be optional, but changing it makes the godegen awkward // FIXME! This should not be optional, but changing it makes the godegen awkward
items?: [...#PlaylistItem] items?: [...#PlaylistItem]
} @cuetsy(kind="interface")
/////////////////////////////////////// ///////////////////////////////////////
// Definitions (referenced above) are declared below // Definitions (referenced above) are declared below

View File

@ -8,29 +8,31 @@ lineage: seqs: [
{ {
schemas: [ schemas: [
{ {
// UID for the home dashboard spec: {
homeDashboardUID?: string // UID for the home dashboard
homeDashboardUID?: string
// The timezone selection // The timezone selection
// TODO: this should use the timezone defined in common // TODO: this should use the timezone defined in common
timezone?: string timezone?: string
// day of the week (sunday, monday, etc) // day of the week (sunday, monday, etc)
weekStart?: string weekStart?: string
// light, dark, empty is default // light, dark, empty is default
theme?: string theme?: string
// Selected language (beta) // Selected language (beta)
language?: string language?: string
// Explore query history preferences // Explore query history preferences
queryHistory?: #QueryHistoryPreference queryHistory?: #QueryHistoryPreference
} @cuetsy(kind="interface")
#QueryHistoryPreference: { #QueryHistoryPreference: {
// one of: '' | 'query' | 'starred'; // one of: '' | 'query' | 'starred';
homeTab?: string homeTab?: string
} @cuetsy(kind="interface") //0.0 } @cuetsy(kind="interface")
}, },
] ]
}, },

View File

@ -9,18 +9,20 @@ lineage: seqs: [
schemas: [ schemas: [
// 0.0 // 0.0
{ {
// Unique public dashboard identifier spec: {
uid: string // Unique public dashboard identifier
// Dashboard unique identifier referenced by this public dashboard uid: string
dashboardUid: string // Dashboard unique identifier referenced by this public dashboard
// Unique public access token dashboardUid: string
accessToken?: string // Unique public access token
// Flag that indicates if the public dashboard is enabled accessToken?: string
isEnabled: bool // Flag that indicates if the public dashboard is enabled
// Flag that indicates if annotations are enabled isEnabled: bool
annotationsEnabled: bool // Flag that indicates if annotations are enabled
// Flag that indicates if the time range picker is enabled annotationsEnabled: bool
timeSelectionEnabled: bool // Flag that indicates if the time range picker is enabled
timeSelectionEnabled: bool
} @cuetsy(kind="interface")
}, },
] ]
}, },

View File

@ -1,7 +1,5 @@
package kind package kind
import "time"
name: "ServiceAccount" name: "ServiceAccount"
maturity: "merged" maturity: "merged"
description: "system account" description: "system account"
@ -11,35 +9,33 @@ lineage: seqs: [
schemas: [ schemas: [
// v0.0 // v0.0
{ {
// ID is the unique identifier of the service account in the database. spec: {
id: int64 @grafanamaturity(ToMetadata="sys") // ID is the unique identifier of the service account in the database.
// OrgId is the ID of an organisation the service account belongs to. id: int64 @grafanamaturity(ToMetadata="sys")
orgId: int64 @grafanamaturity(ToMetadata="sys") // OrgId is the ID of an organisation the service account belongs to.
// Name of the service account. orgId: int64 @grafanamaturity(ToMetadata="sys")
name: string // Name of the service account.
// Login of the service account. name: string
login: string // Login of the service account.
// IsDisabled indicates if the service account is disabled. login: string
isDisabled: bool // IsDisabled indicates if the service account is disabled.
// Role is the Grafana organization role of the service account which can be 'Viewer', 'Editor', 'Admin'. isDisabled: bool
role: #OrgRole @grafanamaturity(ToMetadata="kind") // Role is the Grafana organization role of the service account which can be 'Viewer', 'Editor', 'Admin'.
// Tokens is the number of active tokens for the service account. role: #OrgRole @grafanamaturity(ToMetadata="kind")
// Tokens are used to authenticate the service account against Grafana. // Tokens is the number of active tokens for the service account.
tokens: int64 @grafanamaturity(ToMetadata="kind") // Tokens are used to authenticate the service account against Grafana.
// AvatarUrl is the service account's avatar URL. It allows the frontend to display a picture in front tokens: int64 @grafanamaturity(ToMetadata="kind")
// of the service account. // AvatarUrl is the service account's avatar URL. It allows the frontend to display a picture in front
avatarUrl: string @grafanamaturity(ToMetadata="kind") // of the service account.
// AccessControl metadata associated with a given resource. avatarUrl: string @grafanamaturity(ToMetadata="kind")
accessControl?: { // AccessControl metadata associated with a given resource.
[string]: bool @grafanamaturity(ToMetadata="sys") accessControl?: {
} [string]: bool @grafanamaturity(ToMetadata="sys")
}
// Teams is a list of teams the service account belongs to. // Teams is a list of teams the service account belongs to.
teams?: [...string] @grafanamaturity(ToMetadata="sys") teams?: [...string] @grafanamaturity(ToMetadata="sys")
// Created indicates when the service account was created. } @cuetsy(kind="interface")
created?: string & time.Time
// Updated indicates when the service account was updated.
updated?: string & time.Time
// OrgRole is a Grafana Organization Role which can be 'Viewer', 'Editor', 'Admin'. // OrgRole is a Grafana Organization Role which can be 'Viewer', 'Editor', 'Admin'.
#OrgRole: "Admin" | "Editor" | "Viewer" @cuetsy(kind="type") #OrgRole: "Admin" | "Editor" | "Viewer" @cuetsy(kind="type")

View File

@ -1,7 +1,5 @@
package kind package kind
import "time"
name: "Team" name: "Team"
maturity: "merged" maturity: "merged"
description: "A team is a named grouping of Grafana users to which access control rules may be assigned." description: "A team is a named grouping of Grafana users to which access control rules may be assigned."
@ -11,26 +9,24 @@ lineage: seqs: [
schemas: [ schemas: [
// v0.0 // v0.0
{ {
// OrgId is the ID of an organisation the team belongs to. spec: {
orgId: int64 @grafanamaturity(ToMetadata="sys") // OrgId is the ID of an organisation the team belongs to.
// Name of the team. orgId: int64 @grafanamaturity(ToMetadata="sys")
name: string // Name of the team.
// Email of the team. name: string
email?: string // Email of the team.
// AvatarUrl is the team's avatar URL. email?: string
avatarUrl?: string @grafanamaturity(MaybeRemove) // AvatarUrl is the team's avatar URL.
// MemberCount is the number of the team members. avatarUrl?: string @grafanamaturity(MaybeRemove)
memberCount: int64 @grafanamaturity(ToMetadata="kind") // MemberCount is the number of the team members.
// TODO - it seems it's a team_member.permission, unlikely it should belong to the team kind memberCount: int64 @grafanamaturity(ToMetadata="kind")
permission: #Permission @grafanamaturity(ToMetadata="kind", MaybeRemove) // TODO - it seems it's a team_member.permission, unlikely it should belong to the team kind
// AccessControl metadata associated with a given resource. permission: #Permission @grafanamaturity(ToMetadata="kind", MaybeRemove)
accessControl?: { // AccessControl metadata associated with a given resource.
[string]: bool @grafanamaturity(ToMetadata="sys") accessControl?: {
} [string]: bool @grafanamaturity(ToMetadata="sys")
// Created indicates when the team was created. }
created: string & time.Time } @cuetsy(kind="interface")
// Updated indicates when the team was updated.
updated: string & time.Time
#Permission: 0 | 1 | 2 | 4 @cuetsy(kind="enum",memberNames="Member|Viewer|Editor|Admin") #Permission: 0 | 1 | 2 | 4 @cuetsy(kind="enum",memberNames="Member|Viewer|Editor|Admin")
}, },

View File

@ -3,22 +3,11 @@
// Generated by: // Generated by:
// kinds/gen.go // kinds/gen.go
// Using jennies: // Using jennies:
// TSTypesJenny // TSResourceJenny
// LatestMajorsOrXJenny // LatestMajorsOrXJenny
// //
// Run 'make gen-cue' from repository root to regenerate. // Run 'make gen-cue' from repository root to regenerate.
/**
* TODO -- should not be a public interface on its own, but required for Veneer
*/
export interface AnnotationContainer {
list?: Array<AnnotationQuery>;
}
export const defaultAnnotationContainer: Partial<AnnotationContainer> = {
list: [],
};
/** /**
* TODO: this should be a regular DataQuery that depends on the selected dashboard * TODO: this should be a regular DataQuery that depends on the selected dashboard
* these match the properties of the "grafana" datasouce that is default in most dashboards * these match the properties of the "grafana" datasouce that is default in most dashboards
@ -66,6 +55,17 @@ export const defaultAnnotationPanelFilter: Partial<AnnotationPanelFilter> = {
ids: [], ids: [],
}; };
/**
* TODO -- should not be a public interface on its own, but required for Veneer
*/
export interface AnnotationContainer {
list?: Array<AnnotationQuery>;
}
export const defaultAnnotationContainer: Partial<AnnotationContainer> = {
list: [],
};
/** /**
* TODO docs * TODO docs
* FROM: AnnotationQuery in grafana-data/src/types/annotations.ts * FROM: AnnotationQuery in grafana-data/src/types/annotations.ts

View File

@ -3,7 +3,7 @@
// Generated by: // Generated by:
// kinds/gen.go // kinds/gen.go
// Using jennies: // Using jennies:
// TSTypesJenny // TSResourceJenny
// LatestMajorsOrXJenny // LatestMajorsOrXJenny
// //
// Run 'make gen-cue' from repository root to regenerate. // Run 'make gen-cue' from repository root to regenerate.

View File

@ -3,7 +3,7 @@
// Generated by: // Generated by:
// kinds/gen.go // kinds/gen.go
// Using jennies: // Using jennies:
// TSTypesJenny // TSResourceJenny
// LatestMajorsOrXJenny // LatestMajorsOrXJenny
// //
// Run 'make gen-cue' from repository root to regenerate. // Run 'make gen-cue' from repository root to regenerate.

View File

@ -3,7 +3,7 @@
// Generated by: // Generated by:
// kinds/gen.go // kinds/gen.go
// Using jennies: // Using jennies:
// TSTypesJenny // TSResourceJenny
// LatestMajorsOrXJenny // LatestMajorsOrXJenny
// //
// Run 'make gen-cue' from repository root to regenerate. // Run 'make gen-cue' from repository root to regenerate.
@ -13,7 +13,7 @@ export interface QueryHistoryPreference {
* one of: '' | 'query' | 'starred'; * one of: '' | 'query' | 'starred';
*/ */
homeTab?: string; homeTab?: string;
} // 0.0 }
export interface Preferences { export interface Preferences {
/** /**

View File

@ -3,7 +3,7 @@
// Generated by: // Generated by:
// kinds/gen.go // kinds/gen.go
// Using jennies: // Using jennies:
// TSTypesJenny // TSResourceJenny
// LatestMajorsOrXJenny // LatestMajorsOrXJenny
// //
// Run 'make gen-cue' from repository root to regenerate. // Run 'make gen-cue' from repository root to regenerate.

View File

@ -3,7 +3,7 @@
// Generated by: // Generated by:
// kinds/gen.go // kinds/gen.go
// Using jennies: // Using jennies:
// TSTypesJenny // TSResourceJenny
// LatestMajorsOrXJenny // LatestMajorsOrXJenny
// //
// Run 'make gen-cue' from repository root to regenerate. // Run 'make gen-cue' from repository root to regenerate.
@ -23,10 +23,6 @@ export interface ServiceAccount {
* of the service account. * of the service account.
*/ */
avatarUrl: string; avatarUrl: string;
/**
* Created indicates when the service account was created.
*/
created?: string;
/** /**
* ID is the unique identifier of the service account in the database. * ID is the unique identifier of the service account in the database.
*/ */
@ -60,10 +56,6 @@ export interface ServiceAccount {
* Tokens are used to authenticate the service account against Grafana. * Tokens are used to authenticate the service account against Grafana.
*/ */
tokens: number; tokens: number;
/**
* Updated indicates when the service account was updated.
*/
updated?: string;
} }
export const defaultServiceAccount: Partial<ServiceAccount> = { export const defaultServiceAccount: Partial<ServiceAccount> = {

View File

@ -3,7 +3,7 @@
// Generated by: // Generated by:
// kinds/gen.go // kinds/gen.go
// Using jennies: // Using jennies:
// TSTypesJenny // TSResourceJenny
// LatestMajorsOrXJenny // LatestMajorsOrXJenny
// //
// Run 'make gen-cue' from repository root to regenerate. // Run 'make gen-cue' from repository root to regenerate.
@ -24,10 +24,6 @@ export interface Team {
* AvatarUrl is the team's avatar URL. * AvatarUrl is the team's avatar URL.
*/ */
avatarUrl?: string; avatarUrl?: string;
/**
* Created indicates when the team was created.
*/
created: string;
/** /**
* Email of the team. * Email of the team.
*/ */
@ -48,8 +44,4 @@ export interface Team {
* TODO - it seems it's a team_member.permission, unlikely it should belong to the team kind * TODO - it seems it's a team_member.permission, unlikely it should belong to the team kind
*/ */
permission: Permission; permission: Permission;
/**
* Updated indicates when the team was updated.
*/
updated: string;
} }

View File

@ -840,7 +840,10 @@ func (hs *HTTPServer) ValidateDashboard(c *contextmodel.ReqContext) response.Res
// work), or if schemaVersion is absent (which will happen once the Thema // work), or if schemaVersion is absent (which will happen once the Thema
// schema becomes canonical). // schema becomes canonical).
if err != nil || schemaVersion >= dashboard.HandoffSchemaVersion { if err != nil || schemaVersion >= dashboard.HandoffSchemaVersion {
_, _, validationErr := dk.JSONValueMux(dashboardBytes) // Schemas expect the dashboard to live in the spec field
k8sResource := `{"spec": ` + cmd.Dashboard + "}"
_, _, validationErr := dk.JSONValueMux([]byte(k8sResource))
if validationErr == nil { if validationErr == nil {
isValid = true isValid = true

View File

@ -85,7 +85,7 @@ func (hs *HTTPServer) getPreferencesFor(ctx context.Context, orgID, userID, team
} }
} }
dto := preferences.Preferences{} dto := preferences.Spec{}
if preference.WeekStart != nil && *preference.WeekStart != "" { if preference.WeekStart != nil && *preference.WeekStart != "" {
dto.WeekStart = preference.WeekStart dto.WeekStart = preference.WeekStart
@ -302,7 +302,7 @@ type UpdateOrgPreferencesParams struct {
// swagger:response getPreferencesResponse // swagger:response getPreferencesResponse
type GetPreferencesResponse struct { type GetPreferencesResponse struct {
// in:body // in:body
Body preferences.Preferences `json:"body"` Body preferences.Spec `json:"body"`
} }
// swagger:parameters patchUserPreferences // swagger:parameters patchUserPreferences

View File

@ -8,21 +8,25 @@ import (
"github.com/grafana/kindsys" "github.com/grafana/kindsys"
) )
// LatestMajorsOrXJenny returns a jenny that repeats the input for the latest in each major version, // LatestMajorsOrXJenny returns a jenny that repeats the input for the latest in each major version.
func LatestMajorsOrXJenny(parentdir string, inner codejen.OneToOne[SchemaForGen]) OneToMany { //
// TODO remove forceGroup option, it's a temporary hack to accommodate core kinds
func LatestMajorsOrXJenny(parentdir string, forceGroup bool, inner codejen.OneToOne[SchemaForGen]) OneToMany {
if inner == nil { if inner == nil {
panic("inner jenny must not be nil") panic("inner jenny must not be nil")
} }
return &lmox{ return &lmox{
parentdir: parentdir, parentdir: parentdir,
inner: inner, inner: inner,
forceGroup: forceGroup,
} }
} }
type lmox struct { type lmox struct {
parentdir string parentdir string
inner codejen.OneToOne[SchemaForGen] inner codejen.OneToOne[SchemaForGen]
forceGroup bool
} }
func (j *lmox) JennyName() string { func (j *lmox) JennyName() string {
@ -36,6 +40,10 @@ func (j *lmox) Generate(kind kindsys.Kind) (codejen.Files, error) {
IsGroup: comm.LineageIsGroup, IsGroup: comm.LineageIsGroup,
} }
if j.forceGroup {
sfg.IsGroup = true
}
do := func(sfg SchemaForGen, infix string) (codejen.Files, error) { do := func(sfg SchemaForGen, infix string) (codejen.Files, error) {
f, err := j.inner.Generate(sfg) f, err := j.inner.Generate(sfg)
if err != nil { if err != nil {

View File

@ -0,0 +1,118 @@
package codegen
import (
"bytes"
"fmt"
"strings"
"cuelang.org/go/cue"
"github.com/dave/dst/dstutil"
"github.com/grafana/codejen"
"github.com/grafana/kindsys"
"github.com/grafana/thema/encoding/gocode"
"github.com/grafana/thema/encoding/openapi"
)
type ResourceGoTypesJenny struct {
ApplyFuncs []dstutil.ApplyFunc
ExpandReferences bool
}
func (*ResourceGoTypesJenny) JennyName() string {
return "GoTypesJenny"
}
func (ag *ResourceGoTypesJenny) Generate(kind kindsys.Kind) (*codejen.File, error) {
comm := kind.Props().Common()
sfg := SchemaForGen{
Name: comm.Name,
Schema: kind.Lineage().Latest(),
IsGroup: comm.LineageIsGroup,
}
sch := sfg.Schema
iter, err := sch.Underlying().Fields()
if err != nil {
return nil, err
}
var subr []string
for iter.Next() {
subr = append(subr, typeNameFromKey(iter.Selector().String()))
}
buf := new(bytes.Buffer)
mname := kind.Props().Common().MachineName
if err := tmpls.Lookup("core_resource.tmpl").Execute(buf, tvars_resource{
PackageName: mname,
KindName: kind.Props().Common().Name,
SubresourceNames: subr,
}); err != nil {
return nil, fmt.Errorf("failed executing core resource template: %w", err)
}
if err != nil {
return nil, err
}
return codejen.NewFile(fmt.Sprintf("pkg/kinds/%s/%s_gen.go", mname, mname), buf.Bytes(), ag), nil
}
type SubresourceGoTypesJenny struct {
ApplyFuncs []dstutil.ApplyFunc
ExpandReferences bool
}
func (*SubresourceGoTypesJenny) JennyName() string {
return "GoResourceTypes"
}
func (g *SubresourceGoTypesJenny) Generate(kind kindsys.Kind) (codejen.Files, error) {
comm := kind.Props().Common()
sfg := SchemaForGen{
Name: comm.Name,
Schema: kind.Lineage().Latest(),
IsGroup: comm.LineageIsGroup,
}
sch := sfg.Schema
// Iterate through all top-level fields and make go types for them
// (this should consist of "spec" and arbitrary subresources)
i, err := sch.Underlying().Fields()
if err != nil {
return nil, err
}
files := make(codejen.Files, 0)
for i.Next() {
str := i.Selector().String()
b, err := gocode.GenerateTypesOpenAPI(sch, &gocode.TypeConfigOpenAPI{
// TODO will need to account for sanitizing e.g. dashes here at some point
Config: &openapi.Config{
Group: false, // TODO: better
RootName: typeNameFromKey(str),
Subpath: cue.MakePath(cue.Str(str)),
},
PackageName: sfg.Schema.Lineage().Name(),
ApplyFuncs: append(g.ApplyFuncs, PrefixDropper(sfg.Name)),
})
if err != nil {
return nil, err
}
name := sfg.Schema.Lineage().Name()
files = append(files, codejen.File{
RelativePath: fmt.Sprintf("pkg/kinds/%s/%s_%s_gen.go", name, name, strings.ToLower(str)),
Data: b,
From: []codejen.NamedJenny{g},
})
}
return files, nil
}
func typeNameFromKey(key string) string {
if len(key) > 0 {
return strings.ToUpper(key[:1]) + key[1:]
}
return strings.ToUpper(key)
}

View File

@ -0,0 +1,79 @@
package codegen
import (
"github.com/grafana/codejen"
"github.com/grafana/cuetsy/ts"
"github.com/grafana/cuetsy/ts/ast"
"github.com/grafana/thema/encoding/typescript"
)
// TSResourceJenny is a [OneToOne] that produces TypeScript types and
// defaults for a Thema schema.
//
// Thema's generic TS jenny will be able to replace this one once
// https://github.com/grafana/thema/issues/89 is complete.
type TSResourceJenny struct{}
var _ codejen.OneToOne[SchemaForGen] = &TSResourceJenny{}
func (j TSResourceJenny) JennyName() string {
return "TSResourceJenny"
}
func (j TSResourceJenny) Generate(sfg SchemaForGen) (*codejen.File, error) {
// TODO allow using name instead of machine name in thema generator
f, err := typescript.GenerateTypes(sfg.Schema, &typescript.TypeConfig{
RootName: sfg.Name,
Group: sfg.IsGroup,
})
if err != nil {
return nil, err
}
renameSpecNode(sfg.Name, f)
return codejen.NewFile(sfg.Schema.Lineage().Name()+"_types.gen.ts", []byte(f.String()), j), nil
}
func renameSpecNode(name string, tf *ast.File) {
specidx, specdefidx := -1, -1
for idx, def := range tf.Nodes {
// Peer through export keywords
if ex, is := def.(ast.ExportKeyword); is {
def = ex.Decl
}
switch x := def.(type) {
case ast.TypeDecl:
if x.Name.Name == "spec" {
specidx = idx
x.Name.Name = name
tf.Nodes[idx] = x
}
case ast.VarDecl:
// Before:
// export const defaultspec: Partial<spec> = {
// After:
/// export const defaultPlaylist: Partial<Playlist> = {
if x.Names.Idents[0].Name == "defaultspec" {
specdefidx = idx
x.Names.Idents[0].Name = "default" + name
tt := x.Type.(ast.TypeTransformExpr)
tt.Expr = ts.Ident(name)
x.Type = tt
tf.Nodes[idx] = x
}
}
}
if specidx != -1 {
decl := tf.Nodes[specidx]
tf.Nodes = append(append(tf.Nodes[:specidx], tf.Nodes[specidx+1:]...), decl)
}
if specdefidx != -1 {
if specdefidx > specidx {
specdefidx--
}
decl := tf.Nodes[specdefidx]
tf.Nodes = append(append(tf.Nodes[:specdefidx], tf.Nodes[specdefidx+1:]...), decl)
}
}

View File

@ -50,6 +50,7 @@ func (gen *genTSVeneerIndex) Generate(kinds ...kindsys.Kind) (*codejen.File, err
if err != nil { if err != nil {
return nil, fmt.Errorf("%s: %w", def.Props().Common().Name, err) return nil, fmt.Errorf("%s: %w", def.Props().Common().Name, err)
} }
renameSpecNode(def.Props().Common().Name, f)
elems, err := gen.extractTSIndexVeneerElements(def, f) elems, err := gen.extractTSIndexVeneerElements(def, f)
if err != nil { if err != nil {
return nil, fmt.Errorf("%s: %w", def.Props().Common().Name, err) return nil, fmt.Errorf("%s: %w", def.Props().Common().Name, err)
@ -75,13 +76,13 @@ func (gen *genTSVeneerIndex) extractTSIndexVeneerElements(def kindsys.Kind, tf *
sels := p.Selectors() sels := p.Selectors()
switch len(sels) { switch len(sels) {
case 0: case 0:
name = comm.Name return true
fallthrough
case 1: case 1:
// Only deal with subpaths that are definitions, for now // Only deal with subpaths that are definitions, for now
// TODO incorporate smarts about grouped lineages here // TODO incorporate smarts about grouped lineages here
if name == "" { if name == "" {
if !sels[0].IsDefinition() { if !(sels[0].IsDefinition() || sels[0].String() == "spec") {
return false return false
} }
// It might seem to make sense that we'd strip replaceout the leading # here for // It might seem to make sense that we'd strip replaceout the leading # here for
@ -90,6 +91,10 @@ func (gen *genTSVeneerIndex) extractTSIndexVeneerElements(def kindsys.Kind, tf *
name = sels[0].String() name = sels[0].String()
} }
if name == "spec" {
name = comm.Name
}
// Search the generated TS AST for the type and default def nodes // Search the generated TS AST for the type and default def nodes
pair := findDeclNode(name, tf) pair := findDeclNode(name, tf)
if pair.T == nil { if pair.T == nil {

View File

@ -3,6 +3,7 @@ package codegen
import ( import (
"bytes" "bytes"
"embed" "embed"
"strings"
"text/template" "text/template"
"time" "time"
@ -15,7 +16,8 @@ var tmpls *template.Template
func init() { func init() {
base := template.New("codegen").Funcs(template.FuncMap{ base := template.New("codegen").Funcs(template.FuncMap{
"now": time.Now, "now": time.Now,
"ToLower": strings.ToLower,
}) })
tmpls = template.Must(base.ParseFS(tmplFS, "tmpl/*.tmpl")) tmpls = template.Must(base.ParseFS(tmplFS, "tmpl/*.tmpl"))
} }
@ -46,6 +48,11 @@ type (
tvars_coremodel_imports struct { tvars_coremodel_imports struct {
PackageName string PackageName string
} }
tvars_resource struct {
PackageName string
KindName string
SubresourceNames []string
}
) )
type HeaderVars = tvars_autogen_header type HeaderVars = tvars_autogen_header

View File

@ -0,0 +1,7 @@
package {{ .PackageName }}
// Resource is the wire representation of {{ .KindName }}. (TODO be better)
type Resource struct {
{{- range .SubresourceNames }}
{{ . }} {{ . }} `json:"{{ . | ToLower }}"`{{end}}
}

View File

@ -17,9 +17,9 @@ const rootrel string = "kinds/{{ .Props.MachineName }}"
// TODO standard generated docs // TODO standard generated docs
type Kind struct { type Kind struct {
kindsys.Core kindsys.Core
lin thema.ConvergentLineage[*{{ .Props.Name }}] lin thema.ConvergentLineage[*Resource]
jcodec vmux.Codec jcodec vmux.Codec
valmux vmux.ValueMux[*{{ .Props.Name }}] valmux vmux.ValueMux[*Resource]
} }
// type guard - ensure generated Kind type satisfies the kindsys.Core interface // type guard - ensure generated Kind type satisfies the kindsys.Core interface
@ -40,7 +40,7 @@ func NewKind(rt *thema.Runtime, opts ...thema.BindOption) (*Kind, error) {
// Get the thema.Schema that the meta says is in the current version (which // Get the thema.Schema that the meta says is in the current version (which
// codegen ensures is always the latest) // codegen ensures is always the latest)
cursch := thema.SchemaP(k.Core.Lineage(), def.Properties.CurrentVersion) cursch := thema.SchemaP(k.Core.Lineage(), def.Properties.CurrentVersion)
tsch, err := thema.BindType[*{{ .Props.Name }}](cursch, &{{ .Props.Name }}{}) tsch, err := thema.BindType(cursch, &Resource{})
if err != nil { if err != nil {
// Should be unreachable, modulo bugs in the Thema->Go code generator // Should be unreachable, modulo bugs in the Thema->Go code generator
return nil, err return nil, err
@ -53,18 +53,18 @@ func NewKind(rt *thema.Runtime, opts ...thema.BindOption) (*Kind, error) {
} }
// ConvergentLineage returns the same [thema.Lineage] as Lineage, but bound (see [thema.BindType]) // ConvergentLineage returns the same [thema.Lineage] as Lineage, but bound (see [thema.BindType])
// to the the {{ .Props.Name }} type generated from the current schema, v{{ .Props.CurrentVersion }}. // to the the {{ .Props.Name }} [Resource] type generated from the current schema, v{{ .Props.CurrentVersion }}.
func (k *Kind) ConvergentLineage() thema.ConvergentLineage[*{{ .Props.Name }}] { func (k *Kind) ConvergentLineage() thema.ConvergentLineage[*Resource] {
return k.lin return k.lin
} }
// JSONValueMux is a version multiplexer that maps a []byte containing JSON data // JSONValueMux is a version multiplexer that maps a []byte containing JSON data
// at any schematized dashboard version to an instance of {{ .Props.Name }}. // at any schematized dashboard version to an instance of {{ .Props.Name }} [Resource].
// //
// Validation and translation errors emitted from this func will identify the // Validation and translation errors emitted from this func will identify the
// input bytes as "dashboard.json". // input bytes as "dashboard.json".
// //
// This is a thin wrapper around Thema's [vmux.ValueMux]. // This is a thin wrapper around Thema's [vmux.ValueMux].
func (k *Kind) JSONValueMux(b []byte) (*{{ .Props.Name }}, thema.TranslationLacunas, error) { func (k *Kind) JSONValueMux(b []byte) (*Resource, thema.TranslationLacunas, error) {
return k.valmux(b) return k.valmux(b)
} }

View File

@ -0,0 +1,17 @@
// Code generated - EDITING IS FUTILE. DO NOT EDIT.
//
// Generated by:
// kinds/gen.go
// Using jennies:
// GoTypesJenny
//
// Run 'make gen-cue' from repository root to regenerate.
package dashboard
// Resource is the wire representation of Dashboard. (TODO be better)
type Resource struct {
Metadata Metadata `json:"metadata"`
Spec Spec `json:"spec"`
Status Status `json:"status"`
}

View File

@ -26,9 +26,9 @@ const rootrel string = "kinds/dashboard"
// TODO standard generated docs // TODO standard generated docs
type Kind struct { type Kind struct {
kindsys.Core kindsys.Core
lin thema.ConvergentLineage[*Dashboard] lin thema.ConvergentLineage[*Resource]
jcodec vmux.Codec jcodec vmux.Codec
valmux vmux.ValueMux[*Dashboard] valmux vmux.ValueMux[*Resource]
} }
// type guard - ensure generated Kind type satisfies the kindsys.Core interface // type guard - ensure generated Kind type satisfies the kindsys.Core interface
@ -49,7 +49,7 @@ func NewKind(rt *thema.Runtime, opts ...thema.BindOption) (*Kind, error) {
// Get the thema.Schema that the meta says is in the current version (which // Get the thema.Schema that the meta says is in the current version (which
// codegen ensures is always the latest) // codegen ensures is always the latest)
cursch := thema.SchemaP(k.Core.Lineage(), def.Properties.CurrentVersion) cursch := thema.SchemaP(k.Core.Lineage(), def.Properties.CurrentVersion)
tsch, err := thema.BindType[*Dashboard](cursch, &Dashboard{}) tsch, err := thema.BindType(cursch, &Resource{})
if err != nil { if err != nil {
// Should be unreachable, modulo bugs in the Thema->Go code generator // Should be unreachable, modulo bugs in the Thema->Go code generator
return nil, err return nil, err
@ -62,18 +62,18 @@ func NewKind(rt *thema.Runtime, opts ...thema.BindOption) (*Kind, error) {
} }
// ConvergentLineage returns the same [thema.Lineage] as Lineage, but bound (see [thema.BindType]) // ConvergentLineage returns the same [thema.Lineage] as Lineage, but bound (see [thema.BindType])
// to the the Dashboard type generated from the current schema, v0.0. // to the the Dashboard [Resource] type generated from the current schema, v0.0.
func (k *Kind) ConvergentLineage() thema.ConvergentLineage[*Dashboard] { func (k *Kind) ConvergentLineage() thema.ConvergentLineage[*Resource] {
return k.lin return k.lin
} }
// JSONValueMux is a version multiplexer that maps a []byte containing JSON data // JSONValueMux is a version multiplexer that maps a []byte containing JSON data
// at any schematized dashboard version to an instance of Dashboard. // at any schematized dashboard version to an instance of Dashboard [Resource].
// //
// Validation and translation errors emitted from this func will identify the // Validation and translation errors emitted from this func will identify the
// input bytes as "dashboard.json". // input bytes as "dashboard.json".
// //
// This is a thin wrapper around Thema's [vmux.ValueMux]. // This is a thin wrapper around Thema's [vmux.ValueMux].
func (k *Kind) JSONValueMux(b []byte) (*Dashboard, thema.TranslationLacunas, error) { func (k *Kind) JSONValueMux(b []byte) (*Resource, thema.TranslationLacunas, error) {
return k.valmux(b) return k.valmux(b)
} }

View File

@ -0,0 +1,42 @@
// Code generated - EDITING IS FUTILE. DO NOT EDIT.
//
// Generated by:
// kinds/gen.go
// Using jennies:
// GoResourceTypes
//
// Run 'make gen-cue' from repository root to regenerate.
package dashboard
import (
"time"
)
// Metadata defines model for Metadata.
type Metadata struct {
CreatedBy string `json:"createdBy"`
CreationTimestamp time.Time `json:"creationTimestamp"`
DeletionTimestamp *time.Time `json:"deletionTimestamp,omitempty"`
// extraFields is reserved for any fields that are pulled from the API server metadata but do not have concrete fields in the CUE metadata
ExtraFields map[string]interface{} `json:"extraFields"`
Finalizers []string `json:"finalizers"`
Labels map[string]string `json:"labels"`
ResourceVersion string `json:"resourceVersion"`
Uid string `json:"uid"`
UpdateTimestamp time.Time `json:"updateTimestamp"`
UpdatedBy string `json:"updatedBy"`
}
// _kubeObjectMetadata is metadata found in a kubernetes object's metadata field.
// It is not exhaustive and only includes fields which may be relevant to a kind's implementation,
// As it is also intended to be generic enough to function with any API Server.
type KubeObjectMetadata struct {
CreationTimestamp time.Time `json:"creationTimestamp"`
DeletionTimestamp *time.Time `json:"deletionTimestamp,omitempty"`
Finalizers []string `json:"finalizers"`
Labels map[string]string `json:"labels"`
ResourceVersion string `json:"resourceVersion"`
Uid string `json:"uid"`
}

View File

@ -3,8 +3,7 @@
// Generated by: // Generated by:
// kinds/gen.go // kinds/gen.go
// Using jennies: // Using jennies:
// GoTypesJenny // GoResourceTypes
// LatestJenny
// //
// Run 'make gen-cue' from repository root to regenerate. // Run 'make gen-cue' from repository root to regenerate.
@ -14,12 +13,6 @@ import (
"time" "time"
) )
// Defines values for Style.
const (
StyleDark Style = "dark"
StyleLight Style = "light"
)
// Defines values for CursorSync. // Defines values for CursorSync.
const ( const (
CursorSyncN0 CursorSync = 0 CursorSyncN0 CursorSync = 0
@ -33,15 +26,6 @@ const (
LinkTypeLink LinkType = "link" LinkTypeLink LinkType = "link"
) )
// Defines values for FieldColorModeId.
const (
FieldColorModeIdContinuousGrYlRd FieldColorModeId = "continuous-GrYlRd"
FieldColorModeIdFixed FieldColorModeId = "fixed"
FieldColorModeIdPaletteClassic FieldColorModeId = "palette-classic"
FieldColorModeIdPaletteSaturated FieldColorModeId = "palette-saturated"
FieldColorModeIdThresholds FieldColorModeId = "thresholds"
)
// Defines values for FieldColorSeriesByMode. // Defines values for FieldColorSeriesByMode.
const ( const (
FieldColorSeriesByModeLast FieldColorSeriesByMode = "last" FieldColorSeriesByModeLast FieldColorSeriesByMode = "last"
@ -103,6 +87,12 @@ const (
RowPanelTypeRow RowPanelType = "row" RowPanelTypeRow RowPanelType = "row"
) )
// Defines values for SpecStyle.
const (
SpecStyleDark SpecStyle = "dark"
SpecStyleLight SpecStyle = "light"
)
// Defines values for SpecialValueMapOptionsMatch. // Defines values for SpecialValueMapOptionsMatch.
const ( const (
SpecialValueMapOptionsMatchFalse SpecialValueMapOptionsMatch = "false" SpecialValueMapOptionsMatchFalse SpecialValueMapOptionsMatch = "false"
@ -117,16 +107,6 @@ const (
SpecialValueMapTypeValue SpecialValueMapType = "value" SpecialValueMapTypeValue SpecialValueMapType = "value"
) )
// Defines values for SpecialValueMatch.
const (
SpecialValueMatchEmpty SpecialValueMatch = "empty"
SpecialValueMatchFalse SpecialValueMatch = "false"
SpecialValueMatchNan SpecialValueMatch = "nan"
SpecialValueMatchNull SpecialValueMatch = "null"
SpecialValueMatchNullNan SpecialValueMatch = "null+nan"
SpecialValueMatchTrue SpecialValueMatch = "true"
)
// Defines values for ThresholdsMode. // Defines values for ThresholdsMode.
const ( const (
ThresholdsModeAbsolute ThresholdsMode = "absolute" ThresholdsModeAbsolute ThresholdsMode = "absolute"
@ -225,112 +205,6 @@ type AnnotationTarget struct {
Type string `json:"type"` Type string `json:"type"`
} }
// Dashboard defines model for Dashboard.
type Dashboard struct {
// TODO -- should not be a public interface on its own, but required for Veneer
Annotations *AnnotationContainer `json:"annotations,omitempty"`
// Description of dashboard.
Description *string `json:"description,omitempty"`
// Whether a dashboard is editable or not.
Editable bool `json:"editable"`
// The month that the fiscal year starts on. 0 = January, 11 = December
FiscalYearStartMonth *int `json:"fiscalYearStartMonth,omitempty"`
// For dashboards imported from the https://grafana.com/grafana/dashboards/ portal
GnetId *string `json:"gnetId,omitempty"`
// 0 for no shared crosshair or tooltip (default).
// 1 for shared crosshair.
// 2 for shared crosshair AND shared tooltip.
GraphTooltip CursorSync `json:"graphTooltip"`
// Unique numeric identifier for the dashboard.
// TODO must isolate or remove identifiers local to a Grafana instance...?
Id *int64 `json:"id,omitempty"`
// TODO docs
Links []Link `json:"links,omitempty"`
// When set to true, the dashboard will redraw panels at an interval matching the pixel width.
// This will keep data "moving left" regardless of the query refresh rate. This setting helps
// avoid dashboards presenting stale live data
LiveNow *bool `json:"liveNow,omitempty"`
Panels []interface{} `json:"panels,omitempty"`
// Refresh rate of dashboard. Represented via interval string, e.g. "5s", "1m", "1h", "1d".
Refresh *interface{} `json:"refresh,omitempty"`
// This property should only be used in dashboards defined by plugins. It is a quick check
// to see if the version has changed since the last time. Unclear why using the version property
// is insufficient.
Revision *int64 `json:"revision,omitempty"`
// Version of the JSON schema, incremented each time a Grafana update brings
// changes to said schema.
// TODO this is the existing schema numbering system. It will be replaced by Thema's themaVersion
SchemaVersion int `json:"schemaVersion"`
// TODO docs
Snapshot *Snapshot `json:"snapshot,omitempty"`
// Theme of dashboard.
Style Style `json:"style"`
// Tags associated with dashboard.
Tags []string `json:"tags,omitempty"`
// TODO docs
Templating *struct {
List []VariableModel `json:"list,omitempty"`
} `json:"templating,omitempty"`
// Time range for dashboard, e.g. last 6 hours, last 7 days, etc
Time *struct {
From string `json:"from"`
To string `json:"to"`
} `json:"time,omitempty"`
// TODO docs
// TODO this appears to be spread all over in the frontend. Concepts will likely need tidying in tandem with schema changes
Timepicker *struct {
// Whether timepicker is collapsed or not.
Collapse bool `json:"collapse"`
// Whether timepicker is enabled or not.
Enable bool `json:"enable"`
// Whether timepicker is visible or not.
Hidden bool `json:"hidden"`
// Selectable intervals for auto-refresh.
RefreshIntervals []string `json:"refresh_intervals"`
// TODO docs
TimeOptions []string `json:"time_options"`
} `json:"timepicker,omitempty"`
// Timezone of dashboard. Accepts IANA TZDB zone ID or "browser" or "utc".
Timezone *string `json:"timezone,omitempty"`
// Title of dashboard.
Title *string `json:"title,omitempty"`
// Unique dashboard identifier that can be generated by anyone. string (8-40)
Uid *string `json:"uid,omitempty"`
// Version of the dashboard, incremented each time the dashboard is updated.
Version *int `json:"version,omitempty"`
// TODO docs
WeekStart *string `json:"weekStart,omitempty"`
}
// Theme of dashboard.
type Style string
// 0 for no shared crosshair or tooltip (default). // 0 for no shared crosshair or tooltip (default).
// 1 for shared crosshair. // 1 for shared crosshair.
// 2 for shared crosshair AND shared tooltip. // 2 for shared crosshair AND shared tooltip.
@ -397,9 +271,6 @@ type FieldColor struct {
SeriesBy *FieldColorSeriesByMode `json:"seriesBy,omitempty"` SeriesBy *FieldColorSeriesByMode `json:"seriesBy,omitempty"`
} }
// TODO docs
type FieldColorModeId string
// TODO docs // TODO docs
type FieldColorSeriesByMode string type FieldColorSeriesByMode string
@ -693,6 +564,112 @@ type Snapshot struct {
UserId int `json:"userId"` UserId int `json:"userId"`
} }
// Spec defines model for Spec.
type Spec struct {
// TODO -- should not be a public interface on its own, but required for Veneer
Annotations *AnnotationContainer `json:"annotations,omitempty"`
// Description of dashboard.
Description *string `json:"description,omitempty"`
// Whether a dashboard is editable or not.
Editable bool `json:"editable"`
// The month that the fiscal year starts on. 0 = January, 11 = December
FiscalYearStartMonth *int `json:"fiscalYearStartMonth,omitempty"`
// For dashboards imported from the https://grafana.com/grafana/dashboards/ portal
GnetId *string `json:"gnetId,omitempty"`
// 0 for no shared crosshair or tooltip (default).
// 1 for shared crosshair.
// 2 for shared crosshair AND shared tooltip.
GraphTooltip CursorSync `json:"graphTooltip"`
// Unique numeric identifier for the dashboard.
// TODO must isolate or remove identifiers local to a Grafana instance...?
Id *int64 `json:"id,omitempty"`
// TODO docs
Links []Link `json:"links,omitempty"`
// When set to true, the dashboard will redraw panels at an interval matching the pixel width.
// This will keep data "moving left" regardless of the query refresh rate. This setting helps
// avoid dashboards presenting stale live data
LiveNow *bool `json:"liveNow,omitempty"`
Panels []interface{} `json:"panels,omitempty"`
// Refresh rate of dashboard. Represented via interval string, e.g. "5s", "1m", "1h", "1d".
Refresh *interface{} `json:"refresh,omitempty"`
// This property should only be used in dashboards defined by plugins. It is a quick check
// to see if the version has changed since the last time. Unclear why using the version property
// is insufficient.
Revision *int64 `json:"revision,omitempty"`
// Version of the JSON schema, incremented each time a Grafana update brings
// changes to said schema.
// TODO this is the existing schema numbering system. It will be replaced by Thema's themaVersion
SchemaVersion int `json:"schemaVersion"`
// TODO docs
Snapshot *Snapshot `json:"snapshot,omitempty"`
// Theme of dashboard.
Style SpecStyle `json:"style"`
// Tags associated with dashboard.
Tags []string `json:"tags,omitempty"`
// TODO docs
Templating *struct {
List []VariableModel `json:"list,omitempty"`
} `json:"templating,omitempty"`
// Time range for dashboard, e.g. last 6 hours, last 7 days, etc
Time *struct {
From string `json:"from"`
To string `json:"to"`
} `json:"time,omitempty"`
// TODO docs
// TODO this appears to be spread all over in the frontend. Concepts will likely need tidying in tandem with schema changes
Timepicker *struct {
// Whether timepicker is collapsed or not.
Collapse bool `json:"collapse"`
// Whether timepicker is enabled or not.
Enable bool `json:"enable"`
// Whether timepicker is visible or not.
Hidden bool `json:"hidden"`
// Selectable intervals for auto-refresh.
RefreshIntervals []string `json:"refresh_intervals"`
// TODO docs
TimeOptions []string `json:"time_options"`
} `json:"timepicker,omitempty"`
// Timezone of dashboard. Accepts IANA TZDB zone ID or "browser" or "utc".
Timezone *string `json:"timezone,omitempty"`
// Title of dashboard.
Title *string `json:"title,omitempty"`
// Unique dashboard identifier that can be generated by anyone. string (8-40)
Uid *string `json:"uid,omitempty"`
// Version of the dashboard, incremented each time the dashboard is updated.
Version *int `json:"version,omitempty"`
// TODO docs
WeekStart *string `json:"weekStart,omitempty"`
}
// Theme of dashboard.
type SpecStyle string
// TODO docs // TODO docs
type SpecialValueMap struct { type SpecialValueMap struct {
Options struct { Options struct {
@ -711,9 +688,6 @@ type SpecialValueMapOptionsMatch string
// SpecialValueMapType defines model for SpecialValueMap.Type. // SpecialValueMapType defines model for SpecialValueMap.Type.
type SpecialValueMapType string type SpecialValueMapType string
// TODO docs
type SpecialValueMatch string
// Schema for panel targets is specified by datasource // Schema for panel targets is specified by datasource
// plugins. We use a placeholder definition, which the Go // plugins. We use a placeholder definition, which the Go
// schema loader either left open/as-is with the Base // schema loader either left open/as-is with the Base

View File

@ -0,0 +1,47 @@
// Code generated - EDITING IS FUTILE. DO NOT EDIT.
//
// Generated by:
// kinds/gen.go
// Using jennies:
// GoResourceTypes
//
// Run 'make gen-cue' from repository root to regenerate.
package dashboard
// Defines values for OperatorStateState.
const (
OperatorStateStateFailed OperatorStateState = "failed"
OperatorStateStateInProgress OperatorStateState = "in_progress"
OperatorStateStateSuccess OperatorStateState = "success"
)
// OperatorState defines model for OperatorState.
type OperatorState struct {
// descriptiveState is an optional more descriptive state field which has no requirements on format
DescriptiveState *string `json:"descriptiveState,omitempty"`
// details contains any extra information that is operator-specific
Details map[string]interface{} `json:"details,omitempty"`
// lastEvaluation is the ResourceVersion last evaluated
LastEvaluation string `json:"lastEvaluation"`
// state describes the state of the lastEvaluation.
// It is limited to three possible states for machine evaluation.
State OperatorStateState `json:"state"`
}
// OperatorStateState state describes the state of the lastEvaluation.
// It is limited to three possible states for machine evaluation.
type OperatorStateState string
// Status defines model for Status.
type Status struct {
// additionalFields is reserved for future use
AdditionalFields map[string]interface{} `json:"additionalFields"`
// operatorStates is a map of operator ID to operator state evaluations.
// Any operator which consumes this kind SHOULD add its state evaluation information to this field.
OperatorStates map[string]OperatorState `json:"operatorStates,omitempty"`
}

View File

@ -1,89 +0,0 @@
package dashboard_test
import (
"encoding/json"
"io"
"io/fs"
"os"
"path/filepath"
"strings"
"testing"
"cuelang.org/go/cue/errors"
"github.com/grafana/grafana/pkg/cuectx"
"github.com/grafana/grafana/pkg/kinds/dashboard"
"github.com/stretchr/testify/require"
)
func TestDevenvDashboardValidity(t *testing.T) {
path, err := filepath.Abs("../../../devenv/dev-dashboards")
require.NoError(t, err)
m, err := themaTestableDashboards(os.DirFS(path))
require.NoError(t, err)
dk, err := dashboard.NewKind(cuectx.GrafanaThemaRuntime())
require.NoError(t, err)
for path, b := range m {
t.Run(path, func(t *testing.T) {
// The path arg here only matters for error output
cv, err := cuectx.JSONtoCUE(path, b)
require.NoError(t, err, "error while decoding dashboard JSON into a CUE value")
_, err = dk.ConvergentLineage().TypedSchema().Validate(cv)
if err != nil {
// Testify trims errors to short length. We want the full text
errstr := errors.Details(err, nil)
t.Log(errstr)
if strings.Contains(errstr, "null") {
t.Log("validation failure appears to involve nulls - see if scripts/stripnulls.sh has any effect?")
}
t.FailNow()
}
})
}
}
func themaTestableDashboards(in fs.FS) (map[string][]byte, error) {
m := make(map[string][]byte)
err := fs.WalkDir(in, ".", func(path string, d fs.DirEntry, err error) error {
if err != nil {
return err
}
if d.IsDir() || filepath.Ext(d.Name()) != ".json" {
return nil
}
// nolint:gosec
f, err := in.Open(path)
if err != nil {
return err
}
defer f.Close() //nolint:errcheck
b, err := io.ReadAll(f)
if err != nil {
return err
}
jtree := make(map[string]interface{})
err = json.Unmarshal(b, &jtree)
if err != nil {
return err
}
if oldschemav, has := jtree["schemaVersion"]; !has || !(oldschemav.(float64) > dashboard.HandoffSchemaVersion-1) {
return nil
}
m[path] = b
return nil
})
if err != nil {
return nil, err
}
return m, nil
}

View File

@ -0,0 +1,17 @@
// Code generated - EDITING IS FUTILE. DO NOT EDIT.
//
// Generated by:
// kinds/gen.go
// Using jennies:
// GoTypesJenny
//
// Run 'make gen-cue' from repository root to regenerate.
package librarypanel
// Resource is the wire representation of LibraryPanel. (TODO be better)
type Resource struct {
Metadata Metadata `json:"metadata"`
Spec Spec `json:"spec"`
Status Status `json:"status"`
}

View File

@ -26,9 +26,9 @@ const rootrel string = "kinds/librarypanel"
// TODO standard generated docs // TODO standard generated docs
type Kind struct { type Kind struct {
kindsys.Core kindsys.Core
lin thema.ConvergentLineage[*LibraryPanel] lin thema.ConvergentLineage[*Resource]
jcodec vmux.Codec jcodec vmux.Codec
valmux vmux.ValueMux[*LibraryPanel] valmux vmux.ValueMux[*Resource]
} }
// type guard - ensure generated Kind type satisfies the kindsys.Core interface // type guard - ensure generated Kind type satisfies the kindsys.Core interface
@ -49,7 +49,7 @@ func NewKind(rt *thema.Runtime, opts ...thema.BindOption) (*Kind, error) {
// Get the thema.Schema that the meta says is in the current version (which // Get the thema.Schema that the meta says is in the current version (which
// codegen ensures is always the latest) // codegen ensures is always the latest)
cursch := thema.SchemaP(k.Core.Lineage(), def.Properties.CurrentVersion) cursch := thema.SchemaP(k.Core.Lineage(), def.Properties.CurrentVersion)
tsch, err := thema.BindType[*LibraryPanel](cursch, &LibraryPanel{}) tsch, err := thema.BindType(cursch, &Resource{})
if err != nil { if err != nil {
// Should be unreachable, modulo bugs in the Thema->Go code generator // Should be unreachable, modulo bugs in the Thema->Go code generator
return nil, err return nil, err
@ -62,18 +62,18 @@ func NewKind(rt *thema.Runtime, opts ...thema.BindOption) (*Kind, error) {
} }
// ConvergentLineage returns the same [thema.Lineage] as Lineage, but bound (see [thema.BindType]) // ConvergentLineage returns the same [thema.Lineage] as Lineage, but bound (see [thema.BindType])
// to the the LibraryPanel type generated from the current schema, v0.0. // to the the LibraryPanel [Resource] type generated from the current schema, v0.0.
func (k *Kind) ConvergentLineage() thema.ConvergentLineage[*LibraryPanel] { func (k *Kind) ConvergentLineage() thema.ConvergentLineage[*Resource] {
return k.lin return k.lin
} }
// JSONValueMux is a version multiplexer that maps a []byte containing JSON data // JSONValueMux is a version multiplexer that maps a []byte containing JSON data
// at any schematized dashboard version to an instance of LibraryPanel. // at any schematized dashboard version to an instance of LibraryPanel [Resource].
// //
// Validation and translation errors emitted from this func will identify the // Validation and translation errors emitted from this func will identify the
// input bytes as "dashboard.json". // input bytes as "dashboard.json".
// //
// This is a thin wrapper around Thema's [vmux.ValueMux]. // This is a thin wrapper around Thema's [vmux.ValueMux].
func (k *Kind) JSONValueMux(b []byte) (*LibraryPanel, thema.TranslationLacunas, error) { func (k *Kind) JSONValueMux(b []byte) (*Resource, thema.TranslationLacunas, error) {
return k.valmux(b) return k.valmux(b)
} }

View File

@ -0,0 +1,42 @@
// Code generated - EDITING IS FUTILE. DO NOT EDIT.
//
// Generated by:
// kinds/gen.go
// Using jennies:
// GoResourceTypes
//
// Run 'make gen-cue' from repository root to regenerate.
package librarypanel
import (
"time"
)
// Metadata defines model for Metadata.
type Metadata struct {
CreatedBy string `json:"createdBy"`
CreationTimestamp time.Time `json:"creationTimestamp"`
DeletionTimestamp *time.Time `json:"deletionTimestamp,omitempty"`
// extraFields is reserved for any fields that are pulled from the API server metadata but do not have concrete fields in the CUE metadata
ExtraFields map[string]interface{} `json:"extraFields"`
Finalizers []string `json:"finalizers"`
Labels map[string]string `json:"labels"`
ResourceVersion string `json:"resourceVersion"`
Uid string `json:"uid"`
UpdateTimestamp time.Time `json:"updateTimestamp"`
UpdatedBy string `json:"updatedBy"`
}
// _kubeObjectMetadata is metadata found in a kubernetes object's metadata field.
// It is not exhaustive and only includes fields which may be relevant to a kind's implementation,
// As it is also intended to be generic enough to function with any API Server.
type KubeObjectMetadata struct {
CreationTimestamp time.Time `json:"creationTimestamp"`
DeletionTimestamp *time.Time `json:"deletionTimestamp,omitempty"`
Finalizers []string `json:"finalizers"`
Labels map[string]string `json:"labels"`
ResourceVersion string `json:"resourceVersion"`
Uid string `json:"uid"`
}

View File

@ -3,8 +3,7 @@
// Generated by: // Generated by:
// kinds/gen.go // kinds/gen.go
// Using jennies: // Using jennies:
// GoTypesJenny // GoResourceTypes
// LatestJenny
// //
// Run 'make gen-cue' from repository root to regenerate. // Run 'make gen-cue' from repository root to regenerate.
@ -32,8 +31,8 @@ type LibraryElementDTOMetaUser struct {
Name string `json:"name"` Name string `json:"name"`
} }
// LibraryPanel defines model for LibraryPanel. // Spec defines model for Spec.
type LibraryPanel struct { type Spec struct {
// Panel description // Panel description
Description *string `json:"description,omitempty"` Description *string `json:"description,omitempty"`

View File

@ -0,0 +1,47 @@
// Code generated - EDITING IS FUTILE. DO NOT EDIT.
//
// Generated by:
// kinds/gen.go
// Using jennies:
// GoResourceTypes
//
// Run 'make gen-cue' from repository root to regenerate.
package librarypanel
// Defines values for OperatorStateState.
const (
OperatorStateStateFailed OperatorStateState = "failed"
OperatorStateStateInProgress OperatorStateState = "in_progress"
OperatorStateStateSuccess OperatorStateState = "success"
)
// OperatorState defines model for OperatorState.
type OperatorState struct {
// descriptiveState is an optional more descriptive state field which has no requirements on format
DescriptiveState *string `json:"descriptiveState,omitempty"`
// details contains any extra information that is operator-specific
Details map[string]interface{} `json:"details,omitempty"`
// lastEvaluation is the ResourceVersion last evaluated
LastEvaluation string `json:"lastEvaluation"`
// state describes the state of the lastEvaluation.
// It is limited to three possible states for machine evaluation.
State OperatorStateState `json:"state"`
}
// OperatorStateState state describes the state of the lastEvaluation.
// It is limited to three possible states for machine evaluation.
type OperatorStateState string
// Status defines model for Status.
type Status struct {
// additionalFields is reserved for future use
AdditionalFields map[string]interface{} `json:"additionalFields"`
// operatorStates is a map of operator ID to operator state evaluations.
// Any operator which consumes this kind SHOULD add its state evaluation information to this field.
OperatorStates map[string]OperatorState `json:"operatorStates,omitempty"`
}

View File

@ -0,0 +1,17 @@
// Code generated - EDITING IS FUTILE. DO NOT EDIT.
//
// Generated by:
// kinds/gen.go
// Using jennies:
// GoTypesJenny
//
// Run 'make gen-cue' from repository root to regenerate.
package playlist
// Resource is the wire representation of Playlist. (TODO be better)
type Resource struct {
Metadata Metadata `json:"metadata"`
Spec Spec `json:"spec"`
Status Status `json:"status"`
}

View File

@ -26,9 +26,9 @@ const rootrel string = "kinds/playlist"
// TODO standard generated docs // TODO standard generated docs
type Kind struct { type Kind struct {
kindsys.Core kindsys.Core
lin thema.ConvergentLineage[*Playlist] lin thema.ConvergentLineage[*Resource]
jcodec vmux.Codec jcodec vmux.Codec
valmux vmux.ValueMux[*Playlist] valmux vmux.ValueMux[*Resource]
} }
// type guard - ensure generated Kind type satisfies the kindsys.Core interface // type guard - ensure generated Kind type satisfies the kindsys.Core interface
@ -49,7 +49,7 @@ func NewKind(rt *thema.Runtime, opts ...thema.BindOption) (*Kind, error) {
// Get the thema.Schema that the meta says is in the current version (which // Get the thema.Schema that the meta says is in the current version (which
// codegen ensures is always the latest) // codegen ensures is always the latest)
cursch := thema.SchemaP(k.Core.Lineage(), def.Properties.CurrentVersion) cursch := thema.SchemaP(k.Core.Lineage(), def.Properties.CurrentVersion)
tsch, err := thema.BindType[*Playlist](cursch, &Playlist{}) tsch, err := thema.BindType(cursch, &Resource{})
if err != nil { if err != nil {
// Should be unreachable, modulo bugs in the Thema->Go code generator // Should be unreachable, modulo bugs in the Thema->Go code generator
return nil, err return nil, err
@ -62,18 +62,18 @@ func NewKind(rt *thema.Runtime, opts ...thema.BindOption) (*Kind, error) {
} }
// ConvergentLineage returns the same [thema.Lineage] as Lineage, but bound (see [thema.BindType]) // ConvergentLineage returns the same [thema.Lineage] as Lineage, but bound (see [thema.BindType])
// to the the Playlist type generated from the current schema, v0.0. // to the the Playlist [Resource] type generated from the current schema, v0.0.
func (k *Kind) ConvergentLineage() thema.ConvergentLineage[*Playlist] { func (k *Kind) ConvergentLineage() thema.ConvergentLineage[*Resource] {
return k.lin return k.lin
} }
// JSONValueMux is a version multiplexer that maps a []byte containing JSON data // JSONValueMux is a version multiplexer that maps a []byte containing JSON data
// at any schematized dashboard version to an instance of Playlist. // at any schematized dashboard version to an instance of Playlist [Resource].
// //
// Validation and translation errors emitted from this func will identify the // Validation and translation errors emitted from this func will identify the
// input bytes as "dashboard.json". // input bytes as "dashboard.json".
// //
// This is a thin wrapper around Thema's [vmux.ValueMux]. // This is a thin wrapper around Thema's [vmux.ValueMux].
func (k *Kind) JSONValueMux(b []byte) (*Playlist, thema.TranslationLacunas, error) { func (k *Kind) JSONValueMux(b []byte) (*Resource, thema.TranslationLacunas, error) {
return k.valmux(b) return k.valmux(b)
} }

View File

@ -0,0 +1,42 @@
// Code generated - EDITING IS FUTILE. DO NOT EDIT.
//
// Generated by:
// kinds/gen.go
// Using jennies:
// GoResourceTypes
//
// Run 'make gen-cue' from repository root to regenerate.
package playlist
import (
"time"
)
// Metadata defines model for Metadata.
type Metadata struct {
CreatedBy string `json:"createdBy"`
CreationTimestamp time.Time `json:"creationTimestamp"`
DeletionTimestamp *time.Time `json:"deletionTimestamp,omitempty"`
// extraFields is reserved for any fields that are pulled from the API server metadata but do not have concrete fields in the CUE metadata
ExtraFields map[string]interface{} `json:"extraFields"`
Finalizers []string `json:"finalizers"`
Labels map[string]string `json:"labels"`
ResourceVersion string `json:"resourceVersion"`
Uid string `json:"uid"`
UpdateTimestamp time.Time `json:"updateTimestamp"`
UpdatedBy string `json:"updatedBy"`
}
// _kubeObjectMetadata is metadata found in a kubernetes object's metadata field.
// It is not exhaustive and only includes fields which may be relevant to a kind's implementation,
// As it is also intended to be generic enough to function with any API Server.
type KubeObjectMetadata struct {
CreationTimestamp time.Time `json:"creationTimestamp"`
DeletionTimestamp *time.Time `json:"deletionTimestamp,omitempty"`
Finalizers []string `json:"finalizers"`
Labels map[string]string `json:"labels"`
ResourceVersion string `json:"resourceVersion"`
Uid string `json:"uid"`
}

View File

@ -3,8 +3,7 @@
// Generated by: // Generated by:
// kinds/gen.go // kinds/gen.go
// Using jennies: // Using jennies:
// GoTypesJenny // GoResourceTypes
// LatestJenny
// //
// Run 'make gen-cue' from repository root to regenerate. // Run 'make gen-cue' from repository root to regenerate.
@ -17,24 +16,6 @@ const (
ItemTypeDashboardByUid ItemType = "dashboard_by_uid" ItemTypeDashboardByUid ItemType = "dashboard_by_uid"
) )
// Playlist defines model for Playlist.
type Playlist struct {
// Interval sets the time between switching views in a playlist.
// FIXME: Is this based on a standardized format or what options are available? Can datemath be used?
Interval string `json:"interval"`
// The ordered list of items that the playlist will iterate over.
// FIXME! This should not be optional, but changing it makes the godegen awkward
Items []Item `json:"items,omitempty"`
// Name of the playlist.
Name string `json:"name"`
// Unique playlist identifier. Generated on creation, either by the
// creator of the playlist of by the application.
Uid string `json:"uid"`
}
// Item defines model for Item. // Item defines model for Item.
type Item struct { type Item struct {
// Title is an unused property -- it will be removed in the future // Title is an unused property -- it will be removed in the future
@ -56,3 +37,21 @@ type Item struct {
// Type of the item. // Type of the item.
type ItemType string type ItemType string
// Spec defines model for Spec.
type Spec struct {
// Interval sets the time between switching views in a playlist.
// FIXME: Is this based on a standardized format or what options are available? Can datemath be used?
Interval string `json:"interval"`
// The ordered list of items that the playlist will iterate over.
// FIXME! This should not be optional, but changing it makes the godegen awkward
Items []Item `json:"items,omitempty"`
// Name of the playlist.
Name string `json:"name"`
// Unique playlist identifier. Generated on creation, either by the
// creator of the playlist of by the application.
Uid string `json:"uid"`
}

View File

@ -0,0 +1,47 @@
// Code generated - EDITING IS FUTILE. DO NOT EDIT.
//
// Generated by:
// kinds/gen.go
// Using jennies:
// GoResourceTypes
//
// Run 'make gen-cue' from repository root to regenerate.
package playlist
// Defines values for OperatorStateState.
const (
OperatorStateStateFailed OperatorStateState = "failed"
OperatorStateStateInProgress OperatorStateState = "in_progress"
OperatorStateStateSuccess OperatorStateState = "success"
)
// OperatorState defines model for OperatorState.
type OperatorState struct {
// descriptiveState is an optional more descriptive state field which has no requirements on format
DescriptiveState *string `json:"descriptiveState,omitempty"`
// details contains any extra information that is operator-specific
Details map[string]interface{} `json:"details,omitempty"`
// lastEvaluation is the ResourceVersion last evaluated
LastEvaluation string `json:"lastEvaluation"`
// state describes the state of the lastEvaluation.
// It is limited to three possible states for machine evaluation.
State OperatorStateState `json:"state"`
}
// OperatorStateState state describes the state of the lastEvaluation.
// It is limited to three possible states for machine evaluation.
type OperatorStateState string
// Status defines model for Status.
type Status struct {
// additionalFields is reserved for future use
AdditionalFields map[string]interface{} `json:"additionalFields"`
// operatorStates is a map of operator ID to operator state evaluations.
// Any operator which consumes this kind SHOULD add its state evaluation information to this field.
OperatorStates map[string]OperatorState `json:"operatorStates,omitempty"`
}

View File

@ -0,0 +1,17 @@
// Code generated - EDITING IS FUTILE. DO NOT EDIT.
//
// Generated by:
// kinds/gen.go
// Using jennies:
// GoTypesJenny
//
// Run 'make gen-cue' from repository root to regenerate.
package preferences
// Resource is the wire representation of Preferences. (TODO be better)
type Resource struct {
Metadata Metadata `json:"metadata"`
Spec Spec `json:"spec"`
Status Status `json:"status"`
}

View File

@ -26,9 +26,9 @@ const rootrel string = "kinds/preferences"
// TODO standard generated docs // TODO standard generated docs
type Kind struct { type Kind struct {
kindsys.Core kindsys.Core
lin thema.ConvergentLineage[*Preferences] lin thema.ConvergentLineage[*Resource]
jcodec vmux.Codec jcodec vmux.Codec
valmux vmux.ValueMux[*Preferences] valmux vmux.ValueMux[*Resource]
} }
// type guard - ensure generated Kind type satisfies the kindsys.Core interface // type guard - ensure generated Kind type satisfies the kindsys.Core interface
@ -49,7 +49,7 @@ func NewKind(rt *thema.Runtime, opts ...thema.BindOption) (*Kind, error) {
// Get the thema.Schema that the meta says is in the current version (which // Get the thema.Schema that the meta says is in the current version (which
// codegen ensures is always the latest) // codegen ensures is always the latest)
cursch := thema.SchemaP(k.Core.Lineage(), def.Properties.CurrentVersion) cursch := thema.SchemaP(k.Core.Lineage(), def.Properties.CurrentVersion)
tsch, err := thema.BindType[*Preferences](cursch, &Preferences{}) tsch, err := thema.BindType(cursch, &Resource{})
if err != nil { if err != nil {
// Should be unreachable, modulo bugs in the Thema->Go code generator // Should be unreachable, modulo bugs in the Thema->Go code generator
return nil, err return nil, err
@ -62,18 +62,18 @@ func NewKind(rt *thema.Runtime, opts ...thema.BindOption) (*Kind, error) {
} }
// ConvergentLineage returns the same [thema.Lineage] as Lineage, but bound (see [thema.BindType]) // ConvergentLineage returns the same [thema.Lineage] as Lineage, but bound (see [thema.BindType])
// to the the Preferences type generated from the current schema, v0.0. // to the the Preferences [Resource] type generated from the current schema, v0.0.
func (k *Kind) ConvergentLineage() thema.ConvergentLineage[*Preferences] { func (k *Kind) ConvergentLineage() thema.ConvergentLineage[*Resource] {
return k.lin return k.lin
} }
// JSONValueMux is a version multiplexer that maps a []byte containing JSON data // JSONValueMux is a version multiplexer that maps a []byte containing JSON data
// at any schematized dashboard version to an instance of Preferences. // at any schematized dashboard version to an instance of Preferences [Resource].
// //
// Validation and translation errors emitted from this func will identify the // Validation and translation errors emitted from this func will identify the
// input bytes as "dashboard.json". // input bytes as "dashboard.json".
// //
// This is a thin wrapper around Thema's [vmux.ValueMux]. // This is a thin wrapper around Thema's [vmux.ValueMux].
func (k *Kind) JSONValueMux(b []byte) (*Preferences, thema.TranslationLacunas, error) { func (k *Kind) JSONValueMux(b []byte) (*Resource, thema.TranslationLacunas, error) {
return k.valmux(b) return k.valmux(b)
} }

View File

@ -0,0 +1,42 @@
// Code generated - EDITING IS FUTILE. DO NOT EDIT.
//
// Generated by:
// kinds/gen.go
// Using jennies:
// GoResourceTypes
//
// Run 'make gen-cue' from repository root to regenerate.
package preferences
import (
"time"
)
// Metadata defines model for Metadata.
type Metadata struct {
CreatedBy string `json:"createdBy"`
CreationTimestamp time.Time `json:"creationTimestamp"`
DeletionTimestamp *time.Time `json:"deletionTimestamp,omitempty"`
// extraFields is reserved for any fields that are pulled from the API server metadata but do not have concrete fields in the CUE metadata
ExtraFields map[string]interface{} `json:"extraFields"`
Finalizers []string `json:"finalizers"`
Labels map[string]string `json:"labels"`
ResourceVersion string `json:"resourceVersion"`
Uid string `json:"uid"`
UpdateTimestamp time.Time `json:"updateTimestamp"`
UpdatedBy string `json:"updatedBy"`
}
// _kubeObjectMetadata is metadata found in a kubernetes object's metadata field.
// It is not exhaustive and only includes fields which may be relevant to a kind's implementation,
// As it is also intended to be generic enough to function with any API Server.
type KubeObjectMetadata struct {
CreationTimestamp time.Time `json:"creationTimestamp"`
DeletionTimestamp *time.Time `json:"deletionTimestamp,omitempty"`
Finalizers []string `json:"finalizers"`
Labels map[string]string `json:"labels"`
ResourceVersion string `json:"resourceVersion"`
Uid string `json:"uid"`
}

View File

@ -3,15 +3,20 @@
// Generated by: // Generated by:
// kinds/gen.go // kinds/gen.go
// Using jennies: // Using jennies:
// GoTypesJenny // GoResourceTypes
// LatestJenny
// //
// Run 'make gen-cue' from repository root to regenerate. // Run 'make gen-cue' from repository root to regenerate.
package preferences package preferences
// Preferences defines model for Preferences. // QueryHistoryPreference defines model for QueryHistoryPreference.
type Preferences struct { type QueryHistoryPreference struct {
// HomeTab one of: '' | 'query' | 'starred';
HomeTab *string `json:"homeTab,omitempty"`
}
// Spec defines model for Spec.
type Spec struct {
// UID for the home dashboard // UID for the home dashboard
HomeDashboardUID *string `json:"homeDashboardUID,omitempty"` HomeDashboardUID *string `json:"homeDashboardUID,omitempty"`
@ -29,9 +34,3 @@ type Preferences struct {
// WeekStart day of the week (sunday, monday, etc) // WeekStart day of the week (sunday, monday, etc)
WeekStart *string `json:"weekStart,omitempty"` WeekStart *string `json:"weekStart,omitempty"`
} }
// QueryHistoryPreference defines model for QueryHistoryPreference.
type QueryHistoryPreference struct {
// HomeTab one of: '' | 'query' | 'starred';
HomeTab *string `json:"homeTab,omitempty"`
}

View File

@ -0,0 +1,47 @@
// Code generated - EDITING IS FUTILE. DO NOT EDIT.
//
// Generated by:
// kinds/gen.go
// Using jennies:
// GoResourceTypes
//
// Run 'make gen-cue' from repository root to regenerate.
package preferences
// Defines values for OperatorStateState.
const (
OperatorStateStateFailed OperatorStateState = "failed"
OperatorStateStateInProgress OperatorStateState = "in_progress"
OperatorStateStateSuccess OperatorStateState = "success"
)
// OperatorState defines model for OperatorState.
type OperatorState struct {
// descriptiveState is an optional more descriptive state field which has no requirements on format
DescriptiveState *string `json:"descriptiveState,omitempty"`
// details contains any extra information that is operator-specific
Details map[string]interface{} `json:"details,omitempty"`
// lastEvaluation is the ResourceVersion last evaluated
LastEvaluation string `json:"lastEvaluation"`
// state describes the state of the lastEvaluation.
// It is limited to three possible states for machine evaluation.
State OperatorStateState `json:"state"`
}
// OperatorStateState state describes the state of the lastEvaluation.
// It is limited to three possible states for machine evaluation.
type OperatorStateState string
// Status defines model for Status.
type Status struct {
// additionalFields is reserved for future use
AdditionalFields map[string]interface{} `json:"additionalFields"`
// operatorStates is a map of operator ID to operator state evaluations.
// Any operator which consumes this kind SHOULD add its state evaluation information to this field.
OperatorStates map[string]OperatorState `json:"operatorStates,omitempty"`
}

View File

@ -0,0 +1,17 @@
// Code generated - EDITING IS FUTILE. DO NOT EDIT.
//
// Generated by:
// kinds/gen.go
// Using jennies:
// GoTypesJenny
//
// Run 'make gen-cue' from repository root to regenerate.
package publicdashboard
// Resource is the wire representation of PublicDashboard. (TODO be better)
type Resource struct {
Metadata Metadata `json:"metadata"`
Spec Spec `json:"spec"`
Status Status `json:"status"`
}

View File

@ -26,9 +26,9 @@ const rootrel string = "kinds/publicdashboard"
// TODO standard generated docs // TODO standard generated docs
type Kind struct { type Kind struct {
kindsys.Core kindsys.Core
lin thema.ConvergentLineage[*PublicDashboard] lin thema.ConvergentLineage[*Resource]
jcodec vmux.Codec jcodec vmux.Codec
valmux vmux.ValueMux[*PublicDashboard] valmux vmux.ValueMux[*Resource]
} }
// type guard - ensure generated Kind type satisfies the kindsys.Core interface // type guard - ensure generated Kind type satisfies the kindsys.Core interface
@ -49,7 +49,7 @@ func NewKind(rt *thema.Runtime, opts ...thema.BindOption) (*Kind, error) {
// Get the thema.Schema that the meta says is in the current version (which // Get the thema.Schema that the meta says is in the current version (which
// codegen ensures is always the latest) // codegen ensures is always the latest)
cursch := thema.SchemaP(k.Core.Lineage(), def.Properties.CurrentVersion) cursch := thema.SchemaP(k.Core.Lineage(), def.Properties.CurrentVersion)
tsch, err := thema.BindType[*PublicDashboard](cursch, &PublicDashboard{}) tsch, err := thema.BindType(cursch, &Resource{})
if err != nil { if err != nil {
// Should be unreachable, modulo bugs in the Thema->Go code generator // Should be unreachable, modulo bugs in the Thema->Go code generator
return nil, err return nil, err
@ -62,18 +62,18 @@ func NewKind(rt *thema.Runtime, opts ...thema.BindOption) (*Kind, error) {
} }
// ConvergentLineage returns the same [thema.Lineage] as Lineage, but bound (see [thema.BindType]) // ConvergentLineage returns the same [thema.Lineage] as Lineage, but bound (see [thema.BindType])
// to the the PublicDashboard type generated from the current schema, v0.0. // to the the PublicDashboard [Resource] type generated from the current schema, v0.0.
func (k *Kind) ConvergentLineage() thema.ConvergentLineage[*PublicDashboard] { func (k *Kind) ConvergentLineage() thema.ConvergentLineage[*Resource] {
return k.lin return k.lin
} }
// JSONValueMux is a version multiplexer that maps a []byte containing JSON data // JSONValueMux is a version multiplexer that maps a []byte containing JSON data
// at any schematized dashboard version to an instance of PublicDashboard. // at any schematized dashboard version to an instance of PublicDashboard [Resource].
// //
// Validation and translation errors emitted from this func will identify the // Validation and translation errors emitted from this func will identify the
// input bytes as "dashboard.json". // input bytes as "dashboard.json".
// //
// This is a thin wrapper around Thema's [vmux.ValueMux]. // This is a thin wrapper around Thema's [vmux.ValueMux].
func (k *Kind) JSONValueMux(b []byte) (*PublicDashboard, thema.TranslationLacunas, error) { func (k *Kind) JSONValueMux(b []byte) (*Resource, thema.TranslationLacunas, error) {
return k.valmux(b) return k.valmux(b)
} }

View File

@ -0,0 +1,42 @@
// Code generated - EDITING IS FUTILE. DO NOT EDIT.
//
// Generated by:
// kinds/gen.go
// Using jennies:
// GoResourceTypes
//
// Run 'make gen-cue' from repository root to regenerate.
package publicdashboard
import (
"time"
)
// Metadata defines model for Metadata.
type Metadata struct {
CreatedBy string `json:"createdBy"`
CreationTimestamp time.Time `json:"creationTimestamp"`
DeletionTimestamp *time.Time `json:"deletionTimestamp,omitempty"`
// extraFields is reserved for any fields that are pulled from the API server metadata but do not have concrete fields in the CUE metadata
ExtraFields map[string]interface{} `json:"extraFields"`
Finalizers []string `json:"finalizers"`
Labels map[string]string `json:"labels"`
ResourceVersion string `json:"resourceVersion"`
Uid string `json:"uid"`
UpdateTimestamp time.Time `json:"updateTimestamp"`
UpdatedBy string `json:"updatedBy"`
}
// _kubeObjectMetadata is metadata found in a kubernetes object's metadata field.
// It is not exhaustive and only includes fields which may be relevant to a kind's implementation,
// As it is also intended to be generic enough to function with any API Server.
type KubeObjectMetadata struct {
CreationTimestamp time.Time `json:"creationTimestamp"`
DeletionTimestamp *time.Time `json:"deletionTimestamp,omitempty"`
Finalizers []string `json:"finalizers"`
Labels map[string]string `json:"labels"`
ResourceVersion string `json:"resourceVersion"`
Uid string `json:"uid"`
}

View File

@ -3,15 +3,14 @@
// Generated by: // Generated by:
// kinds/gen.go // kinds/gen.go
// Using jennies: // Using jennies:
// GoTypesJenny // GoResourceTypes
// LatestJenny
// //
// Run 'make gen-cue' from repository root to regenerate. // Run 'make gen-cue' from repository root to regenerate.
package publicdashboard package publicdashboard
// PublicDashboard defines model for PublicDashboard. // Spec defines model for Spec.
type PublicDashboard struct { type Spec struct {
// Unique public access token // Unique public access token
AccessToken *string `json:"accessToken,omitempty"` AccessToken *string `json:"accessToken,omitempty"`

View File

@ -0,0 +1,47 @@
// Code generated - EDITING IS FUTILE. DO NOT EDIT.
//
// Generated by:
// kinds/gen.go
// Using jennies:
// GoResourceTypes
//
// Run 'make gen-cue' from repository root to regenerate.
package publicdashboard
// Defines values for OperatorStateState.
const (
OperatorStateStateFailed OperatorStateState = "failed"
OperatorStateStateInProgress OperatorStateState = "in_progress"
OperatorStateStateSuccess OperatorStateState = "success"
)
// OperatorState defines model for OperatorState.
type OperatorState struct {
// descriptiveState is an optional more descriptive state field which has no requirements on format
DescriptiveState *string `json:"descriptiveState,omitempty"`
// details contains any extra information that is operator-specific
Details map[string]interface{} `json:"details,omitempty"`
// lastEvaluation is the ResourceVersion last evaluated
LastEvaluation string `json:"lastEvaluation"`
// state describes the state of the lastEvaluation.
// It is limited to three possible states for machine evaluation.
State OperatorStateState `json:"state"`
}
// OperatorStateState state describes the state of the lastEvaluation.
// It is limited to three possible states for machine evaluation.
type OperatorStateState string
// Status defines model for Status.
type Status struct {
// additionalFields is reserved for future use
AdditionalFields map[string]interface{} `json:"additionalFields"`
// operatorStates is a map of operator ID to operator state evaluations.
// Any operator which consumes this kind SHOULD add its state evaluation information to this field.
OperatorStates map[string]OperatorState `json:"operatorStates,omitempty"`
}

View File

@ -0,0 +1,17 @@
// Code generated - EDITING IS FUTILE. DO NOT EDIT.
//
// Generated by:
// kinds/gen.go
// Using jennies:
// GoTypesJenny
//
// Run 'make gen-cue' from repository root to regenerate.
package serviceaccount
// Resource is the wire representation of ServiceAccount. (TODO be better)
type Resource struct {
Metadata Metadata `json:"metadata"`
Spec Spec `json:"spec"`
Status Status `json:"status"`
}

View File

@ -26,9 +26,9 @@ const rootrel string = "kinds/serviceaccount"
// TODO standard generated docs // TODO standard generated docs
type Kind struct { type Kind struct {
kindsys.Core kindsys.Core
lin thema.ConvergentLineage[*ServiceAccount] lin thema.ConvergentLineage[*Resource]
jcodec vmux.Codec jcodec vmux.Codec
valmux vmux.ValueMux[*ServiceAccount] valmux vmux.ValueMux[*Resource]
} }
// type guard - ensure generated Kind type satisfies the kindsys.Core interface // type guard - ensure generated Kind type satisfies the kindsys.Core interface
@ -49,7 +49,7 @@ func NewKind(rt *thema.Runtime, opts ...thema.BindOption) (*Kind, error) {
// Get the thema.Schema that the meta says is in the current version (which // Get the thema.Schema that the meta says is in the current version (which
// codegen ensures is always the latest) // codegen ensures is always the latest)
cursch := thema.SchemaP(k.Core.Lineage(), def.Properties.CurrentVersion) cursch := thema.SchemaP(k.Core.Lineage(), def.Properties.CurrentVersion)
tsch, err := thema.BindType[*ServiceAccount](cursch, &ServiceAccount{}) tsch, err := thema.BindType(cursch, &Resource{})
if err != nil { if err != nil {
// Should be unreachable, modulo bugs in the Thema->Go code generator // Should be unreachable, modulo bugs in the Thema->Go code generator
return nil, err return nil, err
@ -62,18 +62,18 @@ func NewKind(rt *thema.Runtime, opts ...thema.BindOption) (*Kind, error) {
} }
// ConvergentLineage returns the same [thema.Lineage] as Lineage, but bound (see [thema.BindType]) // ConvergentLineage returns the same [thema.Lineage] as Lineage, but bound (see [thema.BindType])
// to the the ServiceAccount type generated from the current schema, v0.0. // to the the ServiceAccount [Resource] type generated from the current schema, v0.0.
func (k *Kind) ConvergentLineage() thema.ConvergentLineage[*ServiceAccount] { func (k *Kind) ConvergentLineage() thema.ConvergentLineage[*Resource] {
return k.lin return k.lin
} }
// JSONValueMux is a version multiplexer that maps a []byte containing JSON data // JSONValueMux is a version multiplexer that maps a []byte containing JSON data
// at any schematized dashboard version to an instance of ServiceAccount. // at any schematized dashboard version to an instance of ServiceAccount [Resource].
// //
// Validation and translation errors emitted from this func will identify the // Validation and translation errors emitted from this func will identify the
// input bytes as "dashboard.json". // input bytes as "dashboard.json".
// //
// This is a thin wrapper around Thema's [vmux.ValueMux]. // This is a thin wrapper around Thema's [vmux.ValueMux].
func (k *Kind) JSONValueMux(b []byte) (*ServiceAccount, thema.TranslationLacunas, error) { func (k *Kind) JSONValueMux(b []byte) (*Resource, thema.TranslationLacunas, error) {
return k.valmux(b) return k.valmux(b)
} }

View File

@ -0,0 +1,42 @@
// Code generated - EDITING IS FUTILE. DO NOT EDIT.
//
// Generated by:
// kinds/gen.go
// Using jennies:
// GoResourceTypes
//
// Run 'make gen-cue' from repository root to regenerate.
package serviceaccount
import (
"time"
)
// Metadata defines model for Metadata.
type Metadata struct {
CreatedBy string `json:"createdBy"`
CreationTimestamp time.Time `json:"creationTimestamp"`
DeletionTimestamp *time.Time `json:"deletionTimestamp,omitempty"`
// extraFields is reserved for any fields that are pulled from the API server metadata but do not have concrete fields in the CUE metadata
ExtraFields map[string]interface{} `json:"extraFields"`
Finalizers []string `json:"finalizers"`
Labels map[string]string `json:"labels"`
ResourceVersion string `json:"resourceVersion"`
Uid string `json:"uid"`
UpdateTimestamp time.Time `json:"updateTimestamp"`
UpdatedBy string `json:"updatedBy"`
}
// _kubeObjectMetadata is metadata found in a kubernetes object's metadata field.
// It is not exhaustive and only includes fields which may be relevant to a kind's implementation,
// As it is also intended to be generic enough to function with any API Server.
type KubeObjectMetadata struct {
CreationTimestamp time.Time `json:"creationTimestamp"`
DeletionTimestamp *time.Time `json:"deletionTimestamp,omitempty"`
Finalizers []string `json:"finalizers"`
Labels map[string]string `json:"labels"`
ResourceVersion string `json:"resourceVersion"`
Uid string `json:"uid"`
}

View File

@ -3,17 +3,12 @@
// Generated by: // Generated by:
// kinds/gen.go // kinds/gen.go
// Using jennies: // Using jennies:
// GoTypesJenny // GoResourceTypes
// LatestJenny
// //
// Run 'make gen-cue' from repository root to regenerate. // Run 'make gen-cue' from repository root to regenerate.
package serviceaccount package serviceaccount
import (
"time"
)
// Defines values for OrgRole. // Defines values for OrgRole.
const ( const (
OrgRoleAdmin OrgRole = "Admin" OrgRoleAdmin OrgRole = "Admin"
@ -24,8 +19,8 @@ const (
// OrgRole is a Grafana Organization Role which can be 'Viewer', 'Editor', 'Admin'. // OrgRole is a Grafana Organization Role which can be 'Viewer', 'Editor', 'Admin'.
type OrgRole string type OrgRole string
// ServiceAccount defines model for ServiceAccount. // Spec defines model for Spec.
type ServiceAccount struct { type Spec struct {
// AccessControl metadata associated with a given resource. // AccessControl metadata associated with a given resource.
AccessControl map[string]bool `json:"accessControl,omitempty"` AccessControl map[string]bool `json:"accessControl,omitempty"`
@ -33,9 +28,6 @@ type ServiceAccount struct {
// of the service account. // of the service account.
AvatarUrl string `json:"avatarUrl"` AvatarUrl string `json:"avatarUrl"`
// Created indicates when the service account was created.
Created *time.Time `json:"created,omitempty"`
// ID is the unique identifier of the service account in the database. // ID is the unique identifier of the service account in the database.
Id int64 `json:"id"` Id int64 `json:"id"`
@ -60,7 +52,4 @@ type ServiceAccount struct {
// Tokens is the number of active tokens for the service account. // Tokens is the number of active tokens for the service account.
// Tokens are used to authenticate the service account against Grafana. // Tokens are used to authenticate the service account against Grafana.
Tokens int64 `json:"tokens"` Tokens int64 `json:"tokens"`
// Updated indicates when the service account was updated.
Updated *time.Time `json:"updated,omitempty"`
} }

View File

@ -0,0 +1,47 @@
// Code generated - EDITING IS FUTILE. DO NOT EDIT.
//
// Generated by:
// kinds/gen.go
// Using jennies:
// GoResourceTypes
//
// Run 'make gen-cue' from repository root to regenerate.
package serviceaccount
// Defines values for OperatorStateState.
const (
OperatorStateStateFailed OperatorStateState = "failed"
OperatorStateStateInProgress OperatorStateState = "in_progress"
OperatorStateStateSuccess OperatorStateState = "success"
)
// OperatorState defines model for OperatorState.
type OperatorState struct {
// descriptiveState is an optional more descriptive state field which has no requirements on format
DescriptiveState *string `json:"descriptiveState,omitempty"`
// details contains any extra information that is operator-specific
Details map[string]interface{} `json:"details,omitempty"`
// lastEvaluation is the ResourceVersion last evaluated
LastEvaluation string `json:"lastEvaluation"`
// state describes the state of the lastEvaluation.
// It is limited to three possible states for machine evaluation.
State OperatorStateState `json:"state"`
}
// OperatorStateState state describes the state of the lastEvaluation.
// It is limited to three possible states for machine evaluation.
type OperatorStateState string
// Status defines model for Status.
type Status struct {
// additionalFields is reserved for future use
AdditionalFields map[string]interface{} `json:"additionalFields"`
// operatorStates is a map of operator ID to operator state evaluations.
// Any operator which consumes this kind SHOULD add its state evaluation information to this field.
OperatorStates map[string]OperatorState `json:"operatorStates,omitempty"`
}

View File

@ -0,0 +1,17 @@
// Code generated - EDITING IS FUTILE. DO NOT EDIT.
//
// Generated by:
// kinds/gen.go
// Using jennies:
// GoTypesJenny
//
// Run 'make gen-cue' from repository root to regenerate.
package team
// Resource is the wire representation of Team. (TODO be better)
type Resource struct {
Metadata Metadata `json:"metadata"`
Spec Spec `json:"spec"`
Status Status `json:"status"`
}

View File

@ -26,9 +26,9 @@ const rootrel string = "kinds/team"
// TODO standard generated docs // TODO standard generated docs
type Kind struct { type Kind struct {
kindsys.Core kindsys.Core
lin thema.ConvergentLineage[*Team] lin thema.ConvergentLineage[*Resource]
jcodec vmux.Codec jcodec vmux.Codec
valmux vmux.ValueMux[*Team] valmux vmux.ValueMux[*Resource]
} }
// type guard - ensure generated Kind type satisfies the kindsys.Core interface // type guard - ensure generated Kind type satisfies the kindsys.Core interface
@ -49,7 +49,7 @@ func NewKind(rt *thema.Runtime, opts ...thema.BindOption) (*Kind, error) {
// Get the thema.Schema that the meta says is in the current version (which // Get the thema.Schema that the meta says is in the current version (which
// codegen ensures is always the latest) // codegen ensures is always the latest)
cursch := thema.SchemaP(k.Core.Lineage(), def.Properties.CurrentVersion) cursch := thema.SchemaP(k.Core.Lineage(), def.Properties.CurrentVersion)
tsch, err := thema.BindType[*Team](cursch, &Team{}) tsch, err := thema.BindType(cursch, &Resource{})
if err != nil { if err != nil {
// Should be unreachable, modulo bugs in the Thema->Go code generator // Should be unreachable, modulo bugs in the Thema->Go code generator
return nil, err return nil, err
@ -62,18 +62,18 @@ func NewKind(rt *thema.Runtime, opts ...thema.BindOption) (*Kind, error) {
} }
// ConvergentLineage returns the same [thema.Lineage] as Lineage, but bound (see [thema.BindType]) // ConvergentLineage returns the same [thema.Lineage] as Lineage, but bound (see [thema.BindType])
// to the the Team type generated from the current schema, v0.0. // to the the Team [Resource] type generated from the current schema, v0.0.
func (k *Kind) ConvergentLineage() thema.ConvergentLineage[*Team] { func (k *Kind) ConvergentLineage() thema.ConvergentLineage[*Resource] {
return k.lin return k.lin
} }
// JSONValueMux is a version multiplexer that maps a []byte containing JSON data // JSONValueMux is a version multiplexer that maps a []byte containing JSON data
// at any schematized dashboard version to an instance of Team. // at any schematized dashboard version to an instance of Team [Resource].
// //
// Validation and translation errors emitted from this func will identify the // Validation and translation errors emitted from this func will identify the
// input bytes as "dashboard.json". // input bytes as "dashboard.json".
// //
// This is a thin wrapper around Thema's [vmux.ValueMux]. // This is a thin wrapper around Thema's [vmux.ValueMux].
func (k *Kind) JSONValueMux(b []byte) (*Team, thema.TranslationLacunas, error) { func (k *Kind) JSONValueMux(b []byte) (*Resource, thema.TranslationLacunas, error) {
return k.valmux(b) return k.valmux(b)
} }

View File

@ -0,0 +1,42 @@
// Code generated - EDITING IS FUTILE. DO NOT EDIT.
//
// Generated by:
// kinds/gen.go
// Using jennies:
// GoResourceTypes
//
// Run 'make gen-cue' from repository root to regenerate.
package team
import (
"time"
)
// Metadata defines model for Metadata.
type Metadata struct {
CreatedBy string `json:"createdBy"`
CreationTimestamp time.Time `json:"creationTimestamp"`
DeletionTimestamp *time.Time `json:"deletionTimestamp,omitempty"`
// extraFields is reserved for any fields that are pulled from the API server metadata but do not have concrete fields in the CUE metadata
ExtraFields map[string]interface{} `json:"extraFields"`
Finalizers []string `json:"finalizers"`
Labels map[string]string `json:"labels"`
ResourceVersion string `json:"resourceVersion"`
Uid string `json:"uid"`
UpdateTimestamp time.Time `json:"updateTimestamp"`
UpdatedBy string `json:"updatedBy"`
}
// _kubeObjectMetadata is metadata found in a kubernetes object's metadata field.
// It is not exhaustive and only includes fields which may be relevant to a kind's implementation,
// As it is also intended to be generic enough to function with any API Server.
type KubeObjectMetadata struct {
CreationTimestamp time.Time `json:"creationTimestamp"`
DeletionTimestamp *time.Time `json:"deletionTimestamp,omitempty"`
Finalizers []string `json:"finalizers"`
Labels map[string]string `json:"labels"`
ResourceVersion string `json:"resourceVersion"`
Uid string `json:"uid"`
}

View File

@ -3,17 +3,12 @@
// Generated by: // Generated by:
// kinds/gen.go // kinds/gen.go
// Using jennies: // Using jennies:
// GoTypesJenny // GoResourceTypes
// LatestJenny
// //
// Run 'make gen-cue' from repository root to regenerate. // Run 'make gen-cue' from repository root to regenerate.
package team package team
import (
"time"
)
// Defines values for Permission. // Defines values for Permission.
const ( const (
PermissionN0 Permission = 0 PermissionN0 Permission = 0
@ -25,17 +20,14 @@ const (
// Permission defines model for Permission. // Permission defines model for Permission.
type Permission int type Permission int
// Team defines model for Team. // Spec defines model for Spec.
type Team struct { type Spec struct {
// AccessControl metadata associated with a given resource. // AccessControl metadata associated with a given resource.
AccessControl map[string]bool `json:"accessControl,omitempty"` AccessControl map[string]bool `json:"accessControl,omitempty"`
// AvatarUrl is the team's avatar URL. // AvatarUrl is the team's avatar URL.
AvatarUrl *string `json:"avatarUrl,omitempty"` AvatarUrl *string `json:"avatarUrl,omitempty"`
// Created indicates when the team was created.
Created time.Time `json:"created"`
// Email of the team. // Email of the team.
Email *string `json:"email,omitempty"` Email *string `json:"email,omitempty"`
@ -48,7 +40,4 @@ type Team struct {
// OrgId is the ID of an organisation the team belongs to. // OrgId is the ID of an organisation the team belongs to.
OrgId int64 `json:"orgId"` OrgId int64 `json:"orgId"`
Permission Permission `json:"permission"` Permission Permission `json:"permission"`
// Updated indicates when the team was updated.
Updated time.Time `json:"updated"`
} }

View File

@ -0,0 +1,47 @@
// Code generated - EDITING IS FUTILE. DO NOT EDIT.
//
// Generated by:
// kinds/gen.go
// Using jennies:
// GoResourceTypes
//
// Run 'make gen-cue' from repository root to regenerate.
package team
// Defines values for OperatorStateState.
const (
OperatorStateStateFailed OperatorStateState = "failed"
OperatorStateStateInProgress OperatorStateState = "in_progress"
OperatorStateStateSuccess OperatorStateState = "success"
)
// OperatorState defines model for OperatorState.
type OperatorState struct {
// descriptiveState is an optional more descriptive state field which has no requirements on format
DescriptiveState *string `json:"descriptiveState,omitempty"`
// details contains any extra information that is operator-specific
Details map[string]interface{} `json:"details,omitempty"`
// lastEvaluation is the ResourceVersion last evaluated
LastEvaluation string `json:"lastEvaluation"`
// state describes the state of the lastEvaluation.
// It is limited to three possible states for machine evaluation.
State OperatorStateState `json:"state"`
}
// OperatorStateState state describes the state of the lastEvaluation.
// It is limited to three possible states for machine evaluation.
type OperatorStateState string
// Status defines model for Status.
type Status struct {
// additionalFields is reserved for future use
AdditionalFields map[string]interface{} `json:"additionalFields"`
// operatorStates is a map of operator ID to operator state evaluations.
// Any operator which consumes this kind SHOULD add its state evaluation information to this field.
OperatorStates map[string]OperatorState `json:"operatorStates,omitempty"`
}

View File

@ -22,7 +22,7 @@ type Playlist struct {
OrgId int64 `json:"-" db:"org_id"` OrgId int64 `json:"-" db:"org_id"`
} }
type PlaylistDTO = playlist.Playlist type PlaylistDTO = playlist.Spec
type PlaylistItemDTO = playlist.Item type PlaylistItemDTO = playlist.Item
type PlaylistItemType = playlist.ItemType type PlaylistItemType = playlist.ItemType

View File

@ -22,7 +22,7 @@ func GetEntitySummaryBuilder() entity.EntitySummaryBuilder {
} }
func summaryBuilder(ctx context.Context, uid string, body []byte) (*entity.EntitySummary, []byte, error) { func summaryBuilder(ctx context.Context, uid string, body []byte) (*entity.EntitySummary, []byte, error) {
obj := &playlist.Playlist{} obj := &playlist.Spec{}
err := json.Unmarshal(body, obj) err := json.Unmarshal(body, obj)
if err != nil { if err != nil {
return nil, nil, err // unable to read object return nil, nil, err // unable to read object

View File

@ -17,7 +17,7 @@ func TestPlaylistSummary(t *testing.T) {
_, _, err := builder(context.Background(), "abc", []byte("{invalid json")) _, _, err := builder(context.Background(), "abc", []byte("{invalid json"))
require.Error(t, err) require.Error(t, err)
playlist := playlist.Playlist{ playlist := playlist.Spec{
Interval: "30s", Interval: "30s",
Name: "test", Name: "test",
Items: []playlist.Item{ Items: []playlist.Item{

View File

@ -29,7 +29,7 @@ func GetEntitySummaryBuilder() entity.EntitySummaryBuilder {
} }
} }
obj := &preferences.Preferences{} obj := &preferences.Spec{}
err := json.Unmarshal(body, obj) err := json.Unmarshal(body, obj)
if err != nil { if err != nil {
return nil, nil, err // unable to read object return nil, nil, err // unable to read object

View File

@ -18,9 +18,7 @@ export const getMockTeam = (i = 1, overrides = {}): Team => {
memberCount: i, memberCount: i,
permission: TeamPermissionLevel.Member, permission: TeamPermissionLevel.Member,
accessControl: { isEditor: false }, accessControl: { isEditor: false },
created: '',
orgId: 0, orgId: 0,
updated: '',
...overrides, ...overrides,
}; };
}; };

View File

@ -14,7 +14,6 @@ const loadingTeam = {
memberCount: 0, memberCount: 0,
permission: TeamPermissionLevel.Member, permission: TeamPermissionLevel.Member,
accessControl: { isEditor: false }, accessControl: { isEditor: false },
created: '',
orgId: 0, orgId: 0,
updated: '', updated: '',
}; };

View File

@ -1,11 +0,0 @@
#!/bin/bash
# Temporary - remove this script once the dashboard schema are mature
# Remove the appropriate ellipses from the schema to check for unspecified
# fields in the artifacts (validating "open")
# Run from root of grafana repo
CMD=${CLI:-bin/darwin-amd64/grafana-cli}
FILES=$(grep -rl '"schemaVersion": 30' devenv)
for DASH in ${FILES}; do echo "${DASH}"; ${CMD} cue validate-resource --dashboard "${DASH}"; done