mirror of
https://github.com/edgelesssys/constellation.git
synced 2025-09-19 04:24:39 -04:00
Replace logging with default logging interface (#233)
* Add test logger * Refactor access manager logging * Refactor activation service logging * Refactor debugd logging * Refactor kms server logging * Refactor disk-mapper logging Signed-off-by: Daniel Weiße <dw@edgeless.systems>
This commit is contained in:
parent
e3f78a5bff
commit
b10b13b173
42 changed files with 513 additions and 328 deletions
|
@ -4,8 +4,6 @@ import (
|
|||
"context"
|
||||
"flag"
|
||||
"fmt"
|
||||
"log"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"time"
|
||||
|
@ -17,10 +15,14 @@ import (
|
|||
"github.com/edgelesssys/constellation/internal/attestation/gcp"
|
||||
"github.com/edgelesssys/constellation/internal/attestation/qemu"
|
||||
"github.com/edgelesssys/constellation/internal/attestation/vtpm"
|
||||
"github.com/edgelesssys/constellation/internal/constants"
|
||||
"github.com/edgelesssys/constellation/internal/logger"
|
||||
"github.com/edgelesssys/constellation/state/keyservice"
|
||||
"github.com/edgelesssys/constellation/state/mapper"
|
||||
"github.com/edgelesssys/constellation/state/setup"
|
||||
"github.com/spf13/afero"
|
||||
"go.uber.org/zap"
|
||||
"go.uber.org/zap/zapcore"
|
||||
)
|
||||
|
||||
const (
|
||||
|
@ -34,7 +36,9 @@ var csp = flag.String("csp", "", "Cloud Service Provider the image is running on
|
|||
func main() {
|
||||
flag.Parse()
|
||||
|
||||
log.Printf("Starting disk-mapper for csp %q\n", *csp)
|
||||
log := logger.New(logger.JSONLog, zapcore.InfoLevel)
|
||||
log.With(zap.String("version", constants.VersionInfo), zap.String("cloudProvider", *csp)).
|
||||
Infof("Starting disk-mapper")
|
||||
|
||||
// set up metadata API and quote issuer for aTLS connections
|
||||
var err error
|
||||
|
@ -47,7 +51,7 @@ func main() {
|
|||
diskPath, diskPathErr = filepath.EvalSymlinks(azureStateDiskPath)
|
||||
metadata, err = azurecloud.NewMetadata(context.Background())
|
||||
if err != nil {
|
||||
exit(err)
|
||||
log.With(zap.Error).Fatalf("Failed to create Azure metadata API")
|
||||
}
|
||||
issuer = azure.NewIssuer()
|
||||
|
||||
|
@ -56,34 +60,35 @@ func main() {
|
|||
issuer = gcp.NewIssuer()
|
||||
gcpClient, err := gcpcloud.NewClient(context.Background())
|
||||
if err != nil {
|
||||
exit(err)
|
||||
log.With(zap.Error).Fatalf("Failed to create GCP client")
|
||||
}
|
||||
metadata = gcpcloud.New(gcpClient)
|
||||
|
||||
case "qemu":
|
||||
diskPath = qemuStateDiskPath
|
||||
issuer = qemu.NewIssuer()
|
||||
fmt.Fprintf(os.Stderr, "warning: cloud services are not supported for csp %q\n", *csp)
|
||||
log.Warnf("cloud services are not supported on QEMU")
|
||||
metadata = &core.ProviderMetadataFake{}
|
||||
|
||||
default:
|
||||
diskPathErr = fmt.Errorf("csp %q is not supported by Constellation", *csp)
|
||||
}
|
||||
if diskPathErr != nil {
|
||||
exit(fmt.Errorf("unable to determine state disk path: %w", diskPathErr))
|
||||
log.With(zap.Error(diskPathErr)).Fatalf("Unable to determine state disk path")
|
||||
}
|
||||
|
||||
// initialize device mapper
|
||||
mapper, err := mapper.New(diskPath)
|
||||
if err != nil {
|
||||
exit(err)
|
||||
log.With(zap.Error(err)).Fatalf("Failed to initialize device mapper")
|
||||
}
|
||||
defer mapper.Close()
|
||||
|
||||
setupManger := setup.New(
|
||||
log.Named("setupManager"),
|
||||
*csp,
|
||||
afero.Afero{Fs: afero.NewOsFs()},
|
||||
keyservice.New(issuer, metadata, 20*time.Second), // try to request a key every 20 seconds
|
||||
keyservice.New(log.Named("keyService"), issuer, metadata, 20*time.Second), // try to request a key every 20 seconds
|
||||
mapper,
|
||||
setup.DiskMounter{},
|
||||
vtpm.OpenVTPM,
|
||||
|
@ -95,13 +100,7 @@ func main() {
|
|||
} else {
|
||||
err = setupManger.PrepareNewDisk()
|
||||
}
|
||||
exit(err)
|
||||
}
|
||||
|
||||
func exit(err error) {
|
||||
if err != nil {
|
||||
fmt.Fprintln(os.Stderr, err.Error())
|
||||
os.Exit(1)
|
||||
log.With(zap.Error(err)).Fatalf("Failed to prepare state disk")
|
||||
}
|
||||
os.Exit(0)
|
||||
}
|
||||
|
|
|
@ -3,7 +3,6 @@ package keyservice
|
|||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"log"
|
||||
"net"
|
||||
"sync"
|
||||
"time"
|
||||
|
@ -12,7 +11,9 @@ import (
|
|||
"github.com/edgelesssys/constellation/coordinator/core"
|
||||
"github.com/edgelesssys/constellation/coordinator/pubapi/pubproto"
|
||||
"github.com/edgelesssys/constellation/internal/grpc/atlscredentials"
|
||||
"github.com/edgelesssys/constellation/internal/logger"
|
||||
"github.com/edgelesssys/constellation/state/keyservice/keyproto"
|
||||
"go.uber.org/zap"
|
||||
"google.golang.org/grpc"
|
||||
"google.golang.org/grpc/codes"
|
||||
"google.golang.org/grpc/credentials"
|
||||
|
@ -21,6 +22,7 @@ import (
|
|||
|
||||
// KeyAPI is the interface called by the Coordinator or an admin during restart of a node.
|
||||
type KeyAPI struct {
|
||||
log *logger.Logger
|
||||
mux sync.Mutex
|
||||
metadata core.ProviderMetadata
|
||||
issuer core.QuoteIssuer
|
||||
|
@ -31,8 +33,9 @@ type KeyAPI struct {
|
|||
}
|
||||
|
||||
// New initializes a KeyAPI with the given parameters.
|
||||
func New(issuer core.QuoteIssuer, metadata core.ProviderMetadata, timeout time.Duration) *KeyAPI {
|
||||
func New(log *logger.Logger, issuer core.QuoteIssuer, metadata core.ProviderMetadata, timeout time.Duration) *KeyAPI {
|
||||
return &KeyAPI{
|
||||
log: log,
|
||||
metadata: metadata,
|
||||
issuer: issuer,
|
||||
keyReceived: make(chan struct{}, 1),
|
||||
|
@ -71,7 +74,7 @@ func (a *KeyAPI) WaitForDecryptionKey(uuid, listenAddr string) ([]byte, error) {
|
|||
}
|
||||
defer listener.Close()
|
||||
|
||||
log.Printf("Waiting for decryption key. Listening on: %s", listener.Addr().String())
|
||||
a.log.Infof("Waiting for decryption key. Listening on: %s", listener.Addr().String())
|
||||
go server.Serve(listener)
|
||||
defer server.GracefulStop()
|
||||
|
||||
|
@ -118,7 +121,7 @@ func (a *KeyAPI) requestKey(uuid string, credentials credentials.TransportCreden
|
|||
// list available Coordinators
|
||||
endpoints, _ := core.CoordinatorEndpoints(context.Background(), a.metadata)
|
||||
|
||||
log.Printf("Sending a key request to available Coordinators: %v", endpoints)
|
||||
a.log.With(zap.Strings("endpoints", endpoints)).Infof("Sending a key request to available Coordinators")
|
||||
// notify all available Coordinators to send a key to the node
|
||||
// any errors encountered here will be ignored, and the calls retried after a timeout
|
||||
for _, endpoint := range endpoints {
|
||||
|
|
|
@ -12,6 +12,7 @@ import (
|
|||
"github.com/edgelesssys/constellation/coordinator/role"
|
||||
"github.com/edgelesssys/constellation/internal/atls"
|
||||
"github.com/edgelesssys/constellation/internal/grpc/atlscredentials"
|
||||
"github.com/edgelesssys/constellation/internal/logger"
|
||||
"github.com/edgelesssys/constellation/internal/oid"
|
||||
"github.com/edgelesssys/constellation/state/keyservice/keyproto"
|
||||
"github.com/stretchr/testify/assert"
|
||||
|
@ -85,6 +86,7 @@ func TestRequestKeyLoop(t *testing.T) {
|
|||
}
|
||||
|
||||
keyWaiter := &KeyAPI{
|
||||
log: logger.NewTest(t),
|
||||
metadata: stubMetadata{listResponse: tc.listResponse},
|
||||
keyReceived: keyReceived,
|
||||
timeout: 500 * time.Millisecond,
|
||||
|
@ -138,6 +140,7 @@ func TestPushStateDiskKey(t *testing.T) {
|
|||
t.Run(name, func(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
|
||||
tc.testAPI.log = logger.NewTest(t)
|
||||
_, err := tc.testAPI.PushStateDiskKey(context.Background(), tc.request)
|
||||
if tc.wantErr {
|
||||
assert.Error(err)
|
||||
|
@ -150,7 +153,7 @@ func TestPushStateDiskKey(t *testing.T) {
|
|||
}
|
||||
|
||||
func TestResetKey(t *testing.T) {
|
||||
api := New(nil, nil, time.Second)
|
||||
api := New(logger.NewTest(t), nil, nil, time.Second)
|
||||
|
||||
api.key = []byte{0x1, 0x2, 0x3}
|
||||
api.ResetKey()
|
||||
|
|
|
@ -3,7 +3,6 @@ package setup
|
|||
import (
|
||||
"crypto/rand"
|
||||
"errors"
|
||||
"log"
|
||||
"net"
|
||||
"os"
|
||||
"path/filepath"
|
||||
|
@ -13,7 +12,9 @@ import (
|
|||
"github.com/edgelesssys/constellation/coordinator/nodestate"
|
||||
"github.com/edgelesssys/constellation/internal/attestation/vtpm"
|
||||
"github.com/edgelesssys/constellation/internal/file"
|
||||
"github.com/edgelesssys/constellation/internal/logger"
|
||||
"github.com/spf13/afero"
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
const (
|
||||
|
@ -27,6 +28,7 @@ const (
|
|||
|
||||
// SetupManager handles formating, mapping, mounting and unmounting of state disks.
|
||||
type SetupManager struct {
|
||||
log *logger.Logger
|
||||
csp string
|
||||
fs afero.Afero
|
||||
keyWaiter KeyWaiter
|
||||
|
@ -36,8 +38,9 @@ type SetupManager struct {
|
|||
}
|
||||
|
||||
// New initializes a SetupManager with the given parameters.
|
||||
func New(csp string, fs afero.Afero, keyWaiter KeyWaiter, mapper DeviceMapper, mounter Mounter, openTPM vtpm.TPMOpenFunc) *SetupManager {
|
||||
func New(log *logger.Logger, csp string, fs afero.Afero, keyWaiter KeyWaiter, mapper DeviceMapper, mounter Mounter, openTPM vtpm.TPMOpenFunc) *SetupManager {
|
||||
return &SetupManager{
|
||||
log: log,
|
||||
csp: csp,
|
||||
fs: fs,
|
||||
keyWaiter: keyWaiter,
|
||||
|
@ -50,7 +53,7 @@ func New(csp string, fs afero.Afero, keyWaiter KeyWaiter, mapper DeviceMapper, m
|
|||
// PrepareExistingDisk requests and waits for a decryption key to remap the encrypted state disk.
|
||||
// Once the disk is mapped, the function taints the node as initialized by updating it's PCRs.
|
||||
func (s *SetupManager) PrepareExistingDisk() error {
|
||||
log.Println("Preparing existing state disk")
|
||||
s.log.Infof("Preparing existing state disk")
|
||||
uuid := s.mapper.DiskUUID()
|
||||
|
||||
getKey:
|
||||
|
@ -61,6 +64,7 @@ getKey:
|
|||
|
||||
if err := s.mapper.MapDisk(stateDiskMappedName, string(passphrase)); err != nil {
|
||||
// retry key fetching if disk mapping fails
|
||||
s.log.With(zap.Error(err)).Errorf("Failed to map state disk, retrying...")
|
||||
s.keyWaiter.ResetKey()
|
||||
goto getKey
|
||||
}
|
||||
|
@ -88,7 +92,7 @@ getKey:
|
|||
|
||||
// PrepareNewDisk prepares an instances state disk by formatting the disk as a LUKS device using a random passphrase.
|
||||
func (s *SetupManager) PrepareNewDisk() error {
|
||||
log.Println("Preparing new state disk")
|
||||
s.log.Infof("Preparing new state disk")
|
||||
|
||||
// generate and save temporary passphrase
|
||||
if err := s.fs.MkdirAll(keyPath, os.ModePerm); err != nil {
|
||||
|
|
|
@ -11,6 +11,7 @@ import (
|
|||
"github.com/edgelesssys/constellation/coordinator/nodestate"
|
||||
"github.com/edgelesssys/constellation/internal/attestation/vtpm"
|
||||
"github.com/edgelesssys/constellation/internal/file"
|
||||
"github.com/edgelesssys/constellation/internal/logger"
|
||||
"github.com/spf13/afero"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
|
@ -107,7 +108,15 @@ func TestPrepareExistingDisk(t *testing.T) {
|
|||
require.NoError(t, handler.WriteJSON(stateInfoPath, nodestate.NodeState{OwnerID: []byte("ownerID"), ClusterID: []byte("clusterID")}, file.OptMkdirAll))
|
||||
}
|
||||
|
||||
setupManager := New("test", tc.fs, tc.keyWaiter, tc.mapper, tc.mounter, tc.openTPM)
|
||||
setupManager := New(
|
||||
logger.NewTest(t),
|
||||
"test",
|
||||
tc.fs,
|
||||
tc.keyWaiter,
|
||||
tc.mapper,
|
||||
tc.mounter,
|
||||
tc.openTPM,
|
||||
)
|
||||
|
||||
err := setupManager.PrepareExistingDisk()
|
||||
if tc.wantErr {
|
||||
|
@ -167,7 +176,7 @@ func TestPrepareNewDisk(t *testing.T) {
|
|||
t.Run(name, func(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
|
||||
setupManager := New("test", tc.fs, nil, tc.mapper, nil, nil)
|
||||
setupManager := New(logger.NewTest(t), "test", tc.fs, nil, tc.mapper, nil, nil)
|
||||
|
||||
err := setupManager.PrepareNewDisk()
|
||||
if tc.wantErr {
|
||||
|
@ -233,7 +242,7 @@ func TestReadInitSecrets(t *testing.T) {
|
|||
require.NoError(handler.WriteJSON("/tmp/test-state.json", state, file.OptMkdirAll))
|
||||
}
|
||||
|
||||
setupManager := New("test", tc.fs, nil, nil, nil, nil)
|
||||
setupManager := New(logger.NewTest(t), "test", tc.fs, nil, nil, nil, nil)
|
||||
|
||||
ownerID, clusterID, err := setupManager.readInitSecrets("/tmp/test-state.json")
|
||||
if tc.wantErr {
|
||||
|
|
|
@ -14,6 +14,7 @@ import (
|
|||
"github.com/edgelesssys/constellation/coordinator/core"
|
||||
"github.com/edgelesssys/constellation/internal/atls"
|
||||
"github.com/edgelesssys/constellation/internal/grpc/atlscredentials"
|
||||
"github.com/edgelesssys/constellation/internal/logger"
|
||||
"github.com/edgelesssys/constellation/internal/oid"
|
||||
"github.com/edgelesssys/constellation/state/keyservice"
|
||||
"github.com/edgelesssys/constellation/state/keyservice/keyproto"
|
||||
|
@ -85,7 +86,12 @@ func TestKeyAPI(t *testing.T) {
|
|||
apiAddr := listener.Addr().String()
|
||||
listener.Close()
|
||||
|
||||
api := keyservice.New(atls.NewFakeIssuer(oid.Dummy{}), &core.ProviderMetadataFake{}, 20*time.Second)
|
||||
api := keyservice.New(
|
||||
logger.NewTest(t),
|
||||
atls.NewFakeIssuer(oid.Dummy{}),
|
||||
&core.ProviderMetadataFake{},
|
||||
20*time.Second,
|
||||
)
|
||||
|
||||
// send a key to the server
|
||||
go func() {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue