You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

servicecontext.go 5.1 kB

2 years ago
4 months ago
2 years ago
4 months ago
2 years ago
4 months ago
4 months ago
4 months ago
4 months ago
2 years ago
4 months ago
2 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. /*
  2. Copyright (c) [2023] [pcm]
  3. [pcm-coordinator] is licensed under Mulan PSL v2.
  4. You can use this software according to the terms and conditions of the Mulan PSL v2.
  5. You may obtain a copy of Mulan PSL v2 at:
  6. http://license.coscl.org.cn/MulanPSL2
  7. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
  8. EITHER EXPaRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
  9. MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
  10. See the Mulan PSL v2 for more details.
  11. */
  12. package svc
  13. import (
  14. "github.com/go-redis/redis/v8"
  15. "github.com/go-resty/resty/v2"
  16. alert "github.com/prometheus/alertmanager/api/v2/client"
  17. "github.com/robfig/cron/v3"
  18. "github.com/zeromicro/go-zero/core/logx"
  19. "github.com/zeromicro/go-zero/zrpc"
  20. "gitlink.org.cn/JointCloud/pcm-ac/hpcacclient"
  21. "gitlink.org.cn/JointCloud/pcm-coordinator/internal/config"
  22. "gitlink.org.cn/JointCloud/pcm-coordinator/internal/participant"
  23. "gitlink.org.cn/JointCloud/pcm-coordinator/internal/scheduler"
  24. "gitlink.org.cn/JointCloud/pcm-coordinator/internal/scheduler/database"
  25. "gitlink.org.cn/JointCloud/pcm-coordinator/internal/scheduler/service"
  26. "gitlink.org.cn/JointCloud/pcm-coordinator/pkg/tracker"
  27. "gitlink.org.cn/JointCloud/pcm-coordinator/pkg/utils"
  28. "gitlink.org.cn/JointCloud/pcm-modelarts/client/imagesservice"
  29. "gitlink.org.cn/JointCloud/pcm-modelarts/client/modelartsservice"
  30. "gitlink.org.cn/JointCloud/pcm-octopus/octopusclient"
  31. "gitlink.org.cn/JointCloud/pcm-openstack/openstackclient"
  32. slurmClient "gitlink.org.cn/JointCloud/pcm-slurm/slurmclient"
  33. "gorm.io/driver/mysql"
  34. "gorm.io/gorm"
  35. "gorm.io/gorm/logger"
  36. "gorm.io/gorm/schema"
  37. "time"
  38. )
  39. type ServiceContext struct {
  40. Config config.Config
  41. RedisClient *redis.Client
  42. Cron *cron.Cron
  43. ModelArtsRpc modelartsservice.ModelArtsService
  44. ModelArtsImgRpc imagesservice.ImagesService
  45. DbEngin *gorm.DB
  46. ACRpc hpcacclient.HpcAC
  47. THRpc slurmClient.Slurm
  48. OctopusRpc octopusclient.Octopus
  49. OpenstackRpc openstackclient.Openstack
  50. MonitorClient map[int64]tracker.Prometheus
  51. PromClient tracker.Prometheus
  52. AlertClient *alert.AlertmanagerAPI
  53. HttpClient *resty.Client
  54. Scheduler *scheduler.Scheduler
  55. Ai *participant.Ai
  56. }
  57. func NewServiceContext(c config.Config) *ServiceContext {
  58. promClient, err := tracker.NewPrometheus(c.Monitoring.PromUrl)
  59. if err != nil {
  60. logx.Errorf("InitPrometheus err: %v", err)
  61. panic("InitPrometheus err")
  62. }
  63. httpClient := resty.New()
  64. httpClient.SetTimeout(1 * time.Second)
  65. alertClient := tracker.NewAlertClient(c.Monitoring.AlertUrl)
  66. //添加snowflake支持
  67. err = utils.InitSnowflake(c.SnowflakeConf.MachineId)
  68. if err != nil {
  69. logx.Errorf("InitSnowflake err: %v", err)
  70. panic("InitSnowflake err")
  71. }
  72. //启动Gorm支持
  73. dbEngin, err := gorm.Open(mysql.Open(c.DB.DataSource), &gorm.Config{
  74. NamingStrategy: schema.NamingStrategy{
  75. SingularTable: true, // 使用单数表名,启用该选项,此时,`User` 的表名应该是 `t_user`
  76. },
  77. Logger: logger.Default.LogMode(logger.Warn),
  78. })
  79. if err != nil {
  80. logx.Errorf("数据库连接失败, err%v", err)
  81. panic(err)
  82. }
  83. sqlDB, err := dbEngin.DB()
  84. // SetMaxIdleConns 设置空闲连接池中连接的最大数量
  85. sqlDB.SetMaxIdleConns(10)
  86. // SetMaxOpenConns 设置打开数据库连接的最大数量。
  87. sqlDB.SetMaxOpenConns(50)
  88. // SetConnMaxLifetime 设置了连接可复用的最大时间。
  89. sqlDB.SetConnMaxLifetime(time.Hour)
  90. if err != nil {
  91. logx.Error(err.Error())
  92. return nil
  93. }
  94. redisClient := redis.NewClient(&redis.Options{
  95. Addr: c.Redis.Host,
  96. Password: c.Redis.Pass,
  97. })
  98. // scheduler
  99. storage := &database.AiStorage{DbEngin: dbEngin}
  100. hpcStorage := &database.HpcStorage{DbEngin: dbEngin}
  101. cache := make(map[string]interface{}, 0)
  102. aiService, err := service.NewAiService(&c, storage, cache)
  103. if err != nil {
  104. logx.Error(err.Error())
  105. panic(err)
  106. }
  107. hpcService, err := service.NewHpcService(&c, hpcStorage, cache)
  108. if err != nil {
  109. logx.Error(err.Error())
  110. panic(err)
  111. }
  112. scheduler := scheduler.NewSchdlr(aiService, storage, hpcStorage, hpcService)
  113. ai, err := participant.New(storage, c.Participant.AdapterId)
  114. if err != nil {
  115. logx.Error(err.Error())
  116. panic(err)
  117. }
  118. return &ServiceContext{
  119. DbEngin: dbEngin,
  120. Cron: cron.New(cron.WithSeconds()),
  121. Config: c,
  122. RedisClient: redisClient,
  123. ModelArtsRpc: modelartsservice.NewModelArtsService(zrpc.MustNewClient(c.ModelArtsRpcConf)),
  124. ModelArtsImgRpc: imagesservice.NewImagesService(zrpc.MustNewClient(c.ModelArtsImgRpcConf)),
  125. ACRpc: hpcacclient.NewHpcAC(zrpc.MustNewClient(c.ACRpcConf)),
  126. OctopusRpc: octopusclient.NewOctopus(zrpc.MustNewClient(c.OctopusRpcConf)),
  127. OpenstackRpc: openstackclient.NewOpenstack(zrpc.MustNewClient(c.OpenstackRpcConf)),
  128. MonitorClient: make(map[int64]tracker.Prometheus),
  129. PromClient: promClient,
  130. AlertClient: alertClient,
  131. HttpClient: httpClient,
  132. Scheduler: scheduler,
  133. Ai: ai,
  134. }
  135. }

PCM is positioned as Software stack over Cloud, aiming to build the standards and ecology of heterogeneous cloud collaboration for JCC in a non intrusive and autonomous peer-to-peer manner.