Skip to content

Commit

Permalink
Removed the dependency on the operator kit (#220)
Browse files Browse the repository at this point in the history
* Removed the dependency on the operator kit
Added the license attribution for rook operator-kit in the files

* Cleaned up go.mod and go.sum files

* Resolved the conflicts and updated the license
  • Loading branch information
joshiomkarj authored and tdmanv committed Aug 27, 2019
1 parent d1228b3 commit d1cbd00
Show file tree
Hide file tree
Showing 7 changed files with 238 additions and 314 deletions.
6 changes: 1 addition & 5 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,9 @@ require (
github.com/Azure/go-autorest/autorest v0.5.0 // indirect
github.com/Azure/go-autorest/autorest/to v0.2.0 // indirect
github.com/BurntSushi/toml v0.3.1
github.com/IBM-Bluemix/bluemix-cli-sdk v0.3.0 // indirect
github.com/IBM-Cloud/ibm-cloud-cli-sdk v0.3.0 // indirect
github.com/IBM/ibmcloud-storage-volume-lib v0.0.0-20190705114640-e7a4b11c618c
github.com/Masterminds/semver v1.4.2 // indirect
github.com/Masterminds/semver v1.4.2
github.com/Masterminds/sprig v2.15.0+incompatible
github.com/aokoli/goutils v1.1.0 // indirect
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a // indirect
Expand All @@ -32,7 +31,6 @@ require (
github.com/go-openapi/errors v0.19.2 // indirect
github.com/go-openapi/strfmt v0.0.0-20170822153411-610b6cacdcde
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6 // indirect
github.com/golang/mock v1.2.0 // indirect
github.com/google/gofuzz v1.0.0 // indirect
github.com/google/uuid v1.1.1 // indirect
github.com/googleapis/gnostic v0.3.0 // indirect
Expand All @@ -52,10 +50,8 @@ require (
github.com/pborman/uuid v1.2.0 // indirect
github.com/pkg/errors v0.8.0
github.com/renier/xmlrpc v0.0.0-20170708154548-ce4a1a486c03 // indirect
github.com/rook/operator-kit v0.0.0-00010101000000-000000000000
github.com/satori/go.uuid v1.2.0
github.com/sirupsen/logrus v1.2.0
github.com/smartystreets/goconvey v0.0.0-20190710185942-9d28bd7c0945 // indirect
github.com/softlayer/softlayer-go v0.0.0-20190615201252-ba6e7f295217 // indirect
github.com/spf13/cobra v0.0.3
github.com/spf13/pflag v1.0.1 // indirect
Expand Down
295 changes: 0 additions & 295 deletions go.sum

Large diffs are not rendered by default.

9 changes: 5 additions & 4 deletions pkg/apis/cr/v1alpha1/register.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,12 @@ package v1alpha1
import (
"reflect"

opkit "github.com/rook/operator-kit"
apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"

customresource "github.com/kanisterio/kanister/pkg/customresource"
)

// These variables are exported to help hook into this package's schemes.
Expand All @@ -35,7 +36,7 @@ var (
)

// ActionSetResource is a CRD for actionsets.
var ActionSetResource = opkit.CustomResource{
var ActionSetResource = customresource.CustomResource{
Name: ActionSetResourceName,
Plural: ActionSetResourceNamePlural,
Group: ResourceGroup,
Expand All @@ -45,7 +46,7 @@ var ActionSetResource = opkit.CustomResource{
}

// BlueprintResource is a CRD for blueprints.
var BlueprintResource = opkit.CustomResource{
var BlueprintResource = customresource.CustomResource{
Name: BlueprintResourceName,
Plural: BlueprintResourceNamePlural,
Group: ResourceGroup,
Expand All @@ -55,7 +56,7 @@ var BlueprintResource = opkit.CustomResource{
}

// ProfileResource is a CRD for blueprints.
var ProfileResource = opkit.CustomResource{
var ProfileResource = customresource.CustomResource{
Name: ProfileResourceName,
Plural: ProfileResourceNamePlural,
Group: ResourceGroup,
Expand Down
8 changes: 4 additions & 4 deletions pkg/controller/controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,12 @@ import (
"reflect"
"sync"

customresource "github.com/kanisterio/kanister/pkg/customresource"
"github.com/pkg/errors"
opkit "github.com/rook/operator-kit"
log "github.com/sirupsen/logrus"
"gopkg.in/tomb.v2"
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest"
Expand Down Expand Up @@ -82,7 +82,7 @@ func (c *Controller) StartWatch(ctx context.Context, namespace string) error {
c.clientset = clientset
c.recorder = eventer.NewEventRecorder(c.clientset, "Kanister Controller")

for cr, o := range map[opkit.CustomResource]runtime.Object{
for cr, o := range map[customresource.CustomResource]runtime.Object{
crv1alpha1.ActionSetResource: &crv1alpha1.ActionSet{},
crv1alpha1.BlueprintResource: &crv1alpha1.Blueprint{},
} {
Expand All @@ -91,7 +91,7 @@ func (c *Controller) StartWatch(ctx context.Context, namespace string) error {
UpdateFunc: c.onUpdate,
DeleteFunc: c.onDelete,
}
watcher := opkit.NewWatcher(cr, namespace, resourceHandlers, crClient.CrV1alpha1().RESTClient())
watcher := customresource.NewWatcher(cr, namespace, resourceHandlers, crClient.CrV1alpha1().RESTClient())
// TODO: remove this tmp channel once https://github.com/rook/operator-kit/pull/11 is merged.
chTmp := make(chan struct{})
go func() {
Expand Down
144 changes: 144 additions & 0 deletions pkg/customresource/customresource.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
// Copyright 2019 The Kanister Authors.
// Copyright 2016 The Rook Authors. All rights reserved.
//
// 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 customresource

import (
"fmt"
"time"

"github.com/Masterminds/semver"
apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
apiextensionsclient "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
"k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/util/wait"
"k8s.io/client-go/kubernetes"

// importing go check to bypass the testing flags
_ "gopkg.in/check.v1"
)

const serverVersionV170 = "v1.7.0"

// CustomResource is for creating a Kubernetes TPR/CRD
type CustomResource struct {
// Name of the custom resource
Name string

// Plural of the custom resource in plural
Plural string

// Group the custom resource belongs to
Group string

// Version which should be defined in a const above
Version string

// Scope of the CRD. Namespaced or cluster
Scope apiextensionsv1beta1.ResourceScope

// Kind is the serialized interface of the resource.
Kind string
}

// Context hold the clientsets used for creating and watching custom resources
type Context struct {
Clientset kubernetes.Interface
APIExtensionClientset apiextensionsclient.Interface
Interval time.Duration
Timeout time.Duration
}

// CreateCustomResources creates the given custom resources and waits for them to initialize
// The resource is of kind CRD if the Kubernetes server is 1.7.0 and above.
// The resource is of kind TPR if the Kubernetes server is below 1.7.0.
func CreateCustomResources(context Context, resources []CustomResource) error {

// CRD is available on v1.7.0 and above. TPR became deprecated on v1.7.0
serverVersion, err := context.Clientset.Discovery().ServerVersion()
if err != nil {
return fmt.Errorf("Error getting server version: %v", err)
}
kubeVersion := semver.MustParse(serverVersion.GitVersion)

if kubeVersion.LessThan(semver.MustParse(serverVersionV170)) {
return fmt.Errorf("Kubernetes versions less than 1.7.0 not supported")
}
var lastErr error
for _, resource := range resources {
err = createCRD(context, resource)
if err != nil {
lastErr = err
}
}

for _, resource := range resources {
if err := waitForCRDInit(context, resource); err != nil {
lastErr = err
}
}
return lastErr
}

func createCRD(context Context, resource CustomResource) error {
crdName := fmt.Sprintf("%s.%s", resource.Plural, resource.Group)
crd := &apiextensionsv1beta1.CustomResourceDefinition{
ObjectMeta: metav1.ObjectMeta{
Name: crdName,
},
Spec: apiextensionsv1beta1.CustomResourceDefinitionSpec{
Group: resource.Group,
Version: resource.Version,
Scope: resource.Scope,
Names: apiextensionsv1beta1.CustomResourceDefinitionNames{
Singular: resource.Name,
Plural: resource.Plural,
Kind: resource.Kind,
},
},
}

_, err := context.APIExtensionClientset.ApiextensionsV1beta1().CustomResourceDefinitions().Create(crd)
if err != nil {
if !errors.IsAlreadyExists(err) {
return fmt.Errorf("failed to create %s CRD. %+v", resource.Name, err)
}
}
return nil
}

func waitForCRDInit(context Context, resource CustomResource) error {
crdName := fmt.Sprintf("%s.%s", resource.Plural, resource.Group)
return wait.Poll(context.Interval, context.Timeout, func() (bool, error) {
crd, err := context.APIExtensionClientset.ApiextensionsV1beta1().CustomResourceDefinitions().Get(crdName, metav1.GetOptions{})
if err != nil {
return false, err
}
for _, cond := range crd.Status.Conditions {
switch cond.Type {
case apiextensionsv1beta1.Established:
if cond.Status == apiextensionsv1beta1.ConditionTrue {
return true, nil
}
case apiextensionsv1beta1.NamesAccepted:
if cond.Status == apiextensionsv1beta1.ConditionFalse {
return false, fmt.Errorf("Name conflict: %v ", cond.Reason)
}
}
}
return false, nil
})
}
77 changes: 77 additions & 0 deletions pkg/customresource/watcher.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
// Copyright 2019 The Kanister Authors.
// Copyright 2016 The Rook Authors. All rights reserved.
//
// 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 customresource

import (
"errors"

"k8s.io/apimachinery/pkg/fields"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/cache"
)

var (
// ErrVersionOutdated indicates that the custom resource is outdated and needs to be refreshed
ErrVersionOutdated = errors.New("requested version is outdated in apiserver")
)

// ResourceWatcher watches a custom resource for desired state
type ResourceWatcher struct {
resource CustomResource
namespace string
resourceEventHandlers cache.ResourceEventHandlerFuncs
client rest.Interface
scheme *runtime.Scheme
}

// NewWatcher creates an instance of a custom resource watcher for the given resource
func NewWatcher(resource CustomResource, namespace string, handlers cache.ResourceEventHandlerFuncs, client rest.Interface) *ResourceWatcher {
return &ResourceWatcher{
resource: resource,
namespace: namespace,
resourceEventHandlers: handlers,
client: client,
}
}

// Watch begins watching the custom resource (TPR/CRD). The call will block until a Done signal is raised during in the context.
// When the watch has detected a create, update, or delete event, it will handled by the functions in the resourceEventHandlers. After the callback returns, the watch loop will continue for the next event.
// If the callback returns an error, the error will be logged.
func (w *ResourceWatcher) Watch(objType runtime.Object, done <-chan struct{}) error {
source := cache.NewListWatchFromClient(
w.client,
w.resource.Plural,
w.namespace,
fields.Everything())
_, controller := cache.NewInformer(
source,

// The object type.
objType,

// resyncPeriod
// Every resyncPeriod, all resources in the cache will retrigger events.
// Set to 0 to disable the resync.
0,

// Your custom resource event handlers.
w.resourceEventHandlers)

go controller.Run(done)
<-done
return nil
}
13 changes: 7 additions & 6 deletions pkg/resource/resource.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,29 +19,30 @@ import (
"time"

"github.com/pkg/errors"
opkit "github.com/rook/operator-kit"

apiextensionsclient "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest"

crv1alpha1 "github.com/kanisterio/kanister/pkg/apis/cr/v1alpha1"
customresource "github.com/kanisterio/kanister/pkg/customresource"
)

// CreateCustomResources creates the given custom resources and waits for them to initialize
func CreateCustomResources(ctx context.Context, config *rest.Config) error {
opKitCTX, err := newOpKitContext(config)
crCTX, err := newOpKitContext(config)
if err != nil {
return err
}
resources := []opkit.CustomResource{
resources := []customresource.CustomResource{
crv1alpha1.ActionSetResource,
crv1alpha1.BlueprintResource,
crv1alpha1.ProfileResource,
}
return opkit.CreateCustomResources(*opKitCTX, resources)
return customresource.CreateCustomResources(*crCTX, resources)
}

func newOpKitContext(config *rest.Config) (*opkit.Context, error) {
func newOpKitContext(config *rest.Config) (*customresource.Context, error) {
clientset, err := kubernetes.NewForConfig(config)
if err != nil {
return nil, errors.Wrap(err, "failed to get k8s client.")
Expand All @@ -50,7 +51,7 @@ func newOpKitContext(config *rest.Config) (*opkit.Context, error) {
if err != nil {
return nil, errors.Wrap(err, "failed to create k8s API extension clientset")
}
return &opkit.Context{
return &customresource.Context{
Clientset: clientset,
APIExtensionClientset: apiExtClientset,
Interval: 500 * time.Millisecond,
Expand Down

0 comments on commit d1cbd00

Please sign in to comment.