Skip to content

Commit de32252

Browse files
committed
feat: add support for multiple Datastores
1 parent 17869a4 commit de32252

File tree

3 files changed

+46
-2
lines changed

3 files changed

+46
-2
lines changed

api/v1alpha1/tenantcontrolplane_types.go

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,14 @@ type AddonsSpec struct {
297297
KubeProxy *AddonSpec `json:"kubeProxy,omitempty"`
298298
}
299299

300+
// DataStoreOverride defines which kubernetes resource will be stored in a dedicated datastore.
301+
type DataStoreOverride struct {
302+
// Resource specifies which kubernetes resource to target.
303+
Resource string `json:"resource,omitempty"`
304+
// DataStore specifies the DataStore that should be used to store the Kubernetes data for the given Resource.
305+
DataStore string `json:"dataStore,omitempty"`
306+
}
307+
300308
// TenantControlPlaneSpec defines the desired state of TenantControlPlane.
301309
// +kubebuilder:validation:XValidation:rule="!has(oldSelf.dataStore) || has(self.dataStore)", message="unsetting the dataStore is not supported"
302310
// +kubebuilder:validation:XValidation:rule="!has(oldSelf.dataStoreSchema) || has(self.dataStoreSchema)", message="unsetting the dataStoreSchema is not supported"
@@ -324,8 +332,10 @@ type TenantControlPlaneSpec struct {
324332
// to the user to avoid clashes between different TenantControlPlanes. If not set upon creation, Kamaji will default the
325333
// DataStoreUsername by concatenating the namespace and name of the TenantControlPlane.
326334
// +kubebuilder:validation:XValidation:rule="self == oldSelf",message="changing the dataStoreUsername is not supported"
327-
DataStoreUsername string `json:"dataStoreUsername,omitempty"`
328-
ControlPlane ControlPlane `json:"controlPlane"`
335+
DataStoreUsername string `json:"dataStoreUsername,omitempty"`
336+
// DataStoreOverride defines which kubernetes resources will be stored in dedicated datastores.
337+
DataStoreOverrides []DataStoreOverride `json:"dataStoreOverrides,omitempty"`
338+
ControlPlane ControlPlane `json:"controlPlane"`
329339
// Kubernetes specification for tenant control plane
330340
Kubernetes KubernetesSpec `json:"kubernetes"`
331341
// NetworkProfile specifies how the network is

internal/builders/controlplane/deployment.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,15 @@ const (
5252
kineInitContainerName = "chmod"
5353
)
5454

55+
type DataStoreOverrides struct {
56+
Resource string
57+
DataStore kamajiv1alpha1.DataStore
58+
}
59+
5560
type Deployment struct {
5661
KineContainerImage string
5762
DataStore kamajiv1alpha1.DataStore
63+
DataStoreOverrides []DataStoreOverrides
5864
Client client.Client
5965
}
6066

@@ -711,6 +717,20 @@ func (d Deployment) buildKubeAPIServerCommand(tenantControlPlane kamajiv1alpha1.
711717
desiredArgs["--etcd-keyfile"] = "/etc/kubernetes/pki/etcd/server.key"
712718
}
713719

720+
if len(d.DataStoreOverrides) != 0 {
721+
dataStoreOverridesEndpoints := make([]string, 0, len(d.DataStoreOverrides))
722+
for _, dso := range d.DataStoreOverrides {
723+
httpsEndpoints := make([]string, 0, len(dso.DataStore.Spec.Endpoints))
724+
725+
for _, ep := range d.DataStore.Spec.Endpoints {
726+
httpsEndpoints = append(httpsEndpoints, fmt.Sprintf("https://%s", ep))
727+
}
728+
dataStoreOverridesEndpoints = append(dataStoreOverridesEndpoints, fmt.Sprintf("%s#%s", dso.Resource, strings.Join(httpsEndpoints, ";")))
729+
}
730+
731+
desiredArgs["--etcd-servers-overrides"] = strings.Join(dataStoreOverridesEndpoints, ",")
732+
}
733+
714734
// Order matters, here: extraArgs could try to overwrite some arguments managed by Kamaji and that would be crucial.
715735
// Adding as first element of the array of maps, we're sure that these overrides will be sanitized by our configuration.
716736
return utilities.MergeMaps(current, desiredArgs, extraArgs)

internal/webhook/handlers/tcp_deployment.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,20 @@ func (t TenantControlPlaneDeployment) OnUpdate(newObject runtime.Object, oldObje
6767
}
6868
t.DeploymentBuilder.DataStore = ds
6969

70+
dataStoreOverrides := make([]controlplane.DataStoreOverrides, 0)
71+
72+
for _, dso := range tcp.Spec.DataStoreOverrides {
73+
ds := kamajiv1alpha1.DataStore{}
74+
if err := t.Client.Get(ctx, types.NamespacedName{Name: dso.DataStore}, &ds); err != nil {
75+
return nil, err
76+
}
77+
dataStoreOverrides = append(dataStoreOverrides, controlplane.DataStoreOverrides{
78+
Resource: dso.Resource,
79+
DataStore: ds,
80+
})
81+
}
82+
t.DeploymentBuilder.DataStoreOverrides = dataStoreOverrides
83+
7084
deployment := appsv1.Deployment{}
7185
deployment.Name = tcp.Name
7286
deployment.Namespace = tcp.Namespace

0 commit comments

Comments
 (0)