From eb3b5039eae61fb77de4cf22412e0322d94327f2 Mon Sep 17 00:00:00 2001 From: hasbro17 Date: Wed, 28 Mar 2018 11:50:29 -0700 Subject: [PATCH] *: remove old actions --- pkg/generator/generator_test.go | 2 +- pkg/generator/handler_tmpl.go | 2 +- pkg/sdk/action/action.go | 108 ++++++++++++++----------------- pkg/sdk/action/api.go | 110 -------------------------------- pkg/sdk/handler/handler.go | 2 +- pkg/sdk/informer/sync.go | 11 +--- pkg/sdk/types/types.go | 12 ---- 7 files changed, 51 insertions(+), 196 deletions(-) delete mode 100644 pkg/sdk/action/api.go diff --git a/pkg/generator/generator_test.go b/pkg/generator/generator_test.go index 17823e665ff..e001288d50c 100644 --- a/pkg/generator/generator_test.go +++ b/pkg/generator/generator_test.go @@ -75,7 +75,7 @@ type Handler struct { // Fill me } -func (h *Handler) Handle(ctx types.Context, event types.Event) []types.Action { +func (h *Handler) Handle(ctx types.Context, event types.Event) error { // Change me switch o := event.Object.(type) { case *apps_v1.Deployment: diff --git a/pkg/generator/handler_tmpl.go b/pkg/generator/handler_tmpl.go index 43a2ee96711..8a22bd3431e 100644 --- a/pkg/generator/handler_tmpl.go +++ b/pkg/generator/handler_tmpl.go @@ -32,7 +32,7 @@ type Handler struct { // Fill me } -func (h *Handler) Handle(ctx types.Context, event types.Event) []types.Action { +func (h *Handler) Handle(ctx types.Context, event types.Event) error { // Change me switch o := event.Object.(type) { case *apps_v1.Deployment: diff --git a/pkg/sdk/action/action.go b/pkg/sdk/action/action.go index 79db96fa0dc..811e0a75d07 100644 --- a/pkg/sdk/action/action.go +++ b/pkg/sdk/action/action.go @@ -20,105 +20,91 @@ import ( "github.com/coreos/operator-sdk/pkg/k8sclient" sdkTypes "github.com/coreos/operator-sdk/pkg/sdk/types" "github.com/coreos/operator-sdk/pkg/util/k8sutil" - - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) -const ( - // Supported function types - KubeApplyFunc sdkTypes.FuncType = "kube-apply" - KubeDeleteFunc sdkTypes.FuncType = "kube-delete" -) +// Create creates the provided object on the server and updates the arg +// "object" with the result from the server(UID, resourceVersion, etc). +// Returns an error if the object’s TypeMeta(Kind, APIVersion) or ObjectMeta(Name/GenerateName, Namespace) is missing or incorrect. +// Can also return an api error from the server +// e.g AlreadyExists https://github.com/kubernetes/apimachinery/blob/master/pkg/api/errors/errors.go#L423 +func Create(object sdkTypes.Object) (err error) { + _, namespace, err := k8sutil.GetNameAndNamespace(object) + if err != nil { + return err + } + gvk := object.GetObjectKind().GroupVersionKind() + apiVersion, kind := gvk.ToAPIVersionAndKind() -var ( - // kubeFuncs is the mapping of the supported functions - kubeFuncs = map[sdkTypes.FuncType]sdkTypes.KubeFunc{ - KubeApplyFunc: KubeApply, - KubeDeleteFunc: KubeDelete, + resourceClient, _, err := k8sclient.GetResourceClient(apiVersion, kind, namespace) + if err != nil { + return fmt.Errorf("failed to get resource client: %v", err) } -) -// ProcessAction invokes the function specified by action.Func -func ProcessAction(action sdkTypes.Action) error { - kubeFunc, ok := kubeFuncs[action.Func] - if !ok { - return fmt.Errorf("failed to process action: unsupported function (%v)", action.Func) + unstructObj := k8sutil.UnstructuredFromRuntimeObject(object) + unstructObj, err = resourceClient.Create(unstructObj) + if err != nil { + return err } - err := kubeFunc(action.Object) + + // Update the arg object with the result + err = k8sutil.UnstructuredIntoRuntimeObject(unstructObj, object) if err != nil { - return fmt.Errorf("failed to process action: %v", err) + return fmt.Errorf("failed to unmarshal the retrieved data: %v", err) } return nil } -// KubeApply tries to create the specified object or update it if it already exists -func KubeApply(object sdkTypes.Object) (err error) { - defer func() { - if err != nil { - err = fmt.Errorf("kube-apply failed: %v", err) - } - }() - - name, namespace, err := k8sutil.GetNameAndNamespace(object) +// Update updates the provided object on the server and updates the arg +// "object" with the result from the server(UID, resourceVersion, etc). +// Returns an error if the object’s TypeMeta(Kind, APIVersion) or ObjectMeta(Name, Namespace) is missing or incorrect. +// Can also return an api error from the server +// e.g Conflict https://github.com/kubernetes/apimachinery/blob/master/pkg/api/errors/errors.go#L428 +func Update(object sdkTypes.Object) (err error) { + _, namespace, err := k8sutil.GetNameAndNamespace(object) if err != nil { return err } gvk := object.GetObjectKind().GroupVersionKind() apiVersion, kind := gvk.ToAPIVersionAndKind() - objectInfo := k8sutil.ObjectInfo(kind, name, namespace) resourceClient, _, err := k8sclient.GetResourceClient(apiVersion, kind, namespace) if err != nil { - return fmt.Errorf("failed to get resource client for object: %v", err) + return fmt.Errorf("failed to get resource client: %v", err) } unstructObj := k8sutil.UnstructuredFromRuntimeObject(object) - - // Create the resource if it doesn't exist - _, err = resourceClient.Create(unstructObj) - if err == nil { - return nil - } - if err != nil && !apierrors.IsAlreadyExists(err) { - return fmt.Errorf("failed to create object (%s): %v ", objectInfo, err) + unstructObj, err = resourceClient.Update(unstructObj) + if err != nil { + return err } - // Update it if it already exists - // NOTE: The update could fail if there is a resourceVersion conflict. - // That means the object is stale, and the user needs to retry the Action with - // an updated object that has the latest resourceVersion - _, err = resourceClient.Update(unstructObj) + // Update the arg object with the result + err = k8sutil.UnstructuredIntoRuntimeObject(unstructObj, object) if err != nil { - return fmt.Errorf("failed to update object (%s): %v ", objectInfo, err) + return fmt.Errorf("failed to unmarshal the retrieved data: %v", err) } return nil } -// KubeDelete deletes an object if it still exists -func KubeDelete(object sdkTypes.Object) (err error) { - defer func() { - if err != nil { - err = fmt.Errorf("kube-delete failed: %v", err) - } - }() - +// Delete deletes the specified object +// Returns an error if the object’s TypeMeta(Kind, APIVersion) or ObjectMeta(Name, Namespace) is missing or incorrect. +// e.g NotFound https://github.com/kubernetes/apimachinery/blob/master/pkg/api/errors/errors.go#L418 +// “opts” configures the DeleteOptions +// When passed WithDeleteOptions(o), the specified metav1.DeleteOptions are set. +func Delete(object sdkTypes.Object, opts ...DeleteOption) (err error) { name, namespace, err := k8sutil.GetNameAndNamespace(object) if err != nil { return err } gvk := object.GetObjectKind().GroupVersionKind() apiVersion, kind := gvk.ToAPIVersionAndKind() - objectInfo := k8sutil.ObjectInfo(kind, name, namespace) resourceClient, _, err := k8sclient.GetResourceClient(apiVersion, kind, namespace) if err != nil { - return fmt.Errorf("failed to get resource client for object: %v", err) + return fmt.Errorf("failed to get resource client: %v", err) } - err = resourceClient.Delete(name, &metav1.DeleteOptions{}) - if err != nil && !apierrors.IsNotFound(err) { - return fmt.Errorf("failed to delete object (%s): %v", objectInfo, err) - } - return nil + o := NewDeleteOp() + o.applyOpts(opts) + return resourceClient.Delete(name, o.metaDeleteOptions) } diff --git a/pkg/sdk/action/api.go b/pkg/sdk/action/api.go deleted file mode 100644 index 811e0a75d07..00000000000 --- a/pkg/sdk/action/api.go +++ /dev/null @@ -1,110 +0,0 @@ -// Copyright 2018 The Operator-SDK Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package action - -import ( - "fmt" - - "github.com/coreos/operator-sdk/pkg/k8sclient" - sdkTypes "github.com/coreos/operator-sdk/pkg/sdk/types" - "github.com/coreos/operator-sdk/pkg/util/k8sutil" -) - -// Create creates the provided object on the server and updates the arg -// "object" with the result from the server(UID, resourceVersion, etc). -// Returns an error if the object’s TypeMeta(Kind, APIVersion) or ObjectMeta(Name/GenerateName, Namespace) is missing or incorrect. -// Can also return an api error from the server -// e.g AlreadyExists https://github.com/kubernetes/apimachinery/blob/master/pkg/api/errors/errors.go#L423 -func Create(object sdkTypes.Object) (err error) { - _, namespace, err := k8sutil.GetNameAndNamespace(object) - if err != nil { - return err - } - gvk := object.GetObjectKind().GroupVersionKind() - apiVersion, kind := gvk.ToAPIVersionAndKind() - - resourceClient, _, err := k8sclient.GetResourceClient(apiVersion, kind, namespace) - if err != nil { - return fmt.Errorf("failed to get resource client: %v", err) - } - - unstructObj := k8sutil.UnstructuredFromRuntimeObject(object) - unstructObj, err = resourceClient.Create(unstructObj) - if err != nil { - return err - } - - // Update the arg object with the result - err = k8sutil.UnstructuredIntoRuntimeObject(unstructObj, object) - if err != nil { - return fmt.Errorf("failed to unmarshal the retrieved data: %v", err) - } - return nil -} - -// Update updates the provided object on the server and updates the arg -// "object" with the result from the server(UID, resourceVersion, etc). -// Returns an error if the object’s TypeMeta(Kind, APIVersion) or ObjectMeta(Name, Namespace) is missing or incorrect. -// Can also return an api error from the server -// e.g Conflict https://github.com/kubernetes/apimachinery/blob/master/pkg/api/errors/errors.go#L428 -func Update(object sdkTypes.Object) (err error) { - _, namespace, err := k8sutil.GetNameAndNamespace(object) - if err != nil { - return err - } - gvk := object.GetObjectKind().GroupVersionKind() - apiVersion, kind := gvk.ToAPIVersionAndKind() - - resourceClient, _, err := k8sclient.GetResourceClient(apiVersion, kind, namespace) - if err != nil { - return fmt.Errorf("failed to get resource client: %v", err) - } - - unstructObj := k8sutil.UnstructuredFromRuntimeObject(object) - unstructObj, err = resourceClient.Update(unstructObj) - if err != nil { - return err - } - - // Update the arg object with the result - err = k8sutil.UnstructuredIntoRuntimeObject(unstructObj, object) - if err != nil { - return fmt.Errorf("failed to unmarshal the retrieved data: %v", err) - } - return nil -} - -// Delete deletes the specified object -// Returns an error if the object’s TypeMeta(Kind, APIVersion) or ObjectMeta(Name, Namespace) is missing or incorrect. -// e.g NotFound https://github.com/kubernetes/apimachinery/blob/master/pkg/api/errors/errors.go#L418 -// “opts” configures the DeleteOptions -// When passed WithDeleteOptions(o), the specified metav1.DeleteOptions are set. -func Delete(object sdkTypes.Object, opts ...DeleteOption) (err error) { - name, namespace, err := k8sutil.GetNameAndNamespace(object) - if err != nil { - return err - } - gvk := object.GetObjectKind().GroupVersionKind() - apiVersion, kind := gvk.ToAPIVersionAndKind() - - resourceClient, _, err := k8sclient.GetResourceClient(apiVersion, kind, namespace) - if err != nil { - return fmt.Errorf("failed to get resource client: %v", err) - } - - o := NewDeleteOp() - o.applyOpts(opts) - return resourceClient.Delete(name, o.metaDeleteOptions) -} diff --git a/pkg/sdk/handler/handler.go b/pkg/sdk/handler/handler.go index 2ec0b301ed7..dabb6dda3cb 100644 --- a/pkg/sdk/handler/handler.go +++ b/pkg/sdk/handler/handler.go @@ -22,7 +22,7 @@ import ( // If any intended action failed, the event would be re-triggered. // For actions done before the failed action, there is no rollback. type Handler interface { - Handle(sdkTypes.Context, sdkTypes.Event) []sdkTypes.Action + Handle(sdkTypes.Context, sdkTypes.Event) error } var ( diff --git a/pkg/sdk/informer/sync.go b/pkg/sdk/informer/sync.go index 0d29ce91eb1..c16c6214500 100644 --- a/pkg/sdk/informer/sync.go +++ b/pkg/sdk/informer/sync.go @@ -15,7 +15,6 @@ package informer import ( - sdkAction "github.com/coreos/operator-sdk/pkg/sdk/action" sdkHandler "github.com/coreos/operator-sdk/pkg/sdk/handler" sdkTypes "github.com/coreos/operator-sdk/pkg/sdk/types" "github.com/coreos/operator-sdk/pkg/util/k8sutil" @@ -78,16 +77,8 @@ func (i *informer) sync(key string) error { } sdkCtx := sdkTypes.Context{Context: i.context} - actions := sdkHandler.RegisteredHandler.Handle(sdkCtx, event) // TODO: Add option to prevent multiple informers from invoking Handle() concurrently? - - for _, action := range actions { - err := sdkAction.ProcessAction(action) - if err != nil { - return err - } - } - return nil + return sdkHandler.RegisteredHandler.Handle(sdkCtx, event) } // handleErr checks if an error happened and makes sure we will retry later. diff --git a/pkg/sdk/types/types.go b/pkg/sdk/types/types.go index 58643cbe420..1d619f7dfec 100644 --- a/pkg/sdk/types/types.go +++ b/pkg/sdk/types/types.go @@ -38,15 +38,3 @@ type Event struct { type Context struct { Context context.Context } - -// FuncType defines the type of the function of an Action. -type FuncType string - -// KubeFunc is the function signature for supported kubernetes functions -type KubeFunc func(Object) error - -// Action defines what Function to apply on a given Object. -type Action struct { - Object Object - Func FuncType -}