Skip to content

Commit

Permalink
Merge pull request #45 from josedonizetti/fix-get-current-namespace
Browse files Browse the repository at this point in the history
fix: if current namespace empty, returns default
  • Loading branch information
josedonizetti authored May 31, 2022
2 parents ac00ae8 + 178b205 commit 7539c07
Show file tree
Hide file tree
Showing 2 changed files with 106 additions and 7 deletions.
25 changes: 18 additions & 7 deletions pkg/k8s/k8s.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"k8s.io/cli-runtime/pkg/genericclioptions"
"k8s.io/client-go/dynamic"
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/clientcmd"
)

const (
Expand Down Expand Up @@ -65,20 +66,31 @@ func GetCluster(context string) (Cluster, error) {

cf.Context = &context

kubeConfig, err := cf.ToRESTConfig()
// disable warnings
rest.SetDefaultWarningHandler(rest.NoWarnings{})

clientConfig := cf.ToRawKubeConfigLoader()

restMapper, err := cf.ToRESTMapper()
if err != nil {
return nil, err
}

// disable warnings
rest.SetDefaultWarningHandler(rest.NoWarnings{})
return getCluster(clientConfig, restMapper)
}

func getCluster(clientConfig clientcmd.ClientConfig, restMapper meta.RESTMapper) (*cluster, error) {
kubeConfig, err := clientConfig.ClientConfig()
if err != nil {
return nil, err
}

k8sDynamicClient, err := dynamic.NewForConfig(kubeConfig)
if err != nil {
return nil, err
}

rawCfg, err := cf.ToRawKubeConfigLoader().RawConfig()
rawCfg, err := clientConfig.RawConfig()
if err != nil {
return nil, err
}
Expand All @@ -88,9 +100,8 @@ func GetCluster(context string) (Cluster, error) {
namespace = context.Namespace
}

restMapper, err := cf.ToRESTMapper()
if err != nil {
return nil, err
if len(namespace) == 0 {
namespace = "default"
}

return &cluster{
Expand Down
88 changes: 88 additions & 0 deletions pkg/k8s/k8s_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,77 @@ import (
"testing"

"github.com/stretchr/testify/assert"
"k8s.io/apimachinery/pkg/api/meta"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/client-go/tools/clientcmd"
clientcmdapi "k8s.io/client-go/tools/clientcmd/api"
)

func TestGetCurrentNamespace(t *testing.T) {
tests := []struct {
Name string
Namespace string
ExpectedNamespace string
}{
{
Name: "empty namespace",
ExpectedNamespace: "default",
},
{
Name: "non empty namespace",
Namespace: "namespace",
ExpectedNamespace: "namespace",
},
}

for _, test := range tests {
t.Run(test.Name, func(t *testing.T) {
fakeConfig := createValidTestConfig(test.Namespace)
cluster, err := getCluster(fakeConfig, nil)
assert.NoError(t, err)
assert.Equal(t, test.ExpectedNamespace, cluster.GetCurrentNamespace())
})
}
}

func TestGetGVR(t *testing.T) {
tests := []struct {
Resource string
GroupVersionKind schema.GroupVersionKind
ExpectedResource schema.GroupVersionResource
Err bool
}{
{
Resource: "nonexisting",
GroupVersionKind: schema.GroupVersionKind{Group: "testapi", Version: "test", Kind: "MyObject"},
Err: true,
},
{
Resource: "MyObject",
GroupVersionKind: schema.GroupVersionKind{Group: "testapi", Version: "test", Kind: "MyObject"},
ExpectedResource: schema.GroupVersionResource{Resource: "myobjects", Group: "testapi", Version: "test"},
},
}

for _, test := range tests {
mapper := meta.NewDefaultRESTMapper([]schema.GroupVersion{test.GroupVersionKind.GroupVersion()})
mapper.Add(test.GroupVersionKind, meta.RESTScopeNamespace)

fakeConfig := createValidTestConfig("")

cluster, err := getCluster(fakeConfig, mapper)
assert.NoError(t, err)

gvr, err := cluster.GetGVR(test.Resource)
if test.Err {
assert.Error(t, err)
continue
}

assert.Equal(t, test.ExpectedResource, gvr)
}
}

func TestIsClusterResource(t *testing.T) {
for _, r := range getClusterResources() {
assert.True(t, IsClusterResource(newGVR(r)), r)
Expand All @@ -20,3 +88,23 @@ func TestIsClusterResource(t *testing.T) {
func newGVR(resource string) schema.GroupVersionResource {
return schema.GroupVersionResource{Resource: resource}
}

func createValidTestConfig(namespace string) clientcmd.ClientConfig {
const (
server = "https://anything.com:8080"
token = "the-token"
)

config := clientcmdapi.NewConfig()

config.CurrentContext = "cluster1"
config.Clusters["cluster1"] = &clientcmdapi.Cluster{Server: server}
config.AuthInfos["cluster1"] = &clientcmdapi.AuthInfo{Token: token}
config.Contexts["cluster1"] = &clientcmdapi.Context{
Cluster: "cluster1",
AuthInfo: "cluster1",
Namespace: namespace,
}

return clientcmd.NewNonInteractiveClientConfig(*config, "cluster1", &clientcmd.ConfigOverrides{}, nil)
}

0 comments on commit 7539c07

Please sign in to comment.