...

Source file src/github.com/letsencrypt/boulder/cmd/boulder-sa/main.go

Documentation: github.com/letsencrypt/boulder/cmd/boulder-sa

     1  package notmain
     2  
     3  import (
     4  	"context"
     5  	"flag"
     6  	"os"
     7  
     8  	"github.com/letsencrypt/boulder/cmd"
     9  	"github.com/letsencrypt/boulder/config"
    10  	"github.com/letsencrypt/boulder/features"
    11  	bgrpc "github.com/letsencrypt/boulder/grpc"
    12  	"github.com/letsencrypt/boulder/sa"
    13  	sapb "github.com/letsencrypt/boulder/sa/proto"
    14  )
    15  
    16  type Config struct {
    17  	SA struct {
    18  		cmd.ServiceConfig
    19  		DB          cmd.DBConfig
    20  		ReadOnlyDB  cmd.DBConfig `validate:"-"`
    21  		IncidentsDB cmd.DBConfig `validate:"-"`
    22  
    23  		Features map[string]bool
    24  
    25  		// Max simultaneous SQL queries caused by a single RPC.
    26  		ParallelismPerRPC int `validate:"omitempty,min=1"`
    27  		// LagFactor is how long to sleep before retrying a read request that may
    28  		// have failed solely due to replication lag.
    29  		LagFactor config.Duration `validate:"-"`
    30  	}
    31  
    32  	Syslog        cmd.SyslogConfig
    33  	OpenTelemetry cmd.OpenTelemetryConfig
    34  }
    35  
    36  func main() {
    37  	grpcAddr := flag.String("addr", "", "gRPC listen address override")
    38  	debugAddr := flag.String("debug-addr", "", "Debug server address override")
    39  	configFile := flag.String("config", "", "File path to the configuration file for this service")
    40  	flag.Parse()
    41  	if *configFile == "" {
    42  		flag.Usage()
    43  		os.Exit(1)
    44  	}
    45  
    46  	var c Config
    47  	err := cmd.ReadConfigFile(*configFile, &c)
    48  	cmd.FailOnError(err, "Reading JSON config file into config structure")
    49  
    50  	err = features.Set(c.SA.Features)
    51  	cmd.FailOnError(err, "Failed to set feature flags")
    52  
    53  	if *grpcAddr != "" {
    54  		c.SA.GRPC.Address = *grpcAddr
    55  	}
    56  	if *debugAddr != "" {
    57  		c.SA.DebugAddr = *debugAddr
    58  	}
    59  
    60  	scope, logger, oTelShutdown := cmd.StatsAndLogging(c.Syslog, c.OpenTelemetry, c.SA.DebugAddr)
    61  	defer oTelShutdown(context.Background())
    62  	logger.Info(cmd.VersionString())
    63  
    64  	dbMap, err := sa.InitWrappedDb(c.SA.DB, scope, logger)
    65  	cmd.FailOnError(err, "While initializing dbMap")
    66  
    67  	dbReadOnlyMap := dbMap
    68  	if c.SA.ReadOnlyDB != (cmd.DBConfig{}) {
    69  		dbReadOnlyMap, err = sa.InitWrappedDb(c.SA.ReadOnlyDB, scope, logger)
    70  		cmd.FailOnError(err, "While initializing dbReadOnlyMap")
    71  	}
    72  
    73  	dbIncidentsMap := dbMap
    74  	if c.SA.IncidentsDB != (cmd.DBConfig{}) {
    75  		dbIncidentsMap, err = sa.InitWrappedDb(c.SA.IncidentsDB, scope, logger)
    76  		cmd.FailOnError(err, "While initializing dbIncidentsMap")
    77  	}
    78  
    79  	clk := cmd.Clock()
    80  
    81  	parallel := c.SA.ParallelismPerRPC
    82  	if parallel < 1 {
    83  		parallel = 1
    84  	}
    85  
    86  	tls, err := c.SA.TLS.Load(scope)
    87  	cmd.FailOnError(err, "TLS config")
    88  
    89  	saroi, err := sa.NewSQLStorageAuthorityRO(
    90  		dbReadOnlyMap, dbIncidentsMap, scope, parallel, c.SA.LagFactor.Duration, clk, logger)
    91  	cmd.FailOnError(err, "Failed to create read-only SA impl")
    92  
    93  	sai, err := sa.NewSQLStorageAuthorityWrapping(saroi, dbMap, scope)
    94  	cmd.FailOnError(err, "Failed to create SA impl")
    95  
    96  	start, err := bgrpc.NewServer(c.SA.GRPC, logger).WithCheckInterval(c.SA.HealthCheckInterval.Duration).Add(
    97  		&sapb.StorageAuthorityReadOnly_ServiceDesc, saroi).Add(
    98  		&sapb.StorageAuthority_ServiceDesc, sai).Build(
    99  		tls, scope, clk)
   100  	cmd.FailOnError(err, "Unable to setup SA gRPC server")
   101  
   102  	cmd.FailOnError(start(), "SA gRPC service failed")
   103  }
   104  
   105  func init() {
   106  	cmd.RegisterCommand("boulder-sa", main, &cmd.ConfigValidator{Config: &Config{}})
   107  }
   108  

View as plain text