diff options
author | Shashank Kumar Shankar <shashank.kumar.shankar@intel.com> | 2018-08-20 15:50:50 -0700 |
---|---|---|
committer | Victor Morales <victor.morales@intel.com> | 2018-08-24 15:51:16 -0700 |
commit | a1373742a2c3f980360e4980f3b23b0ff3480ae6 (patch) | |
tree | ce2fb583dea15b8a546d794d21786fdf0f666539 /src/k8splugin/plugins | |
parent | 6ff216219ccb4567baeb34c9dba73daabb60f629 (diff) |
Seed code for k8s multicloud plugin
This patch provides the initial seed code for the multicloud Kubernetes
plugin and also provides the plugin feature to add new Kubernetes
kinds.
Change-Id: Ie5ee414656665070cde2834c4855ac2ebc179a9a
Issue-ID: MULTICLOUD-301
Signed-off-by: Shashank Kumar Shankar <shashank.kumar.shankar@intel.com>
Signed-off-by: Victor Morales <victor.morales@intel.com>
Diffstat (limited to 'src/k8splugin/plugins')
-rw-r--r-- | src/k8splugin/plugins/deployment/plugin.go | 136 | ||||
-rw-r--r-- | src/k8splugin/plugins/namespace/plugin.go | 68 | ||||
-rw-r--r-- | src/k8splugin/plugins/service/plugin.go | 131 |
3 files changed, 335 insertions, 0 deletions
diff --git a/src/k8splugin/plugins/deployment/plugin.go b/src/k8splugin/plugins/deployment/plugin.go new file mode 100644 index 00000000..2b4c7cb7 --- /dev/null +++ b/src/k8splugin/plugins/deployment/plugin.go @@ -0,0 +1,136 @@ +/* +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 ( + "io/ioutil" + "log" + "os" + + "k8s.io/client-go/kubernetes" + + pkgerrors "github.com/pkg/errors" + + appsV1 "k8s.io/api/apps/v1" + metaV1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/kubernetes/scheme" + + "k8splugin/krd" +) + +// CreateResource object in a specific Kubernetes Deployment +func CreateResource(kubedata *krd.GenericKubeResourceData, kubeclient *kubernetes.Clientset) (string, error) { + if kubedata.Namespace == "" { + kubedata.Namespace = "default" + } + + if _, err := os.Stat(kubedata.YamlFilePath); err != nil { + return "", pkgerrors.New("File " + kubedata.YamlFilePath + " not found") + } + + log.Println("Reading deployment YAML") + rawBytes, err := ioutil.ReadFile(kubedata.YamlFilePath) + if err != nil { + return "", pkgerrors.Wrap(err, "Deployment YAML file read error") + } + + log.Println("Decoding deployment YAML") + decode := scheme.Codecs.UniversalDeserializer().Decode + obj, _, err := decode(rawBytes, nil, nil) + if err != nil { + return "", pkgerrors.Wrap(err, "Deserialize deployment error") + } + + switch o := obj.(type) { + case *appsV1.Deployment: + kubedata.DeploymentData = o + default: + return "", pkgerrors.New(kubedata.YamlFilePath + " contains another resource different than Deployment") + } + + kubedata.DeploymentData.Namespace = kubedata.Namespace + kubedata.DeploymentData.Name = kubedata.InternalVNFID + "-" + kubedata.DeploymentData.Name + + result, err := kubeclient.AppsV1().Deployments(kubedata.Namespace).Create(kubedata.DeploymentData) + if err != nil { + return "", pkgerrors.Wrap(err, "Create Deployment error") + } + + return result.GetObjectMeta().GetName(), nil +} + +// ListResources of existing deployments hosted in a specific Kubernetes Deployment +func ListResources(limit int64, namespace string, kubeclient *kubernetes.Clientset) (*[]string, error) { + if namespace == "" { + namespace = "default" + } + + opts := metaV1.ListOptions{ + Limit: limit, + } + opts.APIVersion = "apps/v1" + opts.Kind = "Deployment" + + list, err := kubeclient.AppsV1().Deployments(namespace).List(opts) + if err != nil { + return nil, pkgerrors.Wrap(err, "Get Deployment list error") + } + + result := make([]string, 0, limit) + if list != nil { + for _, deployment := range list.Items { + result = append(result, deployment.Name) + } + } + + return &result, nil +} + +// DeleteResource existing deployments hosting in a specific Kubernetes Deployment +func DeleteResource(name string, namespace string, kubeclient *kubernetes.Clientset) error { + if namespace == "" { + namespace = "default" + } + + log.Println("Deleting deployment: " + name) + + deletePolicy := metaV1.DeletePropagationForeground + err := kubeclient.AppsV1().Deployments(namespace).Delete(name, &metaV1.DeleteOptions{ + PropagationPolicy: &deletePolicy, + }) + + if err != nil { + return pkgerrors.Wrap(err, "Delete Deployment error") + } + + return nil +} + +// GetResource existing deployment hosting in a specific Kubernetes Deployment +func GetResource(name string, namespace string, kubeclient *kubernetes.Clientset) (string, error) { + if namespace == "" { + namespace = "default" + } + + opts := metaV1.GetOptions{} + opts.APIVersion = "apps/v1" + opts.Kind = "Deployment" + + deployment, err := kubeclient.AppsV1().Deployments(namespace).Get(name, opts) + if err != nil { + return "", pkgerrors.Wrap(err, "Get Deployment error") + } + + return deployment.Name, nil +} diff --git a/src/k8splugin/plugins/namespace/plugin.go b/src/k8splugin/plugins/namespace/plugin.go new file mode 100644 index 00000000..986de863 --- /dev/null +++ b/src/k8splugin/plugins/namespace/plugin.go @@ -0,0 +1,68 @@ +/* +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 ( + pkgerrors "github.com/pkg/errors" + + coreV1 "k8s.io/api/core/v1" + metaV1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/kubernetes" +) + +// CreateResource is used to create a new Namespace +func CreateResource(namespace string, client *kubernetes.Clientset) error { + namespaceStruct := &coreV1.Namespace{ + ObjectMeta: metaV1.ObjectMeta{ + Name: namespace, + }, + } + _, err := client.CoreV1().Namespaces().Create(namespaceStruct) + if err != nil { + return pkgerrors.Wrap(err, "Create Namespace error") + } + return nil +} + +// GetResource is used to check if a given namespace actually exists in Kubernetes +func GetResource(namespace string, client *kubernetes.Clientset) (bool, error) { + opts := metaV1.ListOptions{} + + namespaceList, err := client.CoreV1().Namespaces().List(opts) + if err != nil { + return false, pkgerrors.Wrap(err, "Get Namespace list error") + } + + for _, ns := range namespaceList.Items { + if namespace == ns.Name { + return true, nil + } + } + + return false, nil +} + +// DeleteResource is used to delete a namespace +func DeleteResource(namespace string, client *kubernetes.Clientset) error { + deletePolicy := metaV1.DeletePropagationForeground + + err := client.CoreV1().Namespaces().Delete(namespace, &metaV1.DeleteOptions{ + PropagationPolicy: &deletePolicy, + }) + + if err != nil { + return pkgerrors.Wrap(err, "Delete Namespace error") + } + return nil +} diff --git a/src/k8splugin/plugins/service/plugin.go b/src/k8splugin/plugins/service/plugin.go new file mode 100644 index 00000000..36ef24f6 --- /dev/null +++ b/src/k8splugin/plugins/service/plugin.go @@ -0,0 +1,131 @@ +/* +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 ( + "io/ioutil" + "log" + "os" + + "k8s.io/client-go/kubernetes" + + pkgerrors "github.com/pkg/errors" + + coreV1 "k8s.io/api/core/v1" + metaV1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/kubernetes/scheme" + + "k8splugin/krd" +) + +// CreateResource object in a specific Kubernetes Deployment +func CreateResource(kubedata *krd.GenericKubeResourceData, kubeclient *kubernetes.Clientset) (string, error) { + if kubedata.Namespace == "" { + kubedata.Namespace = "default" + } + + if _, err := os.Stat(kubedata.YamlFilePath); err != nil { + return "", pkgerrors.New("File " + kubedata.YamlFilePath + " not found") + } + + log.Println("Reading service YAML") + rawBytes, err := ioutil.ReadFile(kubedata.YamlFilePath) + if err != nil { + return "", pkgerrors.Wrap(err, "Service YAML file read error") + } + + log.Println("Decoding service YAML") + decode := scheme.Codecs.UniversalDeserializer().Decode + obj, _, err := decode(rawBytes, nil, nil) + if err != nil { + return "", pkgerrors.Wrap(err, "Deserialize service error") + } + + switch o := obj.(type) { + case *coreV1.Service: + kubedata.ServiceData = o + default: + return "", pkgerrors.New(kubedata.YamlFilePath + " contains another resource different than Service") + } + + kubedata.ServiceData.Namespace = kubedata.Namespace + kubedata.ServiceData.Name = kubedata.InternalVNFID + "-" + kubedata.ServiceData.Name + + result, err := kubeclient.CoreV1().Services(kubedata.Namespace).Create(kubedata.ServiceData) + if err != nil { + return "", pkgerrors.Wrap(err, "Create Service error") + } + return result.GetObjectMeta().GetName(), nil +} + +// ListResources of existing deployments hosted in a specific Kubernetes Deployment +func ListResources(limit int64, namespace string, kubeclient *kubernetes.Clientset) (*[]string, error) { + if namespace == "" { + namespace = "default" + } + opts := metaV1.ListOptions{ + Limit: limit, + } + opts.APIVersion = "apps/v1" + opts.Kind = "Service" + + list, err := kubeclient.CoreV1().Services(namespace).List(opts) + if err != nil { + return nil, pkgerrors.Wrap(err, "Get Service list error") + } + result := make([]string, 0, limit) + if list != nil { + for _, service := range list.Items { + result = append(result, service.Name) + } + } + return &result, nil +} + +// DeleteResource deletes an existing Kubernetes service +func DeleteResource(name string, namespace string, kubeclient *kubernetes.Clientset) error { + if namespace == "" { + namespace = "default" + } + + log.Println("Deleting service: " + name) + + deletePolicy := metaV1.DeletePropagationForeground + err := kubeclient.CoreV1().Services(namespace).Delete(name, &metaV1.DeleteOptions{ + PropagationPolicy: &deletePolicy, + }) + if err != nil { + return pkgerrors.Wrap(err, "Delete Service error") + } + + return nil +} + +// GetResource existing service hosting in a specific Kubernetes Service +func GetResource(name string, namespace string, kubeclient *kubernetes.Clientset) (string, error) { + if namespace == "" { + namespace = "default" + } + + opts := metaV1.GetOptions{} + opts.APIVersion = "apps/v1" + opts.Kind = "Service" + + service, err := kubeclient.CoreV1().Services(namespace).Get(name, opts) + if err != nil { + return "", pkgerrors.Wrap(err, "Get Deployment error") + } + + return service.Name, nil +} |