aboutsummaryrefslogtreecommitdiffstats
path: root/src/k8splugin/internal/app/client.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/k8splugin/internal/app/client.go')
-rw-r--r--src/k8splugin/internal/app/client.go74
1 files changed, 71 insertions, 3 deletions
diff --git a/src/k8splugin/internal/app/client.go b/src/k8splugin/internal/app/client.go
index 6762d1bc..85fefe69 100644
--- a/src/k8splugin/internal/app/client.go
+++ b/src/k8splugin/internal/app/client.go
@@ -1,6 +1,6 @@
/*
Copyright 2018 Intel Corporation.
-Copyright © 2020 Samsung Electronics
+Copyright © 2021 Samsung Electronics
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -16,6 +16,7 @@ limitations under the License.
package app
import (
+ "io/ioutil"
"os"
"strings"
"time"
@@ -32,9 +33,11 @@ import (
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
+ "k8s.io/client-go/discovery"
"k8s.io/client-go/discovery/cached/disk"
"k8s.io/client-go/dynamic"
"k8s.io/client-go/kubernetes"
+ "k8s.io/client-go/rest"
"k8s.io/client-go/restmapper"
"k8s.io/client-go/tools/clientcmd"
)
@@ -42,6 +45,8 @@ import (
// KubernetesClient encapsulates the different clients' interfaces
// we need when interacting with a Kubernetes cluster
type KubernetesClient struct {
+ rawConfig clientcmd.ClientConfig
+ restConfig *rest.Config
clientSet kubernetes.Interface
dynamicClient dynamic.Interface
discoverClient *disk.CachedDiscoveryClient
@@ -90,6 +95,39 @@ func (k *KubernetesClient) getPodsByLabel(namespace string) ([]ResourceStatus, e
return resp, nil
}
+func (k *KubernetesClient) queryResources(apiVersion, kind, labelSelector, namespace string) ([]ResourceStatus, error) {
+ dynClient := k.GetDynamicClient()
+ mapper := k.GetMapper()
+ gvk := schema.FromAPIVersionAndKind(apiVersion, kind)
+ mapping, err := mapper.RESTMapping(gvk.GroupKind(), gvk.Version)
+ if err != nil {
+ return nil, pkgerrors.Wrap(err, "Preparing mapper based on GVK")
+ }
+
+ gvr := mapping.Resource
+ opts := metav1.ListOptions{
+ LabelSelector: labelSelector,
+ }
+ var unstrList *unstructured.UnstructuredList
+ switch mapping.Scope.Name() {
+ case meta.RESTScopeNameNamespace:
+ unstrList, err = dynClient.Resource(gvr).Namespace(namespace).List(opts)
+ case meta.RESTScopeNameRoot:
+ unstrList, err = dynClient.Resource(gvr).List(opts)
+ default:
+ return nil, pkgerrors.New("Got an unknown RESTScopeName for mapping: " + gvk.String())
+ }
+ if err != nil {
+ return nil, pkgerrors.Wrap(err, "Querying for resources")
+ }
+
+ resp := make([]ResourceStatus, len(unstrList.Items))
+ for _, unstr := range unstrList.Items {
+ resp = append(resp, ResourceStatus{unstr.GetName(), gvk, unstr})
+ }
+ return resp, nil
+}
+
// getResourcesStatus yields status of given generic resource
func (k *KubernetesClient) getResourceStatus(res helm.KubernetesResource, namespace string) (ResourceStatus, error) {
dynClient := k.GetDynamicClient()
@@ -135,8 +173,8 @@ func (k *KubernetesClient) getKubeConfig(cloudregion string) (string, error) {
return kubeConfigPath, nil
}
-// init loads the Kubernetes configuation values stored into the local configuration file
-func (k *KubernetesClient) init(cloudregion string, iid string) error {
+// Init loads the Kubernetes configuation values stored into the local configuration file
+func (k *KubernetesClient) Init(cloudregion string, iid string) error {
if cloudregion == "" {
return pkgerrors.New("Cloudregion is empty")
}
@@ -176,6 +214,21 @@ func (k *KubernetesClient) init(cloudregion string, iid string) error {
}
k.restMapper = restmapper.NewDeferredDiscoveryRESTMapper(k.discoverClient)
+ k.restConfig = config
+
+ //Spawn ClientConfig
+ kubeFile, err := os.Open(configPath)
+ if err != nil {
+ return pkgerrors.Wrap(err, "Opening kubeConfig")
+ }
+ kubeData, err := ioutil.ReadAll(kubeFile)
+ if err != nil {
+ return pkgerrors.Wrap(err, "Reading kubeConfig")
+ }
+ k.rawConfig, err = clientcmd.NewClientConfigFromBytes(kubeData)
+ if err != nil {
+ return pkgerrors.Wrap(err, "Creating rawConfig")
+ }
return nil
}
@@ -390,3 +443,18 @@ func (k *KubernetesClient) GetStandardClient() kubernetes.Interface {
func (k *KubernetesClient) GetInstanceID() string {
return k.instanceID
}
+
+//Following set of methods are implemented so that KubernetesClient
+//implements genericclioptions.RESTClientGetter interface
+func (k *KubernetesClient) ToDiscoveryClient() (discovery.CachedDiscoveryInterface, error) {
+ return k.discoverClient, nil
+}
+func (k *KubernetesClient) ToRESTMapper() (meta.RESTMapper, error) {
+ return k.GetMapper(), nil
+}
+func (k *KubernetesClient) ToRawKubeConfigLoader() clientcmd.ClientConfig {
+ return k.rawConfig
+}
+func (k *KubernetesClient) ToRESTConfig() (*rest.Config, error) {
+ return k.restConfig, nil
+}