Skip to content

Commit

Permalink
Merge branch 'main' of github.com:cloud-barista/cm-honeybee
Browse files Browse the repository at this point in the history
  • Loading branch information
ish-hcc committed Nov 1, 2024
2 parents 67ebb97 + 345a672 commit 52becf9
Show file tree
Hide file tree
Showing 32 changed files with 2,128 additions and 84 deletions.
51 changes: 48 additions & 3 deletions agent/driver/kubernetes/client.go
Original file line number Diff line number Diff line change
@@ -1,14 +1,29 @@
package infra
package kubernetes

import (
"errors"
"os"

"k8s.io/client-go/kubernetes"

// "k8s.io/client-go/rest"
"k8s.io/client-go/tools/clientcmd"

helmclient "github.com/mittwald/go-helm-client"
)

func GetClientSet() (*kubernetes.Clientset, error) {
config, err := clientcmd.BuildConfigFromFlags("", "/etc/kubernetes/admin.conf")
const (
KubeConfigPath = "/etc/kubernetes/admin.conf"
)

func KubeConfigCheck() bool {
_, err := os.ReadFile(KubeConfigPath)
return err == nil
}

func GetKubernetesClientSet() (*kubernetes.Clientset, error) {

config, err := clientcmd.BuildConfigFromFlags("", KubeConfigPath)
if err != nil {
return nil, err
}
Expand All @@ -20,3 +35,33 @@ func GetClientSet() (*kubernetes.Clientset, error) {

return clientset, nil
}

func GetHelmClientSet(ns string) (helmclient.Client, error) {

if ns == "" {
ns = "default"
}

opt := &helmclient.KubeConfClientOptions{
Options: &helmclient.Options{
Namespace: ns,
RepositoryCache: "/tmp/.helmcache",
RepositoryConfig: "/tmp/.helmrepo",
Debug: true,
Linting: true,
},
}

kubeConfigData, err := os.ReadFile(KubeConfigPath)
if err != nil {
return nil, err
}
opt.KubeConfig = kubeConfigData

helmClient, err := helmclient.NewClientFromKubeConf(opt, nil)
if err != nil {
return nil, errors.New("get clientset error")
}

return helmClient, err
}
123 changes: 123 additions & 0 deletions agent/driver/kubernetes/helm.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
package kubernetes

import (
"encoding/json"
"fmt"
"os/exec"
"sort"

"helm.sh/helm/v3/pkg/release"

"github.com/cloud-barista/cm-honeybee/agent/pkg/api/rest/model/onprem/kubernetes"

"github.com/jollaman999/utils/logger"
)

type Release struct {
Namespace string `json:"namespace"`
}

func GetHelmNamespaces() ([]string, error) {

if !KubeConfigCheck() {
return nil, fmt.Errorf(KubeConfigPath + ": no such file or directory")
}

cmd := exec.Command("helm", "ls", "-A", "-o", "json", "--kube-insecure-skip-tls-verify", "--kubeconfig", KubeConfigPath)

output, err := cmd.Output()
if err != nil {
logger.Println(logger.ERROR, true, "Error executing helm command: "+err.Error())
return []string{}, err
}

var releases []Release
err = json.Unmarshal(output, &releases)
if err != nil {
logger.Println(logger.ERROR, true, "Error unmarshaling helm Namespace: "+err.Error())
return []string{}, err
}

namespaceSet := make(map[string]struct{})
for _, release := range releases {
namespaceSet[release.Namespace] = struct{}{}
}

var namespaces []string
for ns := range namespaceSet {
namespaces = append(namespaces, ns)
}

sort.Strings(namespaces)

return namespaces, nil
}

func GetRepoInfo() ([]kubernetes.Repo, error) {

// $USER/.config/helm/repositories.yaml
cmd := exec.Command("helm", "repo", "list", "-o", "json", "--kube-insecure-skip-tls-verify", "--kubeconfig", KubeConfigPath)

output, err := cmd.Output()
if err != nil {
logger.Println(logger.ERROR, true, "Error executing helm command: "+err.Error())
return []kubernetes.Repo{}, err
}

var repos []kubernetes.Repo
err = json.Unmarshal(output, &repos)
if err != nil {
logger.Println(logger.ERROR, true, "Error unmarshaling helm Repo: "+err.Error())
return []kubernetes.Repo{}, err
}

return repos, nil
}

func GetReleaseInfo() ([]kubernetes.Release, error) {

namespaces, err := GetHelmNamespaces()
if err != nil {
return []kubernetes.Release{}, err
}

var releases []kubernetes.Release

for _, ns := range namespaces {
helmClientset, err := GetHelmClientSet(ns)
if err != nil {
logger.Println(logger.ERROR, true, "Helm Connection Error: "+err.Error())
return []kubernetes.Release{}, err
}

var objects []*release.Release
objects, err = helmClientset.ListDeployedReleases()
if err != nil {
return []kubernetes.Release{}, err
}

ObjectCnt := len(objects)

for i := 0; i < ObjectCnt; i++ {

object, err := helmClientset.GetRelease(objects[i].Name)
if err != nil {
return []kubernetes.Release{}, err
}

release := kubernetes.Release{
Name: object.Name,
Namespace: object.Namespace,
Revision: object.Version,
Updated: object.Info.LastDeployed.Time,
Status: string(object.Info.Status),
AppVersion: object.Chart.Metadata.AppVersion,
ChartNameVersion: object.Chart.Metadata.Name + "-" + object.Chart.Metadata.Version,
}
releases = append(releases, release)
}

}

return releases, nil
}
27 changes: 26 additions & 1 deletion agent/driver/kubernetes/kubernetes.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package infra
package kubernetes

import (
"errors"
Expand All @@ -8,6 +8,7 @@ import (
)

var kubernetesInfoLock sync.Mutex
var helmInfoLock sync.Mutex

func GetKubernetesInfo() (*kubernetes.Kubernetes, error) {
if !kubernetesInfoLock.TryLock() {
Expand All @@ -32,3 +33,27 @@ func GetKubernetesInfo() (*kubernetes.Kubernetes, error) {

return &i, nil
}

func GetHelmInfo() (*kubernetes.Helm, error) {
if !helmInfoLock.TryLock() {
return nil, errors.New("helm info collection is in progress")
}
defer func() {
helmInfoLock.Unlock()
}()

var i kubernetes.Helm
var err error

i.Repo, err = GetRepoInfo()
if err != nil {
return nil, err
}

i.Release, err = GetReleaseInfo()
if err != nil {
return nil, err
}

return &i, nil
}
4 changes: 2 additions & 2 deletions agent/driver/kubernetes/node.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package infra
package kubernetes

import (
"context"
Expand All @@ -13,7 +13,7 @@ import (
)

func GetNodeInfo() ([]kubernetes.Node, error) {
clientset, err := GetClientSet()
clientset, err := GetKubernetesClientSet()
if err != nil {
logger.Println(logger.ERROR, true, "Kubernetes Connection Error: "+err.Error())
return []kubernetes.Node{}, err
Expand Down
4 changes: 2 additions & 2 deletions agent/driver/kubernetes/workload.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package infra
package kubernetes

import (
"context"
Expand Down Expand Up @@ -74,7 +74,7 @@ func GetWorkloadInfo() (map[string]interface{}, error) {
}

func callClientMethod(methodName string) (interface{}, error) {
clientset, err := GetClientSet()
clientset, err := GetKubernetesClientSet()
if err != nil {
logger.Println(logger.ERROR, true, "Kubernetes Connection Error: "+err.Error())
return nil, err
Expand Down
Loading

0 comments on commit 52becf9

Please sign in to comment.