summaryrefslogtreecommitdiffstats
path: root/src/k8splugin/plugins
diff options
context:
space:
mode:
authorKiran Kamineni <kiran.k.kamineni@intel.com>2019-04-08 16:36:34 -0700
committerKiran Kamineni <kiran.k.kamineni@intel.com>2019-04-10 11:54:00 -0700
commitf940c42e563e67279cc28c7c129a340dc800fd30 (patch)
tree2fe49c08264378907a3c2a5da5b9af070fb04ac2 /src/k8splugin/plugins
parent9d71e9114baba71266cded1f4f805cd46a378137 (diff)
Add support for generic plugin
Add support for generic kinds We are currently using a known map to find the group version resource for a kind. Issue-ID: MULTICLOUD-350 Change-Id: I5a64f73760b73cf92b9a3fab8c22ad54e0a5f84f Signed-off-by: Kiran Kamineni <kiran.k.kamineni@intel.com>
Diffstat (limited to 'src/k8splugin/plugins')
-rw-r--r--src/k8splugin/plugins/generic/plugin.go109
1 files changed, 109 insertions, 0 deletions
diff --git a/src/k8splugin/plugins/generic/plugin.go b/src/k8splugin/plugins/generic/plugin.go
new file mode 100644
index 00000000..b0cf609c
--- /dev/null
+++ b/src/k8splugin/plugins/generic/plugin.go
@@ -0,0 +1,109 @@
+/*
+Copyright 2018 Intel Corporation.
+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 main
+
+import (
+ "log"
+
+ pkgerrors "github.com/pkg/errors"
+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+ "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
+ "k8s.io/apimachinery/pkg/runtime/schema"
+ "k8s.io/client-go/kubernetes/scheme"
+
+ utils "k8splugin/internal"
+ "k8splugin/internal/app"
+)
+
+type genericPlugin struct {
+}
+
+var kindToGVRMap = map[string]schema.GroupVersionResource{
+ "ConfigMap": schema.GroupVersionResource{Group: "", Version: "v1", Resource: "configmaps"},
+ "StatefulSet": schema.GroupVersionResource{Group: "apps", Version: "v1", Resource: "statefulsets"},
+ "Job": schema.GroupVersionResource{Group: "batch", Version: "v1", Resource: "jobs"},
+ "Pod": schema.GroupVersionResource{Group: "", Version: "v1", Resource: "pods"},
+ "DaemonSet": schema.GroupVersionResource{Group: "apps", Version: "v1", Resource: "daemonsets"},
+ "CustomResourceDefinition": schema.GroupVersionResource{
+ Group: "apiextensions.k8s.io", Version: "v1beta1", Resource: "customresourcedefinitions",
+ },
+}
+
+// Create deployment object in a specific Kubernetes cluster
+func (g genericPlugin) Create(yamlFilePath string, namespace string, client *app.KubernetesClient) (string, error) {
+ if namespace == "" {
+ namespace = "default"
+ }
+
+ //Decode the yaml file to create a runtime.Object
+ obj, err := utils.DecodeYAML(yamlFilePath, nil)
+ if err != nil {
+ return "", pkgerrors.Wrap(err, "Decode deployment object error")
+ }
+
+ //Convert the runtime.Object to an unstructured Object
+ unstruct := &unstructured.Unstructured{}
+ err = scheme.Scheme.Convert(obj, unstruct, nil)
+ if err != nil {
+ return "", pkgerrors.Wrap(err, "Converting to unstructured object")
+ }
+
+ dynClient := client.GetDynamicClient()
+ mapper := client.GetMapper()
+
+ gvk := unstruct.GroupVersionKind()
+ mapping, err := mapper.RESTMapping(schema.GroupKind{Group: gvk.Group, Kind: gvk.Kind}, gvk.Version)
+ if err != nil {
+ return "", pkgerrors.Wrap(err, "Mapping kind to resource error")
+ }
+
+ gvr := mapping.Resource
+
+ createdObj, err := dynClient.Resource(gvr).Namespace(namespace).Create(unstruct, metav1.CreateOptions{})
+ if err != nil {
+ return "", pkgerrors.Wrap(err, "Create object error")
+ }
+
+ return createdObj.GetName(), nil
+}
+
+// Delete an existing deployment hosted in a specific Kubernetes cluster
+func (g genericPlugin) Delete(kind string, name string, namespace string, client *app.KubernetesClient) error {
+ if namespace == "" {
+ namespace = "default"
+ }
+
+ deletePolicy := metav1.DeletePropagationForeground
+ opts := &metav1.DeleteOptions{
+ PropagationPolicy: &deletePolicy,
+ }
+
+ dynClient := client.GetDynamicClient()
+ gvr, ok := kindToGVRMap[kind]
+ if !ok {
+ return pkgerrors.New("GVR not found for: " + kind)
+ }
+
+ log.Printf("Using gvr: %s, %s, %s", gvr.Group, gvr.Version, gvr.Resource)
+
+ err := dynClient.Resource(gvr).Namespace(namespace).Delete(name, opts)
+ if err != nil {
+ return pkgerrors.Wrap(err, "Delete object error")
+ }
+
+ return nil
+}
+
+// ExportedVariable is what we will look for when calling the generic plugin
+var ExportedVariable genericPlugin