diff --git a/application b/application index 282c3e5..84e5df6 160000 --- a/application +++ b/application @@ -1 +1 @@ -Subproject commit 282c3e52d0d6a4614b1754f0a79dac17509e4361 +Subproject commit 84e5df60788053d41dc5e22d30a0b2cc166d992a diff --git a/argohandler/argohandler.go b/argohandler/argohandler.go index 072ef86..896fcd8 100644 --- a/argohandler/argohandler.go +++ b/argohandler/argohandler.go @@ -13,6 +13,8 @@ import ( "github.com/argoproj/argo-cd/v2/pkg/apiclient" "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" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/primitive" @@ -61,8 +63,8 @@ var ( func InitializeClient() { once.Do(func() { - argocdServer := "130.185.77.247:30966" - argocdToken := "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhcmdvY2QiLCJzdWIiOiJhZG1pbjphcGlLZXkiLCJuYmYiOjE3NjAwMjE1NjAsImlhdCI6MTc2MDAyMTU2MCwianRpIjoiZTdjMzMyNWQtZDU0Yy00M2Q0LWIzOGYtYjc3NGQ4OTcxZGZmIn0.35lU-UOwl3XxjvqEfnEXIhaVoug90-J2WWj5x0OihC0" + argocdServer := "argocd.bugx.ir" + argocdToken := "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhcmdvY2QiLCJzdWIiOiJhZG1pbjphcGlLZXkiLCJuYmYiOjE3NjMxMzQ3NzEsImlhdCI6MTc2MzEzNDc3MSwianRpIjoiNDVkMmViYmYtMDYzNC00MTFlLTk4ODctMjMzMmJjMGFjNDkxIn0.UgQ7oIWzrsP7mCaN8Tfd7wrcFQ7Ew6wYFQHevMIGflw" config := apiclient.ClientOptions{ ServerAddr: argocdServer, @@ -108,7 +110,7 @@ func CreateApp(objectID string, clustername string, ControlPlane string, Platfor Path: "vcluster-0.28.0", Cluster: "in-cluster", 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, } @@ -276,11 +278,84 @@ func updateConfig(objectID string, configStrings string, namespace string) { } _, err = db.Vclusters_details.UpdateOne(context.TODO(), filter, update) + RegisterToArgo(configStrings, namespace) if err != nil { 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) { InitializeClient() diff --git a/jobs/helminstall.go b/jobs/helminstall.go deleted file mode 100644 index 726f6ac..0000000 --- a/jobs/helminstall.go +++ /dev/null @@ -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 - -} diff --git a/main.go b/main.go index 6c02338..4141668 100644 --- a/main.go +++ b/main.go @@ -8,14 +8,12 @@ import ( "main/db" "main/handler" - "main/jobs" "net/http" "regexp" "time" "github.com/golang-jwt/jwt/v4" "github.com/gorilla/mux" - "github.com/hibiken/asynq" "github.com/rs/cors" "go.mongodb.org/mongo-driver/bson" "golang.org/x/crypto/bcrypt" @@ -61,7 +59,6 @@ func registerHnadler(w http.ResponseWriter, r *http.Request) { var existUser User _ = db.UserCollection.FindOne(context.TODO(), bson.M{"email": user.Email}).Decode(&existUser) - if existUser.Email == user.Email { http.Error(w, `{"message": "User already registered"}`, http.StatusUnauthorized) return @@ -123,24 +120,6 @@ func loginHandler(w http.ResponseWriter, r *http.Request) { func main() { 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.HandleFunc("/register", registerHnadler) router.HandleFunc("/login", loginHandler) diff --git a/worker.go b/worker.go deleted file mode 100644 index c90e848..0000000 --- a/worker.go +++ /dev/null @@ -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) - } -}