Remove implementation details (CleanUp) from the interface.
The CleanUp method is instead called directly from the implementation, when required. Test updated in a quick way since the mock we're using does not support AtLeast(1) - thus Times(2).
This commit is contained in:
		
							parent
							
								
									0b94471727
								
							
						
					
					
						commit
						854fcc1ff8
					
				| 
						 | 
					@ -46,8 +46,6 @@ type AutoscalerOptions struct {
 | 
				
			||||||
type Autoscaler interface {
 | 
					type Autoscaler interface {
 | 
				
			||||||
	// RunOnce represents an iteration in the control-loop of CA
 | 
						// RunOnce represents an iteration in the control-loop of CA
 | 
				
			||||||
	RunOnce(currentTime time.Time) errors.AutoscalerError
 | 
						RunOnce(currentTime time.Time) errors.AutoscalerError
 | 
				
			||||||
	// CleanUp represents a clean-up required before the first invocation of RunOnce
 | 
					 | 
				
			||||||
	CleanUp()
 | 
					 | 
				
			||||||
	// CloudProvider returns the cloud provider associated to this autoscaler
 | 
						// CloudProvider returns the cloud provider associated to this autoscaler
 | 
				
			||||||
	CloudProvider() cloudprovider.CloudProvider
 | 
						CloudProvider() cloudprovider.CloudProvider
 | 
				
			||||||
	// ExitCleanUp is a clean-up performed just before process termination.
 | 
						// ExitCleanUp is a clean-up performed just before process termination.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -47,11 +47,6 @@ func NewDynamicAutoscaler(autoscalerBuilder AutoscalerBuilder, configFetcher dyn
 | 
				
			||||||
	}, nil
 | 
						}, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// CleanUp does the work required before all the iterations of a dynamic autoscaler run
 | 
					 | 
				
			||||||
func (a *DynamicAutoscaler) CleanUp() {
 | 
					 | 
				
			||||||
	a.autoscaler.CleanUp()
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// CloudProvider returns the cloud provider associated to this autoscaler
 | 
					// CloudProvider returns the cloud provider associated to this autoscaler
 | 
				
			||||||
func (a *DynamicAutoscaler) CloudProvider() cloudprovider.CloudProvider {
 | 
					func (a *DynamicAutoscaler) CloudProvider() cloudprovider.CloudProvider {
 | 
				
			||||||
	return a.autoscaler.CloudProvider()
 | 
						return a.autoscaler.CloudProvider()
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -34,10 +34,6 @@ func (m *AutoscalerMock) RunOnce(currentTime time.Time) errors.AutoscalerError {
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (m *AutoscalerMock) CleanUp() {
 | 
					 | 
				
			||||||
	m.Called()
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (m *AutoscalerMock) CloudProvider() cloudprovider.CloudProvider {
 | 
					func (m *AutoscalerMock) CloudProvider() cloudprovider.CloudProvider {
 | 
				
			||||||
	args := m.Called()
 | 
						args := m.Called()
 | 
				
			||||||
	return args.Get(0).(cloudprovider.CloudProvider)
 | 
						return args.Get(0).(cloudprovider.CloudProvider)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -59,6 +59,7 @@ type StaticAutoscaler struct {
 | 
				
			||||||
	lastScaleDownFailTime   time.Time
 | 
						lastScaleDownFailTime   time.Time
 | 
				
			||||||
	scaleDown               *ScaleDown
 | 
						scaleDown               *ScaleDown
 | 
				
			||||||
	podListProcessor        pods.PodListProcessor
 | 
						podListProcessor        pods.PodListProcessor
 | 
				
			||||||
 | 
						initialized             bool
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// NewStaticAutoscaler creates an instance of Autoscaler filled with provided parameters
 | 
					// NewStaticAutoscaler creates an instance of Autoscaler filled with provided parameters
 | 
				
			||||||
| 
						 | 
					@ -91,12 +92,18 @@ func NewStaticAutoscaler(opts context.AutoscalingOptions, predicateChecker *simu
 | 
				
			||||||
	}, nil
 | 
						}, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// CleanUp cleans up ToBeDeleted taints added by the previously run and then failed CA
 | 
					// cleanUpIfRequired removes ToBeDeleted taints added by a previous run of CA
 | 
				
			||||||
func (a *StaticAutoscaler) CleanUp() {
 | 
					// the taints are removed only once per runtime
 | 
				
			||||||
 | 
					func (a *StaticAutoscaler) cleanUpIfRequired() {
 | 
				
			||||||
 | 
						if a.initialized {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// CA can die at any time. Removing taints that might have been left from the previous run.
 | 
						// CA can die at any time. Removing taints that might have been left from the previous run.
 | 
				
			||||||
	if readyNodes, err := a.ReadyNodeLister().List(); err != nil {
 | 
						if readyNodes, err := a.ReadyNodeLister().List(); err != nil {
 | 
				
			||||||
		cleanToBeDeleted(readyNodes, a.AutoscalingContext.ClientSet, a.Recorder)
 | 
							cleanToBeDeleted(readyNodes, a.AutoscalingContext.ClientSet, a.Recorder)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						a.initialized = true
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// CloudProvider returns the cloud provider associated to this autoscaler
 | 
					// CloudProvider returns the cloud provider associated to this autoscaler
 | 
				
			||||||
| 
						 | 
					@ -106,6 +113,8 @@ func (a *StaticAutoscaler) CloudProvider() cloudprovider.CloudProvider {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// RunOnce iterates over node groups and scales them up/down if necessary
 | 
					// RunOnce iterates over node groups and scales them up/down if necessary
 | 
				
			||||||
func (a *StaticAutoscaler) RunOnce(currentTime time.Time) errors.AutoscalerError {
 | 
					func (a *StaticAutoscaler) RunOnce(currentTime time.Time) errors.AutoscalerError {
 | 
				
			||||||
 | 
						a.cleanUpIfRequired()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	readyNodeLister := a.ReadyNodeLister()
 | 
						readyNodeLister := a.ReadyNodeLister()
 | 
				
			||||||
	allNodeLister := a.AllNodeLister()
 | 
						allNodeLister := a.AllNodeLister()
 | 
				
			||||||
	unschedulablePodLister := a.UnschedulablePodLister()
 | 
						unschedulablePodLister := a.UnschedulablePodLister()
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -200,7 +200,8 @@ func TestStaticAutoscalerRunOnce(t *testing.T) {
 | 
				
			||||||
		lastScaleUpTime:       time.Now(),
 | 
							lastScaleUpTime:       time.Now(),
 | 
				
			||||||
		lastScaleDownFailTime: time.Now(),
 | 
							lastScaleDownFailTime: time.Now(),
 | 
				
			||||||
		scaleDown:             sd,
 | 
							scaleDown:             sd,
 | 
				
			||||||
		podListProcessor:      pods.NewDefaultPodListProcessor()}
 | 
							podListProcessor:      pods.NewDefaultPodListProcessor(),
 | 
				
			||||||
 | 
							initialized:           true}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// MaxNodesTotal reached.
 | 
						// MaxNodesTotal reached.
 | 
				
			||||||
	readyNodeListerMock.On("List").Return([]*apiv1.Node{n1}, nil).Once()
 | 
						readyNodeListerMock.On("List").Return([]*apiv1.Node{n1}, nil).Once()
 | 
				
			||||||
| 
						 | 
					@ -379,7 +380,8 @@ func TestStaticAutoscalerRunOnceWithAutoprovisionedEnabled(t *testing.T) {
 | 
				
			||||||
		lastScaleUpTime:       time.Now(),
 | 
							lastScaleUpTime:       time.Now(),
 | 
				
			||||||
		lastScaleDownFailTime: time.Now(),
 | 
							lastScaleDownFailTime: time.Now(),
 | 
				
			||||||
		scaleDown:             sd,
 | 
							scaleDown:             sd,
 | 
				
			||||||
		podListProcessor:      pods.NewDefaultPodListProcessor()}
 | 
							podListProcessor:      pods.NewDefaultPodListProcessor(),
 | 
				
			||||||
 | 
							initialized:           true}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Scale up.
 | 
						// Scale up.
 | 
				
			||||||
	readyNodeListerMock.On("List").Return([]*apiv1.Node{n1}, nil).Once()
 | 
						readyNodeListerMock.On("List").Return([]*apiv1.Node{n1}, nil).Once()
 | 
				
			||||||
| 
						 | 
					@ -519,7 +521,7 @@ func TestStaticAutoscalerRunOnceWithALongUnregisteredNode(t *testing.T) {
 | 
				
			||||||
		podListProcessor:      pods.NewDefaultPodListProcessor()}
 | 
							podListProcessor:      pods.NewDefaultPodListProcessor()}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Scale up.
 | 
						// Scale up.
 | 
				
			||||||
	readyNodeListerMock.On("List").Return([]*apiv1.Node{n1}, nil).Once()
 | 
						readyNodeListerMock.On("List").Return([]*apiv1.Node{n1}, nil).Times(2) // due to initialized=false
 | 
				
			||||||
	allNodeListerMock.On("List").Return([]*apiv1.Node{n1}, nil).Once()
 | 
						allNodeListerMock.On("List").Return([]*apiv1.Node{n1}, nil).Once()
 | 
				
			||||||
	scheduledPodMock.On("List").Return([]*apiv1.Pod{p1}, nil).Once()
 | 
						scheduledPodMock.On("List").Return([]*apiv1.Pod{p1}, nil).Once()
 | 
				
			||||||
	unschedulablePodMock.On("List").Return([]*apiv1.Pod{p2}, nil).Once()
 | 
						unschedulablePodMock.On("List").Return([]*apiv1.Pod{p2}, nil).Once()
 | 
				
			||||||
| 
						 | 
					@ -656,7 +658,7 @@ func TestStaticAutoscalerRunOncePodsWithPriorities(t *testing.T) {
 | 
				
			||||||
		podListProcessor:      pods.NewDefaultPodListProcessor()}
 | 
							podListProcessor:      pods.NewDefaultPodListProcessor()}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Scale up
 | 
						// Scale up
 | 
				
			||||||
	readyNodeListerMock.On("List").Return([]*apiv1.Node{n1, n2, n3}, nil).Once()
 | 
						readyNodeListerMock.On("List").Return([]*apiv1.Node{n1, n2, n3}, nil).Times(2) // due to initialized=false
 | 
				
			||||||
	allNodeListerMock.On("List").Return([]*apiv1.Node{n1, n2, n3}, nil).Once()
 | 
						allNodeListerMock.On("List").Return([]*apiv1.Node{n1, n2, n3}, nil).Once()
 | 
				
			||||||
	scheduledPodMock.On("List").Return([]*apiv1.Pod{p1, p2, p3}, nil).Once()
 | 
						scheduledPodMock.On("List").Return([]*apiv1.Pod{p1, p2, p3}, nil).Once()
 | 
				
			||||||
	unschedulablePodMock.On("List").Return([]*apiv1.Pod{p4, p5, p6}, nil).Once()
 | 
						unschedulablePodMock.On("List").Return([]*apiv1.Pod{p4, p5, p6}, nil).Once()
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -261,7 +261,6 @@ func run(healthCheck *metrics.HealthCheck) {
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		glog.Fatalf("Failed to create autoscaler: %v", err)
 | 
							glog.Fatalf("Failed to create autoscaler: %v", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	autoscaler.CleanUp()
 | 
					 | 
				
			||||||
	registerSignalHandlers(autoscaler)
 | 
						registerSignalHandlers(autoscaler)
 | 
				
			||||||
	healthCheck.StartMonitoring()
 | 
						healthCheck.StartMonitoring()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue