Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
K
k3s
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Jacklull
k3s
Commits
199424b6
Commit
199424b6
authored
Sep 13, 2021
by
Brad Davidson
Committed by
Brad Davidson
Sep 14, 2021
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Pass context into all Executor functions
Signed-off-by:
Brad Davidson
<
brad.davidson@rancher.com
>
parent
137e80cd
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
46 additions
and
41 deletions
+46
-41
agent.go
pkg/daemons/agent/agent.go
+6
-6
server.go
pkg/daemons/control/server.go
+14
-9
embed.go
pkg/daemons/executor/embed.go
+11
-11
executor.go
pkg/daemons/executor/executor.go
+15
-15
No files found.
pkg/daemons/agent/agent.go
View file @
199424b6
...
@@ -26,13 +26,13 @@ func Agent(ctx context.Context, nodeConfig *daemonconfig.Node, proxy proxy.Proxy
...
@@ -26,13 +26,13 @@ func Agent(ctx context.Context, nodeConfig *daemonconfig.Node, proxy proxy.Proxy
logs
.
InitLogs
()
logs
.
InitLogs
()
defer
logs
.
FlushLogs
()
defer
logs
.
FlushLogs
()
if
err
:=
startKubelet
(
&
nodeConfig
.
AgentConfig
);
err
!=
nil
{
if
err
:=
startKubelet
(
ctx
,
&
nodeConfig
.
AgentConfig
);
err
!=
nil
{
return
err
return
err
}
}
go
func
()
{
go
func
()
{
if
!
config
.
KubeProxyDisabled
(
ctx
,
nodeConfig
,
proxy
)
{
if
!
config
.
KubeProxyDisabled
(
ctx
,
nodeConfig
,
proxy
)
{
if
err
:=
startKubeProxy
(
&
nodeConfig
.
AgentConfig
);
err
!=
nil
{
if
err
:=
startKubeProxy
(
ctx
,
&
nodeConfig
.
AgentConfig
);
err
!=
nil
{
logrus
.
Fatalf
(
"Failed to start kube-proxy: %v"
,
err
)
logrus
.
Fatalf
(
"Failed to start kube-proxy: %v"
,
err
)
}
}
}
}
...
@@ -41,20 +41,20 @@ func Agent(ctx context.Context, nodeConfig *daemonconfig.Node, proxy proxy.Proxy
...
@@ -41,20 +41,20 @@ func Agent(ctx context.Context, nodeConfig *daemonconfig.Node, proxy proxy.Proxy
return
nil
return
nil
}
}
func
startKubeProxy
(
cfg
*
daemonconfig
.
Agent
)
error
{
func
startKubeProxy
(
c
tx
context
.
Context
,
c
fg
*
daemonconfig
.
Agent
)
error
{
argsMap
:=
kubeProxyArgs
(
cfg
)
argsMap
:=
kubeProxyArgs
(
cfg
)
args
:=
daemonconfig
.
GetArgs
(
argsMap
,
cfg
.
ExtraKubeProxyArgs
)
args
:=
daemonconfig
.
GetArgs
(
argsMap
,
cfg
.
ExtraKubeProxyArgs
)
logrus
.
Infof
(
"Running kube-proxy %s"
,
daemonconfig
.
ArgString
(
args
))
logrus
.
Infof
(
"Running kube-proxy %s"
,
daemonconfig
.
ArgString
(
args
))
return
executor
.
KubeProxy
(
args
)
return
executor
.
KubeProxy
(
ctx
,
args
)
}
}
func
startKubelet
(
cfg
*
daemonconfig
.
Agent
)
error
{
func
startKubelet
(
c
tx
context
.
Context
,
c
fg
*
daemonconfig
.
Agent
)
error
{
argsMap
:=
kubeletArgs
(
cfg
)
argsMap
:=
kubeletArgs
(
cfg
)
args
:=
daemonconfig
.
GetArgs
(
argsMap
,
cfg
.
ExtraKubeletArgs
)
args
:=
daemonconfig
.
GetArgs
(
argsMap
,
cfg
.
ExtraKubeletArgs
)
logrus
.
Infof
(
"Running kubelet %s"
,
daemonconfig
.
ArgString
(
args
))
logrus
.
Infof
(
"Running kubelet %s"
,
daemonconfig
.
ArgString
(
args
))
return
executor
.
Kubelet
(
args
)
return
executor
.
Kubelet
(
ctx
,
args
)
}
}
// ImageCredProvAvailable checks to see if the kubelet image credential provider bin dir and config
// ImageCredProvAvailable checks to see if the kubelet image credential provider bin dir and config
...
...
pkg/daemons/control/server.go
View file @
199424b6
...
@@ -71,12 +71,12 @@ func Server(ctx context.Context, cfg *config.Control) error {
...
@@ -71,12 +71,12 @@ func Server(ctx context.Context, cfg *config.Control) error {
runtime
.
Handler
=
handler
runtime
.
Handler
=
handler
if
!
cfg
.
DisableScheduler
{
if
!
cfg
.
DisableScheduler
{
if
err
:=
scheduler
(
cfg
,
runtime
);
err
!=
nil
{
if
err
:=
scheduler
(
c
tx
,
c
fg
,
runtime
);
err
!=
nil
{
return
err
return
err
}
}
}
}
if
!
cfg
.
DisableControllerManager
{
if
!
cfg
.
DisableControllerManager
{
if
err
:=
controllerManager
(
cfg
,
runtime
);
err
!=
nil
{
if
err
:=
controllerManager
(
c
tx
,
c
fg
,
runtime
);
err
!=
nil
{
return
err
return
err
}
}
}
}
...
@@ -90,7 +90,7 @@ func Server(ctx context.Context, cfg *config.Control) error {
...
@@ -90,7 +90,7 @@ func Server(ctx context.Context, cfg *config.Control) error {
return
nil
return
nil
}
}
func
controllerManager
(
cfg
*
config
.
Control
,
runtime
*
config
.
ControlRuntime
)
error
{
func
controllerManager
(
c
tx
context
.
Context
,
c
fg
*
config
.
Control
,
runtime
*
config
.
ControlRuntime
)
error
{
argsMap
:=
map
[
string
]
string
{
argsMap
:=
map
[
string
]
string
{
"kubeconfig"
:
runtime
.
KubeConfigController
,
"kubeconfig"
:
runtime
.
KubeConfigController
,
"service-account-private-key-file"
:
runtime
.
ServiceKey
,
"service-account-private-key-file"
:
runtime
.
ServiceKey
,
...
@@ -121,10 +121,10 @@ func controllerManager(cfg *config.Control, runtime *config.ControlRuntime) erro
...
@@ -121,10 +121,10 @@ func controllerManager(cfg *config.Control, runtime *config.ControlRuntime) erro
args
:=
config
.
GetArgs
(
argsMap
,
cfg
.
ExtraControllerArgs
)
args
:=
config
.
GetArgs
(
argsMap
,
cfg
.
ExtraControllerArgs
)
logrus
.
Infof
(
"Running kube-controller-manager %s"
,
config
.
ArgString
(
args
))
logrus
.
Infof
(
"Running kube-controller-manager %s"
,
config
.
ArgString
(
args
))
return
executor
.
ControllerManager
(
runtime
.
APIServerReady
,
args
)
return
executor
.
ControllerManager
(
ctx
,
runtime
.
APIServerReady
,
args
)
}
}
func
scheduler
(
cfg
*
config
.
Control
,
runtime
*
config
.
ControlRuntime
)
error
{
func
scheduler
(
c
tx
context
.
Context
,
c
fg
*
config
.
Control
,
runtime
*
config
.
ControlRuntime
)
error
{
argsMap
:=
map
[
string
]
string
{
argsMap
:=
map
[
string
]
string
{
"kubeconfig"
:
runtime
.
KubeConfigScheduler
,
"kubeconfig"
:
runtime
.
KubeConfigScheduler
,
"bind-address"
:
localhostIP
.
String
(),
"bind-address"
:
localhostIP
.
String
(),
...
@@ -137,7 +137,7 @@ func scheduler(cfg *config.Control, runtime *config.ControlRuntime) error {
...
@@ -137,7 +137,7 @@ func scheduler(cfg *config.Control, runtime *config.ControlRuntime) error {
args
:=
config
.
GetArgs
(
argsMap
,
cfg
.
ExtraSchedulerAPIArgs
)
args
:=
config
.
GetArgs
(
argsMap
,
cfg
.
ExtraSchedulerAPIArgs
)
logrus
.
Infof
(
"Running kube-scheduler %s"
,
config
.
ArgString
(
args
))
logrus
.
Infof
(
"Running kube-scheduler %s"
,
config
.
ArgString
(
args
))
return
executor
.
Scheduler
(
runtime
.
APIServerReady
,
args
)
return
executor
.
Scheduler
(
ctx
,
runtime
.
APIServerReady
,
args
)
}
}
func
apiServer
(
ctx
context
.
Context
,
cfg
*
config
.
Control
,
runtime
*
config
.
ControlRuntime
)
(
authenticator
.
Request
,
http
.
Handler
,
error
)
{
func
apiServer
(
ctx
context
.
Context
,
cfg
*
config
.
Control
,
runtime
*
config
.
ControlRuntime
)
(
authenticator
.
Request
,
http
.
Handler
,
error
)
{
...
@@ -323,7 +323,7 @@ func cloudControllerManager(ctx context.Context, cfg *config.Control, runtime *c
...
@@ -323,7 +323,7 @@ func cloudControllerManager(ctx context.Context, cfg *config.Control, runtime *c
select
{
select
{
case
<-
ctx
.
Done
()
:
case
<-
ctx
.
Done
()
:
return
return
case
err
:=
<-
promise
(
func
()
error
{
return
checkForCloudControllerPrivileges
(
runtime
,
5
*
time
.
Second
)
})
:
case
err
:=
<-
promise
(
func
()
error
{
return
checkForCloudControllerPrivileges
(
ctx
,
runtime
,
5
*
time
.
Second
)
})
:
if
err
!=
nil
{
if
err
!=
nil
{
logrus
.
Infof
(
"Waiting for cloud-controller-manager privileges to become available"
)
logrus
.
Infof
(
"Waiting for cloud-controller-manager privileges to become available"
)
continue
continue
...
@@ -333,10 +333,15 @@ func cloudControllerManager(ctx context.Context, cfg *config.Control, runtime *c
...
@@ -333,10 +333,15 @@ func cloudControllerManager(ctx context.Context, cfg *config.Control, runtime *c
}
}
}()
}()
return
executor
.
CloudControllerManager
(
ccmRBACReady
,
args
)
return
executor
.
CloudControllerManager
(
c
tx
,
c
cmRBACReady
,
args
)
}
}
func
checkForCloudControllerPrivileges
(
runtime
*
config
.
ControlRuntime
,
timeout
time
.
Duration
)
error
{
// checkForCloudControllerPrivileges makes a SubjectAccessReview request to the apiserver
// to validate that the embedded cloud controller manager has the required privileges,
// and does not return until the requested access is granted.
// If the CCM RBAC changes, the ResourceAttributes checked for by this function should
// be modified to check for the most recently added privilege.
func
checkForCloudControllerPrivileges
(
ctx
context
.
Context
,
runtime
*
config
.
ControlRuntime
,
timeout
time
.
Duration
)
error
{
restConfig
,
err
:=
clientcmd
.
BuildConfigFromFlags
(
""
,
runtime
.
KubeConfigAdmin
)
restConfig
,
err
:=
clientcmd
.
BuildConfigFromFlags
(
""
,
runtime
.
KubeConfigAdmin
)
if
err
!=
nil
{
if
err
!=
nil
{
return
err
return
err
...
...
pkg/daemons/executor/embed.go
View file @
199424b6
...
@@ -38,7 +38,7 @@ func (Embedded) Bootstrap(ctx context.Context, nodeConfig *daemonconfig.Node, cf
...
@@ -38,7 +38,7 @@ func (Embedded) Bootstrap(ctx context.Context, nodeConfig *daemonconfig.Node, cf
return
nil
return
nil
}
}
func
(
Embedded
)
Kubelet
(
args
[]
string
)
error
{
func
(
Embedded
)
Kubelet
(
ctx
context
.
Context
,
args
[]
string
)
error
{
command
:=
kubelet
.
NewKubeletCommand
(
context
.
Background
())
command
:=
kubelet
.
NewKubeletCommand
(
context
.
Background
())
command
.
SetArgs
(
args
)
command
.
SetArgs
(
args
)
...
@@ -48,13 +48,13 @@ func (Embedded) Kubelet(args []string) error {
...
@@ -48,13 +48,13 @@ func (Embedded) Kubelet(args []string) error {
logrus
.
Fatalf
(
"kubelet panic: %v"
,
err
)
logrus
.
Fatalf
(
"kubelet panic: %v"
,
err
)
}
}
}()
}()
logrus
.
Fatalf
(
"kubelet exited: %v"
,
command
.
Execute
(
))
logrus
.
Fatalf
(
"kubelet exited: %v"
,
command
.
Execute
Context
(
ctx
))
}()
}()
return
nil
return
nil
}
}
func
(
Embedded
)
KubeProxy
(
args
[]
string
)
error
{
func
(
Embedded
)
KubeProxy
(
ctx
context
.
Context
,
args
[]
string
)
error
{
command
:=
proxy
.
NewProxyCommand
()
command
:=
proxy
.
NewProxyCommand
()
command
.
SetArgs
(
args
)
command
.
SetArgs
(
args
)
...
@@ -64,7 +64,7 @@ func (Embedded) KubeProxy(args []string) error {
...
@@ -64,7 +64,7 @@ func (Embedded) KubeProxy(args []string) error {
logrus
.
Fatalf
(
"kube-proxy panic: %v"
,
err
)
logrus
.
Fatalf
(
"kube-proxy panic: %v"
,
err
)
}
}
}()
}()
logrus
.
Fatalf
(
"kube-proxy exited: %v"
,
command
.
Execute
(
))
logrus
.
Fatalf
(
"kube-proxy exited: %v"
,
command
.
Execute
Context
(
ctx
))
}()
}()
return
nil
return
nil
...
@@ -81,14 +81,14 @@ func (Embedded) APIServer(ctx context.Context, etcdReady <-chan struct{}, args [
...
@@ -81,14 +81,14 @@ func (Embedded) APIServer(ctx context.Context, etcdReady <-chan struct{}, args [
logrus
.
Fatalf
(
"apiserver panic: %v"
,
err
)
logrus
.
Fatalf
(
"apiserver panic: %v"
,
err
)
}
}
}()
}()
logrus
.
Fatalf
(
"apiserver exited: %v"
,
command
.
Execute
(
))
logrus
.
Fatalf
(
"apiserver exited: %v"
,
command
.
Execute
Context
(
ctx
))
}()
}()
startupConfig
:=
<-
app
.
StartupConfig
startupConfig
:=
<-
app
.
StartupConfig
return
startupConfig
.
Authenticator
,
startupConfig
.
Handler
,
nil
return
startupConfig
.
Authenticator
,
startupConfig
.
Handler
,
nil
}
}
func
(
Embedded
)
Scheduler
(
apiReady
<-
chan
struct
{},
args
[]
string
)
error
{
func
(
Embedded
)
Scheduler
(
ctx
context
.
Context
,
apiReady
<-
chan
struct
{},
args
[]
string
)
error
{
command
:=
sapp
.
NewSchedulerCommand
()
command
:=
sapp
.
NewSchedulerCommand
()
command
.
SetArgs
(
args
)
command
.
SetArgs
(
args
)
...
@@ -99,13 +99,13 @@ func (Embedded) Scheduler(apiReady <-chan struct{}, args []string) error {
...
@@ -99,13 +99,13 @@ func (Embedded) Scheduler(apiReady <-chan struct{}, args []string) error {
logrus
.
Fatalf
(
"scheduler panic: %v"
,
err
)
logrus
.
Fatalf
(
"scheduler panic: %v"
,
err
)
}
}
}()
}()
logrus
.
Fatalf
(
"scheduler exited: %v"
,
command
.
Execute
(
))
logrus
.
Fatalf
(
"scheduler exited: %v"
,
command
.
Execute
Context
(
ctx
))
}()
}()
return
nil
return
nil
}
}
func
(
Embedded
)
ControllerManager
(
apiReady
<-
chan
struct
{},
args
[]
string
)
error
{
func
(
Embedded
)
ControllerManager
(
ctx
context
.
Context
,
apiReady
<-
chan
struct
{},
args
[]
string
)
error
{
command
:=
cmapp
.
NewControllerManagerCommand
()
command
:=
cmapp
.
NewControllerManagerCommand
()
command
.
SetArgs
(
args
)
command
.
SetArgs
(
args
)
...
@@ -116,13 +116,13 @@ func (Embedded) ControllerManager(apiReady <-chan struct{}, args []string) error
...
@@ -116,13 +116,13 @@ func (Embedded) ControllerManager(apiReady <-chan struct{}, args []string) error
logrus
.
Fatalf
(
"controller-manager panic: %v"
,
err
)
logrus
.
Fatalf
(
"controller-manager panic: %v"
,
err
)
}
}
}()
}()
logrus
.
Fatalf
(
"controller-manager exited: %v"
,
command
.
Execute
(
))
logrus
.
Fatalf
(
"controller-manager exited: %v"
,
command
.
Execute
Context
(
ctx
))
}()
}()
return
nil
return
nil
}
}
func
(
Embedded
)
CloudControllerManager
(
ccmRBACReady
<-
chan
struct
{},
args
[]
string
)
error
{
func
(
Embedded
)
CloudControllerManager
(
c
tx
context
.
Context
,
c
cmRBACReady
<-
chan
struct
{},
args
[]
string
)
error
{
ccmOptions
,
err
:=
ccmopt
.
NewCloudControllerManagerOptions
()
ccmOptions
,
err
:=
ccmopt
.
NewCloudControllerManagerOptions
()
if
err
!=
nil
{
if
err
!=
nil
{
logrus
.
Fatalf
(
"unable to initialize command options: %v"
,
err
)
logrus
.
Fatalf
(
"unable to initialize command options: %v"
,
err
)
...
@@ -159,7 +159,7 @@ func (Embedded) CloudControllerManager(ccmRBACReady <-chan struct{}, args []stri
...
@@ -159,7 +159,7 @@ func (Embedded) CloudControllerManager(ccmRBACReady <-chan struct{}, args []stri
logrus
.
Fatalf
(
"cloud-controller-manager panic: %v"
,
err
)
logrus
.
Fatalf
(
"cloud-controller-manager panic: %v"
,
err
)
}
}
}()
}()
logrus
.
Fatalf
(
"cloud-controller-manager exited: %v"
,
command
.
Execute
(
))
logrus
.
Errorf
(
"cloud-controller-manager exited: %v"
,
command
.
ExecuteContext
(
ctx
))
}()
}()
return
nil
return
nil
...
...
pkg/daemons/executor/executor.go
View file @
199424b6
...
@@ -20,14 +20,14 @@ var (
...
@@ -20,14 +20,14 @@ var (
type
Executor
interface
{
type
Executor
interface
{
Bootstrap
(
ctx
context
.
Context
,
nodeConfig
*
daemonconfig
.
Node
,
cfg
cmds
.
Agent
)
error
Bootstrap
(
ctx
context
.
Context
,
nodeConfig
*
daemonconfig
.
Node
,
cfg
cmds
.
Agent
)
error
Kubelet
(
args
[]
string
)
error
Kubelet
(
ctx
context
.
Context
,
args
[]
string
)
error
KubeProxy
(
args
[]
string
)
error
KubeProxy
(
ctx
context
.
Context
,
args
[]
string
)
error
APIServer
(
ctx
context
.
Context
,
etcdReady
<-
chan
struct
{},
args
[]
string
)
(
authenticator
.
Request
,
http
.
Handler
,
error
)
APIServer
(
ctx
context
.
Context
,
etcdReady
<-
chan
struct
{},
args
[]
string
)
(
authenticator
.
Request
,
http
.
Handler
,
error
)
Scheduler
(
apiReady
<-
chan
struct
{},
args
[]
string
)
error
Scheduler
(
ctx
context
.
Context
,
apiReady
<-
chan
struct
{},
args
[]
string
)
error
ControllerManager
(
apiReady
<-
chan
struct
{},
args
[]
string
)
error
ControllerManager
(
ctx
context
.
Context
,
apiReady
<-
chan
struct
{},
args
[]
string
)
error
CurrentETCDOptions
()
(
InitialOptions
,
error
)
CurrentETCDOptions
()
(
InitialOptions
,
error
)
ETCD
(
ctx
context
.
Context
,
args
ETCDConfig
)
error
ETCD
(
ctx
context
.
Context
,
args
ETCDConfig
)
error
CloudControllerManager
(
ccmRBACReady
<-
chan
struct
{},
args
[]
string
)
error
CloudControllerManager
(
c
tx
context
.
Context
,
c
cmRBACReady
<-
chan
struct
{},
args
[]
string
)
error
}
}
type
ETCDConfig
struct
{
type
ETCDConfig
struct
{
...
@@ -89,24 +89,24 @@ func Bootstrap(ctx context.Context, nodeConfig *daemonconfig.Node, cfg cmds.Agen
...
@@ -89,24 +89,24 @@ func Bootstrap(ctx context.Context, nodeConfig *daemonconfig.Node, cfg cmds.Agen
return
executor
.
Bootstrap
(
ctx
,
nodeConfig
,
cfg
)
return
executor
.
Bootstrap
(
ctx
,
nodeConfig
,
cfg
)
}
}
func
Kubelet
(
args
[]
string
)
error
{
func
Kubelet
(
ctx
context
.
Context
,
args
[]
string
)
error
{
return
executor
.
Kubelet
(
args
)
return
executor
.
Kubelet
(
ctx
,
args
)
}
}
func
KubeProxy
(
args
[]
string
)
error
{
func
KubeProxy
(
ctx
context
.
Context
,
args
[]
string
)
error
{
return
executor
.
KubeProxy
(
args
)
return
executor
.
KubeProxy
(
ctx
,
args
)
}
}
func
APIServer
(
ctx
context
.
Context
,
etcdReady
<-
chan
struct
{},
args
[]
string
)
(
authenticator
.
Request
,
http
.
Handler
,
error
)
{
func
APIServer
(
ctx
context
.
Context
,
etcdReady
<-
chan
struct
{},
args
[]
string
)
(
authenticator
.
Request
,
http
.
Handler
,
error
)
{
return
executor
.
APIServer
(
ctx
,
etcdReady
,
args
)
return
executor
.
APIServer
(
ctx
,
etcdReady
,
args
)
}
}
func
Scheduler
(
apiReady
<-
chan
struct
{},
args
[]
string
)
error
{
func
Scheduler
(
ctx
context
.
Context
,
apiReady
<-
chan
struct
{},
args
[]
string
)
error
{
return
executor
.
Scheduler
(
apiReady
,
args
)
return
executor
.
Scheduler
(
ctx
,
apiReady
,
args
)
}
}
func
ControllerManager
(
apiReady
<-
chan
struct
{},
args
[]
string
)
error
{
func
ControllerManager
(
ctx
context
.
Context
,
apiReady
<-
chan
struct
{},
args
[]
string
)
error
{
return
executor
.
ControllerManager
(
apiReady
,
args
)
return
executor
.
ControllerManager
(
ctx
,
apiReady
,
args
)
}
}
func
CurrentETCDOptions
()
(
InitialOptions
,
error
)
{
func
CurrentETCDOptions
()
(
InitialOptions
,
error
)
{
...
@@ -117,6 +117,6 @@ func ETCD(ctx context.Context, args ETCDConfig) error {
...
@@ -117,6 +117,6 @@ func ETCD(ctx context.Context, args ETCDConfig) error {
return
executor
.
ETCD
(
ctx
,
args
)
return
executor
.
ETCD
(
ctx
,
args
)
}
}
func
CloudControllerManager
(
ccmRBACReady
<-
chan
struct
{},
args
[]
string
)
error
{
func
CloudControllerManager
(
c
tx
context
.
Context
,
c
cmRBACReady
<-
chan
struct
{},
args
[]
string
)
error
{
return
executor
.
CloudControllerManager
(
ccmRBACReady
,
args
)
return
executor
.
CloudControllerManager
(
c
tx
,
c
cmRBACReady
,
args
)
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment