Skip to content

Commit 46c8933

Browse files
authored
Convert PortForwarder to Accessor, move to Deployer (#6026)
1 parent e01d089 commit 46c8933

26 files changed

+316
-148
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
Copyright 2019 The Skaffold Authors
2+
Copyright 2021 The Skaffold Authors
33
44
Licensed under the Apache License, Version 2.0 (the "License");
55
you may not use this file except in compliance with the License.
@@ -14,24 +14,25 @@ See the License for the specific language governing permissions and
1414
limitations under the License.
1515
*/
1616

17-
package v1
17+
package access
1818

1919
import (
20+
"context"
2021
"io"
21-
22-
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/kubernetes/portforward"
2322
)
2423

25-
func (r *SkaffoldRunner) createForwarder(out io.Writer) *portforward.ForwarderManager {
26-
if !r.runCtx.PortForward() {
27-
return nil
28-
}
29-
30-
return portforward.NewForwarderManager(out,
31-
r.kubectlCLI,
32-
r.podSelector,
33-
r.labeller.RunIDSelector(),
34-
r.runCtx.Mode(),
35-
r.runCtx.Opts.PortForward,
36-
r.runCtx.PortForwardResources())
24+
// Accessor defines the behavior for any implementation of a component
25+
// that accesses and exposes deployed resources from Skaffold.
26+
type Accessor interface {
27+
// Start starts the resource accessor.
28+
Start(context.Context, io.Writer, []string) error
29+
30+
// Stop stops the resource accessor.
31+
Stop()
3732
}
33+
34+
type NoopAccessor struct{}
35+
36+
func (n *NoopAccessor) Start(context.Context, io.Writer, []string) error { return nil }
37+
38+
func (n *NoopAccessor) Stop() {}

pkg/skaffold/runner/v1/watcher.go renamed to pkg/skaffold/access/access_mux.go

+20-9
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,26 @@ See the License for the specific language governing permissions and
1414
limitations under the License.
1515
*/
1616

17-
package v1
17+
package access
1818

19-
import "context"
19+
import (
20+
"context"
21+
"io"
22+
)
2023

21-
type Watcher interface {
22-
// Name returns the watcher name
23-
Name() string
24-
// Start starts the watcher
25-
Start(ctx context.Context, namespaces []string) error
26-
// Stop stops the watcher
27-
Stop()
24+
type AccessorMux []Accessor
25+
26+
func (a AccessorMux) Start(ctx context.Context, out io.Writer, namespaces []string) error {
27+
for _, accessor := range a {
28+
if err := accessor.Start(ctx, out, namespaces); err != nil {
29+
return err
30+
}
31+
}
32+
return nil
33+
}
34+
35+
func (a AccessorMux) Stop() {
36+
for _, accessor := range a {
37+
accessor.Stop()
38+
}
2839
}

pkg/skaffold/access/provider.go

+79
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
/*
2+
Copyright 2021 The Skaffold Authors
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
package access
18+
19+
import (
20+
"sync"
21+
22+
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/deploy/label"
23+
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/kubectl"
24+
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/kubernetes"
25+
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/kubernetes/portforward"
26+
)
27+
28+
type Provider interface {
29+
GetKubernetesAccessor(*kubernetes.ImageList) Accessor
30+
GetNoopAccessor() Accessor
31+
}
32+
33+
type fullProvider struct {
34+
kubernetesAccessor func(*kubernetes.ImageList) Accessor
35+
}
36+
37+
var (
38+
provider *fullProvider
39+
once sync.Once
40+
)
41+
42+
func NewAccessorProvider(config portforward.Config, labelConfig label.Config, cli *kubectl.CLI) Provider {
43+
once.Do(func() {
44+
provider = &fullProvider{
45+
kubernetesAccessor: func(podSelector *kubernetes.ImageList) Accessor {
46+
if !config.PortForwardOptions().Enabled() {
47+
return &NoopAccessor{}
48+
}
49+
50+
return portforward.NewForwarderManager(cli,
51+
podSelector,
52+
labelConfig.RunIDSelector(),
53+
config.Mode(),
54+
config.PortForwardOptions(),
55+
config.PortForwardResources())
56+
},
57+
}
58+
})
59+
return provider
60+
}
61+
62+
func (p *fullProvider) GetKubernetesAccessor(s *kubernetes.ImageList) Accessor {
63+
return p.kubernetesAccessor(s)
64+
}
65+
66+
func (p *fullProvider) GetNoopAccessor() Accessor {
67+
return &NoopAccessor{}
68+
}
69+
70+
// NoopProvider is used in tests
71+
type NoopProvider struct{}
72+
73+
func (p *NoopProvider) GetKubernetesAccessor(_ *kubernetes.ImageList) Accessor {
74+
return &NoopAccessor{}
75+
}
76+
77+
func (p *NoopProvider) GetNoopAccessor() Accessor {
78+
return &NoopAccessor{}
79+
}

pkg/skaffold/deploy/deploy.go

+7-2
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,14 @@ import (
2020
"context"
2121
"io"
2222

23+
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/access"
2324
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/debug"
2425
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/graph"
2526
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/log"
2627
)
2728

2829
// NoopComponentProvider is for tests
29-
var NoopComponentProvider = ComponentProvider{Logger: &log.NoopProvider{}, Debugger: &debug.NoopProvider{}}
30+
var NoopComponentProvider = ComponentProvider{Accessor: &access.NoopProvider{}, Debugger: &debug.NoopProvider{}, Logger: &log.NoopProvider{}}
3031

3132
// Deployer is the Deploy API of skaffold and responsible for deploying
3233
// the build results to a Kubernetes cluster
@@ -52,13 +53,17 @@ type Deployer interface {
5253
// GetLogger returns a Deployer's implementation of a Logger
5354
GetLogger() log.Logger
5455

56+
// GetAccessor returns a Deployer's implementation of an Accessor
57+
GetAccessor() access.Accessor
58+
5559
// TrackBuildArtifacts registers build artifacts to be tracked by a Deployer
5660
TrackBuildArtifacts([]graph.Artifact)
5761
}
5862

5963
// ComponentProvider serves as a clean way to send three providers
6064
// as params to the Deployer constructors
6165
type ComponentProvider struct {
62-
Logger log.Provider
66+
Accessor access.Provider
6367
Debugger debug.Provider
68+
Logger log.Provider
6469
}

pkg/skaffold/deploy/deploy_mux.go

+13-4
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"strconv"
2424
"strings"
2525

26+
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/access"
2627
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/constants"
2728
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/debug"
2829
eventV2 "github.com/GoogleContainerTools/skaffold/pkg/skaffold/event/v2"
@@ -39,12 +40,12 @@ import (
3940
// it collects the results and returns it in bulk.
4041
type DeployerMux []Deployer
4142

42-
func (m DeployerMux) GetLogger() log.Logger {
43-
var loggers log.LoggerMux
43+
func (m DeployerMux) GetAccessor() access.Accessor {
44+
var accessors access.AccessorMux
4445
for _, deployer := range m {
45-
loggers = append(loggers, deployer.GetLogger())
46+
accessors = append(accessors, deployer.GetAccessor())
4647
}
47-
return loggers
48+
return accessors
4849
}
4950

5051
func (m DeployerMux) GetDebugger() debug.Debugger {
@@ -55,6 +56,14 @@ func (m DeployerMux) GetDebugger() debug.Debugger {
5556
return debuggers
5657
}
5758

59+
func (m DeployerMux) GetLogger() log.Logger {
60+
var loggers log.LoggerMux
61+
for _, deployer := range m {
62+
loggers = append(loggers, deployer.GetLogger())
63+
}
64+
return loggers
65+
}
66+
5867
func (m DeployerMux) Deploy(ctx context.Context, w io.Writer, as []graph.Artifact) ([]string, error) {
5968
seenNamespaces := util.NewStringSet()
6069

pkg/skaffold/deploy/deploy_mux_test.go

+7-2
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525
"os"
2626
"testing"
2727

28+
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/access"
2829
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/debug"
2930
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/graph"
3031
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/log"
@@ -46,14 +47,18 @@ type MockDeployer struct {
4647
renderErr error
4748
}
4849

49-
func (m *MockDeployer) GetLogger() log.Logger {
50-
return &log.NoopLogger{}
50+
func (m *MockDeployer) GetAccessor() access.Accessor {
51+
return &access.NoopAccessor{}
5152
}
5253

5354
func (m *MockDeployer) GetDebugger() debug.Debugger {
5455
return &debug.NoopDebugger{}
5556
}
5657

58+
func (m *MockDeployer) GetLogger() log.Logger {
59+
return &log.NoopLogger{}
60+
}
61+
5762
func (m *MockDeployer) TrackBuildArtifacts(_ []graph.Artifact) {}
5863

5964
func (m *MockDeployer) Dependencies() ([]string, error) {

pkg/skaffold/deploy/helm/deploy.go

+13-5
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import (
3535
shell "github.com/kballard/go-shellquote"
3636
"github.com/sirupsen/logrus"
3737

38+
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/access"
3839
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/config"
3940
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/constants"
4041
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/debug"
@@ -79,8 +80,10 @@ var (
7980
type Deployer struct {
8081
*latestV1.HelmDeploy
8182

82-
logger log.Logger
83-
debugger debug.Debugger
83+
accessor access.Accessor
84+
debugger debug.Debugger
85+
logger log.Logger
86+
8487
podSelector *kubernetes.ImageList
8588
originalImages []graph.Artifact
8689

@@ -131,8 +134,9 @@ func NewDeployer(cfg Config, labels map[string]string, provider deploy.Component
131134
return &Deployer{
132135
HelmDeploy: h,
133136
podSelector: podSelector,
134-
logger: provider.Logger.GetKubernetesLogger(podSelector),
137+
accessor: provider.Accessor.GetKubernetesAccessor(podSelector),
135138
debugger: provider.Debugger.GetKubernetesDebugger(podSelector),
139+
logger: provider.Logger.GetKubernetesLogger(podSelector),
136140
originalImages: originalImages,
137141
kubeContext: cfg.GetKubeContext(),
138142
kubeConfig: cfg.GetKubeConfig(),
@@ -146,14 +150,18 @@ func NewDeployer(cfg Config, labels map[string]string, provider deploy.Component
146150
}, podSelector, nil
147151
}
148152

149-
func (h *Deployer) GetLogger() log.Logger {
150-
return h.logger
153+
func (h *Deployer) GetAccessor() access.Accessor {
154+
return h.accessor
151155
}
152156

153157
func (h *Deployer) GetDebugger() debug.Debugger {
154158
return h.debugger
155159
}
156160

161+
func (h *Deployer) GetLogger() log.Logger {
162+
return h.logger
163+
}
164+
157165
func (h *Deployer) TrackBuildArtifacts(artifacts []graph.Artifact) {
158166
deployutil.AddTagsToPodSelector(artifacts, h.originalImages, h.podSelector)
159167
h.logger.RegisterArtifacts(artifacts)

pkg/skaffold/deploy/kpt/kpt.go

+13-5
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import (
3232
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
3333
k8syaml "sigs.k8s.io/yaml"
3434

35+
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/access"
3536
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/config"
3637
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/debug"
3738
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/deploy"
@@ -69,8 +70,10 @@ const (
6970
type Deployer struct {
7071
*latestV1.KptDeploy
7172

72-
logger log.Logger
73-
debugger debug.Debugger
73+
accessor access.Accessor
74+
debugger debug.Debugger
75+
logger log.Logger
76+
7477
podSelector *kubernetes.ImageList
7578
originalImages []graph.Artifact
7679

@@ -93,8 +96,9 @@ func NewDeployer(cfg Config, labels map[string]string, provider deploy.Component
9396
return &Deployer{
9497
KptDeploy: d,
9598
podSelector: podSelector,
96-
logger: provider.Logger.GetKubernetesLogger(podSelector),
99+
accessor: provider.Accessor.GetKubernetesAccessor(podSelector),
97100
debugger: provider.Debugger.GetKubernetesDebugger(podSelector),
101+
logger: provider.Logger.GetKubernetesLogger(podSelector),
98102
insecureRegistries: cfg.GetInsecureRegistries(),
99103
labels: labels,
100104
globalConfig: cfg.GlobalConfig(),
@@ -105,14 +109,18 @@ func NewDeployer(cfg Config, labels map[string]string, provider deploy.Component
105109
}, podSelector
106110
}
107111

108-
func (k *Deployer) GetLogger() log.Logger {
109-
return k.logger
112+
func (k *Deployer) GetAccessor() access.Accessor {
113+
return k.accessor
110114
}
111115

112116
func (k *Deployer) GetDebugger() debug.Debugger {
113117
return k.debugger
114118
}
115119

120+
func (k *Deployer) GetLogger() log.Logger {
121+
return k.logger
122+
}
123+
116124
func (k *Deployer) TrackBuildArtifacts(artifacts []graph.Artifact) {
117125
deployutil.AddTagsToPodSelector(artifacts, k.originalImages, k.podSelector)
118126
k.logger.RegisterArtifacts(artifacts)

0 commit comments

Comments
 (0)