2020-04-27 17:09:58 +00:00
package executor
import (
"context"
"net/http"
2020-05-05 22:02:16 +00:00
"os"
"path/filepath"
2021-11-12 05:03:15 +00:00
"strconv"
"strings"
"time"
2020-04-27 17:09:58 +00:00
2022-03-02 23:47:27 +00:00
"github.com/k3s-io/k3s/pkg/cli/cmds"
daemonconfig "github.com/k3s-io/k3s/pkg/daemons/config"
2021-11-12 05:03:15 +00:00
yaml2 "gopkg.in/yaml.v2"
2020-04-27 17:09:58 +00:00
"k8s.io/apiserver/pkg/authentication/authenticator"
2021-11-12 05:03:15 +00:00
"sigs.k8s.io/yaml"
2020-04-27 17:09:58 +00:00
)
2020-05-05 22:02:16 +00:00
var (
executor Executor
)
2020-04-27 17:09:58 +00:00
type Executor interface {
2021-05-11 19:50:08 +00:00
Bootstrap ( ctx context . Context , nodeConfig * daemonconfig . Node , cfg cmds . Agent ) error
2021-09-13 22:20:03 +00:00
Kubelet ( ctx context . Context , args [ ] string ) error
KubeProxy ( ctx context . Context , args [ ] string ) error
2021-10-12 06:13:10 +00:00
APIServerHandlers ( ctx context . Context ) ( authenticator . Request , http . Handler , error )
APIServer ( ctx context . Context , etcdReady <- chan struct { } , args [ ] string ) error
2021-09-13 22:20:03 +00:00
Scheduler ( ctx context . Context , apiReady <- chan struct { } , args [ ] string ) error
ControllerManager ( ctx context . Context , apiReady <- chan struct { } , args [ ] string ) error
2020-05-05 22:02:16 +00:00
CurrentETCDOptions ( ) ( InitialOptions , error )
2021-11-12 05:03:15 +00:00
ETCD ( ctx context . Context , args ETCDConfig , extraArgs [ ] string ) error
2021-09-13 22:20:03 +00:00
CloudControllerManager ( ctx context . Context , ccmRBACReady <- chan struct { } , args [ ] string ) error
2020-04-27 17:09:58 +00:00
}
2020-05-05 22:02:16 +00:00
type ETCDConfig struct {
2022-04-27 20:44:15 +00:00
InitialOptions ` json:",inline" `
Name string ` json:"name,omitempty" `
ListenClientURLs string ` json:"listen-client-urls,omitempty" `
2023-09-22 06:54:03 +00:00
ListenClientHTTPURLs string ` json:"listen-client-http-urls,omitempty" `
2022-04-27 20:44:15 +00:00
ListenMetricsURLs string ` json:"listen-metrics-urls,omitempty" `
ListenPeerURLs string ` json:"listen-peer-urls,omitempty" `
AdvertiseClientURLs string ` json:"advertise-client-urls,omitempty" `
DataDir string ` json:"data-dir,omitempty" `
SnapshotCount int ` json:"snapshot-count,omitempty" `
ServerTrust ServerTrust ` json:"client-transport-security" `
PeerTrust PeerTrust ` json:"peer-transport-security" `
ForceNewCluster bool ` json:"force-new-cluster,omitempty" `
HeartbeatInterval int ` json:"heartbeat-interval" `
ElectionTimeout int ` json:"election-timeout" `
Logger string ` json:"logger" `
LogOutputs [ ] string ` json:"log-outputs" `
ExperimentalInitialCorruptCheck bool ` json:"experimental-initial-corrupt-check" `
2020-05-05 22:02:16 +00:00
}
type ServerTrust struct {
CertFile string ` json:"cert-file" `
KeyFile string ` json:"key-file" `
ClientCertAuth bool ` json:"client-cert-auth" `
TrustedCAFile string ` json:"trusted-ca-file" `
}
type PeerTrust struct {
CertFile string ` json:"cert-file" `
KeyFile string ` json:"key-file" `
ClientCertAuth bool ` json:"client-cert-auth" `
TrustedCAFile string ` json:"trusted-ca-file" `
}
type InitialOptions struct {
AdvertisePeerURL string ` json:"initial-advertise-peer-urls,omitempty" `
Cluster string ` json:"initial-cluster,omitempty" `
State string ` json:"initial-cluster-state,omitempty" `
}
2021-11-12 05:03:15 +00:00
func ( e ETCDConfig ) ToConfigFile ( extraArgs [ ] string ) ( string , error ) {
2020-05-05 22:02:16 +00:00
confFile := filepath . Join ( e . DataDir , "config" )
bytes , err := yaml . Marshal ( & e )
if err != nil {
return "" , err
}
2021-11-12 05:03:15 +00:00
if len ( extraArgs ) > 0 {
var s map [ string ] interface { }
if err := yaml2 . Unmarshal ( bytes , & s ) ; err != nil {
return "" , err
}
for _ , v := range extraArgs {
extraArg := strings . SplitN ( v , "=" , 2 )
// Depending on the argV, we have different types to handle.
// Source: https://github.com/etcd-io/etcd/blob/44b8ae145b505811775f5af915dd19198d556d55/server/config/config.go#L36-L190 and https://etcd.io/docs/v3.5/op-guide/configuration/#configuration-file
if len ( extraArg ) == 2 {
key := strings . TrimLeft ( extraArg [ 0 ] , "-" )
lowerKey := strings . ToLower ( key )
var stringArr [ ] string
if i , err := strconv . Atoi ( extraArg [ 1 ] ) ; err == nil {
s [ key ] = i
} else if time , err := time . ParseDuration ( extraArg [ 1 ] ) ; err == nil && ( strings . Contains ( lowerKey , "time" ) || strings . Contains ( lowerKey , "duration" ) || strings . Contains ( lowerKey , "interval" ) || strings . Contains ( lowerKey , "retention" ) ) {
// auto-compaction-retention is either a time.Duration or int, depending on version. If it is an int, it will be caught above.
s [ key ] = time
} else if err := yaml . Unmarshal ( [ ] byte ( extraArg [ 1 ] ) , & stringArr ) ; err == nil {
s [ key ] = stringArr
} else {
switch strings . ToLower ( extraArg [ 1 ] ) {
case "true" :
s [ key ] = true
case "false" :
s [ key ] = false
default :
s [ key ] = extraArg [ 1 ]
}
}
}
}
bytes , err = yaml2 . Marshal ( & s )
if err != nil {
return "" , err
}
}
2020-05-05 22:02:16 +00:00
if err := os . MkdirAll ( e . DataDir , 0700 ) ; err != nil {
return "" , err
}
2022-10-08 00:36:57 +00:00
return confFile , os . WriteFile ( confFile , bytes , 0600 )
2020-05-05 22:02:16 +00:00
}
2020-04-27 17:09:58 +00:00
func Set ( driver Executor ) {
executor = driver
}
2021-05-11 19:50:08 +00:00
func Bootstrap ( ctx context . Context , nodeConfig * daemonconfig . Node , cfg cmds . Agent ) error {
return executor . Bootstrap ( ctx , nodeConfig , cfg )
}
2021-09-13 22:20:03 +00:00
func Kubelet ( ctx context . Context , args [ ] string ) error {
return executor . Kubelet ( ctx , args )
2020-04-27 17:09:58 +00:00
}
2021-09-13 22:20:03 +00:00
func KubeProxy ( ctx context . Context , args [ ] string ) error {
return executor . KubeProxy ( ctx , args )
2020-04-27 17:09:58 +00:00
}
2021-10-12 06:13:10 +00:00
func APIServerHandlers ( ctx context . Context ) ( authenticator . Request , http . Handler , error ) {
return executor . APIServerHandlers ( ctx )
}
func APIServer ( ctx context . Context , etcdReady <- chan struct { } , args [ ] string ) error {
2020-05-05 22:02:16 +00:00
return executor . APIServer ( ctx , etcdReady , args )
2020-04-27 17:09:58 +00:00
}
2021-09-13 22:20:03 +00:00
func Scheduler ( ctx context . Context , apiReady <- chan struct { } , args [ ] string ) error {
return executor . Scheduler ( ctx , apiReady , args )
2020-04-27 17:09:58 +00:00
}
2021-09-13 22:20:03 +00:00
func ControllerManager ( ctx context . Context , apiReady <- chan struct { } , args [ ] string ) error {
return executor . ControllerManager ( ctx , apiReady , args )
2020-04-27 17:09:58 +00:00
}
2020-05-05 22:02:16 +00:00
func CurrentETCDOptions ( ) ( InitialOptions , error ) {
return executor . CurrentETCDOptions ( )
}
2021-11-12 05:03:15 +00:00
func ETCD ( ctx context . Context , args ETCDConfig , extraArgs [ ] string ) error {
return executor . ETCD ( ctx , args , extraArgs )
2020-05-05 22:02:16 +00:00
}
2021-06-29 14:28:38 +00:00
2021-09-13 22:20:03 +00:00
func CloudControllerManager ( ctx context . Context , ccmRBACReady <- chan struct { } , args [ ] string ) error {
return executor . CloudControllerManager ( ctx , ccmRBACReady , args )
2021-06-29 14:28:38 +00:00
}