Skip to content

Commit

Permalink
Merge pull request #33 from linkernetworks/johnlin/get-nodeip
Browse files Browse the repository at this point in the history
support to get node IP
  • Loading branch information
Hung-Wei Chiu authored Jun 23, 2018
2 parents b312705 + 062dd9c commit 1768230
Show file tree
Hide file tree
Showing 5 changed files with 145 additions and 30 deletions.
17 changes: 17 additions & 0 deletions src/kubernetes/kubectl.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package kubernetes

import (
"k8s.io/client-go/kubernetes"
)

type KubeCtl struct {
Clientset kubernetes.Interface
Namespace string
}

func New(clientset kubernetes.Interface, namespace string) *KubeCtl {
return &KubeCtl{
Clientset: clientset,
Namespace: namespace,
}
}
17 changes: 17 additions & 0 deletions src/kubernetes/kubectl_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package kubernetes

import (
"testing"

"github.com/stretchr/testify/assert"

fakeclientset "k8s.io/client-go/kubernetes/fake"
)

func TestNewKubeCtl(t *testing.T) {
clientset := fakeclientset.NewSimpleClientset()
namespace := "default"
kubectl := New(clientset, namespace)
assert.Equal(t, namespace, kubectl.Namespace)
assert.NotNil(t, kubectl)
}
26 changes: 19 additions & 7 deletions src/kubernetes/nodes.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,35 @@ package kubernetes
import (
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
)

