cmd/google_guest_compat_manager/main.go (74 lines of code) (raw):
// Copyright 2024 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Package main is the entry point for the google-guest-compat-manager. It is
// responsible for enabling either Core Plugin or the legacy guest agent.
package main
import (
"context"
"fmt"
"os"
"time"
"github.com/GoogleCloudPlatform/google-guest-agent/cmd/google_guest_compat_manager/watcher"
"github.com/GoogleCloudPlatform/galog"
"github.com/GoogleCloudPlatform/google-guest-agent/internal/cfg"
"github.com/GoogleCloudPlatform/google-guest-agent/internal/daemon"
"github.com/GoogleCloudPlatform/google-guest-agent/internal/events"
"github.com/GoogleCloudPlatform/google-guest-agent/internal/logger"
"github.com/GoogleCloudPlatform/google-guest-agent/internal/metadata"
"github.com/GoogleCloudPlatform/google-guest-agent/internal/service"
)
const (
// galogShutdownTimeout is the period of time we should wait galog to
// shutdown.
galogShutdownTimeout = time.Second
)
var (
// logOpts holds the logger options. It's mapped to command line flags.
logOpts = logger.Options{
Ident: "google_guest_compat_manager",
Prefix: "GCEGuestCompatManager",
CloudIdent: "GCEGuestCompatManager",
}
// version is the version of the binary.
version = "unknown"
)
func setupLogger(ctx context.Context) error {
conf := cfg.Retrieve()
logOpts.ProgramVersion = version
logOpts.Level = conf.Core.LogLevel
logOpts.Verbosity = conf.Core.LogVerbosity
logOpts.LogFile = conf.Core.LogFile
if err := logger.Init(ctx, logOpts); err != nil {
return fmt.Errorf("failed to initialize logger: %w", err)
}
return nil
}
func main() {
ctx, cancel := context.WithCancel(context.Background())
if err := cfg.Load(nil); err != nil {
fmt.Fprintln(os.Stderr, "Failed to load config:", err)
os.Exit(1)
}
if err := setupLogger(ctx); err != nil {
fmt.Fprintln(os.Stderr, "Failed to initialize logger:", err)
os.Exit(1)
}
if err := service.Init(ctx, func() {
galog.Info("Google Guest Agent Compat Manager Leaving (canceling context)...")
galog.Shutdown(galogShutdownTimeout)
cancel()
}, daemon.GuestAgentCompatManager); err != nil {
galog.Fatalf("Failed to initialize service manager: %s", err)
}
if err := setup(ctx); err != nil {
galog.Fatalf("Failed to setup guest compat manager: %v", err)
}
if err := events.FetchManager().Run(ctx); err != nil {
galog.Fatalf("Failed to run events manager: %v", err)
}
}
// setup sets up the config to setup the guest compat manager.
func setup(ctx context.Context) error {
galog.Infof("Setting up guest compat manager")
if err := events.FetchManager().AddWatcher(ctx, metadata.NewWatcher()); err != nil {
return fmt.Errorf("failed to add metadata watcher: %w", err)
}
watcher := watcher.NewManager()
subscriber := events.EventSubscriber{Name: "GuestCompatManager", Data: nil, Callback: watcher.Setup}
events.FetchManager().Subscribe(metadata.LongpollEvent, subscriber)
galog.Debug("Compat manager subscriber registered for metadata longpoll event, setting service state to running...")
service.SetState(ctx, service.StateRunning)
galog.Infof("Google Guest Compat Manager (version: %q) Initialized...", version)
return nil
}