Skip to content

Commit a8451c4

Browse files
authored
Merge pull request #138 from hasbro17/haseeb/remove-old-actions
*: remove old actions
2 parents 2461007 + eb3b503 commit a8451c4

File tree

7 files changed

+51
-196
lines changed

7 files changed

+51
-196
lines changed

pkg/generator/generator_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ type Handler struct {
7575
// Fill me
7676
}
7777
78-
func (h *Handler) Handle(ctx types.Context, event types.Event) []types.Action {
78+
func (h *Handler) Handle(ctx types.Context, event types.Event) error {
7979
// Change me
8080
switch o := event.Object.(type) {
8181
case *apps_v1.Deployment:

pkg/generator/handler_tmpl.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ type Handler struct {
3232
// Fill me
3333
}
3434
35-
func (h *Handler) Handle(ctx types.Context, event types.Event) []types.Action {
35+
func (h *Handler) Handle(ctx types.Context, event types.Event) error {
3636
// Change me
3737
switch o := event.Object.(type) {
3838
case *apps_v1.Deployment:

pkg/sdk/action/action.go

Lines changed: 47 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -20,105 +20,91 @@ import (
2020
"github.com/coreos/operator-sdk/pkg/k8sclient"
2121
sdkTypes "github.com/coreos/operator-sdk/pkg/sdk/types"
2222
"github.com/coreos/operator-sdk/pkg/util/k8sutil"
23-
24-
apierrors "k8s.io/apimachinery/pkg/api/errors"
25-
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2623
)
2724

28-
const (
29-
// Supported function types
30-
KubeApplyFunc sdkTypes.FuncType = "kube-apply"
31-
KubeDeleteFunc sdkTypes.FuncType = "kube-delete"
32-
)
25+
// Create creates the provided object on the server and updates the arg
26+
// "object" with the result from the server(UID, resourceVersion, etc).
27+
// Returns an error if the object’s TypeMeta(Kind, APIVersion) or ObjectMeta(Name/GenerateName, Namespace) is missing or incorrect.
28+
// Can also return an api error from the server
29+
// e.g AlreadyExists https://github.com/kubernetes/apimachinery/blob/master/pkg/api/errors/errors.go#L423
30+
func Create(object sdkTypes.Object) (err error) {
31+
_, namespace, err := k8sutil.GetNameAndNamespace(object)
32+
if err != nil {
33+
return err
34+
}
35+
gvk := object.GetObjectKind().GroupVersionKind()
36+
apiVersion, kind := gvk.ToAPIVersionAndKind()
3337

34-
var (
35-
// kubeFuncs is the mapping of the supported functions
36-
kubeFuncs = map[sdkTypes.FuncType]sdkTypes.KubeFunc{
37-
KubeApplyFunc: KubeApply,
38-
KubeDeleteFunc: KubeDelete,
38+
resourceClient, _, err := k8sclient.GetResourceClient(apiVersion, kind, namespace)
39+
if err != nil {
40+
return fmt.Errorf("failed to get resource client: %v", err)
3941
}
40-
)
4142

42-
// ProcessAction invokes the function specified by action.Func
43-
func ProcessAction(action sdkTypes.Action) error {
44-
kubeFunc, ok := kubeFuncs[action.Func]
45-
if !ok {
46-
return fmt.Errorf("failed to process action: unsupported function (%v)", action.Func)
43+
unstructObj := k8sutil.UnstructuredFromRuntimeObject(object)
44+
unstructObj, err = resourceClient.Create(unstructObj)
45+
if err != nil {
46+
return err
4747
}
48-
err := kubeFunc(action.Object)
48+
49+
// Update the arg object with the result
50+
err = k8sutil.UnstructuredIntoRuntimeObject(unstructObj, object)
4951
if err != nil {
50-
return fmt.Errorf("failed to process action: %v", err)
52+
return fmt.Errorf("failed to unmarshal the retrieved data: %v", err)
5153
}
5254
return nil
5355
}
5456

55-
// KubeApply tries to create the specified object or update it if it already exists
56-
func KubeApply(object sdkTypes.Object) (err error) {
57-
defer func() {
58-
if err != nil {
59-
err = fmt.Errorf("kube-apply failed: %v", err)
60-
}
61-
}()
62-
63-
name, namespace, err := k8sutil.GetNameAndNamespace(object)
57+
// Update updates the provided object on the server and updates the arg
58+
// "object" with the result from the server(UID, resourceVersion, etc).
59+
// Returns an error if the object’s TypeMeta(Kind, APIVersion) or ObjectMeta(Name, Namespace) is missing or incorrect.
60+
// Can also return an api error from the server
61+
// e.g Conflict https://github.com/kubernetes/apimachinery/blob/master/pkg/api/errors/errors.go#L428
62+
func Update(object sdkTypes.Object) (err error) {
63+
_, namespace, err := k8sutil.GetNameAndNamespace(object)
6464
if err != nil {
6565
return err
6666
}
6767
gvk := object.GetObjectKind().GroupVersionKind()
6868
apiVersion, kind := gvk.ToAPIVersionAndKind()
69-
objectInfo := k8sutil.ObjectInfo(kind, name, namespace)
7069

7170
resourceClient, _, err := k8sclient.GetResourceClient(apiVersion, kind, namespace)
7271
if err != nil {
73-
return fmt.Errorf("failed to get resource client for object: %v", err)
72+
return fmt.Errorf("failed to get resource client: %v", err)
7473
}
7574

7675
unstructObj := k8sutil.UnstructuredFromRuntimeObject(object)
77-
78-
// Create the resource if it doesn't exist
79-
_, err = resourceClient.Create(unstructObj)
80-
if err == nil {
81-
return nil
82-
}
83-
if err != nil && !apierrors.IsAlreadyExists(err) {
84-
return fmt.Errorf("failed to create object (%s): %v ", objectInfo, err)
76+
unstructObj, err = resourceClient.Update(unstructObj)
77+
if err != nil {
78+
return err
8579
}
8680

87-
// Update it if it already exists
88-
// NOTE: The update could fail if there is a resourceVersion conflict.
89-
// That means the object is stale, and the user needs to retry the Action with
90-
// an updated object that has the latest resourceVersion
91-
_, err = resourceClient.Update(unstructObj)
81+
// Update the arg object with the result
82+
err = k8sutil.UnstructuredIntoRuntimeObject(unstructObj, object)
9283
if err != nil {
93-
return fmt.Errorf("failed to update object (%s): %v ", objectInfo, err)
84+
return fmt.Errorf("failed to unmarshal the retrieved data: %v", err)
9485
}
9586
return nil
9687
}
9788

98-
// KubeDelete deletes an object if it still exists
99-
func KubeDelete(object sdkTypes.Object) (err error) {
100-
defer func() {
101-
if err != nil {
102-
err = fmt.Errorf("kube-delete failed: %v", err)
103-
}
104-
}()
105-
89+
// Delete deletes the specified object
90+
// Returns an error if the object’s TypeMeta(Kind, APIVersion) or ObjectMeta(Name, Namespace) is missing or incorrect.
91+
// e.g NotFound https://github.com/kubernetes/apimachinery/blob/master/pkg/api/errors/errors.go#L418
92+
// “opts” configures the DeleteOptions
93+
// When passed WithDeleteOptions(o), the specified metav1.DeleteOptions are set.
94+
func Delete(object sdkTypes.Object, opts ...DeleteOption) (err error) {
10695
name, namespace, err := k8sutil.GetNameAndNamespace(object)
10796
if err != nil {
10897
return err
10998
}
11099
gvk := object.GetObjectKind().GroupVersionKind()
111100
apiVersion, kind := gvk.ToAPIVersionAndKind()
112-
objectInfo := k8sutil.ObjectInfo(kind, name, namespace)
113101

114102
resourceClient, _, err := k8sclient.GetResourceClient(apiVersion, kind, namespace)
115103
if err != nil {
116-
return fmt.Errorf("failed to get resource client for object: %v", err)
104+
return fmt.Errorf("failed to get resource client: %v", err)
117105
}
118106

119-
err = resourceClient.Delete(name, &metav1.DeleteOptions{})
120-
if err != nil && !apierrors.IsNotFound(err) {
121-
return fmt.Errorf("failed to delete object (%s): %v", objectInfo, err)
122-
}
123-
return nil
107+
o := NewDeleteOp()
108+
o.applyOpts(opts)
109+
return resourceClient.Delete(name, o.metaDeleteOptions)
124110
}

pkg/sdk/action/api.go

Lines changed: 0 additions & 110 deletions
This file was deleted.

pkg/sdk/handler/handler.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import (
2222
// If any intended action failed, the event would be re-triggered.
2323
// For actions done before the failed action, there is no rollback.
2424
type Handler interface {
25-
Handle(sdkTypes.Context, sdkTypes.Event) []sdkTypes.Action
25+
Handle(sdkTypes.Context, sdkTypes.Event) error
2626
}
2727

2828
var (

pkg/sdk/informer/sync.go

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
package informer
1616

1717
import (
18-
sdkAction "github.com/coreos/operator-sdk/pkg/sdk/action"
1918
sdkHandler "github.com/coreos/operator-sdk/pkg/sdk/handler"
2019
sdkTypes "github.com/coreos/operator-sdk/pkg/sdk/types"
2120
"github.com/coreos/operator-sdk/pkg/util/k8sutil"
@@ -78,16 +77,8 @@ func (i *informer) sync(key string) error {
7877
}
7978

8079
sdkCtx := sdkTypes.Context{Context: i.context}
81-
actions := sdkHandler.RegisteredHandler.Handle(sdkCtx, event)
8280
// TODO: Add option to prevent multiple informers from invoking Handle() concurrently?
83-
84-
for _, action := range actions {
85-
err := sdkAction.ProcessAction(action)
86-
if err != nil {
87-
return err
88-
}
89-
}
90-
return nil
81+
return sdkHandler.RegisteredHandler.Handle(sdkCtx, event)
9182
}
9283

9384
// handleErr checks if an error happened and makes sure we will retry later.

pkg/sdk/types/types.go

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -38,15 +38,3 @@ type Event struct {
3838
type Context struct {
3939
Context context.Context
4040
}
41-
42-
// FuncType defines the type of the function of an Action.
43-
type FuncType string
44-
45-
// KubeFunc is the function signature for supported kubernetes functions
46-
type KubeFunc func(Object) error
47-
48-
// Action defines what Function to apply on a given Object.
49-
type Action struct {
50-
Object Object
51-
Func FuncType
52-
}

0 commit comments

Comments
 (0)