Skip to content

Commit 0c51f6b

Browse files
committed
feat!: add PDNSProvider CRD to manage multiple PowerDNS instances
Signed-off-by: Benjamin Pinchon <[email protected]>
1 parent 2661067 commit 0c51f6b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

59 files changed

+4307
-540
lines changed

PROJECT

Lines changed: 16 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -8,53 +8,46 @@ layout:
88
projectName: powerdns-operator
99
repo: github.com/powerdns-operator/powerdns-operator
1010
resources:
11-
- api:
12-
crdVersion: v1
13-
domain: cav.enablers.ob
14-
group: dns
15-
kind: Zone
16-
path: github.com/powerdns-operator/powerdns-operator/api/v1alpha1
17-
version: v1alpha1
18-
- api:
19-
crdVersion: v1
20-
namespaced: true
21-
domain: cav.enablers.ob
22-
group: dns
23-
kind: RRset
24-
path: github.com/powerdns-operator/powerdns-operator/api/v1alpha1
25-
version: v1alpha1
2611
- api:
2712
crdVersion: v1
2813
namespaced: true
2914
controller: true
3015
domain: cav.enablers.ob
3116
group: dns
3217
kind: Zone
33-
path: github.com/powerdns-operator/powerdns-operator/api/v1alpha2
34-
version: v1alpha2
18+
path: github.com/powerdns-operator/powerdns-operator/api/v1alpha3
19+
version: v1alpha3
3520
- api:
3621
crdVersion: v1
3722
namespaced: true
3823
controller: true
3924
domain: cav.enablers.ob
4025
group: dns
4126
kind: RRset
42-
path: github.com/powerdns-operator/powerdns-operator/api/v1alpha2
43-
version: v1alpha2
27+
path: github.com/powerdns-operator/powerdns-operator/api/v1alpha3
28+
version: v1alpha3
4429
- api:
4530
crdVersion: v1
4631
controller: true
4732
domain: cav.enablers.ob
4833
group: dns
4934
kind: ClusterZone
50-
path: github.com/powerdns-operator/powerdns-operator/api/v1alpha2
51-
version: v1alpha2
35+
path: github.com/powerdns-operator/powerdns-operator/api/v1alpha3
36+
version: v1alpha3
5237
- api:
5338
crdVersion: v1
5439
controller: true
5540
domain: cav.enablers.ob
5641
group: dns
5742
kind: ClusterRRset
58-
path: github.com/powerdns-operator/powerdns-operator/api/v1alpha2
59-
version: v1alpha2
43+
path: github.com/powerdns-operator/powerdns-operator/api/v1alpha3
44+
version: v1alpha3
45+
- api:
46+
crdVersion: v1
47+
controller: true
48+
domain: cav.enablers.ob
49+
group: dns
50+
kind: PDNSProvider
51+
path: github.com/powerdns-operator/powerdns-operator/api/v1alpha3
52+
version: v1alpha3
6053
version: "3"

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ https://github.com/user-attachments/assets/cc43b03e-ed0d-4112-941d-0b53cc2ad3be
3535
|-----------|-------------------|
3636
| **PowerDNS Authoritative** | 4.7, 4.8, 4.9 |
3737
| **Kubernetes** | 1.31, 1.32, 1.33 |
38-
| **Go** (for development) | 1.24+ |
38+
| **Go** (for development) | 1.25+ |
3939

4040
## 🛠️ Installation
4141

api/v1alpha1/rrset_types.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ type RRsetStatus struct {
4848
}
4949

5050
// +kubebuilder:object:root=true
51+
// +kubebuilder:storageversion:deprecated
5152
// +kubebuilder:subresource:status
5253
// +kubebuilder:unservedversion
5354

api/v1alpha1/zone_types.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ type ZoneStatus struct {
6969
}
7070

7171
// +kubebuilder:object:root=true
72+
// +kubebuilder:storageversion:deprecated
7273
// +kubebuilder:subresource:status
7374
// +kubebuilder:unservedversion
7475

api/v1alpha2/clusterrrset_types.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,10 @@ import (
1515
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1616
)
1717

18-
//+kubebuilder:object:root=true
19-
//+kubebuilder:subresource:status
20-
//+kubebuilder:resource:scope=Cluster
18+
// +kubebuilder:object:root=true
19+
// +kubebuilder:storageversion:deprecated
20+
// +kubebuilder:subresource:status
21+
// +kubebuilder:resource:scope=Cluster
2122

