-
Notifications
You must be signed in to change notification settings - Fork 152
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Removed the dependency on the operator kit (#220)
* 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
1 parent
d1228b3
commit d1cbd00
Showing
7 changed files
with
238 additions
and
314 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
}) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters