1
0
Fork 0
mirror of https://github.com/arangodb/kube-arangodb.git synced 2024-12-14 11:57:37 +00:00

[Feature] Generate feature list (#1362)

This commit is contained in:
Adam Janikowski 2023-07-24 17:10:59 +02:00 committed by GitHub
parent 7d513cca72
commit 6a49e3d25b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 559 additions and 85 deletions

View file

@ -14,6 +14,15 @@ The ArangoDB Kubernetes Operator is Production ready.
[Documentation](https://www.arangodb.com/docs/stable/deployment-kubernetes.html) [Documentation](https://www.arangodb.com/docs/stable/deployment-kubernetes.html)
### Limits
<!-- START(limits) -->
| Limit | Description | Community | Enterprise |
|:-------------------|:-----------------------------------------------------------------------------|:----------|:-----------|
| Cluster size limit | Limits of the nodes (DBServers & Coordinators) supported in the Cluster mode | 64 | 1024 |
<!-- END(limits) -->
### Production readiness state ### Production readiness state
Beginning with Version 0.3.11 we maintain a production readiness Beginning with Version 0.3.11 we maintain a production readiness
@ -29,52 +38,67 @@ Kubernetes versions starting from 1.18 are supported and tested, charts and mani
The following table has the general readiness state, the table below The following table has the general readiness state, the table below
covers individual newer features separately. covers individual newer features separately.
<!-- START(metricsTable) --> <!-- START(kubernetesVersionsTable) -->
| Platform | Kubernetes Version | ArangoDB Version | State | Remarks | Provider Remarks | | Platform | Kubernetes Version | ArangoDB Version | State | Remarks | Provider Remarks |
|:--------------------|:-------------------|:-----------------|:-----------|:------------------------------------------|:-----------------------------------| |:--------------------|:-------------------|:-----------------|:-----------|:------------------------------------------|:-----------------------------------|
| Google GKE | 1.21-1.25 | >= 3.6.0 | Production | Don't use micro nodes | | | Google GKE | 1.21-1.26 | >= 3.6.0 | Production | Don't use micro nodes | |
| Azure AKS | 1.21-1.24 | >= 3.6.0 | Production | | | | Azure AKS | 1.21-1.26 | >= 3.6.0 | Production | | |
| Amazon EKS | 1.21-1.24 | >= 3.6.0 | Production | | [Amazon EKS](./docs/providers/eks) | | Amazon EKS | 1.21-1.26 | >= 3.6.0 | Production | | [Amazon EKS](./docs/providers/eks) |
| IBM Cloud | 1.17 | >= 3.6.0 | Deprecated | Support will be dropped in Operator 1.5.0 | | | IBM Cloud | 1.17 | >= 3.6.0 | Deprecated | Support will be dropped in Operator 1.5.0 | |
| IBM Cloud | 1.18-1.21 | >= 3.6.0 | Production | | | | IBM Cloud | 1.18-1.21 | >= 3.6.0 | Production | | |
| OpenShift | 3.11 | >= 3.6.0 | Deprecated | Support will be dropped in Operator 1.5.0 | | | OpenShift | 3.11 | >= 3.6.0 | Deprecated | Support will be dropped in Operator 1.5.0 | |
| OpenShift | 4.2-4.11 | >= 3.6.0 | Production | | | | OpenShift | 4.2-4.13 | >= 3.6.0 | Production | | |
| BareMetal (kubeadm) | <= 1.20 | >= 3.6.0 | Deprecated | Support will be dropped in Operator 1.5.0 | | | BareMetal (kubeadm) | <= 1.20 | >= 3.6.0 | Deprecated | Support will be dropped in Operator 1.5.0 | |
| BareMetal (kubeadm) | 1.21-1.25 | >= 3.6.0 | Production | | | | BareMetal (kubeadm) | 1.21-1.27 | >= 3.6.0 | Production | | |
| Minikube | 1.21-1.25 | >= 3.6.0 | Devel Only | | | | Minikube | 1.21-1.27 | >= 3.6.0 | Devel Only | | |
| Other | 1.21-1.25 | >= 3.6.0 | Devel Only | | | | Other | 1.21-1.27 | >= 3.6.0 | Devel Only | | |
<!-- END(metricsTable) --> <!-- END(kubernetesVersionsTable) -->
#### Feature-wise production readiness table: #### Operator Features
| Feature | Operator Version | ArangoDB Version | ArangoDB Edition | Introduced | State | Enabled | Flag | Remarks | <!-- START(featuresCommunityTable) -->
|--------------------------------------------------------------------------------------|------------------|------------------|-----------------------|------------|--------------|---------|-------------------------------------------------------|--------------------------------------------------------------------------| | Feature | Operator Version | Introduced | ArangoDB Version | ArangoDB Edition | State | Enabled | Flag | Remarks |
| Pod Disruption Budgets | 0.3.11 | Any | Community, Enterprise | 0.3.10 | Production | True | N/A | N/A | |:-------------------------------------------------------------------------------------|:-----------------|:-----------|:-----------------|:----------------------|:-------------|:--------|:------------------------------------------------------|:-------------------------------------------------------------------------|
| Volume Resizing | 0.3.11 | Any | Community, Enterprise | 0.3.10 | Production | True | N/A | N/A | | [Rebalancer V2](docs/design/features/rebalancer_v2.md) | 1.2.31 | 1.2.31 | >= 3.10.0 | Community, Enterprise | Alpha | False | --deployment.feature.rebalancer-v2 | N/A |
| Disabling of liveness probes | 0.3.11 | Any | Community, Enterprise | 0.3.10 | Production | True | N/A | N/A | | [Secured containers](docs/design/features/secured_containers.md) | 1.2.31 | 1.2.31 | >= 3.8.0 | Community, Enterprise | Alpha | False | --deployment.feature.secured-containers | If set to True Operator will run containers in secure mode |
| Volume Claim Templates | 1.0.0 | Any | Community, Enterprise | 0.3.10 | Production | True | N/A | N/A | | Version Check V2 | 1.2.31 | 1.2.31 | >= 3.8.0 | Community, Enterprise | Alpha | False | --deployment.feature.upgrade-version-check-V2 | N/A |
| Prometheus Metrics Exporter | 1.0.0 | Any | Community, Enterprise | 0.3.10 | Production | True | N/A | Prometheus required | | [Operator Ephemeral Volumes](docs/design/features/ephemeral_volumes.md) | 1.2.31 | 1.2.2 | >= 3.8.0 | Community, Enterprise | Beta | False | --deployment.feature.ephemeral-volumes | N/A |
| Sidecar Containers | 1.0.0 | Any | Community, Enterprise | 0.3.10 | Production | True | N/A | N/A | | [Force Rebuild Out Synced Shards](docs/design/features/rebuild_out_synced_shards.md) | 1.2.27 | 1.2.27 | >= 3.8.0 | Community, Enterprise | Production | False | --deployment.feature.force-rebuild-out-synced-shards | It should be used only if user is aware of the risks. |
| Operator Single Mode | 1.0.4 | Any | Community, Enterprise | 1.0.4 | Production | False | --mode.single | Only 1 instance of Operator allowed in namespace when feature is enabled | | [Spec Default Restore](docs/design/features/deployment_spec_defaults.md) | 1.2.25 | 1.2.21 | >= 3.8.0 | Community, Enterprise | Beta | True | --deployment.feature.deployment-spec-defaults-restore | If set to False Operator will not change ArangoDeployment Spec |
| TLS SNI Support | 1.0.3 | >= 3.7.0 | Enterprise | 1.0.3 | Production | True | --deployment.feature.tls-sni | N/A | | Version Check | 1.2.23 | 1.1.4 | >= 3.8.0 | Community, Enterprise | Production | True | --deployment.feature.upgrade-version-check | N/A |
| TLS Runtime Rotation Support | 1.1.0 | > 3.7.0 | Enterprise | 1.0.4 | Production | True | --deployment.feature.tls-rotation | N/A | | [Failover Leader service](docs/design/features/failover_leader_service.md) | 1.2.13 | 1.2.13 | >= 3.8.0 | Community, Enterprise | Production | False | --deployment.feature.failover-leadership | N/A |
| JWT Rotation Support | 1.1.0 | > 3.7.0 | Enterprise | 1.0.3 | Production | True | --deployment.feature.jwt-rotation | N/A | | Graceful Restart | 1.2.5 | 1.0.7 | >= 3.8.0 | Community, Enterprise | Production | True | ---deployment.feature.graceful-shutdown | N/A |
| Encryption Key Rotation Support | 1.2.0 | > 3.7.0 | Enterprise | 1.0.3 | NotSupported | False | --deployment.feature.encryption-rotation | N/A | | Optional Graceful Restart | 1.2.0 | 1.2.5 | >= 3.8.0 | Community, Enterprise | Production | False | --deployment.feature.optional-graceful-shutdown | N/A |
| Version Check | 1.1.4 | >= 3.6.0 | Community, Enterprise | 1.1.4 | Alpha | False | --deployment.feature.upgrade-version-check | N/A | | Operator Internal Metrics Exporter | 1.2.0 | 1.2.0 | >= 3.8.0 | Community, Enterprise | Production | True | --deployment.feature.metrics-exporter | N/A |
| Version Check | 1.2.23 | >= 3.6.0 | Community, Enterprise | 1.1.4 | Production | True | --deployment.feature.upgrade-version-check | N/A | | Operator Maintenance Management Support | 1.2.0 | 1.0.7 | >= 3.8.0 | Community, Enterprise | Production | True | --deployment.feature.maintenance | N/A |
| Version Check V2 | 1.2.31 | >= 3.6.0 | Community, Enterprise | 1.2.31 | Alpha | False | --deployment.feature.upgrade-version-check-v2 | N/A | | Encryption Key Rotation Support | 1.2.0 | 1.0.3 | >= 3.8.0 | Enterprise | NotSupported | False | --deployment.feature.encryption-rotation | N/A |
| Operator Maintenance Management Support | 1.2.0 | >= 3.6.0 | Community, Enterprise | 1.0.7 | Production | True | --deployment.feature.maintenance | N/A | | TLS Runtime Rotation Support | 1.1.0 | 1.0.4 | >= 3.8.0 | Enterprise | Production | True | --deployment.feature.tls-rotation | N/A |
| Graceful Restart | 1.2.5 | >= 3.6.0 | Community, Enterprise | 1.0.7 | Production | True | --deployment.feature.graceful-shutdown | N/A | | JWT Rotation Support | 1.1.0 | 1.0.3 | >= 3.8.0 | Enterprise | Production | True | --deployment.feature.jwt-rotation | N/A |
| Optional Graceful Restart | 1.2.25 | >= 3.6.0 | Community, Enterprise | 1.2.5 | Beta | True | --deployment.feature.optional-graceful-shutdown | N/A | | Operator Single Mode | 1.0.4 | 1.0.4 | >= 3.8.0 | Community, Enterprise | Production | False | --mode.single | Only 1 instance of Operator allowed in namespace when feature is enabled |
| Operator Internal Metrics Exporter | 1.2.0 | >= 3.6.0 | Community, Enterprise | 1.2.0 | Production | True | --deployment.feature.metrics-exporter | N/A | | TLS SNI Support | 1.0.3 | 1.0.3 | >= 3.8.0 | Enterprise | Production | True | --deployment.feature.tls-sni | N/A |
| [Operator Ephemeral Volumes](docs/design/features/ephemeral_volumes.md) | 1.2.2 | >= 3.7.0 | Community, Enterprise | 1.2.2 | Alpha | False | --deployment.feature.ephemeral-volumes | N/A | | Disabling of liveness probes | 0.3.11 | 0.3.10 | >= 3.8.0 | Community, Enterprise | Production | True | N/A | N/A |
| [Operator Ephemeral Volumes](docs/design/features/ephemeral_volumes.md) | 1.2.2 | >= 3.7.0 | Community, Enterprise | 1.2.31 | Beta | False | --deployment.feature.ephemeral-volumes | N/A | | Pod Disruption Budgets | 0.3.11 | 0.3.10 | >= 3.8.0 | Community, Enterprise | Production | True | N/A | N/A |
| [Failover Leader service](docs/design/features/failover_leader_service.md) | 1.2.13 | >= 3.7.0 | Community, Enterprise | 1.2.13 | Production | False | --deployment.feature.failover-leadership | N/A | | Prometheus Metrics Exporter | 0.3.11 | 0.3.10 | >= 3.8.0 | Community, Enterprise | Production | True | N/A | Prometheus required |
| [Spec Default Restore](docs/design/features/deployment_spec_defaults.md) | 1.2.21 | >= 3.7.0 | Community, Enterprise | 1.2.21 | Beta | True | --deployment.feature.deployment-spec-defaults-restore | If set to False Operator will not change ArangoDeployment Spec | | Sidecar Containers | 0.3.11 | 0.3.10 | >= 3.8.0 | Community, Enterprise | Production | True | N/A | N/A |
| [Force Rebuild Out Synced Shards](docs/design/features/rebuild_out_synced_shards.md) | 1.2.27 | >= 3.8.0 | Community, Enterprise | 1.2.27 | Beta | False | --deployment.feature.force-rebuild-out-synced-shards | It should be used only if user is aware of the risks. | | Volume Claim Templates | 0.3.11 | 0.3.10 | >= 3.8.0 | Community, Enterprise | Production | True | N/A | N/A |
| [Rebalancer V2](docs/design/features/rebalancer_v2.md) | 1.2.31 | >= 3.10.0 | Community, Enterprise | 1.2.31 | Alpha | False | --deployment.feature.rebalancer-v2 | N/A | | Volume Resizing | 0.3.11 | 0.3.10 | >= 3.8.0 | Community, Enterprise | Production | True | N/A | N/A |
| [Secured containers](docs/design/features/secured_containers.md) | 1.2.31 | >= 3.7.0 | Community, Enterprise | 1.2.31 | Alpha | False | --deployment.feature.secured-containers | If set to True Operator will run containers in secure mode |
<!-- END(featuresCommunityTable) -->
#### Operator Enterprise Only Features
To upgrade to the Enterprise Edition, you need to get in touch with the ArangoDB team. [Contact us](https://www.arangodb.com/contact/) for more details.
<!-- START(featuresEnterpriseTable) -->
| Feature | Operator Version | Introduced | ArangoDB Version | ArangoDB Edition | State | Enabled | Flag | Remarks |
|:-------------------------------------------------------|:-----------------|:-----------|:-----------------|:-----------------|:-----------|:--------|:-----|:----------------------------------------------------------------------------|
| AgencyCache | 1.2.30 | 1.2.30 | >= 3.8.0 | Enterprise | Production | True | N/A | Enable Agency Cache mechanism in the Operator (Increase limit of the nodes) |
| Member Maintenance Support | 1.2.25 | 1.2.16 | >= 3.8.0 | Enterprise | Production | True | N/A | Enable Member Maintenance during planned restarts |
| [Rebalancer](docs/design/features/rebalancer.md) | 1.2.15 | 1.2.5 | >= 3.8.0 | Enterprise | Production | True | N/A | N/A |
| [TopologyAwareness](docs/design/topology_awareness.md) | 1.2.4 | 1.2.4 | >= 3.8.0 | Enterprise | Production | True | N/A | N/A |
<!-- END(featuresEnterpriseTable) -->
## Operator Community Edition (CE) ## Operator Community Edition (CE)

View file

@ -0,0 +1,10 @@
# ArangoDB Rebalancer Support
## How to use
To enable Rebalancer in ArangoDeployment:
```yaml
spec:
rebalancer:
enabled: true
```

View file

@ -1,4 +1,4 @@
# ArangoDB Rebalancer Support # ArangoDB Rebalancer V2 Support
## Overview ## Overview

215
internal/features.yaml Normal file
View file

@ -0,0 +1,215 @@
features:
- name: Pod Disruption Budgets
enabled: true
releases:
- operatorVersion: 0.3.10
state: Alpha
- operatorVersion: 0.3.11
state: Production
- name: Volume Resizing
enabled: true
releases:
- operatorVersion: 0.3.10
state: Alpha
- operatorVersion: 0.3.11
state: Production
- name: Disabling of liveness probes
enabled: true
releases:
- operatorVersion: 0.3.10
state: Alpha
- operatorVersion: 0.3.11
state: Production
- name: Volume Claim Templates
enabled: true
releases:
- operatorVersion: 0.3.10
state: Alpha
- operatorVersion: 0.3.11
state: Production
- name: Prometheus Metrics Exporter
enabled: true
remarks: Prometheus required
releases:
- operatorVersion: 0.3.10
state: Alpha
- operatorVersion: 0.3.11
state: Production
- name: Sidecar Containers
enabled: true
releases:
- operatorVersion: 0.3.10
state: Alpha
- operatorVersion: 0.3.11
state: Production
- name: Operator Single Mode
enabled: False
flag: --mode.single
remarks: Only 1 instance of Operator allowed in namespace when feature is enabled
releases:
- operatorVersion: 1.0.4
state: Production
- name: TLS SNI Support
arangoDBEditions: Enterprise
enabled: true
flag: --deployment.feature.tls-sni
releases:
- operatorVersion: 1.0.3
state: Production
- name: TLS Runtime Rotation Support
arangoDBEditions: Enterprise
enabled: true
flag: --deployment.feature.tls-rotation
releases:
- operatorVersion: 1.0.4
state: Alpha
- operatorVersion: 1.1.0
state: Production
- name: JWT Rotation Support
arangoDBEditions: Enterprise
enabled: true
flag: --deployment.feature.jwt-rotation
releases:
- operatorVersion: 1.0.3
state: Alpha
- operatorVersion: 1.1.0
state: Production
- name: Encryption Key Rotation Support
arangoDBEditions: Enterprise
flag: --deployment.feature.encryption-rotation
enabled: false
releases:
- operatorVersion: 1.0.3
state: Alpha
- operatorVersion: 1.2.0
state: NotSupported
- name: Version Check
flag: --deployment.feature.upgrade-version-check
enabled: true
releases:
- operatorVersion: 1.1.4
state: Alpha
- operatorVersion: 1.2.23
state: Production
- name: Version Check V2
flag: --deployment.feature.upgrade-version-check-V2
enabled: false
releases:
- operatorVersion: 1.2.31
state: Alpha
- name: Operator Maintenance Management Support
flag: --deployment.feature.maintenance
enabled: true
releases:
- operatorVersion: 1.0.7
state: Alpha
- operatorVersion: 1.2.0
state: Production
- name: Graceful Restart
flag: '---deployment.feature.graceful-shutdown'
enabled: true
releases:
- operatorVersion: 1.0.7
state: Alpha
- operatorVersion: 1.2.5
state: Production
- name: Optional Graceful Restart
flag: --deployment.feature.optional-graceful-shutdown
enabled: false
releases:
- operatorVersion: 1.2.5
state: Beta
- operatorVersion: 1.2.0
state: Production
- name: Operator Internal Metrics Exporter
flag: --deployment.feature.metrics-exporter
enabled: true
releases:
- operatorVersion: 1.2.0
state: Production
- name: Operator Ephemeral Volumes
doc: docs/design/features/ephemeral_volumes.md
flag: --deployment.feature.ephemeral-volumes
enabled: false
releases:
- operatorVersion: 1.2.2
state: Alpha
- operatorVersion: 1.2.31
state: Beta
- name: Failover Leader service
doc: docs/design/features/failover_leader_service.md
flag: --deployment.feature.failover-leadership
enabled: false
releases:
- operatorVersion: 1.2.13
state: Production
- name: Spec Default Restore
doc: docs/design/features/deployment_spec_defaults.md
flag: --deployment.feature.deployment-spec-defaults-restore
enabled: true
remarks: If set to False Operator will not change ArangoDeployment Spec
releases:
- operatorVersion: 1.2.21
state: Alpha
- operatorVersion: 1.2.25
state: Beta
- name: Force Rebuild Out Synced Shards
doc: docs/design/features/rebuild_out_synced_shards.md
flag: --deployment.feature.force-rebuild-out-synced-shards
enabled: false
remarks: It should be used only if user is aware of the risks.
releases:
- operatorVersion: 1.2.27
state: Production
- name: Rebalancer
doc: docs/design/features/rebalancer.md
enabled: true
operatorEditions: Enterprise
arangoDBEditions: Enterprise
releases:
- operatorVersion: 1.2.5
state: Alpha
- operatorVersion: 1.2.15
state: Production
- name: Rebalancer V2
doc: docs/design/features/rebalancer_v2.md
arangoDBVersion: ">= 3.10.0"
flag: --deployment.feature.rebalancer-v2
enabled: false
releases:
- operatorVersion: 1.2.31
state: Alpha
- name: Secured containers
doc: docs/design/features/secured_containers.md
flag: --deployment.feature.secured-containers
enabled: false
remarks: If set to True Operator will run containers in secure mode
releases:
- operatorVersion: 1.2.31
state: Alpha
- name: TopologyAwareness
doc: docs/design/topology_awareness.md
enabled: true
operatorEditions: Enterprise
arangoDBEditions: Enterprise
releases:
- operatorVersion: 1.2.4
state: Production
- name: AgencyCache
enabled: true
operatorEditions: Enterprise
arangoDBEditions: Enterprise
remarks: Enable Agency Cache mechanism in the Operator (Increase limit of the nodes)
releases:
- operatorVersion: 1.2.30
state: Production
- name: Member Maintenance Support
enabled: true
operatorEditions: Enterprise
arangoDBEditions: Enterprise
remarks: Enable Member Maintenance during planned restarts
releases:
- operatorVersion: 1.2.16
state: Alpha
- operatorVersion: 1.2.25
state: Production

5
internal/limits.yaml Normal file
View file

@ -0,0 +1,5 @@
limits:
- name: "Cluster size limit"
description: "Limits of the nodes (DBServers & Coordinators) supported in the Cluster mode"
community: "64"
enterprise: "1024"

View file

@ -1,18 +1,18 @@
platforms: platforms:
- name: "Google GKE" - name: "Google GKE"
versions: versions:
- kubernetesVersion: "1.21-1.25" - kubernetesVersion: "1.21-1.26"
arangoDBVersion: ">= 3.6.0" arangoDBVersion: ">= 3.6.0"
state: "Production" state: "Production"
remarks: "Don't use micro nodes " remarks: "Don't use micro nodes "
- name: "Azure AKS" - name: "Azure AKS"
versions: versions:
- kubernetesVersion: "1.21-1.24" - kubernetesVersion: "1.21-1.26"
arangoDBVersion: ">= 3.6.0" arangoDBVersion: ">= 3.6.0"
state: "Production" state: "Production"
- name: "Amazon EKS" - name: "Amazon EKS"
versions: versions:
- kubernetesVersion: "1.21-1.24" - kubernetesVersion: "1.21-1.26"
arangoDBVersion: ">= 3.6.0" arangoDBVersion: ">= 3.6.0"
state: "Production" state: "Production"
providerRemarks: "[Amazon EKS](./docs/providers/eks)" providerRemarks: "[Amazon EKS](./docs/providers/eks)"
@ -31,7 +31,7 @@ platforms:
arangoDBVersion: ">= 3.6.0" arangoDBVersion: ">= 3.6.0"
state: "Deprecated" state: "Deprecated"
remarks: "Support will be dropped in Operator 1.5.0" remarks: "Support will be dropped in Operator 1.5.0"
- kubernetesVersion: "4.2-4.11" - kubernetesVersion: "4.2-4.13"
arangoDBVersion: ">= 3.6.0" arangoDBVersion: ">= 3.6.0"
state: "Production" state: "Production"
- name: "BareMetal (kubeadm)" - name: "BareMetal (kubeadm)"
@ -40,16 +40,16 @@ platforms:
arangoDBVersion: ">= 3.6.0" arangoDBVersion: ">= 3.6.0"
state: "Deprecated" state: "Deprecated"
remarks: "Support will be dropped in Operator 1.5.0" remarks: "Support will be dropped in Operator 1.5.0"
- kubernetesVersion: "1.21-1.25" - kubernetesVersion: "1.21-1.27"
arangoDBVersion: ">= 3.6.0" arangoDBVersion: ">= 3.6.0"
state: "Production" state: "Production"
- name: "Minikube" - name: "Minikube"
versions: versions:
- kubernetesVersion: "1.21-1.25" - kubernetesVersion: "1.21-1.27"
arangoDBVersion: ">= 3.6.0" arangoDBVersion: ">= 3.6.0"
state: "Devel Only" state: "Devel Only"
- name: "Other" - name: "Other"
versions: versions:
- kubernetesVersion: "1.21-1.25" - kubernetesVersion: "1.21-1.27"
arangoDBVersion: ">= 3.6.0" arangoDBVersion: ">= 3.6.0"
state: "Devel Only" state: "Devel Only"

View file

@ -21,15 +21,22 @@
package internal package internal
import ( import (
"fmt"
"os" "os"
"path" "path"
"sort"
"strings"
"gopkg.in/yaml.v3" "gopkg.in/yaml.v3"
"github.com/arangodb/go-driver"
"github.com/arangodb/kube-arangodb/internal/md" "github.com/arangodb/kube-arangodb/internal/md"
"github.com/arangodb/kube-arangodb/pkg/util" "github.com/arangodb/kube-arangodb/pkg/util"
) )
const minSupportedArangoDBVersion = ">= 3.8.0"
type PlatformsDoc struct { type PlatformsDoc struct {
Platforms Platforms `json:"platforms,omitempty" yaml:"platforms,omitempty"` Platforms Platforms `json:"platforms,omitempty" yaml:"platforms,omitempty"`
} }
@ -49,10 +56,214 @@ type PlatformVersion struct {
ProviderRemarks *string `json:"providerRemarks,omitempty" yaml:"providerRemarks,omitempty"` ProviderRemarks *string `json:"providerRemarks,omitempty" yaml:"providerRemarks,omitempty"`
} }
type FeaturesDoc struct {
Features Features `json:"features,omitempty" yaml:"features,omitempty"`
}
type Features []Feature
type Feature struct {
Name string `json:"name,omitempty" yaml:"name,omitempty"`
Releases FeatureReleases `json:"releases,omitempty" yaml:"releases,omitempty"`
FeatureRelease `json:",inline" yaml:",inline"`
}
type FeatureReleases []FeatureRelease
type FeatureRelease struct {
Doc *string `json:"doc,omitempty" yaml:"doc,omitempty"`
OperatorVersion *string `json:"operatorVersion,omitempty" yaml:"operatorVersion,omitempty"`
ArangoDBVersion *string `json:"arangoDBVersion,omitempty" yaml:"arangoDBVersion,omitempty"`
OperatorEdition *string `json:"operatorEditions,omitempty" yaml:"operatorEditions,omitempty"`
ArangoDBEdition *string `json:"arangoDBEditions,omitempty" yaml:"arangoDBEditions,omitempty"`
State *string `json:"state,omitempty" yaml:"state,omitempty"`
Flag *string `json:"flag,omitempty" yaml:"flag,omitempty"`
Remarks *string `json:"remarks,omitempty" yaml:"remarks,omitempty"`
Enabled *bool `json:"enabled,omitempty" yaml:"enabled,omitempty"`
}
type LimitsDoc struct {
Limits Limits `json:"limits,omitempty" yaml:"limits,omitempty"`
}
type Limits []Limit
type Limit struct {
Name string `json:"name" yaml:"name"`
Description string `json:"description" yaml:"description"`
Community *string `json:"community,omitempty" yaml:"community,omitempty"`
Enterprise *string `json:"enterprise,omitempty" yaml:"enterprise,omitempty"`
}
func GenerateReadme(root string) error { func GenerateReadme(root string) error {
readmeSections := map[string]string{} readmeSections := map[string]string{}
if section, err := GenerateReadmePlatforms(root); err != nil {
return err
} else {
readmeSections["kubernetesVersionsTable"] = section
}
if section, err := GenerateReadmeFeatures(root, true); err != nil {
return err
} else {
readmeSections["featuresEnterpriseTable"] = section
}
if section, err := GenerateReadmeFeatures(root, false); err != nil {
return err
} else {
readmeSections["featuresCommunityTable"] = section
}
if section, err := GenerateReadmeLimits(root); err != nil {
return err
} else {
readmeSections["limits"] = section
}
if err := md.ReplaceSectionsInFile(path.Join(root, "README.md"), readmeSections); err != nil {
return err
}
return nil
}
func GenerateReadmeFeatures(root string, eeOnly bool) (string, error) {
feature := md.NewColumn("Feature", md.ColumnLeftAlign)
introduced := md.NewColumn("Introduced", md.ColumnLeftAlign)
oVersion := md.NewColumn("Operator Version", md.ColumnLeftAlign)
aVersion := md.NewColumn("ArangoDB Version", md.ColumnLeftAlign)
aEdition := md.NewColumn("ArangoDB Edition", md.ColumnLeftAlign)
state := md.NewColumn("State", md.ColumnLeftAlign)
enabled := md.NewColumn("Enabled", md.ColumnLeftAlign)
flag := md.NewColumn("Flag", md.ColumnLeftAlign)
remarks := md.NewColumn("Remarks", md.ColumnLeftAlign)
t := md.NewTable(
feature,
oVersion,
introduced,
aVersion,
aEdition,
state,
enabled,
flag,
remarks,
)
var d FeaturesDoc
data, err := os.ReadFile(path.Join(root, "internal", "features.yaml"))
if err != nil {
return "", err
}
if err := yaml.Unmarshal(data, &d); err != nil {
return "", err
}
// Sort list
sort.Slice(d.Features, func(i, j int) bool {
{ {
av := util.First(util.LastFromList(d.Features[i].Releases).OperatorVersion, d.Features[i].OperatorVersion)
bv := util.First(util.LastFromList(d.Features[j].Releases).OperatorVersion, d.Features[j].OperatorVersion)
a := driver.Version(util.TypeOrDefault[string](av, "1.0.0"))
b := driver.Version(util.TypeOrDefault[string](bv, "1.0.0"))
if c := a.CompareTo(b); c != 0 {
return c > 0
}
}
{
a := driver.Version(util.TypeOrDefault[string](d.Features[i].Releases[0].OperatorVersion, "1.0.0"))
b := driver.Version(util.TypeOrDefault[string](d.Features[j].Releases[0].OperatorVersion, "1.0.0"))
if c := a.CompareTo(b); c != 0 {
return c > 0
}
}
return d.Features[i].Name < d.Features[j].Name
})
for _, f := range d.Features {
r := f.Releases[len(f.Releases)-1]
if community := strings.Contains(util.TypeOrDefault(util.First(r.OperatorEdition, f.OperatorEdition), "Community, Enterprise"), "Community"); community == eeOnly {
continue
}
n := f.Name
if v := util.First(r.Doc, f.Doc); v != nil {
n = fmt.Sprintf("[%s](%s)", n, *v)
}
if err := t.AddRow(map[md.Column]string{
feature: n,
oVersion: util.TypeOrDefault[string](util.First(r.OperatorVersion, f.OperatorVersion), "ANY"),
introduced: util.TypeOrDefault[string](f.Releases[0].OperatorVersion, "ANY"),
aVersion: util.TypeOrDefault[string](util.First(r.ArangoDBVersion, f.ArangoDBVersion), minSupportedArangoDBVersion),
aEdition: util.TypeOrDefault[string](util.First(r.ArangoDBEdition, f.ArangoDBEdition), "Community, Enterprise"),
aEdition: util.TypeOrDefault[string](util.First(r.ArangoDBEdition, f.ArangoDBEdition), "Community, Enterprise"),
state: util.TypeOrDefault[string](util.First(r.State, f.State), "Alpha"),
enabled: util.BoolSwitch[string](util.TypeOrDefault[bool](util.First(r.Enabled, f.Enabled), true), "True", "False"),
flag: util.TypeOrDefault[string](util.First(r.Flag, f.Flag), "N/A"),
remarks: util.TypeOrDefault[string](util.First(r.Remarks, f.Remarks), "N/A"),
}); err != nil {
return "", err
}
}
return md.WrapWithNewLines(t.Render()), nil
}
func GenerateReadmeLimits(root string) (string, error) {
limit := md.NewColumn("Limit", md.ColumnLeftAlign)
description := md.NewColumn("Description", md.ColumnLeftAlign)
community := md.NewColumn("Community", md.ColumnLeftAlign)
enterprise := md.NewColumn("Enterprise", md.ColumnLeftAlign)
t := md.NewTable(
limit,
description,
community,
enterprise,
)
var d LimitsDoc
data, err := os.ReadFile(path.Join(root, "internal", "limits.yaml"))
if err != nil {
return "", err
}
if err := yaml.Unmarshal(data, &d); err != nil {
return "", err
}
for _, l := range d.Limits {
if err := t.AddRow(map[md.Column]string{
limit: l.Name,
description: l.Description,
community: util.TypeOrDefault[string](l.Community, "N/A"),
enterprise: util.TypeOrDefault[string](l.Enterprise, "N/A"),
}); err != nil {
return "", err
}
}
return md.WrapWithNewLines(t.Render()), nil
}
func GenerateReadmePlatforms(root string) (string, error) {
platform := md.NewColumn("Platform", md.ColumnLeftAlign) platform := md.NewColumn("Platform", md.ColumnLeftAlign)
kVersion := md.NewColumn("Kubernetes Version", md.ColumnLeftAlign) kVersion := md.NewColumn("Kubernetes Version", md.ColumnLeftAlign)
aVersion := md.NewColumn("ArangoDB Version", md.ColumnLeftAlign) aVersion := md.NewColumn("ArangoDB Version", md.ColumnLeftAlign)
@ -72,11 +283,11 @@ func GenerateReadme(root string) error {
data, err := os.ReadFile(path.Join(root, "internal", "platforms.yaml")) data, err := os.ReadFile(path.Join(root, "internal", "platforms.yaml"))
if err != nil { if err != nil {
return err return "", err
} }
if err := yaml.Unmarshal(data, &d); err != nil { if err := yaml.Unmarshal(data, &d); err != nil {
return err return "", err
} }
for _, p := range d.Platforms { for _, p := range d.Platforms {
@ -89,17 +300,10 @@ func GenerateReadme(root string) error {
remarks: util.TypeOrDefault[string](v.Remarks, ""), remarks: util.TypeOrDefault[string](v.Remarks, ""),
pRemarks: util.TypeOrDefault[string](v.ProviderRemarks, ""), pRemarks: util.TypeOrDefault[string](v.ProviderRemarks, ""),
}); err != nil { }); err != nil {
return err return "", err
} }
} }
} }
readmeSections["metricsTable"] = md.WrapWithNewLines(t.Render()) return md.WrapWithNewLines(t.Render()), nil
}
if err := md.ReplaceSectionsInFile(path.Join(root, "README.md"), readmeSections); err != nil {
return err
}
return nil
} }

View file

@ -46,6 +46,22 @@ func TypeOrDefault[T interface{}](input *T, defaultValue ...T) T {
return *input return *input
} }
// First returns first not nil value
func First[T interface{}](input ...*T) *T {
for _, i := range input {
if i != nil {
return i
}
}
return nil
}
// LastFromList returns last element on the list
func LastFromList[T interface{}](in []T) T {
return in[len(in)-1]
}
// BoolSwitch define bool switch for defined types - in case of true t T is returned, in case of false f T // BoolSwitch define bool switch for defined types - in case of true t T is returned, in case of false f T
func BoolSwitch[T interface{}](s bool, t, f T) T { func BoolSwitch[T interface{}](s bool, t, f T) T {
if s { if s {