Skip to content

Commit

Permalink
Move cluster image loading logic into Deployer (#6124)
Browse files Browse the repository at this point in the history
* Move cluster image loading logic into Deployer

* Load the correct set of images for each deployer

* Pass loader.Config as parameter to loader instead of provider

* add comments for tracked image vars
  • Loading branch information
nkubala authored Jul 7, 2021
1 parent 823896b commit 92dc3ab
Show file tree
Hide file tree
Showing 19 changed files with 518 additions and 250 deletions.
26 changes: 16 additions & 10 deletions pkg/skaffold/deploy/deploy.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,18 +23,20 @@ import (
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/access"
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/debug"
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/graph"
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/loader"
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/log"
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/status"
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/sync"
)

// NoopComponentProvider is for tests
var NoopComponentProvider = ComponentProvider{
Accessor: &access.NoopProvider{},
Debugger: &debug.NoopProvider{},
Logger: &log.NoopProvider{},
Monitor: &status.NoopProvider{},
Syncer: &sync.NoopProvider{},
Accessor: &access.NoopProvider{},
Debugger: &debug.NoopProvider{},
ImageLoader: &loader.NoopProvider{},
Logger: &log.NoopProvider{},
Monitor: &status.NoopProvider{},
Syncer: &sync.NoopProvider{},
}

// Deployer is the Deploy API of skaffold and responsible for deploying
Expand Down Expand Up @@ -70,16 +72,20 @@ type Deployer interface {
// TrackBuildArtifacts registers build artifacts to be tracked by a Deployer
TrackBuildArtifacts([]graph.Artifact)

// RegisterLocalImages tracks all local images to be loaded by the Deployer
RegisterLocalImages([]graph.Artifact)

// GetStatusMonitor returns a Deployer's implementation of a StatusMonitor
GetStatusMonitor() status.Monitor
}

// ComponentProvider serves as a clean way to send three providers
// as params to the Deployer constructors
type ComponentProvider struct {
Accessor access.Provider
Debugger debug.Provider
Logger log.Provider
Monitor status.Provider
Syncer sync.Provider
Accessor access.Provider
Debugger debug.Provider
ImageLoader loader.Provider
Logger log.Provider
Monitor status.Provider
Syncer sync.Provider
}
6 changes: 6 additions & 0 deletions pkg/skaffold/deploy/deploy_mux.go
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,12 @@ func (m DeployerMux) GetSyncer() sync.Syncer {
return syncers
}

func (m DeployerMux) RegisterLocalImages(images []graph.Artifact) {
for _, deployer := range m.deployers {
deployer.RegisterLocalImages(images)
}
}

func (m DeployerMux) Deploy(ctx context.Context, w io.Writer, as []graph.Artifact) ([]string, error) {
seenNamespaces := util.NewStringSet()

Expand Down
2 changes: 2 additions & 0 deletions pkg/skaffold/deploy/deploy_mux_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,8 @@ func (m *MockDeployer) GetSyncer() sync.Syncer {
return &sync.NoopSyncer{}
}

func (m *MockDeployer) RegisterLocalImages(_ []graph.Artifact) {}

func (m *MockDeployer) TrackBuildArtifacts(_ []graph.Artifact) {}

func (m *MockDeployer) Dependencies() ([]string, error) {
Expand Down
19 changes: 18 additions & 1 deletion pkg/skaffold/deploy/helm/deploy.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,9 +48,11 @@ import (
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/graph"
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/instrumentation"
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/kubernetes"
kloader "github.com/GoogleContainerTools/skaffold/pkg/skaffold/kubernetes/loader"
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/kubernetes/manifest"
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/kubernetes/portforward"
kstatus "github.com/GoogleContainerTools/skaffold/pkg/skaffold/kubernetes/status"
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/loader"
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/log"
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/output"
latestV1 "github.com/GoogleContainerTools/skaffold/pkg/skaffold/schema/latest/v1"
Expand Down Expand Up @@ -86,12 +88,14 @@ type Deployer struct {

accessor access.Accessor
debugger debug.Debugger
imageLoader loader.ImageLoader
logger log.Logger
statusMonitor status.Monitor
syncer sync.Syncer

podSelector *kubernetes.ImageList
originalImages []graph.Artifact
originalImages []graph.Artifact // the set of images defined in ArtifactOverrides
localImages []graph.Artifact // the set of images marked as "local" by the Runner

kubeContext string
kubeConfig string
Expand All @@ -113,6 +117,7 @@ type Deployer struct {
type Config interface {
kubectl.Config
kstatus.Config
kloader.Config
portforward.Config
IsMultiConfig() bool
}
Expand Down Expand Up @@ -144,6 +149,7 @@ func NewDeployer(cfg Config, labels map[string]string, provider deploy.Component
podSelector: podSelector,
accessor: provider.Accessor.GetKubernetesAccessor(cfg, podSelector),
debugger: provider.Debugger.GetKubernetesDebugger(podSelector),
imageLoader: provider.ImageLoader.GetKubernetesImageLoader(cfg),
logger: provider.Logger.GetKubernetesLogger(podSelector),
statusMonitor: provider.Monitor.GetKubernetesMonitor(cfg),
syncer: provider.Syncer.GetKubernetesSyncer(podSelector),
Expand Down Expand Up @@ -180,6 +186,10 @@ func (h *Deployer) GetSyncer() sync.Syncer {
return h.syncer
}

func (h *Deployer) RegisterLocalImages(images []graph.Artifact) {
h.localImages = images
}

func (h *Deployer) TrackBuildArtifacts(artifacts []graph.Artifact) {
deployutil.AddTagsToPodSelector(artifacts, h.originalImages, h.podSelector)
h.logger.RegisterArtifacts(artifacts)
Expand All @@ -192,6 +202,13 @@ func (h *Deployer) Deploy(ctx context.Context, out io.Writer, builds []graph.Art
})
defer endTrace()

childCtx, endTrace := instrumentation.StartTrace(ctx, "Deploy_LoadImages")
if err := h.imageLoader.LoadImages(childCtx, out, h.localImages, h.originalImages, builds); err != nil {
endTrace(instrumentation.TraceEndError(err))
return nil, err
}
endTrace()

logrus.Infof("Deploying with helm v%s ...", h.bV)

var dRes []types.Artifact
Expand Down
20 changes: 18 additions & 2 deletions pkg/skaffold/deploy/kpt/kpt.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,11 @@ import (
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/graph"
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/instrumentation"
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/kubernetes"
kloader "github.com/GoogleContainerTools/skaffold/pkg/skaffold/kubernetes/loader"
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/kubernetes/manifest"
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/kubernetes/portforward"
kstatus "github.com/GoogleContainerTools/skaffold/pkg/skaffold/kubernetes/status"
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/loader"
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/log"
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/output"
latestV1 "github.com/GoogleContainerTools/skaffold/pkg/skaffold/schema/latest/v1"
Expand Down Expand Up @@ -77,11 +79,13 @@ type Deployer struct {
accessor access.Accessor
logger log.Logger
debugger debug.Debugger
imageLoader loader.ImageLoader
statusMonitor status.Monitor
syncer sync.Syncer

podSelector *kubernetes.ImageList
originalImages []graph.Artifact
originalImages []graph.Artifact // the set of images parsed from the Deployer's manifest set
localImages []graph.Artifact // the set of images marked as "local" by the Runner

insecureRegistries map[string]bool
labels map[string]string
Expand All @@ -96,6 +100,7 @@ type Config interface {
kubectl.Config
kstatus.Config
portforward.Config
kloader.Config
}

// NewDeployer generates a new Deployer object contains the kptDeploy schema.
Expand All @@ -106,6 +111,7 @@ func NewDeployer(cfg Config, labels map[string]string, provider deploy.Component
podSelector: podSelector,
accessor: provider.Accessor.GetKubernetesAccessor(cfg, podSelector),
debugger: provider.Debugger.GetKubernetesDebugger(podSelector),
imageLoader: provider.ImageLoader.GetKubernetesImageLoader(cfg),
logger: provider.Logger.GetKubernetesLogger(podSelector),
statusMonitor: provider.Monitor.GetKubernetesMonitor(cfg),
syncer: provider.Syncer.GetKubernetesSyncer(podSelector),
Expand Down Expand Up @@ -139,6 +145,10 @@ func (k *Deployer) GetSyncer() sync.Syncer {
return k.syncer
}

func (k *Deployer) RegisterLocalImages(images []graph.Artifact) {
k.localImages = images
}

func (k *Deployer) TrackBuildArtifacts(artifacts []graph.Artifact) {
deployutil.AddTagsToPodSelector(artifacts, k.originalImages, k.podSelector)
k.logger.RegisterArtifacts(artifacts)
Expand Down Expand Up @@ -210,7 +220,13 @@ func (k *Deployer) Deploy(ctx context.Context, out io.Writer, builds []graph.Art
}
endTrace()

childCtx, endTrace := instrumentation.StartTrace(ctx, "Deploy_renderManifests")
childCtx, endTrace := instrumentation.StartTrace(ctx, "Deploy_loadImages")
if err := k.imageLoader.LoadImages(childCtx, out, k.localImages, k.originalImages, builds); err != nil {
endTrace(instrumentation.TraceEndError(err))
return nil, err
}

_, endTrace = instrumentation.StartTrace(ctx, "Deploy_renderManifests")
manifests, err := k.renderManifests(childCtx, builds)
if err != nil {
endTrace(instrumentation.TraceEndError(err))
Expand Down
2 changes: 2 additions & 0 deletions pkg/skaffold/deploy/kubectl/cli.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ import (
deploy "github.com/GoogleContainerTools/skaffold/pkg/skaffold/deploy/types"
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/instrumentation"
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/kubectl"
kloader "github.com/GoogleContainerTools/skaffold/pkg/skaffold/kubernetes/loader"
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/kubernetes/manifest"
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/kubernetes/portforward"
kstatus "github.com/GoogleContainerTools/skaffold/pkg/skaffold/kubernetes/status"
Expand All @@ -50,6 +51,7 @@ type CLI struct {
type Config interface {
kubectl.Config
kstatus.Config
kloader.Config
portforward.Config
deploy.Config
ForceDeploy() bool
Expand Down
32 changes: 26 additions & 6 deletions pkg/skaffold/deploy/kubectl/kubectl.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import (

"github.com/segmentio/textio"
"github.com/sirupsen/logrus"
"go.opentelemetry.io/otel/trace"

"github.com/GoogleContainerTools/skaffold/pkg/skaffold/access"
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/config"
Expand All @@ -39,6 +40,7 @@ import (
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/instrumentation"
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/kubernetes"
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/kubernetes/manifest"
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/loader"
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/log"
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/output"
latestV1 "github.com/GoogleContainerTools/skaffold/pkg/skaffold/schema/latest/v1"
Expand All @@ -52,12 +54,14 @@ type Deployer struct {
*latestV1.KubectlDeploy

accessor access.Accessor
imageLoader loader.ImageLoader
logger log.Logger
debugger debug.Debugger
statusMonitor status.Monitor
syncer sync.Syncer

originalImages []graph.Artifact
originalImages []graph.Artifact // the set of images marked as "local" by the Runner
localImages []graph.Artifact // the set of images parsed from the Deployer's manifest set
podSelector *kubernetes.ImageList
hydratedManifests []string
workingDir string
Expand Down Expand Up @@ -89,6 +93,7 @@ func NewDeployer(cfg Config, labels map[string]string, provider deploy.Component
podSelector: podSelector,
accessor: provider.Accessor.GetKubernetesAccessor(cfg, podSelector),
debugger: provider.Debugger.GetKubernetesDebugger(podSelector),
imageLoader: provider.ImageLoader.GetKubernetesImageLoader(cfg),
logger: provider.Logger.GetKubernetesLogger(podSelector),
statusMonitor: provider.Monitor.GetKubernetesMonitor(cfg),
syncer: provider.Syncer.GetKubernetesSyncer(podSelector),
Expand Down Expand Up @@ -123,6 +128,10 @@ func (k *Deployer) GetSyncer() sync.Syncer {
return k.syncer
}

func (k *Deployer) RegisterLocalImages(images []graph.Artifact) {
k.localImages = images
}

func (k *Deployer) TrackBuildArtifacts(artifacts []graph.Artifact) {
deployutil.AddTagsToPodSelector(artifacts, k.originalImages, k.podSelector)
k.logger.RegisterArtifacts(artifacts)
Expand All @@ -134,6 +143,8 @@ func (k *Deployer) Deploy(ctx context.Context, out io.Writer, builds []graph.Art
var (
manifests manifest.ManifestList
err error
childCtx context.Context
endTrace func(...trace.SpanOption)
)
instrumentation.AddAttributesToCurrentSpanFromContext(ctx, map[string]string{
"DeployerType": "kubectl",
Expand All @@ -143,7 +154,7 @@ func (k *Deployer) Deploy(ctx context.Context, out io.Writer, builds []graph.Art
// also, manually set the labels to ensure the runID is added
switch {
case len(k.hydratedManifests) > 0:
_, endTrace := instrumentation.StartTrace(ctx, "Deploy_createManifestList")
_, endTrace = instrumentation.StartTrace(ctx, "Deploy_createManifestList")
manifests, err = createManifestList(k.hydratedManifests)
if err != nil {
endTrace(instrumentation.TraceEndError(err))
Expand All @@ -152,11 +163,11 @@ func (k *Deployer) Deploy(ctx context.Context, out io.Writer, builds []graph.Art
manifests, err = manifests.SetLabels(k.labels)
endTrace()
case k.skipRender:
childCtx, endTrace := instrumentation.StartTrace(ctx, "Deploy_readManifests")
childCtx, endTrace = instrumentation.StartTrace(ctx, "Deploy_readManifests")
manifests, err = k.readManifests(childCtx, false)
endTrace()
default:
childCtx, endTrace := instrumentation.StartTrace(ctx, "Deploy_renderManifests")
childCtx, endTrace = instrumentation.StartTrace(ctx, "Deploy_renderManifests")
manifests, err = k.renderManifests(childCtx, out, builds, false)
endTrace()
}
Expand All @@ -168,15 +179,24 @@ func (k *Deployer) Deploy(ctx context.Context, out io.Writer, builds []graph.Art
if len(manifests) == 0 {
return nil, nil
}
_, endTrace := instrumentation.StartTrace(ctx, "Deploy_CollectNamespaces")
endTrace()

_, endTrace = instrumentation.StartTrace(ctx, "Deploy_LoadImages")
if err := k.imageLoader.LoadImages(childCtx, out, k.localImages, k.originalImages, builds); err != nil {
endTrace(instrumentation.TraceEndError(err))
return nil, err
}
endTrace()

_, endTrace = instrumentation.StartTrace(ctx, "Deploy_CollectNamespaces")
namespaces, err := manifests.CollectNamespaces()
if err != nil {
event.DeployInfoEvent(fmt.Errorf("could not fetch deployed resource namespace. "+
"This might cause port-forward and deploy health-check to fail: %w", err))
}
endTrace()

childCtx, endTrace := instrumentation.StartTrace(ctx, "Deploy_WaitForDeletions")
childCtx, endTrace = instrumentation.StartTrace(ctx, "Deploy_WaitForDeletions")
if err := k.kubectl.WaitForDeletions(childCtx, textio.NewPrefixWriter(out, " - "), manifests); err != nil {
endTrace(instrumentation.TraceEndError(err))
return nil, err
Expand Down
17 changes: 16 additions & 1 deletion pkg/skaffold/deploy/kustomize/kustomize.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ import (
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/instrumentation"
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/kubernetes"
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/kubernetes/manifest"
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/loader"
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/log"
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/output"
latestV1 "github.com/GoogleContainerTools/skaffold/pkg/skaffold/schema/latest/v1"
Expand Down Expand Up @@ -104,12 +105,14 @@ type Deployer struct {

accessor access.Accessor
logger log.Logger
imageLoader loader.ImageLoader
debugger debug.Debugger
statusMonitor status.Monitor
syncer sync.Syncer

podSelector *kubernetes.ImageList
originalImages []graph.Artifact
originalImages []graph.Artifact // the set of images parsed from the Deployer's manifest set
localImages []graph.Artifact // the set of images marked as "local" by the Runner

kubectl kubectl.CLI
insecureRegistries map[string]bool
Expand Down Expand Up @@ -138,6 +141,7 @@ func NewDeployer(cfg kubectl.Config, labels map[string]string, provider deploy.C
podSelector: podSelector,
accessor: provider.Accessor.GetKubernetesAccessor(cfg, podSelector),
debugger: provider.Debugger.GetKubernetesDebugger(podSelector),
imageLoader: provider.ImageLoader.GetKubernetesImageLoader(cfg),
logger: provider.Logger.GetKubernetesLogger(podSelector),
statusMonitor: provider.Monitor.GetKubernetesMonitor(cfg),
syncer: provider.Syncer.GetKubernetesSyncer(podSelector),
Expand Down Expand Up @@ -169,6 +173,10 @@ func (k *Deployer) GetSyncer() sync.Syncer {
return k.syncer
}

func (k *Deployer) RegisterLocalImages(images []graph.Artifact) {
k.localImages = images
}

func (k *Deployer) TrackBuildArtifacts(artifacts []graph.Artifact) {
deployutil.AddTagsToPodSelector(artifacts, k.originalImages, k.podSelector)
k.logger.RegisterArtifacts(artifacts)
Expand Down Expand Up @@ -210,6 +218,13 @@ func (k *Deployer) Deploy(ctx context.Context, out io.Writer, builds []graph.Art
}
endTrace()

childCtx, endTrace = instrumentation.StartTrace(ctx, "Deploy_LoadImages")
if err := k.imageLoader.LoadImages(childCtx, out, k.localImages, k.originalImages, builds); err != nil {
endTrace(instrumentation.TraceEndError(err))
return nil, err
}
endTrace()

_, endTrace = instrumentation.StartTrace(ctx, "Deploy_CollectNamespaces")
namespaces, err := manifests.CollectNamespaces()
if err != nil {
Expand Down
Loading

0 comments on commit 92dc3ab

Please sign in to comment.