func GetNode(clientset kubernetes.Interface, name string) (*corev1.Node, error) {
return clientset.CoreV1().Nodes().Get(name, metav1.GetOptions{})
func (kc *KubeCtl) GetNode(name string) (*corev1.Node, error) {
return kc.Clientset.CoreV1().Nodes().Get(name, metav1.GetOptions{})
}

func GetNodes(clientset kubernetes.Interface) ([]*corev1.Node, error) {
func (kc *KubeCtl) GetNodes() ([]*corev1.Node, error) {
nodes := []*corev1.Node{}
nodesList, err := clientset.CoreV1().Nodes().List(metav1.ListOptions{})
nodesList, err := kc.Clientset.CoreV1().Nodes().List(metav1.ListOptions{})
if err != nil {
return nodes, err
}

for _, n := range nodesList.Items {
nodes = append(nodes, &n)
}

return nodes, nil
}

func (kc *KubeCtl) GetNodeExternalIP(name string) (string, error) {
node, err := kc.GetNode(name)
if err != nil {
return "", err
}
var nodeIP string
for _, addr := range node.Status.Addresses {
if addr.Type == "ExternalIP" {
nodeIP = addr.Address
break
}
}
return nodeIP, nil
}
103 changes: 80 additions & 23 deletions src/kubernetes/nodes_test.go
Original file line number Diff line number Diff line change
@@ -1,56 +1,113 @@
package kubernetes

import (
"testing"

"github.com/stretchr/testify/assert"
"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"
"testing"
)

func TestGetNode(t *testing.T) {
clientset := fakeclientset.NewSimpleClientset()
type KubeCtlNodeTestSuite struct {
suite.Suite
kubectl *KubeCtl
fakeclient *fakeclientset.Clientset
}

func (suite *KubeCtlNodeTestSuite) SetupTest() {
suite.fakeclient = fakeclientset.NewSimpleClientset()
namespace := "default"
suite.kubectl = New(suite.fakeclient, namespace)
}

func (suite *KubeCtlNodeTestSuite) TestGetNode() {
node := corev1.Node{
ObjectMeta: metav1.ObjectMeta{
Name: "K8S-Node",
},
}
_, err := clientset.CoreV1().Nodes().Create(&node)
assert.NoError(t, err)
_, err := suite.fakeclient.CoreV1().Nodes().Create(&node)
assert.NoError(suite.T(), err)

result, err := GetNode(clientset, "K8S-Node")
assert.NoError(t, err)
assert.Equal(t, node.GetName(), result.GetName())
result, err := suite.kubectl.GetNode("K8S-Node")
assert.NoError(suite.T(), err)
assert.Equal(suite.T(), node.GetName(), result.GetName())
}

func TestGetNodeFail(t *testing.T) {
clientset := fakeclientset.NewSimpleClientset()

_, err := GetNode(clientset, "UnKnown_Name")
assert.Error(t, err)
func (suite *KubeCtlNodeTestSuite) TestGetNodeFail() {
_, err := suite.kubectl.GetNode("Unknown_Name")
assert.Error(suite.T(), err)
}

func TestGetNodes(t *testing.T) {
clientset := fakeclientset.NewSimpleClientset()

func (suite *KubeCtlNodeTestSuite) TestGetNodes() {
node := corev1.Node{
ObjectMeta: metav1.ObjectMeta{
Name: "K8S-Node1",
},
}
_, err := clientset.CoreV1().Nodes().Create(&node)
assert.NoError(t, err)
_, err := suite.fakeclient.CoreV1().Nodes().Create(&node)
assert.NoError(suite.T(), err)

node = corev1.Node{
ObjectMeta: metav1.ObjectMeta{
Name: "K8S-Node2",
},
}
_, err = clientset.CoreV1().Nodes().Create(&node)
assert.NoError(t, err)
_, err = suite.fakeclient.CoreV1().Nodes().Create(&node)
assert.NoError(suite.T(), err)

nodes, err := suite.kubectl.GetNodes()
assert.NoError(suite.T(), err)
assert.Equal(suite.T(), 2, len(nodes))
}

func (suite *KubeCtlNodeTestSuite) TestGetNodeExternalIP() {
nodeAddr := corev1.NodeAddress{
Type: "ExternalIP",
Address: "192.168.0.100",
}
node := corev1.Node{
ObjectMeta: metav1.ObjectMeta{
Name: "K8S-Node",
},
Status: corev1.NodeStatus{
Addresses: []corev1.NodeAddress{nodeAddr},
},
}
_, err := suite.fakeclient.CoreV1().Nodes().Create(&node)
assert.NoError(suite.T(), err)

nodeIP, err := suite.kubectl.GetNodeExternalIP("K8S-Node")
assert.NoError(suite.T(), err)
assert.Equal(suite.T(), nodeAddr.Address, nodeIP)
}

func (suite *KubeCtlNodeTestSuite) TestGetInvalidNodeExternalIP() {
nodeAddr := corev1.NodeAddress{
Type: "ExternalIP",
Address: "192.168.0.100",
}
node := corev1.Node{
ObjectMeta: metav1.ObjectMeta{
Name: "K8S-Node",
},
Status: corev1.NodeStatus{
Addresses: []corev1.NodeAddress{nodeAddr},
},
}
_, err := suite.fakeclient.CoreV1().Nodes().Create(&node)
assert.NoError(suite.T(), err)

nodeIP, err := suite.kubectl.GetNodeExternalIP("K8S-Node-0")
assert.Error(suite.T(), err)
assert.Equal(suite.T(), "", nodeIP)
}

func (suite *KubeCtlNodeTestSuite) TearDownTest() {}

nodes, err := GetNodes(clientset)
assert.NoError(t, err)
assert.Equal(t, 2, len(nodes))
func TestKubeNodeTestSuite(t *testing.T) {
suite.Run(t, new(KubeCtlNodeTestSuite))
}
12 changes: 12 additions & 0 deletions vendor/vendor.json
Original file line number Diff line number Diff line change
Expand Up @@ -494,6 +494,18 @@
"revision": "f35b8ab0b5a2cef36673838d662e249dd9c94686",
"revisionTime": "2018-05-06T18:05:49Z"
},
{
"checksumSHA1": "wnEANt4k5X/KGwoFyfSSnpxULm4=",
"path": "github.com/stretchr/testify/require",
"revision": "f35b8ab0b5a2cef36673838d662e249dd9c94686",
"revisionTime": "2018-05-06T18:05:49Z"
},
{
"checksumSHA1": "uefllr2OtKBGo/kQSAPbW3w6p0A=",
"path": "github.com/stretchr/testify/suite",
"revision": "f35b8ab0b5a2cef36673838d662e249dd9c94686",
"revisionTime": "2018-05-06T18:05:49Z"
},
{
"checksumSHA1": "L1vKtjhZ2Lej0kfsLaTUm7ps/Yg=",
"path": "github.com/x-cray/logrus-prefixed-formatter",
Expand Down

0 comments on commit 1768230

Please sign in to comment.