aboutsummaryrefslogtreecommitdiffstats
path: root/src/k8splugin/internal/plugin/helpers.go
diff options
context:
space:
mode:
authorBin Yang <bin.yang@windriver.com>2019-06-19 22:46:37 +0000
committerGerrit Code Review <gerrit@onap.org>2019-06-19 22:46:37 +0000
commit36bd529eefdf43e552f420ab0a1d52fd560b837f (patch)
tree9cc2974f1c6dc91c0e54300a96963aa11bce1780 /src/k8splugin/internal/plugin/helpers.go
parentc1963d4331fce447d93131d731e1f261c175de87 (diff)
parentd780f1b30c98a27d269e3e05423e9e54e0e022f6 (diff)
Merge "Plugin code refactoring"
Diffstat (limited to 'src/k8splugin/internal/plugin/helpers.go')
-rw-r--r--src/k8splugin/internal/plugin/helpers.go92
1 files changed, 92 insertions, 0 deletions
diff --git a/src/k8splugin/internal/plugin/helpers.go b/src/k8splugin/internal/plugin/helpers.go
new file mode 100644
index 00000000..efcd18c1
--- /dev/null
+++ b/src/k8splugin/internal/plugin/helpers.go
@@ -0,0 +1,92 @@
+/*
+ * Copyright 2019 Intel Corporation, Inc
+ *
+ * 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 plugin
+
+import (
+ "log"
+ "strings"
+
+ utils "k8splugin/internal"
+ "k8splugin/internal/helm"
+
+ pkgerrors "github.com/pkg/errors"
+ "k8s.io/apimachinery/pkg/api/meta"
+ "k8s.io/apimachinery/pkg/runtime/schema"
+ "k8s.io/client-go/dynamic"
+ "k8s.io/client-go/kubernetes"
+)
+
+// KubernetesConnector is an interface that is expected to be implemented
+// by any code that calls the plugin framework functions.
+// It implements methods that are needed by the plugins to get Kubernetes
+// clients and other information needed to interface with Kubernetes
+type KubernetesConnector interface {
+ //GetMapper returns the RESTMapper that was created for this client
+ GetMapper() meta.RESTMapper
+
+ //GetDynamicClient returns the dynamic client that is needed for
+ //unstructured REST calls to the apiserver
+ GetDynamicClient() dynamic.Interface
+
+ // GetStandardClient returns the standard client that can be used to handle
+ // standard kubernetes kinds
+ GetStandardClient() kubernetes.Interface
+}
+
+// Reference is the interface that is implemented
+type Reference interface {
+ //Create a kubernetes resource described by the yaml in yamlFilePath
+ Create(yamlFilePath string, namespace string, client KubernetesConnector) (string, error)
+
+ //Get a kubernetes resource based on the groupVersionKind and resourceName provided in resource
+ Get(resource helm.KubernetesResource, namespace string, client KubernetesConnector) (string, error)
+
+ //List all resources of the specified GroupVersionKind in the given namespace
+ //If gvk is empty, the plugin will return all supported objects in the namespace
+ List(gvk schema.GroupVersionKind, namespace string, client KubernetesConnector) ([]helm.KubernetesResource, error)
+
+ //Delete a kubernetes resource described in the provided namespace
+ Delete(resource helm.KubernetesResource, namespace string, client KubernetesConnector) error
+}
+
+// GetPluginByKind returns a plugin by the kind name
+// If plugin does not exist, it will return the generic plugin
+// TODO: Change this once we have a plugin registration mechanism
+func GetPluginByKind(kind string) (Reference, error) {
+
+ typePlugin, ok := utils.LoadedPlugins[strings.ToLower(kind)]
+ if !ok {
+ log.Println("No plugin for kind " + kind + " found. Using generic Plugin")
+ typePlugin, ok = utils.LoadedPlugins["generic"]
+ if !ok {
+ return nil, pkgerrors.New("No generic plugin found")
+ }
+ }
+
+ symbol, err := typePlugin.Lookup("ExportedVariable")
+ if err != nil {
+ return nil, pkgerrors.Wrap(err, "No ExportedVariable symbol found")
+ }
+
+ //Assert if it implements the PluginReference interface
+ pluginImpl, ok := symbol.(Reference)
+ if !ok {
+ return nil, pkgerrors.New("ExportedVariable does not implement plugins.Reference interface type")
+ }
+
+ return pluginImpl, nil
+}