Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add seeder API #52

Merged
merged 17 commits into from
Jan 24, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions PROJECT
Original file line number Diff line number Diff line change
Expand Up @@ -62,4 +62,13 @@ resources:
kind: ChiaTimelord
path: github.com/chia-network/chia-operator/api/v1
version: v1
- api:
crdVersion: v1
namespaced: true
controller: true
domain: k8s.chia.net
group: k8s.chia.net
kind: ChiaSeeder
path: github.com/chia-network/chia-operator/api/v1
version: v1
version: "3"
75 changes: 75 additions & 0 deletions api/v1/chiaseeder_types.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
/*
Copyright 2023 Chia Network Inc.
*/

package v1

import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

// ChiaSeederSpec defines the desired state of ChiaSeeder
type ChiaSeederSpec struct {
CommonSpec `json:",inline"`

// ChiaConfig defines the configuration options available to Chia component containers
ChiaConfig ChiaSeederSpecChia `json:"chia"`
}

// ChiaSeederSpecChia defines the desired state of Chia component configuration
type ChiaSeederSpecChia struct {
CommonSpecChia `json:",inline"`

// BootstrapPeer a peer to bootstrap the seeder's peer database
// +optional
BootstrapPeer *string `json:"bootstrapPeer"`

// MinimumHeight only consider nodes synced at least to this height
// +optional
MinimumHeight *uint64 `json:"minimumHeight"`

// DomainName the name of the NS record for your server with a trailing period. (ex. "seeder.example.com.")
DomainName string `json:"domainName"`

// Nameserver the name of the A record for your server with a trailing period. (ex. "seeder-us-west-2.example.com.")
Nameserver string `json:"nameserver"`

// Rname an administrator's email address with '@' replaced with '.'
Rname string `json:"rname"`

// TTL field on DNS records that controls the length of time that a record is considered valid
// +optional
TTL *uint32 `json:"ttl"`
}

// ChiaSeederStatus defines the observed state of ChiaSeeder
type ChiaSeederStatus struct {
// Ready says whether the chia component is ready deployed
// +kubebuilder:default=false
Ready bool `json:"ready,omitempty"`
}

//+kubebuilder:object:root=true
//+kubebuilder:subresource:status

// ChiaSeeder is the Schema for the chiaseeders API
type ChiaSeeder struct {
metav1.TypeMeta `json:",inline"`
metav1.ObjectMeta `json:"metadata,omitempty"`

Spec ChiaSeederSpec `json:"spec,omitempty"`
Status ChiaSeederStatus `json:"status,omitempty"`
}

//+kubebuilder:object:root=true

// ChiaSeederList contains a list of ChiaSeeder
type ChiaSeederList struct {
metav1.TypeMeta `json:",inline"`
metav1.ListMeta `json:"metadata,omitempty"`
Items []ChiaSeeder `json:"items"`
}

func init() {
SchemeBuilder.Register(&ChiaSeeder{}, &ChiaSeederList{})
}
116 changes: 116 additions & 0 deletions api/v1/chiaseeder_types_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
/*
Copyright 2023 Chia Network Inc.
*/

package v1

import (
"testing"

"github.com/google/go-cmp/cmp"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"sigs.k8s.io/yaml"
)

func TestUnmarshalChiaSeeder(t *testing.T) {
yamlData := []byte(`
apiVersion: k8s.chia.net/v1
kind: ChiaSeeder
metadata:
labels:
app.kubernetes.io/name: chiaseeder
app.kubernetes.io/instance: chiaseeder-sample
app.kubernetes.io/part-of: chia-operator
app.kubernetes.io/created-by: chia-operator
name: chiaseeder-sample
spec:
chia:
caSecretName: chiaca-secret
testnet: true
network: testnet68419
networkPort: 8080
introducerAddress: introducer.svc.cluster.local
dnsIntroducerAddress: dns-introducer.svc.cluster.local
timezone: "UTC"
logLevel: "INFO"
bootstrapPeer: "node.default.svc.cluster.local"
minimumHeight: 100
domainName: seeder.example.com.
nameserver: example.com.
rname: admin.example.com.
chiaExporter:
enabled: true
serviceLabels:
network: testnet
`)

var (
testnet = true
timezone = "UTC"
logLevel = "INFO"
network = "testnet68419"
networkPort uint16 = 8080
introducerAddress = "introducer.svc.cluster.local"
dnsIntroducerAddress = "dns-introducer.svc.cluster.local"
bootstrapPeer = "node.default.svc.cluster.local"
minimumHeight uint64 = 100
domainName = "seeder.example.com."
nameserver = "example.com."
rname = "admin.example.com."
)
expect := ChiaSeeder{
TypeMeta: metav1.TypeMeta{
APIVersion: "k8s.chia.net/v1",
Kind: "ChiaSeeder",
},
ObjectMeta: metav1.ObjectMeta{
Name: "chiaseeder-sample",
Labels: map[string]string{
"app.kubernetes.io/name": "chiaseeder",
"app.kubernetes.io/instance": "chiaseeder-sample",
"app.kubernetes.io/part-of": "chia-operator",
"app.kubernetes.io/created-by": "chia-operator",
},
},
Spec: ChiaSeederSpec{
ChiaConfig: ChiaSeederSpecChia{
CommonSpecChia: CommonSpecChia{
CASecretName: "chiaca-secret",
Testnet: &testnet,
Network: &network,
NetworkPort: &networkPort,
IntroducerAddress: &introducerAddress,
DNSIntroducerAddress: &dnsIntroducerAddress,
Timezone: &timezone,
LogLevel: &logLevel,
},
BootstrapPeer: &bootstrapPeer,
MinimumHeight: &minimumHeight,
DomainName: domainName,
Nameserver: nameserver,
Rname: rname,
},
CommonSpec: CommonSpec{
ChiaExporterConfig: SpecChiaExporter{
Enabled: true,
ServiceLabels: map[string]string{
"network": "testnet",
},
},
},
},
}

var actual ChiaSeeder
err := yaml.Unmarshal(yamlData, &actual)
if err != nil {
t.Errorf("Error unmarshaling yaml: %v", err)
return
}

diff := cmp.Diff(actual, expect)
if diff != "" {
t.Errorf("Unmarshaled struct does not match the expected struct. Actual: %+v\nExpected: %+v\nDiff: %s", actual, expect, diff)
return
}
}
122 changes: 122 additions & 0 deletions api/v1/zz_generated.deepcopy.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 9 additions & 0 deletions cmd/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import (
"github.com/chia-network/chia-operator/internal/controller/chiafarmer"
"github.com/chia-network/chia-operator/internal/controller/chiaharvester"
"github.com/chia-network/chia-operator/internal/controller/chianode"
"github.com/chia-network/chia-operator/internal/controller/chiaseeder"
"github.com/chia-network/chia-operator/internal/controller/chiatimelord"
"github.com/chia-network/chia-operator/internal/controller/chiawallet"
//+kubebuilder:scaffold:imports
Expand Down Expand Up @@ -130,6 +131,14 @@ func main() {
setupLog.Error(err, "unable to create controller", "controller", "ChiaTimelord")
os.Exit(1)
}
if err = (&chiaseeder.ChiaSeederReconciler{
Client: mgr.GetClient(),
Scheme: mgr.GetScheme(),
Recorder: mgr.GetEventRecorderFor("chiaseeder-controller"),
}).SetupWithManager(mgr); err != nil {
setupLog.Error(err, "unable to create controller", "controller", "ChiaSeeder")
os.Exit(1)
}
//+kubebuilder:scaffold:builder

if err := mgr.AddHealthzCheck("healthz", healthz.Ping); err != nil {
Expand Down
Loading
Loading