Skip to content

Commit

Permalink
Add new CRD for etcd snapshots
Browse files Browse the repository at this point in the history
Also adds a hack go script to print the embedded CRDs, for developer use.

Signed-off-by: Brad Davidson <[email protected]>
  • Loading branch information
brandond committed Oct 12, 2023
1 parent 64107b5 commit 500744b
Show file tree
Hide file tree
Showing 14 changed files with 795 additions and 9 deletions.
13 changes: 13 additions & 0 deletions hack/crdgen.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package main

import (
"os"

k3scrd "github.com/k3s-io/k3s/pkg/crd"
_ "github.com/k3s-io/k3s/pkg/generated/controllers/k3s.cattle.io/v1"
"github.com/rancher/wrangler/pkg/crd"
)

func main() {
crd.Print(os.Stdout, k3scrd.List())
}
89 changes: 87 additions & 2 deletions pkg/apis/k3s.cattle.io/v1/types.go
Original file line number Diff line number Diff line change
@@ -1,20 +1,105 @@
package v1

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

// +genclient
// +genclient:noStatus
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object

// Addon is used to track application of a manifest file on disk. It mostly exists so that the wrangler DesiredSet
// Apply controller has an object to track as the owner, and ensure that all created resources are tracked when the
// manifest is modified or removed.
type Addon struct {
metav1.TypeMeta `json:",inline"`
metav1.ObjectMeta `json:"metadata,omitempty"`

// Spec provides information about the on-disk manifest backing this resource.
Spec AddonSpec `json:"spec,omitempty"`
}

type AddonSpec struct {
Source string `json:"source,omitempty"`
Checksum string `json:"checksum,omitempty"`
// Source is the Path on disk to the manifest file that this Addon tracks.
Source string `json:"source,omitempty" column:""`
// Checksum is the SHA256 checksum of the most recently successfully applied manifest file.
Checksum string `json:"checksum,omitempty" column:""`
}

// +genclient
// +genclient:nonNamespaced
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object

// ETCDSnapshot tracks a point-in-time snapshot of the etcd datastore.
type ETCDSnapshotFile struct {
metav1.TypeMeta `json:",inline"`
metav1.ObjectMeta `json:"metadata,omitempty"`

// Spec defines properties of an etcd snapshot file
Spec ETCDSnapshotSpec `json:"spec,omitempty"`
// Status represents current information about a snapshot.
Status ETCDSnapshotStatus `json:"status,omitempty"`
}

// ETCDSnapshotSpec desribes an etcd snapshot file
type ETCDSnapshotSpec struct {
// SnapshotName contains the base name of the snapshot file. CLI actions that act
// on snapshots stored locally or within a pre-configured S3 bucket and
// prefix usually take the snapshot name as their argument.
SnapshotName string `json:"snapshotName" column:""`
// NodeName contains the name of the node that took the snapshot.
NodeName string `json:"nodeName" column:"name=Node"`
// Location is the absolute file:// or s3:// URI address of the snapshot.
Location string `json:"location" column:""`
// Metadata contains point-in-time snapshot of the contents of the
// k3s-etcd-snapshot-extra-metadata ConfigMap's data field, at the time the
// snapshot was taken. This is intended to contain data about cluster state
// that may be important for an external system to have available when restoring
// the snapshot.
Metadata map[string]string `json:"metadata,omitempty"`
// S3 contains extra metadata about the S3 storage system holding the
// snapshot. This is guaranteed to be set for all snapshots uploaded to S3.
// If not specified, the snapshot was not uploaded to S3.
S3 *ETCDSnapshotS3 `json:"s3,omitempty"`
}

// ETCDSnapshotS3 holds information about the S3 storage system holding the snapshot.
type ETCDSnapshotS3 struct {
// Endpoint is the host or host:port of the S3 service
Endpoint string `json:"endpoint,omitempty"`
// EndpointCA is the path on disk to the S3 service's trusted CA list. Leave empty to use the OS CA bundle.
EndpointCA string `json:"endpointCA,omitempty"`
// SkipSSLVerify is true if TLS certificate verification is disabled
SkipSSLVerify bool `json:"skipSSLVerify,omitempty"`
// Bucket is the bucket holding the snapshot
Bucket string `json:"bucket,omitempty"`
// Region is the region of the S3 service
Region string `json:"region,omitempty"`
// Prefix is the prefix in which the snapshot file is stored.
Prefix string `json:"prefix,omitempty"`
// Insecure is true if the S3 service uses HTTP instead of HTTPS
Insecure bool `json:"insecure,omitempty"`
}

// ETCDSnapshotStatus is the status of the ETCDSnapshotFile object.
type ETCDSnapshotStatus struct {
// Size is the size of the snapshot file, in bytes. If not specified, the snapshot failed.
Size *resource.Quantity `json:"size,omitempty" column:""`
// CreationTime is the timestamp when the snapshot was taken by etcd.
CreationTime *metav1.Time `json:"creationTime,omitempty" column:""`
// ReadyToUse indicates that the snapshot is available to be restored.
ReadyToUse *bool `json:"readyToUse,omitempty"`
// Error is the last observed error during snapshot creation, if any.
// If the snapshot is retried, this field will be cleared on success.
Error *ETCDSnapshotError `json:"error,omitempty"`
}

// ETCDSnapshotError describes an error encountered during snapshot creation.
type ETCDSnapshotError struct {
// Time is the timestamp when the error was encountered.
Time *metav1.Time `json:"time,omitempty"`
// Message is a string detailing the encountered error during snapshot creation if specified.
// NOTE: message may be logged, and it should not contain sensitive information.
Message *string `json:"message,omitempty"`
}
165 changes: 165 additions & 0 deletions pkg/apis/k3s.cattle.io/v1/zz_generated_deepcopy.go

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

17 changes: 17 additions & 0 deletions pkg/apis/k3s.cattle.io/v1/zz_generated_list_types.go

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

5 changes: 4 additions & 1 deletion pkg/apis/k3s.cattle.io/v1/zz_generated_register.go

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

1 change: 1 addition & 0 deletions pkg/codegen/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ func main() {
"k3s.cattle.io": {
Types: []interface{}{
v1.Addon{},
v1.ETCDSnapshotFile{},
},
GenerateTypes: true,
GenerateClients: true,
Expand Down
21 changes: 15 additions & 6 deletions pkg/crd/crds.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,19 @@ import (
)

func List() []crd.CRD {
addon := crd.NamespacedType("Addon.k3s.cattle.io/v1").
WithSchemaFromStruct(v1.Addon{}).
WithColumn("Source", ".spec.source").
WithColumn("Checksum", ".spec.checksum")

return []crd.CRD{addon}
addon := v1.Addon{}
etcdSnapshotFile := v1.ETCDSnapshotFile{}
return []crd.CRD{
crd.NamespacedType("Addon.k3s.cattle.io/v1").
WithSchemaFromStruct(addon).
WithColumn("Source", ".spec.source").
WithColumn("Checksum", ".spec.checksum"),
crd.NonNamespacedType("ETCDSnapshotFile.k3s.cattle.io/v1").
WithSchemaFromStruct(etcdSnapshotFile).
WithColumn("SnapshotName", ".spec.snapshotName").
WithColumn("Node", ".spec.nodeName").
WithColumn("Location", ".spec.location").
WithColumn("Size", ".status.size").
WithColumn("CreationTime", ".status.creationTime"),
}
}
Loading

0 comments on commit 500744b

Please sign in to comment.