github.com/GoogleContainerTools/skaffold@v1.39.18/pkg/skaffold/deploy/component/kubernetes/component.go (about)

     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 kubernetes
    18  
    19  import (
    20  	gosync "sync"
    21  
    22  	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/access"
    23  	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/config"
    24  	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/debug"
    25  	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/deploy/label"
    26  	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/kubectl"
    27  	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/kubernetes"
    28  	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/kubernetes/debugging"
    29  	k8sloader "github.com/GoogleContainerTools/skaffold/pkg/skaffold/kubernetes/loader"
    30  	k8slogger "github.com/GoogleContainerTools/skaffold/pkg/skaffold/kubernetes/logger"
    31  	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/kubernetes/portforward"
    32  	k8sstatus "github.com/GoogleContainerTools/skaffold/pkg/skaffold/kubernetes/status"
    33  	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/loader"
    34  	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/sync"
    35  )
    36  
    37  // For testing
    38  var (
    39  	NewAccessor    = newAccessor
    40  	NewDebugger    = newDebugger
    41  	NewImageLoader = newImageLoader
    42  	NewLogger      = newLogger
    43  	NewMonitor     = newMonitor
    44  	NewSyncer      = newSyncer
    45  
    46  	accessLock  gosync.Mutex
    47  	k8sAccessor map[string]access.Accessor
    48  
    49  	monitorLock gosync.Mutex
    50  	k8sMonitor  map[string]k8sstatus.Monitor
    51  )
    52  
    53  func newAccessor(cfg portforward.Config, kubeContext string, cli *kubectl.CLI, podSelector kubernetes.PodSelector, labeller label.Config, namespaces *[]string) access.Accessor {
    54  	accessLock.Lock()
    55  	defer accessLock.Unlock()
    56  	if k8sAccessor == nil {
    57  		k8sAccessor = make(map[string]access.Accessor)
    58  	}
    59  	if k8sAccessor[kubeContext] == nil {
    60  		if !cfg.PortForwardOptions().Enabled() {
    61  			k8sAccessor[kubeContext] = &access.NoopAccessor{}
    62  		}
    63  		m := portforward.NewForwarderManager(cli, podSelector, labeller.RunIDSelector(), cfg.Mode(), namespaces, cfg.PortForwardOptions(), cfg.PortForwardResources())
    64  		if m == nil {
    65  			k8sAccessor[kubeContext] = &access.NoopAccessor{}
    66  		} else {
    67  			k8sAccessor[kubeContext] = m
    68  		}
    69  	} else if accessor, ok := k8sAccessor[kubeContext].(*portforward.ForwarderManager); ok {
    70  		accessor.AddPodForwarder(cli, podSelector, cfg.Mode(), cfg.PortForwardOptions())
    71  	}
    72  
    73  	return k8sAccessor[kubeContext]
    74  }
    75  
    76  func newDebugger(mode config.RunMode, podSelector kubernetes.PodSelector, namespaces *[]string, kubeContext string) debug.Debugger {
    77  	if mode != config.RunModes.Debug {
    78  		return &debug.NoopDebugger{}
    79  	}
    80  
    81  	return debugging.NewContainerManager(podSelector, namespaces, kubeContext)
    82  }
    83  
    84  func newImageLoader(cfg k8sloader.Config, cli *kubectl.CLI) loader.ImageLoader {
    85  	if cfg.LoadImages() {
    86  		return k8sloader.NewImageLoader(cfg.GetKubeContext(), cli)
    87  	}
    88  	return &loader.NoopImageLoader{}
    89  }
    90  
    91  func newLogger(config k8slogger.Config, cli *kubectl.CLI, podSelector kubernetes.PodSelector, namespaces *[]string) k8slogger.Logger {
    92  	return k8slogger.NewLogAggregator(cli, podSelector, namespaces, config)
    93  }
    94  
    95  func newMonitor(cfg k8sstatus.Config, kubeContext string, labeller *label.DefaultLabeller, namespaces *[]string) k8sstatus.Monitor {
    96  	monitorLock.Lock()
    97  	defer monitorLock.Unlock()
    98  	if k8sMonitor == nil {
    99  		k8sMonitor = make(map[string]k8sstatus.Monitor)
   100  	}
   101  	if k8sMonitor[kubeContext] == nil {
   102  		enabled := cfg.StatusCheck()
   103  		if enabled != nil && !*enabled { // assume disabled only if explicitly set to false
   104  			k8sMonitor[kubeContext] = &k8sstatus.NoopMonitor{}
   105  		} else {
   106  			k8sMonitor[kubeContext] = k8sstatus.NewStatusMonitor(cfg, labeller, namespaces)
   107  		}
   108  	}
   109  	return k8sMonitor[kubeContext]
   110  }
   111  
   112  func newSyncer(cli *kubectl.CLI, namespaces *[]string, formatter k8slogger.Formatter) sync.Syncer {
   113  	return sync.NewPodSyncer(cli, namespaces, formatter)
   114  }