service.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. // Copyright 2019 Yunion
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. package service
  15. import (
  16. "context"
  17. "io/ioutil"
  18. "net"
  19. "strconv"
  20. "time"
  21. "github.com/gin-gonic/gin"
  22. "yunion.io/x/log"
  23. "yunion.io/x/pkg/utils"
  24. _ "yunion.io/x/sqlchemy/backends"
  25. compute_api "yunion.io/x/onecloud/pkg/apis/scheduler"
  26. "yunion.io/x/onecloud/pkg/appsrv"
  27. "yunion.io/x/onecloud/pkg/cloudcommon"
  28. app_common "yunion.io/x/onecloud/pkg/cloudcommon/app"
  29. "yunion.io/x/onecloud/pkg/cloudcommon/db"
  30. common_options "yunion.io/x/onecloud/pkg/cloudcommon/options"
  31. _ "yunion.io/x/onecloud/pkg/compute/guestdrivers"
  32. _ "yunion.io/x/onecloud/pkg/compute/hostdrivers"
  33. computemodels "yunion.io/x/onecloud/pkg/compute/models"
  34. _ "yunion.io/x/onecloud/pkg/scheduler/algorithmprovider"
  35. "yunion.io/x/onecloud/pkg/scheduler/data_manager/cloudaccount"
  36. "yunion.io/x/onecloud/pkg/scheduler/data_manager/cloudprovider"
  37. "yunion.io/x/onecloud/pkg/scheduler/data_manager/cloudregion"
  38. "yunion.io/x/onecloud/pkg/scheduler/data_manager/netinterface"
  39. "yunion.io/x/onecloud/pkg/scheduler/data_manager/network"
  40. "yunion.io/x/onecloud/pkg/scheduler/data_manager/network_additional_wire"
  41. "yunion.io/x/onecloud/pkg/scheduler/data_manager/schedtag"
  42. skuman "yunion.io/x/onecloud/pkg/scheduler/data_manager/sku"
  43. "yunion.io/x/onecloud/pkg/scheduler/data_manager/wire"
  44. "yunion.io/x/onecloud/pkg/scheduler/data_manager/zone"
  45. schedhandler "yunion.io/x/onecloud/pkg/scheduler/handler"
  46. schedman "yunion.io/x/onecloud/pkg/scheduler/manager"
  47. o "yunion.io/x/onecloud/pkg/scheduler/options"
  48. "yunion.io/x/onecloud/pkg/util/gin/middleware"
  49. )
  50. func EnsureDBSync(opt *common_options.DBOptions) {
  51. checkDBSyncRetries := 5
  52. count := 1
  53. for {
  54. if count == checkDBSyncRetries {
  55. log.Fatalf("database schema not in sync!!!")
  56. }
  57. if !db.CheckSync(false, false, true) {
  58. log.Errorf("database schema not in sync, wait region sync database")
  59. time.Sleep(2 * time.Second)
  60. } else {
  61. break
  62. }
  63. count++
  64. }
  65. }
  66. func StartServiceWrapper(
  67. dbOpts *common_options.DBOptions,
  68. commonOpts *common_options.CommonOptions,
  69. sf func(app *appsrv.Application) error) error {
  70. // init region compute models
  71. cloudcommon.InitDB(dbOpts)
  72. defer cloudcommon.CloseDB()
  73. db.InitAllManagers()
  74. EnsureDBSync(dbOpts)
  75. app_common.InitAuth(commonOpts, func() {
  76. log.Infof("Auth complete!!")
  77. })
  78. if err := computemodels.InitDB(); err != nil {
  79. log.Fatalf("InitDB fail: %s", err)
  80. }
  81. app := app_common.InitApp(&commonOpts.BaseOptions, true)
  82. db.AppDBInit(app)
  83. return sf(app)
  84. }
  85. func StartService() error {
  86. o.Init()
  87. dbOpts := o.Options.DBOptions
  88. commonOpts := &o.Options.CommonOptions
  89. o.Options.Port = o.Options.SchedulerPort
  90. o.Options.AutoSyncTable = false
  91. o.Options.EnableDBChecksumTables = false
  92. o.Options.DBChecksumSkipInit = true
  93. return StartServiceWrapper(&dbOpts, commonOpts, func(app *appsrv.Application) error {
  94. common_options.StartOptionManager(&o.Options, o.Options.ConfigSyncPeriodSeconds, compute_api.SERVICE_TYPE, compute_api.SERVICE_VERSION, o.OnOptionsChange)
  95. // gin http framework mode configuration
  96. ginMode := "release"
  97. if o.Options.LogLevel == "debug" {
  98. ginMode = "debug"
  99. }
  100. gin.SetMode(ginMode)
  101. startSched := func() {
  102. stopEverything := make(chan struct{})
  103. ctx := context.Background()
  104. go skuman.Start(ctx, utils.ToDuration(o.Options.SkuRefreshInterval))
  105. go schedtag.Start(ctx, utils.ToDuration("30s"))
  106. go network_additional_wire.Start(ctx, utils.ToDuration("30m"))
  107. for _, f := range []func(ctx context.Context){
  108. cloudregion.Manager.Start,
  109. zone.Manager.Start,
  110. cloudprovider.GetManager().Start,
  111. cloudaccount.Manager.Start,
  112. wire.Manager.Start,
  113. network.Manager.Start,
  114. netinterface.GetManager().Start,
  115. } {
  116. f(ctx)
  117. }
  118. time.Sleep(5 * time.Second)
  119. schedman.InitAndStart(stopEverything)
  120. }
  121. startSched()
  122. //InitHandlers(app)
  123. return startHTTP(app, &o.Options)
  124. })
  125. }
  126. func startHTTP(app *appsrv.Application, opt *o.SchedulerOptions) error {
  127. gin.DefaultWriter = ioutil.Discard
  128. router := gin.Default()
  129. router.Use(middleware.Logger())
  130. router.Use(middleware.ErrorHandler)
  131. router.Use(middleware.KeystoneTokenVerifyMiddleware())
  132. // prometheus.InstallHandler(router)
  133. schedhandler.InstallHandler(router, opt.EnableAppProfiling)
  134. server := appsrv.InitHTTPServer(app, net.JoinHostPort(opt.Address, strconv.Itoa(int(opt.Port))))
  135. server.Handler = router
  136. log.Infof("Start server on: %s:%d", opt.Address, opt.Port)
  137. if opt.EnableSsl {
  138. return server.ListenAndServeTLS(opt.SslCertfile, opt.SslKeyfile)
  139. } else {
  140. return server.ListenAndServe()
  141. }
  142. }