From 4d35a9206e93e5892c95d599ad8e998f658c05ff Mon Sep 17 00:00:00 2001 From: yunchen Date: Thu, 28 Jun 2018 12:25:44 +0000 Subject: [PATCH 1/4] Add k8s pod, service: get list create delete function --- src/kubernetes/nodes.go | 2 +- src/kubernetes/nodes_test.go | 4 +- src/kubernetes/pods.go | 39 ++++++++++++++++++ src/kubernetes/pods_test.go | 73 +++++++++++++++++++++++++++++++++ src/kubernetes/services.go | 39 ++++++++++++++++++ src/kubernetes/services_test.go | 73 +++++++++++++++++++++++++++++++++ 6 files changed, 227 insertions(+), 3 deletions(-) create mode 100644 src/kubernetes/pods.go create mode 100644 src/kubernetes/pods_test.go create mode 100644 src/kubernetes/services.go create mode 100644 src/kubernetes/services_test.go diff --git a/src/kubernetes/nodes.go b/src/kubernetes/nodes.go index 3ff47c0c..928f23bd 100644 --- a/src/kubernetes/nodes.go +++ b/src/kubernetes/nodes.go @@ -5,7 +5,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) -//Get the Node object by the node name +//Get the node object by the node name func (kc *KubeCtl) GetNode(name string) (*corev1.Node, error) { return kc.Clientset.CoreV1().Nodes().Get(name, metav1.GetOptions{}) } diff --git a/src/kubernetes/nodes_test.go b/src/kubernetes/nodes_test.go index 4a82b631..051b23a2 100644 --- a/src/kubernetes/nodes_test.go +++ b/src/kubernetes/nodes_test.go @@ -44,7 +44,7 @@ func (suite *KubeCtlNodeTestSuite) TestGetNodeFail() { func (suite *KubeCtlNodeTestSuite) TestGetNodes() { node := corev1.Node{ ObjectMeta: metav1.ObjectMeta{ - Name: "K8S-Node2", + Name: "K8S-Node-2", }, } _, err := suite.fakeclient.CoreV1().Nodes().Create(&node) @@ -52,7 +52,7 @@ func (suite *KubeCtlNodeTestSuite) TestGetNodes() { node = corev1.Node{ ObjectMeta: metav1.ObjectMeta{ - Name: "K8S-Node3", + Name: "K8S-Node-3", }, } _, err = suite.fakeclient.CoreV1().Nodes().Create(&node) diff --git a/src/kubernetes/pods.go b/src/kubernetes/pods.go new file mode 100644 index 00000000..b24cec86 --- /dev/null +++ b/src/kubernetes/pods.go @@ -0,0 +1,39 @@ +package kubernetes + +import ( + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +//Get the pod object by the pod name +func (kc *KubeCtl) GetPod(name string, namespace string) (*corev1.Pod, error) { + return kc.Clientset.CoreV1().Pods(namespace).Get(name, metav1.GetOptions{}) +} + +//Get all pods from the k8s cluster +func (kc *KubeCtl) GetPods(namespace string) ([]*corev1.Pod, error) { + pods := []*corev1.Pod{} + podsList, err := kc.Clientset.CoreV1().Pods(namespace).List(metav1.ListOptions{}) + if err != nil { + return pods, err + } + for _, p := range podsList.Items { + pods = append(pods, &p) + } + return pods, nil +} + +//Create the pod by the pod object +func (kc *KubeCtl) CreatePod(pod *corev1.Pod, namespace string) (*corev1.Pod, error) { + pod, err := kc.Clientset.CoreV1().Pods(namespace).Create(pod) + if err != nil { + return nil, err + } + return pod, nil +} + +//Delete the pod by the pod name +func (kc *KubeCtl) DeletePod(name string, namespace string) error { + options := metav1.DeleteOptions{} + return kc.Clientset.CoreV1().Pods(namespace).Delete(name, &options) +} diff --git a/src/kubernetes/pods_test.go b/src/kubernetes/pods_test.go new file mode 100644 index 00000000..42695c37 --- /dev/null +++ b/src/kubernetes/pods_test.go @@ -0,0 +1,73 @@ +package kubernetes + +import ( + "testing" + + "github.com/stretchr/testify/suite" + + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + fakeclientset "k8s.io/client-go/kubernetes/fake" +) + +type KubeCtlPodTestSuite struct { + suite.Suite + kubectl *KubeCtl + fakeclient *fakeclientset.Clientset +} + +func (suite *KubeCtlPodTestSuite) SetupSuite() { + suite.fakeclient = fakeclientset.NewSimpleClientset() + namespace := "default" + suite.kubectl = New(suite.fakeclient, namespace) +} + +func (suite *KubeCtlPodTestSuite) TestGetPod() { + namespace := "default" + pod := corev1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: "K8S-Pod-1", + }, + } + _, err := suite.fakeclient.CoreV1().Pods(namespace).Create(&pod) + suite.NoError(err) + + result, err := suite.kubectl.GetPod("K8S-Pod-1", namespace) + suite.NoError(err) + suite.Equal(pod.GetName(), result.GetName()) +} + +func (suite *KubeCtlPodTestSuite) TestGetPodFail() { + namespace := "default" + _, err := suite.kubectl.GetPod("Unknown_Name", namespace) + suite.Error(err) +} + +func (suite *KubeCtlPodTestSuite) TestGetPods() { + namespace := "default" + pod := corev1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: "K8S-Pod-2", + }, + } + _, err := suite.fakeclient.CoreV1().Pods(namespace).Create(&pod) + suite.NoError(err) + + pod = corev1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: "K8S-Pod-3", + }, + } + _, err = suite.fakeclient.CoreV1().Pods(namespace).Create(&pod) + suite.NoError(err) + + pods, err := suite.kubectl.GetPods(namespace) + suite.NoError(err) + suite.NotEqual(0, len(pods)) +} + +func (suite *KubeCtlPodTestSuite) TearDownSuite() {} + +func TestKubePodTestSuite(t *testing.T) { + suite.Run(t, new(KubeCtlPodTestSuite)) +} diff --git a/src/kubernetes/services.go b/src/kubernetes/services.go new file mode 100644 index 00000000..d5312f4f --- /dev/null +++ b/src/kubernetes/services.go @@ -0,0 +1,39 @@ +package kubernetes + +import ( + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +//Get the service object by the service name +func (kc *KubeCtl) GetService(name string, namespace string) (*corev1.Service, error) { + return kc.Clientset.CoreV1().Services(namespace).Get(name, metav1.GetOptions{}) +} + +//Get all services from the k8s cluster +func (kc *KubeCtl) GetServices(namespace string) ([]*corev1.Service, error) { + services := []*corev1.Service{} + servicesList, err := kc.Clientset.CoreV1().Services(namespace).List(metav1.ListOptions{}) + if err != nil { + return services, err + } + for _, s := range servicesList.Items { + services = append(services, &s) + } + return services, nil +} + +//Create the service by the service object +func (kc *KubeCtl) CreateService(service *corev1.Service, namespace string) (*corev1.Service, error) { + service, err := kc.Clientset.CoreV1().Services(namespace).Create(service) + if err != nil { + return nil, err + } + return service, nil +} + +//Delete the service by the service name +func (kc *KubeCtl) DeleteService(name string, namespace string) error { + options := metav1.DeleteOptions{} + return kc.Clientset.CoreV1().Services(namespace).Delete(name, &options) +} diff --git a/src/kubernetes/services_test.go b/src/kubernetes/services_test.go new file mode 100644 index 00000000..7cd3ea57 --- /dev/null +++ b/src/kubernetes/services_test.go @@ -0,0 +1,73 @@ +package kubernetes + +import ( + "testing" + + "github.com/stretchr/testify/suite" + + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + fakeclientset "k8s.io/client-go/kubernetes/fake" +) + +type KubeCtlServiceTestSuite struct { + suite.Suite + kubectl *KubeCtl + fakeclient *fakeclientset.Clientset +} + +func (suite *KubeCtlServiceTestSuite) SetupSuite() { + suite.fakeclient = fakeclientset.NewSimpleClientset() + namespace := "default" + suite.kubectl = New(suite.fakeclient, namespace) +} + +func (suite *KubeCtlServiceTestSuite) TestGetService() { + namespace := "default" + service := corev1.Service{ + ObjectMeta: metav1.ObjectMeta{ + Name: "K8S-Service-1", + }, + } + _, err := suite.fakeclient.CoreV1().Services(namespace).Create(&service) + suite.NoError(err) + + result, err := suite.kubectl.GetService("K8S-Service-1", namespace) + suite.NoError(err) + suite.Equal(service.GetName(), result.GetName()) +} + +func (suite *KubeCtlServiceTestSuite) TestGetServiceFail() { + namespace := "default" + _, err := suite.kubectl.GetService("Unknown_Name", namespace) + suite.Error(err) +} + +func (suite *KubeCtlServiceTestSuite) TestGetServices() { + namespace := "default" + service := corev1.Service{ + ObjectMeta: metav1.ObjectMeta{ + Name: "K8S-Service-2", + }, + } + _, err := suite.fakeclient.CoreV1().Services(namespace).Create(&service) + suite.NoError(err) + + service = corev1.Service{ + ObjectMeta: metav1.ObjectMeta{ + Name: "K8S-Service-3", + }, + } + _, err = suite.fakeclient.CoreV1().Services(namespace).Create(&service) + suite.NoError(err) + + services, err := suite.kubectl.GetServices(namespace) + suite.NoError(err) + suite.NotEqual(0, len(services)) +} + +func (suite *KubeCtlServiceTestSuite) TearDownSuite() {} + +func TestKubeServiceTestSuite(t *testing.T) { + suite.Run(t, new(KubeCtlServiceTestSuite)) +} From d6fcabe22b0192599e011e7fd181cbad7e2114a2 Mon Sep 17 00:00:00 2001 From: yunchen Date: Thu, 28 Jun 2018 14:59:36 +0000 Subject: [PATCH 2/4] Add PersistentVolumeClaim function --- src/kubernetes/pvc.go | 39 ++++++++++++++++++++ src/kubernetes/pvc_test.go | 73 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 112 insertions(+) create mode 100644 src/kubernetes/pvc.go create mode 100644 src/kubernetes/pvc_test.go diff --git a/src/kubernetes/pvc.go b/src/kubernetes/pvc.go new file mode 100644 index 00000000..6f556b36 --- /dev/null +++ b/src/kubernetes/pvc.go @@ -0,0 +1,39 @@ +package kubernetes + +import ( + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +//Get the PVC object by the PVC name +func (kc *KubeCtl) GetPVC(name string, namespace string) (*corev1.PersistentVolumeClaim, error) { + return kc.Clientset.CoreV1().PersistentVolumeClaims(namespace).Get(name, metav1.GetOptions{}) +} + +//Get all PVCs from the k8s cluster +func (kc *KubeCtl) GetPVCs(namespace string) ([]*corev1.PersistentVolumeClaim, error) { + pvcs := []*corev1.PersistentVolumeClaim{} + pvcsList, err := kc.Clientset.CoreV1().PersistentVolumeClaims(namespace).List(metav1.ListOptions{}) + if err != nil { + return pvcs, err + } + for _, p := range pvcsList.Items { + pvcs = append(pvcs, &p) + } + return pvcs, nil +} + +//Create the PVC by the PVC object +func (kc *KubeCtl) CreatePVC(pvc *corev1.PersistentVolumeClaim, namespace string) (*corev1.PersistentVolumeClaim, error) { + pvc, err := kc.Clientset.CoreV1().PersistentVolumeClaims(namespace).Create(pvc) + if err != nil { + return nil, err + } + return pvc, nil +} + +//Delete the PVC by the PVC name +func (kc *KubeCtl) DeletePVC(name string, namespace string) error { + options := metav1.DeleteOptions{} + return kc.Clientset.CoreV1().PersistentVolumeClaims(namespace).Delete(name, &options) +} diff --git a/src/kubernetes/pvc_test.go b/src/kubernetes/pvc_test.go new file mode 100644 index 00000000..9fcc93ea --- /dev/null +++ b/src/kubernetes/pvc_test.go @@ -0,0 +1,73 @@ +package kubernetes + +import ( + "testing" + + "github.com/stretchr/testify/suite" + + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + fakeclientset "k8s.io/client-go/kubernetes/fake" +) + +type KubeCtlPVCTestSuite struct { + suite.Suite + kubectl *KubeCtl + fakeclient *fakeclientset.Clientset +} + +func (suite *KubeCtlPVCTestSuite) SetupSuite() { + suite.fakeclient = fakeclientset.NewSimpleClientset() + namespace := "default" + suite.kubectl = New(suite.fakeclient, namespace) +} + +func (suite *KubeCtlPVCTestSuite) TestGetPVC() { + namespace := "default" + pvc := corev1.PersistentVolumeClaim{ + ObjectMeta: metav1.ObjectMeta{ + Name: "K8S-PVC-1", + }, + } + _, err := suite.fakeclient.CoreV1().PersistentVolumeClaims(namespace).Create(&pvc) + suite.NoError(err) + + result, err := suite.kubectl.GetPVC("K8S-PVC-1", namespace) + suite.NoError(err) + suite.Equal(pvc.GetName(), result.GetName()) +} + +func (suite *KubeCtlPVCTestSuite) TestGetPVCFail() { + namespace := "default" + _, err := suite.kubectl.GetPVC("Unknown_Name", namespace) + suite.Error(err) +} + +func (suite *KubeCtlPVCTestSuite) TestGetPVCs() { + namespace := "default" + pvc := corev1.PersistentVolumeClaim{ + ObjectMeta: metav1.ObjectMeta{ + Name: "K8S-PVC-2", + }, + } + _, err := suite.fakeclient.CoreV1().PersistentVolumeClaims(namespace).Create(&pvc) + suite.NoError(err) + + pvc = corev1.PersistentVolumeClaim{ + ObjectMeta: metav1.ObjectMeta{ + Name: "K8S-PVC-3", + }, + } + _, err = suite.fakeclient.CoreV1().PersistentVolumeClaims(namespace).Create(&pvc) + suite.NoError(err) + + pvcs, err := suite.kubectl.GetPVCs(namespace) + suite.NoError(err) + suite.NotEqual(0, len(pvcs)) +} + +func (suite *KubeCtlPVCTestSuite) TearDownSuite() {} + +func TestKubePVCTestSuite(t *testing.T) { + suite.Run(t, new(KubeCtlPVCTestSuite)) +} From 734ca6a220b007f01006605e284a836e4ffb0507 Mon Sep 17 00:00:00 2001 From: yunchen Date: Thu, 28 Jun 2018 18:56:51 +0000 Subject: [PATCH 3/4] Update return --- src/kubernetes/pods.go | 6 +----- src/kubernetes/pvc.go | 6 +----- src/kubernetes/services.go | 6 +----- 3 files changed, 3 insertions(+), 15 deletions(-) diff --git a/src/kubernetes/pods.go b/src/kubernetes/pods.go index b24cec86..677042d6 100644 --- a/src/kubernetes/pods.go +++ b/src/kubernetes/pods.go @@ -25,11 +25,7 @@ func (kc *KubeCtl) GetPods(namespace string) ([]*corev1.Pod, error) { //Create the pod by the pod object func (kc *KubeCtl) CreatePod(pod *corev1.Pod, namespace string) (*corev1.Pod, error) { - pod, err := kc.Clientset.CoreV1().Pods(namespace).Create(pod) - if err != nil { - return nil, err - } - return pod, nil + return kc.Clientset.CoreV1().Pods(namespace).Create(pod) } //Delete the pod by the pod name diff --git a/src/kubernetes/pvc.go b/src/kubernetes/pvc.go index 6f556b36..b7591eb3 100644 --- a/src/kubernetes/pvc.go +++ b/src/kubernetes/pvc.go @@ -25,11 +25,7 @@ func (kc *KubeCtl) GetPVCs(namespace string) ([]*corev1.PersistentVolumeClaim, e //Create the PVC by the PVC object func (kc *KubeCtl) CreatePVC(pvc *corev1.PersistentVolumeClaim, namespace string) (*corev1.PersistentVolumeClaim, error) { - pvc, err := kc.Clientset.CoreV1().PersistentVolumeClaims(namespace).Create(pvc) - if err != nil { - return nil, err - } - return pvc, nil + return kc.Clientset.CoreV1().PersistentVolumeClaims(namespace).Create(pvc) } //Delete the PVC by the PVC name diff --git a/src/kubernetes/services.go b/src/kubernetes/services.go index d5312f4f..f6153833 100644 --- a/src/kubernetes/services.go +++ b/src/kubernetes/services.go @@ -25,11 +25,7 @@ func (kc *KubeCtl) GetServices(namespace string) ([]*corev1.Service, error) { //Create the service by the service object func (kc *KubeCtl) CreateService(service *corev1.Service, namespace string) (*corev1.Service, error) { - service, err := kc.Clientset.CoreV1().Services(namespace).Create(service) - if err != nil { - return nil, err - } - return service, nil + return kc.Clientset.CoreV1().Services(namespace).Create(service) } //Delete the service by the service name From 04095f7c11cc4a49bbde78475059e0a36ef29df9 Mon Sep 17 00:00:00 2001 From: yunchen Date: Thu, 28 Jun 2018 21:39:35 +0000 Subject: [PATCH 4/4] Update testing --- src/kubernetes/pods_test.go | 15 ++++++++++++++- src/kubernetes/pvc_test.go | 15 ++++++++++++++- src/kubernetes/services_test.go | 15 ++++++++++++++- 3 files changed, 42 insertions(+), 3 deletions(-) diff --git a/src/kubernetes/pods_test.go b/src/kubernetes/pods_test.go index 42695c37..084df9da 100644 --- a/src/kubernetes/pods_test.go +++ b/src/kubernetes/pods_test.go @@ -38,7 +38,7 @@ func (suite *KubeCtlPodTestSuite) TestGetPod() { } func (suite *KubeCtlPodTestSuite) TestGetPodFail() { - namespace := "default" + namespace := "Unknown_Namespace" _, err := suite.kubectl.GetPod("Unknown_Name", namespace) suite.Error(err) } @@ -66,6 +66,19 @@ func (suite *KubeCtlPodTestSuite) TestGetPods() { suite.NotEqual(0, len(pods)) } +func (suite *KubeCtlPodTestSuite) TestCreateDeletePod() { + namespace := "default" + pod := corev1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: "K8S-Pod-4", + }, + } + _, err := suite.kubectl.CreatePod(&pod, namespace) + suite.NoError(err) + err = suite.kubectl.DeletePod("K8S-Pod-4", namespace) + suite.NoError(err) +} + func (suite *KubeCtlPodTestSuite) TearDownSuite() {} func TestKubePodTestSuite(t *testing.T) { diff --git a/src/kubernetes/pvc_test.go b/src/kubernetes/pvc_test.go index 9fcc93ea..7c0556a1 100644 --- a/src/kubernetes/pvc_test.go +++ b/src/kubernetes/pvc_test.go @@ -38,7 +38,7 @@ func (suite *KubeCtlPVCTestSuite) TestGetPVC() { } func (suite *KubeCtlPVCTestSuite) TestGetPVCFail() { - namespace := "default" + namespace := "Unknown_Namespace" _, err := suite.kubectl.GetPVC("Unknown_Name", namespace) suite.Error(err) } @@ -66,6 +66,19 @@ func (suite *KubeCtlPVCTestSuite) TestGetPVCs() { suite.NotEqual(0, len(pvcs)) } +func (suite *KubeCtlPVCTestSuite) TestCreateDeletePVC() { + namespace := "default" + pvc := corev1.PersistentVolumeClaim{ + ObjectMeta: metav1.ObjectMeta{ + Name: "K8S-PVC-4", + }, + } + _, err := suite.kubectl.CreatePVC(&pvc, namespace) + suite.NoError(err) + err = suite.kubectl.DeletePVC("K8S-PVC-4", namespace) + suite.NoError(err) +} + func (suite *KubeCtlPVCTestSuite) TearDownSuite() {} func TestKubePVCTestSuite(t *testing.T) { diff --git a/src/kubernetes/services_test.go b/src/kubernetes/services_test.go index 7cd3ea57..1113b12d 100644 --- a/src/kubernetes/services_test.go +++ b/src/kubernetes/services_test.go @@ -38,7 +38,7 @@ func (suite *KubeCtlServiceTestSuite) TestGetService() { } func (suite *KubeCtlServiceTestSuite) TestGetServiceFail() { - namespace := "default" + namespace := "Unknown_Namespace" _, err := suite.kubectl.GetService("Unknown_Name", namespace) suite.Error(err) } @@ -66,6 +66,19 @@ func (suite *KubeCtlServiceTestSuite) TestGetServices() { suite.NotEqual(0, len(services)) } +func (suite *KubeCtlServiceTestSuite) TestCreateDeleteService() { + namespace := "default" + service := corev1.Service{ + ObjectMeta: metav1.ObjectMeta{ + Name: "K8S-Service-4", + }, + } + _, err := suite.kubectl.CreateService(&service, namespace) + suite.NoError(err) + err = suite.kubectl.DeleteService("K8S-Service-4", namespace) + suite.NoError(err) +} + func (suite *KubeCtlServiceTestSuite) TearDownSuite() {} func TestKubeServiceTestSuite(t *testing.T) {