|
18 | 18 | package argocdServer |
19 | 19 |
|
20 | 20 | import ( |
| 21 | + "context" |
21 | 22 | "fmt" |
22 | | - "log" |
23 | | - |
24 | 23 | "github.com/argoproj/argo-cd/v2/util/settings" |
| 24 | + moduleRepo "github.com/devtron-labs/devtron/pkg/module/repo" |
| 25 | + "github.com/go-pg/pg" |
25 | 26 | grpc_prometheus "github.com/grpc-ecosystem/go-grpc-prometheus" |
| 27 | + "go.uber.org/zap" |
26 | 28 | "google.golang.org/grpc" |
| 29 | + "k8s.io/client-go/kubernetes" |
| 30 | + "k8s.io/client-go/tools/clientcmd" |
27 | 31 | ) |
28 | 32 |
|
29 | 33 | func init() { |
30 | | - |
31 | 34 | grpc_prometheus.EnableClientHandlingTimeHistogram() |
32 | 35 | } |
33 | 36 |
|
34 | | -func GetConnection(token string, settings *settings.ArgoCDSettings) *grpc.ClientConn { |
| 37 | +type ArgoCDConnectionManager interface { |
| 38 | + GetConnection(token string) *grpc.ClientConn |
| 39 | +} |
| 40 | +type ArgoCDConnectionManagerImpl struct { |
| 41 | + logger *zap.SugaredLogger |
| 42 | + settingsManager *settings.SettingsManager |
| 43 | + moduleRepository moduleRepo.ModuleRepository |
| 44 | + argoCDSettings *settings.ArgoCDSettings |
| 45 | +} |
| 46 | + |
| 47 | +func NewArgoCDConnectionManagerImpl(Logger *zap.SugaredLogger, settingsManager *settings.SettingsManager, |
| 48 | + moduleRepository moduleRepo.ModuleRepository) (*ArgoCDConnectionManagerImpl, error) { |
| 49 | + argoUserServiceImpl := &ArgoCDConnectionManagerImpl{ |
| 50 | + logger: Logger, |
| 51 | + settingsManager: settingsManager, |
| 52 | + moduleRepository: moduleRepository, |
| 53 | + argoCDSettings: nil, |
| 54 | + } |
| 55 | + return argoUserServiceImpl, nil |
| 56 | +} |
| 57 | + |
| 58 | +const ( |
| 59 | + ModuleNameArgoCd string = "argo-cd" |
| 60 | + ModuleStatusInstalled string = "installed" |
| 61 | +) |
| 62 | + |
| 63 | +// GetConnection - this function will call only for acd connection |
| 64 | +func (impl *ArgoCDConnectionManagerImpl) GetConnection(token string) *grpc.ClientConn { |
35 | 65 | conf, err := GetConfig() |
36 | 66 | if err != nil { |
37 | | - log.Fatal(err) |
| 67 | + impl.logger.Errorw("error on get acd config while creating connection", "err", err) |
| 68 | + return nil |
38 | 69 | } |
| 70 | + settings := impl.getArgoCdSettings() |
39 | 71 | var option []grpc.DialOption |
40 | 72 | option = append(option, grpc.WithTransportCredentials(GetTLS(settings.Certificate))) |
41 | 73 | if len(token) > 0 { |
42 | 74 | option = append(option, grpc.WithPerRPCCredentials(TokenAuth{token: token})) |
43 | 75 | } |
44 | 76 | option = append(option, grpc.WithUnaryInterceptor(grpc_prometheus.UnaryClientInterceptor), grpc.WithStreamInterceptor(grpc_prometheus.StreamClientInterceptor)) |
45 | | - |
46 | | - //if conf.Environment=="DEV"{ |
47 | | - // option=append(option,grpc.WithInsecure()) |
48 | | - //} |
49 | 77 | conn, err := grpc.Dial(fmt.Sprintf("%s:%s", conf.Host, conf.Port), option...) |
50 | 78 | if err != nil { |
51 | | - log.Fatal(err) |
| 79 | + return nil |
52 | 80 | } |
53 | 81 | return conn |
54 | 82 | } |
| 83 | + |
| 84 | +func SettingsManager(cfg *Config) (*settings.SettingsManager, error) { |
| 85 | + clientSet, kubeConfig := getK8sClient() |
| 86 | + namespace, _, err := kubeConfig.Namespace() |
| 87 | + if err != nil { |
| 88 | + return nil, err |
| 89 | + } |
| 90 | + //TODO: remove this hardcoding |
| 91 | + if len(cfg.Namespace) >= 0 { |
| 92 | + namespace = cfg.Namespace |
| 93 | + } |
| 94 | + return settings.NewSettingsManager(context.Background(), clientSet, namespace), nil |
| 95 | +} |
| 96 | + |
| 97 | +func getK8sClient() (k8sClient *kubernetes.Clientset, k8sConfig clientcmd.ClientConfig) { |
| 98 | + kubeConfig := clientcmd.NewNonInteractiveDeferredLoadingClientConfig( |
| 99 | + clientcmd.NewDefaultClientConfigLoadingRules(), |
| 100 | + &clientcmd.ConfigOverrides{}, |
| 101 | + ) |
| 102 | + config, err := kubeConfig.ClientConfig() |
| 103 | + if err != nil { |
| 104 | + panic(err) |
| 105 | + } |
| 106 | + clientSet := kubernetes.NewForConfigOrDie(config) |
| 107 | + return clientSet, kubeConfig |
| 108 | +} |
| 109 | + |
| 110 | +func (impl *ArgoCDConnectionManagerImpl) getArgoCdSettings() *settings.ArgoCDSettings { |
| 111 | + settings := impl.argoCDSettings |
| 112 | + if settings == nil { |
| 113 | + module, err := impl.moduleRepository.FindOne(ModuleNameArgoCd) |
| 114 | + if err != nil && err != pg.ErrNoRows { |
| 115 | + impl.logger.Errorw("error on get acd connection", "err", err) |
| 116 | + return nil |
| 117 | + } |
| 118 | + if module == nil || module.Status != ModuleStatusInstalled { |
| 119 | + impl.logger.Errorw("error on get acd connection", "err", err) |
| 120 | + return nil |
| 121 | + } |
| 122 | + settings, err = impl.settingsManager.GetSettings() |
| 123 | + if err != nil { |
| 124 | + impl.logger.Errorw("error on get acd connection", "err", err) |
| 125 | + return nil |
| 126 | + } |
| 127 | + impl.argoCDSettings = settings |
| 128 | + } |
| 129 | + return impl.argoCDSettings |
| 130 | +} |
0 commit comments