Skip to content
Closed
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
57 changes: 57 additions & 0 deletions pkg/api/framework/api.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package framework

import (
"context"

"k8s.io/apimachinery/pkg/runtime"
)

/*
'framework' asks only the user business logic to handle resource events.
It hides all nitty-gritty of k8s controller loop.

An example:
```main.go
func main() {
framework.RegisterSync(
SyncCallback{
SyncFunc: syncEtcdCluster,
ResourceType: &etcdapi.EtcdCluster{},
},
)
framework.Run(context.TODO())
}

func syncEtcdCluster(obj runtime.Object, existed bool) error {
if !existed {
destroyEtcdCluster()
return nil
}
ec := obj.(*etcdapi.EtcdCluster)
reconcile(ec)
return nil
}
```
*/

// SyncCallback defines user business logic for when resource events are triggered.
type SyncCallback struct {
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

as we discussed offline, sync should not be per resource based.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right.
What's your suggestion for users to define the resources they "care about"?
Maybe we can change RegisterSync(SyncBallback, ResourceTypesToWatch...)?

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should generate a Sync function stub for users to fill in. Users do not need to register that func with us at all. User only need to tell the SDK what resources that are interested in. Probably call sdk.Watch(resourceX).

// SyncFunc defines the func to sync a resource event.
// 'obj' is the current state of the resource on the event.
// 'existed' indicates whether this object still exists. If not, its relevant resources
// should be destroyed.
SyncFunc func(obj runtime.Object, existed bool) error
// ResourceType is used to decide what resource to watch and sync events
// It is an instantiation of the resource object which will be used to decide type at runtime.
ResourceType runtime.Object
}

// RegisterSync registers the callbacks where user business logic is defined.
func RegisterSync(cbs ...SyncCallback) {
panic("TODO: unimplemented")
}

// Run is the main entry point.
func Run(ctx context.Context) error {
panic("TODO: unimplemented")
}