Type "WorkerCommand" has both value and pointer receivers
142
143var ErrNotRoot = errors.New("worker must be run as root")
144
145func (cmd *WorkerCommand) checkRoot() error {146 currentUser, err := user.Current()
147 if err != nil {
148 return err
Type "WorkerCommand" has both value and pointer receivers
155 return nil
156}
157
158func (cmd *WorkerCommand) dnsProxyRunner(logger lager.Logger) (ifrit.Runner, error) {159 server, err := network.DNSServer()
160 if err != nil {
161 return nil, err
Type "WorkerCommand" has both value and pointer receivers
68const guardianRuntime = "guardian"
69const houdiniRuntime = "houdini"
70
71func (cmd WorkerCommand) LessenRequirements(prefix string, command *flags.Command) { 72 // configured as work-dir/volumes
73 command.FindOptionByLongName(prefix + "baggageclaim-volumes").Required = false
74}
Type "WorkerCommand" has both value and pointer receivers
184 }), nil
185}
186
187func (cmd *WorkerCommand) loadResources(logger lager.Logger) ([]atc.WorkerResourceType, error) {188 var types []atc.WorkerResourceType
189
190 if cmd.ResourceTypes != "" {
Type "WorkerCommand" has both value and pointer receivers
235const containerdEnvPrefix = "CONCOURSE_CONTAINERD_"
236
237// Checks if runtime specific flags provided match the selected runtime type
238func (cmd *WorkerCommand) verifyRuntimeFlags() error {239 switch {
240 case cmd.Runtime == houdiniRuntime:
241 if cmd.hasFlags(guardianEnvPrefix) || cmd.hasFlags(containerdEnvPrefix) {
Type "WorkerCommand" has both value and pointer receivers
219 return types, nil
220}
221
222func (cmd *WorkerCommand) hasFlags(prefix string) bool {223 env := os.Environ()
224
225 for _, envVar := range env {
Type "WorkerCommand" has both value and pointer receivers
77// The runtime is represented as a Ifrit runner that must include a Garden Server process. The Garden server exposes API
78// endpoints that allow the ATC to make container related requests to the worker.
79// The runner may also include additional processes such as the runtime's daemon or a DNS proxy server.
80func (cmd *WorkerCommand) gardenServerRunner(logger lager.Logger) (atc.Worker, ifrit.Runner, error) { 81 err := cmd.checkRoot()
82 if err != nil {
83 return atc.Worker{}, nil, err
Type "WorkerCommand" has both value and pointer receivers
88 ), nil
89}
90
91func (cmd *WorkerCommand) buildUpNetworkOpts(logger lager.Logger, dnsServers []string) (runtime.Network, error) { 92 logger.Debug("create-cni-network-opts")
93 if cmd.Containerd.CNIPluginsDir == "" {
94 pluginsDir := concourseCmd.DiscoverAsset("bin")
Type "WorkerCommand" has both value and pointer receivers
130 return runtime.NewCNINetwork(networkOpts...)
131}
132
133func (cmd *WorkerCommand) buildUpBackendOpts(logger lager.Logger, cniNetwork runtime.Network) ([]runtime.GardenBackendOpt, error) {134 logger.Debug("create-containerd-backendOpts")
135
136 if cmd.Containerd.InitBin == "" {
Type "WorkerCommand" has both value and pointer receivers
153
154// containerdRunner spawns a containerd and a Garden server process for use as the container
155// runtime of Concourse.
156func (cmd *WorkerCommand) containerdRunner(logger lager.Logger) (ifrit.Runner, error) {157 const sock = "/run/containerd/containerd.sock"
158
159 var (
Type "WorkerCommand" has both value and pointer receivers
54
55// containerdGardenServerRunner launches a Garden server configured to interact
56// with containerd via the containerdAddr socket.
57func (cmd *WorkerCommand) containerdGardenServerRunner( 58 logger lager.Logger,
59 containerdAddr string,
60 dnsServers []string,
Description
(Go's FAQ)[https://go.dev/doc/faq#methodsonvaluesorpointers] recommends that method receivers should be consistent. If some of the methods of the type must have pointer receivers, the rest should too, so the method set is consistent regardless of how the type is used. This is because value and pointer receivers have different method sets.
Bad practice
package main
type foo struct {
a int
}
func (f foo) a() {}
func (f *foo) b() {
f.a = 10
}
Recommended
package main
type foo struct {
a int
}
func (f *foo) a() {}
func (f *foo) b() {
f.a = 10
}