register created cluster to argocd

This commit is contained in:
behrooz
2025-11-14 19:33:30 +03:30
parent f5057233a0
commit a23a1e28f4
5 changed files with 79 additions and 101 deletions

View File

@@ -13,6 +13,8 @@ import (
"github.com/argoproj/argo-cd/v2/pkg/apiclient" "github.com/argoproj/argo-cd/v2/pkg/apiclient"
"github.com/argoproj/argo-cd/v2/pkg/apiclient/application" "github.com/argoproj/argo-cd/v2/pkg/apiclient/application"
clusterapi "github.com/argoproj/argo-cd/v2/pkg/apiclient/cluster"
"github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1"
argoprojv1alpha1 "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" argoprojv1alpha1 "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1"
"go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/primitive" "go.mongodb.org/mongo-driver/bson/primitive"
@@ -61,8 +63,8 @@ var (
func InitializeClient() { func InitializeClient() {
once.Do(func() { once.Do(func() {
argocdServer := "130.185.77.247:30966" argocdServer := "argocd.bugx.ir"
argocdToken := "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhcmdvY2QiLCJzdWIiOiJhZG1pbjphcGlLZXkiLCJuYmYiOjE3NjAwMjE1NjAsImlhdCI6MTc2MDAyMTU2MCwianRpIjoiZTdjMzMyNWQtZDU0Yy00M2Q0LWIzOGYtYjc3NGQ4OTcxZGZmIn0.35lU-UOwl3XxjvqEfnEXIhaVoug90-J2WWj5x0OihC0" argocdToken := "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhcmdvY2QiLCJzdWIiOiJhZG1pbjphcGlLZXkiLCJuYmYiOjE3NjMxMzQ3NzEsImlhdCI6MTc2MzEzNDc3MSwianRpIjoiNDVkMmViYmYtMDYzNC00MTFlLTk4ODctMjMzMmJjMGFjNDkxIn0.UgQ7oIWzrsP7mCaN8Tfd7wrcFQ7Ew6wYFQHevMIGflw"
config := apiclient.ClientOptions{ config := apiclient.ClientOptions{
ServerAddr: argocdServer, ServerAddr: argocdServer,
@@ -108,7 +110,7 @@ func CreateApp(objectID string, clustername string, ControlPlane string, Platfor
Path: "vcluster-0.28.0", Path: "vcluster-0.28.0",
Cluster: "in-cluster", Cluster: "in-cluster",
Server: "https://kubernetes.default.svc", Server: "https://kubernetes.default.svc",
RepoURL: "http://130.185.77.247:31300/gitea_admin/application.git", RepoURL: "https://git.bugx.ir/gitea_admin/application.git",
UserID: userID, UserID: userID,
} }
@@ -276,11 +278,84 @@ func updateConfig(objectID string, configStrings string, namespace string) {
} }
_, err = db.Vclusters_details.UpdateOne(context.TODO(), filter, update) _, err = db.Vclusters_details.UpdateOne(context.TODO(), filter, update)
RegisterToArgo(configStrings, namespace)
if err != nil { if err != nil {
fmt.Println("update cluster config error: ", err) fmt.Println("update cluster config error: ", err)
} }
} }
func RegisterToArgo(kubeConfigString string, namespace string) {
// ArgoCD server
argocdServer := "argocd.bugx.ir"
argocdToken := "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhcmdvY2QiLCJzdWIiOiJhZG1pbjphcGlLZXkiLCJuYmYiOjE3NjMxMzQ3NzEsImlhdCI6MTc2MzEzNDc3MSwianRpIjoiNDVkMmViYmYtMDYzNC00MTFlLTk4ODctMjMzMmJjMGFjNDkxIn0.UgQ7oIWzrsP7mCaN8Tfd7wrcFQ7Ew6wYFQHevMIGflw"
// Context name that must exist in kubeconfig
clusterContext := "kubernetes-super-admin@kubernetes"
decoded, err := base64.StdEncoding.DecodeString(kubeConfigString)
if err != nil {
panic(err)
}
// ---- Load kubeconfig of the target cluster ----
cfg, err := clientcmd.Load([]byte(decoded))
if err != nil {
panic(err)
}
ctx := cfg.Contexts[clusterContext]
if ctx == nil {
panic("cluster context not found in kubeconfig")
}
// Real cluster data
cluster := cfg.Clusters[ctx.Cluster]
user := cfg.AuthInfos[ctx.AuthInfo]
// ---- Create ArgoCD API client ----
clientOpts := apiclient.ClientOptions{
ServerAddr: argocdServer,
AuthToken: argocdToken,
Insecure: false,
}
argocdClient, err := apiclient.NewClient(&clientOpts)
if err != nil {
panic(err)
}
closer, clusterIf, err := argocdClient.NewClusterClient()
if err != nil {
panic(err)
}
defer closer.Close()
// ---- Build the correct request type ----
req := &clusterapi.ClusterCreateRequest{
Cluster: &v1alpha1.Cluster{
Name: namespace + clusterContext,
Server: cluster.Server,
Config: v1alpha1.ClusterConfig{
BearerToken: user.Token,
TLSClientConfig: v1alpha1.TLSClientConfig{
CAData: cluster.CertificateAuthorityData,
Insecure: false,
},
},
},
}
// ---- Register cluster to ArgoCD ----
createdCluster, err := clusterIf.Create(context.Background(), req)
if err != nil {
panic(err)
}
fmt.Println("Cluster registered:", createdCluster.Name)
}
func SyncApp(objectID string, appName string, cluster string, namesname string) { func SyncApp(objectID string, appName string, cluster string, namesname string) {
InitializeClient() InitializeClient()

View File

@@ -1,54 +0,0 @@
package jobs
import (
"context"
"encoding/json"
"fmt"
"log"
"time"
"github.com/hibiken/asynq"
)
const (
TypeInstallChart = "chart:install"
)
type InstallChartPayload struct {
ChartName string
Version string
Namespace string
UserID string
}
func NewInstallCahrtTask(chartname, version, ns, userID string) *asynq.Task {
payload, _ := json.Marshal(InstallChartPayload{
ChartName: chartname,
Version: version,
Namespace: ns,
UserID: userID,
})
return asynq.NewTask(TypeInstallChart, payload)
}
func HandleInstallCahrt(ctx context.Context, t *asynq.Task) error {
var payload InstallChartPayload
if err := json.Unmarshal(t.Payload(), &payload); err != nil {
return fmt.Errorf("Faild to parse payload: %w", err)
}
log.Printf("[Job] Installing chart %s in namespace %s", payload.ChartName, payload.Namespace)
log.Printf("[Job] Validating Chart ... ")
time.Sleep(2 * time.Second)
log.Printf("[Job] Creating resources ...")
time.Sleep(2 * time.Second)
log.Printf("[Job] Wating for pods ...")
time.Sleep(2 * time.Second)
log.Printf("[Job] Finilizing installation ...")
log.Printf("[Job] chart %s installed successfully", payload.ChartName)
return nil
}

21
main.go
View File

@@ -8,14 +8,12 @@ import (
"main/db" "main/db"
"main/handler" "main/handler"
"main/jobs"
"net/http" "net/http"
"regexp" "regexp"
"time" "time"
"github.com/golang-jwt/jwt/v4" "github.com/golang-jwt/jwt/v4"
"github.com/gorilla/mux" "github.com/gorilla/mux"
"github.com/hibiken/asynq"
"github.com/rs/cors" "github.com/rs/cors"
"go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson"
"golang.org/x/crypto/bcrypt" "golang.org/x/crypto/bcrypt"
@@ -61,7 +59,6 @@ func registerHnadler(w http.ResponseWriter, r *http.Request) {
var existUser User var existUser User
_ = db.UserCollection.FindOne(context.TODO(), bson.M{"email": user.Email}).Decode(&existUser) _ = db.UserCollection.FindOne(context.TODO(), bson.M{"email": user.Email}).Decode(&existUser)
if existUser.Email == user.Email { if existUser.Email == user.Email {
http.Error(w, `{"message": "User already registered"}`, http.StatusUnauthorized) http.Error(w, `{"message": "User already registered"}`, http.StatusUnauthorized)
return return
@@ -123,24 +120,6 @@ func loginHandler(w http.ResponseWriter, r *http.Request) {
func main() { func main() {
db.InitDB() db.InitDB()
var redisClient = asynq.NewClient(asynq.RedisClientOpt{Addr: "130.185.77.247:30828", Password: "xwy8ahx46F"})
chart := jobs.InstallChartPayload{
ChartName: "redis",
Version: "2.1.0",
Namespace: "default",
UserID: "razaghi",
}
if _, err := json.Marshal(chart); err != nil {
fmt.Printf("Could not json ")
}
task := jobs.NewInstallCahrtTask(chart.ChartName, chart.Namespace, chart.Namespace, chart.UserID)
info, err := redisClient.Enqueue(task)
if err != nil {
fmt.Printf("Error in connecting redis")
}
fmt.Printf("This is issued task %v", info.ID)
go startWorker()
router := mux.NewRouter() router := mux.NewRouter()
router.HandleFunc("/register", registerHnadler) router.HandleFunc("/register", registerHnadler)
router.HandleFunc("/login", loginHandler) router.HandleFunc("/login", loginHandler)

View File

@@ -1,22 +0,0 @@
package main
import (
"log"
"main/jobs"
"github.com/hibiken/asynq"
)
func startWorker() {
srv := asynq.NewServer(
asynq.RedisClientOpt{Addr: "130.185.77.247:30828", Password: "xwy8ahx46F"},
asynq.Config{Concurrency: 5},
)
mux := asynq.NewServeMux()
mux.HandleFunc(jobs.TypeInstallChart, jobs.HandleInstallCahrt)
if err := srv.Run(mux); err != nil {
log.Fatalf("Could not run worker: %v", err)
}
}