2223
// +kubebuilder:printcolumn:name="Zone",type="string",JSONPath=".spec.zoneRef.name"
2324
// +kubebuilder:printcolumn:name="Name",type="string",JSONPath=".status.dnsEntryName"
@@ -34,7 +35,7 @@ type ClusterRRset struct {
3435
Status RRsetStatus `json:"status,omitempty"`
3536
}
3637

37-
//+kubebuilder:object:root=true
38+
// +kubebuilder:object:root=true
3839

3940
// ClusterRRsetList contains a list of ClusterRRset
4041
type ClusterRRsetList struct {

api/v1alpha2/clusterzone_types.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,9 @@ import (
1515
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1616
)
1717

18-
//+kubebuilder:object:root=true
19-
//+kubebuilder:subresource:status
18+
// +kubebuilder:object:root=true
19+
// +kubebuilder:storageversion:deprecated
20+
// +kubebuilder:subresource:status
2021
// +kubebuilder:resource:scope=Cluster
2122

2223
// +kubebuilder:printcolumn:name="Serial",type="integer",JSONPath=".status.serial"
@@ -31,7 +32,7 @@ type ClusterZone struct {
3132
Status ZoneStatus `json:"status,omitempty"`
3233
}
3334

34-
//+kubebuilder:object:root=true
35+
// +kubebuilder:object:root=true
3536

3637
// ClusterZoneList contains a list of ClusterZone
3738
type ClusterZoneList struct {

api/v1alpha2/rrset_types.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,11 @@ type RRsetStatus struct {
5050
ObservedGeneration *int64 `json:"observedGeneration,omitempty"`
5151
}
5252

53-
//+kubebuilder:object:root=true
54-
//+kubebuilder:storageversion
55-
//+kubebuilder:conversion:hub
56-
//+kubebuilder:subresource:status
57-
//+kubebuilder:resource:scope=Namespaced
53+
// +kubebuilder:object:root=true
54+
// +kubebuilder:storageversion:deprecated
55+
// +kubebuilder:conversion:hub
56+
// +kubebuilder:subresource:status
57+
// +kubebuilder:resource:scope=Namespaced
5858

5959
// +kubebuilder:printcolumn:name="Zone",type="string",JSONPath=".spec.zoneRef.name"
6060
// +kubebuilder:printcolumn:name="Name",type="string",JSONPath=".status.dnsEntryName"
@@ -71,7 +71,7 @@ type RRset struct {
7171
Status RRsetStatus `json:"status,omitempty"`
7272
}
7373

74-
//+kubebuilder:object:root=true
74+
// +kubebuilder:object:root=true
7575

7676
// RRsetList contains a list of RRset
7777
type RRsetList struct {

api/v1alpha2/zone_types.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,10 @@ type ZoneStatus struct {
6868
ObservedGeneration *int64 `json:"observedGeneration,omitempty"`
6969
}
7070

71-
//+kubebuilder:object:root=true
72-
//+kubebuilder:storageversion
73-
//+kubebuilder:subresource:status
74-
//+kubebuilder:resource:scope=Namespaced
71+
// +kubebuilder:object:root=true
72+
// +kubebuilder:storageversion:deprecated
73+
// +kubebuilder:subresource:status
74+
// +kubebuilder:resource:scope=Namespaced
7575

7676
// +kubebuilder:printcolumn:name="Serial",type="integer",JSONPath=".status.serial"
7777
// +kubebuilder:printcolumn:name="ID",type="string",JSONPath=".status.id"
@@ -85,7 +85,7 @@ type Zone struct {
8585
Status ZoneStatus `json:"status,omitempty"`
8686
}
8787

88-
//+kubebuilder:object:root=true
88+
// +kubebuilder:object:root=true
8989

9090
// ZoneList contains a list of Zone
9191
type ZoneList struct {

api/v1alpha3/clusterrrset_types.go

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
/*
2+
* Software Name : PowerDNS-Operator
3+
*
4+
* SPDX-FileCopyrightText: Copyright (c) PowerDNS-Operator contributors
5+
* SPDX-FileCopyrightText: Copyright (c) 2025 Orange Business Services SA
6+
* SPDX-License-Identifier: Apache-2.0
7+
*
8+
* This software is distributed under the Apache 2.0 License,
9+
* see the "LICENSE" file for more details
10+
*/
11+
12+
package v1alpha3
13+
14+
import (
15+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
16+
)
17+
18+
// +kubebuilder:object:root=true
19+
// +kubebuilder:storageversion
20+
// +kubebuilder:subresource:status
21+
// +kubebuilder:resource:scope=Cluster
22+
23+
// +kubebuilder:printcolumn:name="Zone",type="string",JSONPath=".spec.zoneRef.name"
24+
// +kubebuilder:printcolumn:name="Name",type="string",JSONPath=".status.dnsEntryName"
25+
// +kubebuilder:printcolumn:name="Type",type="string",JSONPath=".spec.type"
26+
// +kubebuilder:printcolumn:name="TTL",type="integer",JSONPath=".spec.ttl"
27+
// +kubebuilder:printcolumn:name="Status",type="string",JSONPath=".status.syncStatus"
28+
// +kubebuilder:printcolumn:name="Records",type="string",JSONPath=".spec.records"
29+
// ClusterRRset is the Schema for the clusterrrsets API
30+
type ClusterRRset struct {
31+
metav1.TypeMeta `json:",inline"`
32+
metav1.ObjectMeta `json:"metadata,omitempty"`
33+
34+
Spec RRsetSpec `json:"spec,omitempty"`
35+
Status RRsetStatus `json:"status,omitempty"`
36+
}
37+
38+
// +kubebuilder:object:root=true
39+
40+
// ClusterRRsetList contains a list of ClusterRRset
41+
type ClusterRRsetList struct {
42+
metav1.TypeMeta `json:",inline"`
43+
metav1.ListMeta `json:"metadata,omitempty"`
44+
Items []ClusterRRset `json:"items"`
45+
}
46+
47+
func init() {
48+
SchemeBuilder.Register(&ClusterRRset{}, &ClusterRRsetList{})
49+
}
50+
51+
// IsInExpectedStatus returns true if Status.SyncStatus and Status.ObservedGeneration are, at least, at expected value
52+
func (r *ClusterRRset) IsInExpectedStatus(expectedMinimumObservedGeneration int64, expectedSyncStatus string) bool {
53+
return r.Status.ObservedGeneration != nil &&
54+
*r.Status.ObservedGeneration >= expectedMinimumObservedGeneration &&
55+
r.Status.SyncStatus != nil &&
56+
*r.Status.SyncStatus == expectedSyncStatus
57+
}

api/v1alpha3/clusterzone_types.go

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
/*
2+
* Software Name : PowerDNS-Operator
3+
*
4+
* SPDX-FileCopyrightText: Copyright (c) PowerDNS-Operator contributors
5+
* SPDX-FileCopyrightText: Copyright (c) 2025 Orange Business Services SA
6+
* SPDX-License-Identifier: Apache-2.0
7+
*
8+
* This software is distributed under the Apache 2.0 License,
9+
* see the "LICENSE" file for more details
10+
*/
11+
12+
package v1alpha3
13+
14+
import (
15+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
16+
)
17+
18+
// +kubebuilder:object:root=true
19+
// +kubebuilder:storageversion
20+
// +kubebuilder:subresource:status
21+
// +kubebuilder:resource:scope=Cluster
22+
23+
// +kubebuilder:printcolumn:name="PDNSProvider",type="string",JSONPath=".spec.providerRef"
24+
// +kubebuilder:printcolumn:name="Serial",type="integer",JSONPath=".status.serial"
25+
// +kubebuilder:printcolumn:name="ID",type="string",JSONPath=".status.id"
26+
// +kubebuilder:printcolumn:name="Status",type="string",JSONPath=".status.syncStatus"
27+
// ClusterZone is the Schema for the clusterzones API
28+
type ClusterZone struct {
29+
metav1.TypeMeta `json:",inline"`
30+
metav1.ObjectMeta `json:"metadata,omitempty"`
31+
32+
Spec ZoneSpec `json:"spec,omitempty"`
33+
Status ZoneStatus `json:"status,omitempty"`
34+
}
35+
36+
// +kubebuilder:object:root=true
37+
38+
// ClusterZoneList contains a list of ClusterZone
39+
type ClusterZoneList struct {
40+
metav1.TypeMeta `json:",inline"`
41+
metav1.ListMeta `json:"metadata,omitempty"`
42+
Items []ClusterZone `json:"items"`
43+
}
44+
45+
func init() {
46+
SchemeBuilder.Register(&ClusterZone{}, &ClusterZoneList{})
47+
}
48+
49+
// IsInExpectedStatus returns true if Status.SyncStatus and Status.ObservedGeneration are, at least, at expected value
50+
func (z *ClusterZone) IsInExpectedStatus(expectedMinimumObservedGeneration int64, expectedSyncStatus string) bool {
51+
return z.Status.ObservedGeneration != nil &&
52+
*z.Status.ObservedGeneration >= expectedMinimumObservedGeneration &&
53+
z.Status.SyncStatus != nil &&
54+
*z.Status.SyncStatus == expectedSyncStatus
55+
}

0 commit comments

Comments
 (0)