2020-09-22 15:51:34 +01:00
|
|
|
// Copyright (C) 2020 Storj Labs, Inc.
|
|
|
|
// See LICENSE for copying information.
|
|
|
|
|
|
|
|
package multinode
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"net"
|
|
|
|
|
|
|
|
"github.com/spacemonkeygo/monkit/v3"
|
|
|
|
"go.uber.org/zap"
|
|
|
|
"golang.org/x/sync/errgroup"
|
|
|
|
|
|
|
|
"storj.io/common/identity"
|
2020-10-02 17:21:58 +01:00
|
|
|
"storj.io/storj/multinode/console"
|
2020-09-22 15:51:34 +01:00
|
|
|
"storj.io/storj/multinode/console/server"
|
|
|
|
"storj.io/storj/private/lifecycle"
|
|
|
|
)
|
|
|
|
|
|
|
|
var (
|
|
|
|
mon = monkit.Package()
|
|
|
|
)
|
|
|
|
|
|
|
|
// DB is the master database for Multinode Dashboard.
|
|
|
|
//
|
|
|
|
// architecture: Master Database
|
|
|
|
type DB interface {
|
2020-10-02 17:21:58 +01:00
|
|
|
// Nodes returns nodes database.
|
|
|
|
Nodes() console.Nodes
|
|
|
|
|
2020-09-22 15:51:34 +01:00
|
|
|
// Close closes the database.
|
|
|
|
Close() error
|
|
|
|
}
|
|
|
|
|
|
|
|
// Config is all the configuration parameters for a Multinode Dashboard.
|
|
|
|
type Config struct {
|
|
|
|
Identity identity.Config
|
|
|
|
Console server.Config
|
|
|
|
}
|
|
|
|
|
|
|
|
// Peer is the a Multinode Dashboard application itself.
|
|
|
|
//
|
|
|
|
// architecture: Peer
|
|
|
|
type Peer struct {
|
|
|
|
// core dependencies
|
|
|
|
Log *zap.Logger
|
|
|
|
Identity *identity.FullIdentity
|
|
|
|
DB DB
|
|
|
|
|
|
|
|
// Web server with web UI
|
|
|
|
Console struct {
|
|
|
|
Listener net.Listener
|
|
|
|
// TODO: Service *console.Service
|
|
|
|
Endpoint *server.Server
|
|
|
|
}
|
|
|
|
|
|
|
|
Servers *lifecycle.Group
|
|
|
|
}
|
|
|
|
|
|
|
|
// New creates a new instance of Multinode Dashboard application.
|
|
|
|
func New(log *zap.Logger, full *identity.FullIdentity, config Config, db DB) (_ *Peer, err error) {
|
|
|
|
peer := &Peer{
|
|
|
|
Log: log,
|
|
|
|
Identity: full,
|
|
|
|
DB: db,
|
|
|
|
}
|
|
|
|
|
|
|
|
{ // console setup
|
|
|
|
// peer.Console.Service = console.NewService(
|
|
|
|
// peer.Log.Named("console:service"),
|
|
|
|
// )
|
|
|
|
|
|
|
|
peer.Console.Listener, err = net.Listen("tcp", config.Console.Address)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
peer.Console.Endpoint, err = server.NewServer(
|
|
|
|
peer.Log.Named("console:endpoint"),
|
|
|
|
config.Console,
|
|
|
|
peer.Console.Listener,
|
|
|
|
)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
peer.Servers.Add(lifecycle.Item{
|
|
|
|
Name: "console:endpoint",
|
|
|
|
Run: peer.Console.Endpoint.Run,
|
|
|
|
Close: peer.Console.Endpoint.Close,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
return peer, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// Run runs Multinode Dashboard services and servers until it's either closed or it errors.
|
|
|
|
func (peer *Peer) Run(ctx context.Context) (err error) {
|
|
|
|
defer mon.Task()(&ctx)(&err)
|
|
|
|
|
|
|
|
group, ctx := errgroup.WithContext(ctx)
|
|
|
|
|
|
|
|
peer.Servers.Run(ctx, group)
|
|
|
|
|
|
|
|
return group.Wait()
|
|
|
|
}
|
|
|
|
|
|
|
|
// Close closes all the resources.
|
|
|
|
func (peer *Peer) Close() error {
|
|
|
|
return peer.Servers.Close()
|
|
|
|
}
|