mirror of
https://github.com/open-cluster-management-io/ocm.git
synced 2026-02-14 18:09:57 +00:00
73 lines
2.4 KiB
Go
73 lines
2.4 KiB
Go
package spoke
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
|
|
"github.com/openshift/library-go/pkg/controller/controllercmd"
|
|
"k8s.io/apimachinery/pkg/util/wait"
|
|
"k8s.io/apiserver/pkg/server/healthz"
|
|
"k8s.io/klog/v2"
|
|
|
|
commonoptions "open-cluster-management.io/ocm/pkg/common/options"
|
|
registration "open-cluster-management.io/ocm/pkg/registration/spoke"
|
|
work "open-cluster-management.io/ocm/pkg/work/spoke"
|
|
)
|
|
|
|
type AgentConfig struct {
|
|
registrationConfig *registration.SpokeAgentConfig
|
|
workConfig *work.WorkAgentConfig
|
|
}
|
|
|
|
func NewAgentConfig(
|
|
agentOption *commonoptions.AgentOptions,
|
|
registrationOption *registration.SpokeAgentOptions,
|
|
workOption *work.WorkloadAgentOptions,
|
|
cancel context.CancelFunc,
|
|
) *AgentConfig {
|
|
return &AgentConfig{
|
|
registrationConfig: registration.NewSpokeAgentConfig(agentOption, registrationOption, cancel),
|
|
workConfig: work.NewWorkAgentConfig(agentOption, workOption),
|
|
}
|
|
}
|
|
|
|
func (a *AgentConfig) RunSpokeAgent(ctx context.Context, controllerContext *controllercmd.ControllerContext) error {
|
|
// start registration agent at first
|
|
go func() {
|
|
if err := a.registrationConfig.RunSpokeAgent(ctx, controllerContext); err != nil {
|
|
klog.Fatal(err)
|
|
}
|
|
}()
|
|
|
|
// wait for the hub client config ready.
|
|
// PollUntilContextCancel periodically executes the condition func `o.internalHubConfigValidFunc`
|
|
// until one of the following conditions is met:
|
|
// - condition returns `true`: Indicates the hub client configuration
|
|
// is ready, and the polling stops successfully.
|
|
// - condition returns an error: This happens when loading the kubeconfig
|
|
// file fails or the kubeconfig is invalid. In such cases, the error is returned, causing the
|
|
// agent to exit with an error and triggering a new leader election.
|
|
// - The context is canceled: In this case, no error is returned. This ensures that
|
|
// the current leader can release leadership, allowing a new pod to get leadership quickly.
|
|
klog.Info("Waiting for hub client config and managed cluster to be ready")
|
|
if err := wait.PollUntilContextCancel(ctx, 1*time.Second, true, a.registrationConfig.IsHubKubeConfigValid); err != nil {
|
|
if err != context.Canceled {
|
|
return err
|
|
}
|
|
}
|
|
|
|
// start work agent
|
|
go func() {
|
|
if err := a.workConfig.RunWorkloadAgent(ctx, controllerContext); err != nil {
|
|
klog.Fatal(err)
|
|
}
|
|
}()
|
|
|
|
<-ctx.Done()
|
|
return nil
|
|
}
|
|
|
|
func (o *AgentConfig) HealthCheckers() []healthz.HealthChecker {
|
|
return o.registrationConfig.HealthCheckers()
|
|
}
|