Skip to content

Commit f29ae87

Browse files
feat: added version upgrade availability checks (#120)
1 parent c8d0162 commit f29ae87

21 files changed

Lines changed: 1006 additions & 5 deletions

Dockerfile.tilt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
11
FROM ubuntu:latest
22

3+
RUN apt-get update && apt-get install -y ca-certificates
4+
35
ADD bin/manager_linux /manager

api/v1alpha1/clickhousecluster_types.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,12 @@ type ClickHouseClusterSpec struct {
7272
// +optional
7373
// +kubebuilder:default:="cluster.local"
7474
ClusterDomain string `json:"clusterDomain,omitempty"`
75+
76+
// UpgradeChannel specifies the release channel for major version upgrade checks.
77+
// When empty, only minor updates will be proposed. Allowed values are: stable, lts or specific major.minor version (e.g. 25.8).
78+
// +optional
79+
// +kubebuilder:validation:Pattern=`^(lts|stable|\d+\.\d+)?$`
80+
UpgradeChannel string `json:"upgradeChannel,omitempty"`
7581
}
7682

7783
// WithDefaults sets default values for ClickHouseClusterSpec fields.

api/v1alpha1/conditions.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,14 @@ const (
4545
ConditionReasonVersionPending ConditionReason = "VersionPending"
4646
ConditionReasonVersionProbeFailed ConditionReason = "VersionProbeFailed"
4747

48+
// ConditionTypeVersionUpgraded indicates whether latest version within upgrade channel selected.
49+
ConditionTypeVersionUpgraded ConditionType = "VersionUpgraded"
50+
ConditionReasonWrongReleaseChannel ConditionReason = "WrongReleaseChannel"
51+
ConditionReasonMinorUpdateAvailable ConditionReason = "MinorUpdateAvailable"
52+
ConditionReasonMajorUpdateAvailable ConditionReason = "MajorUpdateAvailable"
53+
ConditionReasonVersionOutdated ConditionReason = "VersionOutdated"
54+
ConditionReasonUpgradeCheckFailed ConditionReason = "UpgradeCheckFailed"
55+
4856
// ConditionTypeReady indicates that cluster is ready to serve client requests.
4957
ConditionTypeReady ConditionType = "Ready"
5058
ClickHouseConditionAllShardsReady ConditionReason = "AllShardsReady"
@@ -91,6 +99,7 @@ var (
9199
ConditionTypeClusterSizeAligned,
92100
ConditionTypeConfigurationInSync,
93101
ConditionTypeVersionInSync,
102+
ConditionTypeVersionUpgraded,
94103
ConditionTypeReady,
95104
ClickHouseConditionTypeSchemaInSync,
96105
}
@@ -104,6 +113,7 @@ var (
104113
ConditionTypeClusterSizeAligned,
105114
ConditionTypeConfigurationInSync,
106115
ConditionTypeVersionInSync,
116+
ConditionTypeVersionUpgraded,
107117
ConditionTypeReady,
108118
KeeperConditionTypeScaleAllowed,
109119
}

api/v1alpha1/events.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ const (
2929
const (
3030
EventReasonVersionDiverge EventReason = "VersionDiverge"
3131
EventReasonVersionProbeFailed EventReason = "VersionProbeFailed"
32+
EventReasonUpgradeAvailable EventReason = "VersionUpgradeAvailable"
3233
)
3334

3435
// EventAction represents the action associated with an event.

api/v1alpha1/keepercluster_types.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,12 @@ type KeeperClusterSpec struct {
5959
// +optional
6060
// +kubebuilder:default:="cluster.local"
6161
ClusterDomain string `json:"clusterDomain,omitempty"`
62+
63+
// UpgradeChannel specifies the release channel for major version upgrade checks.
64+
// When empty, only minor updates will be proposed. Allowed values are: stable, lts or specific major.minor version (e.g. 25.8).
65+
// +optional
66+
// +kubebuilder:validation:Pattern=`^(lts|stable|\d+\.\d+)?$`
67+
UpgradeChannel string `json:"upgradeChannel,omitempty"`
6268
}
6369

6470
// WithDefaults sets default values for KeeperClusterSpec fields.

cmd/main.go

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,14 @@ import (
66
"flag"
77
"fmt"
88
"os"
9+
"time"
910

1011
clickhousecomv1alpha1 "github.com/ClickHouse/clickhouse-operator/api/v1alpha1"
1112
"github.com/ClickHouse/clickhouse-operator/internal/controller/clickhouse"
1213
"github.com/ClickHouse/clickhouse-operator/internal/controller/keeper"
1314
"github.com/ClickHouse/clickhouse-operator/internal/controllerutil"
1415
"github.com/ClickHouse/clickhouse-operator/internal/environment"
16+
"github.com/ClickHouse/clickhouse-operator/internal/upgrade"
1517
"github.com/ClickHouse/clickhouse-operator/internal/version"
1618
whchv1 "github.com/ClickHouse/clickhouse-operator/internal/webhook/v1alpha1"
1719

@@ -32,6 +34,10 @@ import (
3234
"sigs.k8s.io/controller-runtime/pkg/webhook"
3335
)
3436

37+
const (
38+
defaultVersionUpdateInterval = 24 * time.Hour
39+
)
40+
3541
var (
3642
scheme = runtime.NewScheme()
3743
setupLog = ctrl.Log.WithName("setup")
@@ -60,6 +66,8 @@ func run() error {
6066
secureMetrics bool
6167
enableHTTP2 bool
6268
tlsOpts []func(*tls.Config)
69+
versionUpdateInterval time.Duration
70+
disableVersionUpdateChecks bool
6371
)
6472

6573
flag.StringVar(&metricsAddr, "metrics-bind-address", "0", "The address the metrics endpoint binds to. "+
@@ -78,7 +86,11 @@ func run() error {
7886
flag.StringVar(&metricsCertName, "metrics-cert-name", "tls.crt", "The name of the metrics server certificate file.")
7987
flag.StringVar(&metricsCertKey, "metrics-cert-key", "tls.key", "The name of the metrics server key file.")
8088
flag.BoolVar(&enableHTTP2, "enable-http2", false,
81-
"If set, HTTP/2 will be enabled for the metrics and webhook servers")
89+
"If set, HTTP/2 will be enabled for the metrics and webhook servers.")
90+
flag.DurationVar(&versionUpdateInterval, "version-update-interval", defaultVersionUpdateInterval,
91+
"Interval for updating ClickHouse versions list.")
92+
flag.BoolVar(&disableVersionUpdateChecks, "disable-version-update-checks", false,
93+
"If set, the operator will not check for ClickHouse updates and notify about outdated versions.")
8294

8395
opts := zap.Options{
8496
Development: true,
@@ -173,11 +185,21 @@ func run() error {
173185

174186
zapLogger := controllerutil.NewLogger(logger)
175187

176-
if err = keeper.SetupWithManager(mgr, zapLogger); err != nil {
188+
var upgradeChecker *upgrade.Checker
189+
if !disableVersionUpdateChecks {
190+
updater := upgrade.NewReleaseUpdater(upgrade.NewURLFetcher(), versionUpdateInterval, zapLogger)
191+
if err = mgr.Add(updater); err != nil {
192+
return fmt.Errorf("unable to add release updater to manager: %w", err)
193+
}
194+
195+
upgradeChecker = upgrade.NewChecker(updater)
196+
}
197+
198+
if err = keeper.SetupWithManager(mgr, zapLogger, upgradeChecker); err != nil {
177199
return fmt.Errorf("unable to setup KeeperCluster controller: %w", err)
178200
}
179201

180-
if err = clickhouse.SetupWithManager(mgr, zapLogger); err != nil {
202+
if err = clickhouse.SetupWithManager(mgr, zapLogger, upgradeChecker); err != nil {
181203
return fmt.Errorf("unable to setup ClickHouseCluster controller: %w", err)
182204
}
183205

config/crd/bases/clickhouse.com_clickhouseclusters.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4363,6 +4363,12 @@ spec:
43634363
format: int32
43644364
minimum: 0
43654365
type: integer
4366+
upgradeChannel:
4367+
description: |-
4368+
UpgradeChannel specifies the release channel for major version upgrade checks.
4369+
When empty, only minor updates will be proposed. Allowed values are: stable, lts or specific major.minor version (e.g. 25.8).
4370+
pattern: ^(lts|stable|\d+\.\d+)?$
4371+
type: string
43664372
required:
43674373
- keeperClusterRef
43684374
type: object

config/crd/bases/clickhouse.com_keeperclusters.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4298,6 +4298,12 @@ spec:
42984298
x-kubernetes-map-type: atomic
42994299
type: object
43004300
type: object
4301+
upgradeChannel:
4302+
description: |-
4303+
UpgradeChannel specifies the release channel for major version upgrade checks.
4304+
When empty, only minor updates will be proposed. Allowed values are: stable, lts or specific major.minor version (e.g. 25.8).
4305+
pattern: ^(lts|stable|\d+\.\d+)?$
4306+
type: string
43014307
type: object
43024308
status:
43034309
description: KeeperClusterStatus defines the observed state of KeeperCluster.

dist/chart/templates/crd/clickhouseclusters.clickhouse.com.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4173,6 +4173,12 @@ spec:
41734173
format: int32
41744174
minimum: 0
41754175
type: integer
4176+
upgradeChannel:
4177+
description: |-
4178+
UpgradeChannel specifies the release channel for major version upgrade checks.
4179+
When empty, only minor updates will be proposed. Allowed values are: stable, lts or specific major.minor version (e.g. 25.8).
4180+
pattern: ^(lts|stable|\d+\.\d+)?$
4181+
type: string
41764182
required:
41774183
- keeperClusterRef
41784184
type: object

dist/chart/templates/crd/keeperclusters.clickhouse.com.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4116,6 +4116,12 @@ spec:
41164116
x-kubernetes-map-type: atomic
41174117
type: object
41184118
type: object
4119+
upgradeChannel:
4120+
description: |-
4121+
UpgradeChannel specifies the release channel for major version upgrade checks.
4122+
When empty, only minor updates will be proposed. Allowed values are: stable, lts or specific major.minor version (e.g. 25.8).
4123+
pattern: ^(lts|stable|\d+\.\d+)?$
4124+
type: string
41194125
type: object
41204126
status:
41214127
description: KeeperClusterStatus defines the observed state of KeeperCluster.

0 commit comments

Comments
 (0)