github.com/verrazzano/verrazzano@v1.7.1/tools/psr/backend/workmanager/manager.go (about) 1 // Copyright (c) 2022, Oracle and/or its affiliates. 2 // Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. 3 4 package workmanager 5 6 import ( 7 "fmt" 8 "sync" 9 "time" 10 11 "github.com/verrazzano/verrazzano/pkg/log/vzlog" 12 "github.com/verrazzano/verrazzano/tools/psr/backend/config" 13 metrics2 "github.com/verrazzano/verrazzano/tools/psr/backend/metrics" 14 "github.com/verrazzano/verrazzano/tools/psr/backend/spi" 15 "github.com/verrazzano/verrazzano/tools/psr/backend/workers/example" 16 "github.com/verrazzano/verrazzano/tools/psr/backend/workers/http/get" 17 "github.com/verrazzano/verrazzano/tools/psr/backend/workers/opensearch/getlogs" 18 "github.com/verrazzano/verrazzano/tools/psr/backend/workers/opensearch/postlogs" 19 "github.com/verrazzano/verrazzano/tools/psr/backend/workers/opensearch/restart" 20 "github.com/verrazzano/verrazzano/tools/psr/backend/workers/opensearch/scale" 21 "github.com/verrazzano/verrazzano/tools/psr/backend/workers/opensearch/writelogs" 22 "github.com/verrazzano/verrazzano/tools/psr/backend/workers/prometheus/alerts" 23 wlsscale "github.com/verrazzano/verrazzano/tools/psr/backend/workers/weblogic/scale" 24 ) 25 26 var startMetricsFunc = metrics2.StartMetricsServerOrDie 27 28 // StartWorkerRunners starts the workerRunner threads, each which runs a worker in a loop 29 func StartWorkerRunners(log vzlog.VerrazzanoLogger) error { 30 // Get the common config for all the workers 31 conf, err := config.GetCommonConfig(log) 32 if err != nil { 33 log.Error(err) 34 return err 35 } 36 37 // get the worker type 38 wt := conf.WorkerType 39 worker, err := getWorker(wt) 40 if err != nil { 41 log.Error(err) 42 return err 43 } 44 45 // init the workerRunner with the worker that it will call repeatedly to DoWork 46 log.Infof("Initializing worker %s", wt) 47 runner, err := NewRunner(worker, conf, log) 48 if err != nil { 49 log.Errorf("Failed initializing workerRunner and worker: %v", err) 50 return err 51 } 52 53 // start metrics server as go routine 54 log.Info("Starting metrics server") 55 mProviders := []spi.WorkerMetricsProvider{} 56 mProviders = append(mProviders, runner) 57 mProviders = append(mProviders, worker) 58 go startMetricsFunc(mProviders) 59 60 // Wait for any dependencies to be resolved before continuing 61 if err := waitForPreconditions(log, worker); err != nil { 62 return err 63 } 64 65 // run the worker in go-routine to completion (usually forever) 66 var wg sync.WaitGroup 67 for i := 1; i <= conf.WorkerThreadCount; i++ { 68 wg.Add(1) 69 log.Infof("Running worker %s in thread %v", wt, i) 70 go func() { 71 defer wg.Done() 72 _ = runner.RunWorker(conf, log) 73 }() 74 } 75 wg.Wait() 76 return nil 77 } 78 79 // waitForPreconditions Waits indefinitely for any worker preconditions to be met 80 func waitForPreconditions(log vzlog.VerrazzanoLogger, worker spi.Worker) error { 81 for { 82 log.Progressf("Waiting for worker preconditions to be met") 83 readyToExecute, err := worker.PreconditionsMet() 84 if err != nil { 85 return err 86 } 87 if readyToExecute { 88 break 89 } 90 time.Sleep(5 * time.Second) 91 } 92 log.Progressf("Worker preconditions be met, continuing") 93 return nil 94 } 95 96 // getWorker returns a worker given the name of the worker 97 func getWorker(wt string) (spi.Worker, error) { 98 switch wt { 99 case config.WorkerTypeExample: 100 return example.NewExampleWorker() 101 case config.WorkerTypeHTTPGet: 102 return get.NewHTTPGetWorker() 103 case config.WorkerTypeOpsWriteLogs: 104 return writelogs.NewWriteLogsWorker() 105 case config.WorkerTypeOpsGetLogs: 106 return getlogs.NewGetLogsWorker() 107 case config.WorkerTypeOpsPostLogs: 108 return postlogs.NewPostLogsWorker() 109 case config.WorkerTypeOpsScale: 110 return scale.NewScaleWorker() 111 case config.WorkerTypeOpsRestart: 112 return restart.NewRestartWorker() 113 case config.WorkerTypeWlsScale: 114 return wlsscale.NewScaleWorker() 115 case config.WorkerTypeReceiveAlerts: 116 return alerts.NewAlertsWorker() 117 default: 118 return nil, fmt.Errorf("Failed, invalid worker type '%s'", wt) 119 } 120 }