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  }