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:
parent
7d513cca72
commit
6a49e3d25b
8 changed files with 559 additions and 85 deletions
98
README.md
98
README.md
|
@ -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)
|
||||||
|
|
||||||
|
|
10
docs/design/features/rebalancer.md
Normal file
10
docs/design/features/rebalancer.md
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
# ArangoDB Rebalancer Support
|
||||||
|
|
||||||
|
## How to use
|
||||||
|
|
||||||
|
To enable Rebalancer in ArangoDeployment:
|
||||||
|
```yaml
|
||||||
|
spec:
|
||||||
|
rebalancer:
|
||||||
|
enabled: true
|
||||||
|
```
|
|
@ -1,4 +1,4 @@
|
||||||
# ArangoDB Rebalancer Support
|
# ArangoDB Rebalancer V2 Support
|
||||||
|
|
||||||
## Overview
|
## Overview
|
||||||
|
|
||||||
|
|
215
internal/features.yaml
Normal file
215
internal/features.yaml
Normal 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
5
internal/limits.yaml
Normal 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"
|
|
@ -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"
|
||||||
|
|
|
@ -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,52 +56,75 @@ 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 {
|
||||||
platform := md.NewColumn("Platform", md.ColumnLeftAlign)
|
return err
|
||||||
kVersion := md.NewColumn("Kubernetes Version", md.ColumnLeftAlign)
|
} else {
|
||||||
aVersion := md.NewColumn("ArangoDB Version", md.ColumnLeftAlign)
|
readmeSections["kubernetesVersionsTable"] = section
|
||||||
state := md.NewColumn("State", md.ColumnLeftAlign)
|
}
|
||||||
remarks := md.NewColumn("Remarks", md.ColumnLeftAlign)
|
|
||||||
pRemarks := md.NewColumn("Provider Remarks", md.ColumnLeftAlign)
|
|
||||||
t := md.NewTable(
|
|
||||||
platform,
|
|
||||||
kVersion,
|
|
||||||
aVersion,
|
|
||||||
state,
|
|
||||||
remarks,
|
|
||||||
pRemarks,
|
|
||||||
)
|
|
||||||
|
|
||||||
var d PlatformsDoc
|
if section, err := GenerateReadmeFeatures(root, true); err != nil {
|
||||||
|
return err
|
||||||
|
} else {
|
||||||
|
readmeSections["featuresEnterpriseTable"] = section
|
||||||
|
}
|
||||||
|
|
||||||
data, err := os.ReadFile(path.Join(root, "internal", "platforms.yaml"))
|
if section, err := GenerateReadmeFeatures(root, false); err != nil {
|
||||||
if err != nil {
|
return err
|
||||||
return err
|
} else {
|
||||||
}
|
readmeSections["featuresCommunityTable"] = section
|
||||||
|
}
|
||||||
|
|
||||||
if err := yaml.Unmarshal(data, &d); err != nil {
|
if section, err := GenerateReadmeLimits(root); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
} else {
|
||||||
|
readmeSections["limits"] = section
|
||||||
for _, p := range d.Platforms {
|
|
||||||
for _, v := range p.Versions {
|
|
||||||
if err := t.AddRow(map[md.Column]string{
|
|
||||||
platform: p.Name,
|
|
||||||
kVersion: util.TypeOrDefault[string](v.KubernetesVersion, ""),
|
|
||||||
aVersion: util.TypeOrDefault[string](v.ArangoDBVersion, ""),
|
|
||||||
state: util.TypeOrDefault[string](v.State, ""),
|
|
||||||
remarks: util.TypeOrDefault[string](v.Remarks, ""),
|
|
||||||
pRemarks: util.TypeOrDefault[string](v.ProviderRemarks, ""),
|
|
||||||
}); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
readmeSections["metricsTable"] = md.WrapWithNewLines(t.Render())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := md.ReplaceSectionsInFile(path.Join(root, "README.md"), readmeSections); err != nil {
|
if err := md.ReplaceSectionsInFile(path.Join(root, "README.md"), readmeSections); err != nil {
|
||||||
|
@ -103,3 +133,177 @@ func GenerateReadme(root string) error {
|
||||||
|
|
||||||
return nil
|
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)
|
||||||
|
kVersion := md.NewColumn("Kubernetes Version", md.ColumnLeftAlign)
|
||||||
|
aVersion := md.NewColumn("ArangoDB Version", md.ColumnLeftAlign)
|
||||||
|
state := md.NewColumn("State", md.ColumnLeftAlign)
|
||||||
|
remarks := md.NewColumn("Remarks", md.ColumnLeftAlign)
|
||||||
|
pRemarks := md.NewColumn("Provider Remarks", md.ColumnLeftAlign)
|
||||||
|
t := md.NewTable(
|
||||||
|
platform,
|
||||||
|
kVersion,
|
||||||
|
aVersion,
|
||||||
|
state,
|
||||||
|
remarks,
|
||||||
|
pRemarks,
|
||||||
|
)
|
||||||
|
|
||||||
|
var d PlatformsDoc
|
||||||
|
|
||||||
|
data, err := os.ReadFile(path.Join(root, "internal", "platforms.yaml"))
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := yaml.Unmarshal(data, &d); err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, p := range d.Platforms {
|
||||||
|
for _, v := range p.Versions {
|
||||||
|
if err := t.AddRow(map[md.Column]string{
|
||||||
|
platform: p.Name,
|
||||||
|
kVersion: util.TypeOrDefault[string](v.KubernetesVersion, ""),
|
||||||
|
aVersion: util.TypeOrDefault[string](v.ArangoDBVersion, ""),
|
||||||
|
state: util.TypeOrDefault[string](v.State, ""),
|
||||||
|
remarks: util.TypeOrDefault[string](v.Remarks, ""),
|
||||||
|
pRemarks: util.TypeOrDefault[string](v.ProviderRemarks, ""),
|
||||||
|
}); err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return md.WrapWithNewLines(t.Render()), nil
|
||||||
|
}
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
Loading…
Reference in a new issue