diff --git a/pkg/domain/dockerCompose/config.go b/pkg/domain/dockerCompose/config.go index f1326a8..11dbd7f 100644 --- a/pkg/domain/dockerCompose/config.go +++ b/pkg/domain/dockerCompose/config.go @@ -1002,6 +1002,28 @@ func (l *ServiceULimits) Equal(equalable Equalable) bool { } } +// MergeFirstWin adds only the attributes of the passed ServiceULimits they are +// undefined. +func (l *ServiceULimits) MergeFirstWin(serviceULimits *ServiceULimits) { + switch { + case l == nil && serviceULimits == nil: + fallthrough + case l != nil && serviceULimits == nil: + return + + // WARN: It's not possible to change the memory pointer l *ServiceULimits to a new + // initialized ServiceULimits without returning the serviceULimits it self. + // + // case l == nil && serviceULimits != nil: + // l = NewServiceULimits() + // fallthrough + + default: + l.mergeFirstWinNProc(serviceULimits.NProc) + l.mergeFirstWinNoFile(serviceULimits.NoFile) + } +} + // MergeLastWin merges adds or overwrite the attributes of the passed // ServiceULimits with the existing one. func (l *ServiceULimits) MergeLastWin(serviceULimits *ServiceULimits) { @@ -1024,6 +1046,19 @@ func (l *ServiceULimits) MergeLastWin(serviceULimits *ServiceULimits) { } } +func (l *ServiceULimits) mergeFirstWinNProc(nproc uint) { + if l.NProc != nproc { + return + } + l.NProc = nproc +} + +func (l *ServiceULimits) mergeFirstWinNoFile(noFile *ServiceULimitsNoFile) { + if !l.NoFile.Equal(noFile) { + l.NoFile.MergeFirstWin(noFile) + } +} + func (l *ServiceULimits) mergeLastWinNProc(nproc uint) { if l.NProc != nproc { l.NProc = nproc @@ -1067,6 +1102,8 @@ func (nf *ServiceULimitsNoFile) Equal(equalable Equalable) bool { } } +// MergeFirstWin adds only the attributes of the passed ServiceULimits they are +// undefined. func (nf *ServiceULimitsNoFile) MergeFirstWin(serviceULimitsNoFile *ServiceULimitsNoFile) { switch { case nf == nil && serviceULimitsNoFile == nil: @@ -1089,7 +1126,7 @@ func (nf *ServiceULimitsNoFile) MergeFirstWin(serviceULimitsNoFile *ServiceULimi } // MergeLastWin merges adds or overwrite the attributes of the passed -// ServiceULimits with the existing one. +// ServiceULimitsNoFile with the existing one. func (nf *ServiceULimitsNoFile) MergeLastWin(serviceULimitsNoFile *ServiceULimitsNoFile) { switch { case nf == nil && serviceULimitsNoFile == nil: @@ -1164,6 +1201,8 @@ func (v *Volume) Equal(equalable Equalable) bool { } } +// MergeFirstWin adds only the attributes of the passed Volume they are +// undefined. func (v *Volume) MergeFirstWin(volume *Volume) { switch { case v == nil && volume == nil: diff --git a/pkg/domain/dockerCompose/config_test.go b/pkg/domain/dockerCompose/config_test.go index bf43ca2..84dfdef 100644 --- a/pkg/domain/dockerCompose/config_test.go +++ b/pkg/domain/dockerCompose/config_test.go @@ -1899,6 +1899,54 @@ func TestServiceULimits_MergeLastWin(t *testing.T) { } } +func TestServiceULimits_MergeFirstWin(t *testing.T) { + require := require.New(t) + + testCases := []struct { + ServiceULimitsA *dockerCompose.ServiceULimits + ServiceULimitsB *dockerCompose.ServiceULimits + expectedServiceULimits *dockerCompose.ServiceULimits + }{ + { + ServiceULimitsA: nil, + ServiceULimitsB: nil, + expectedServiceULimits: nil, + }, + { + ServiceULimitsA: &dockerCompose.ServiceULimits{}, + ServiceULimitsB: nil, + expectedServiceULimits: &dockerCompose.ServiceULimits{}, + }, + { + ServiceULimitsA: &dockerCompose.ServiceULimits{ + NProc: 10, + }, + ServiceULimitsB: &dockerCompose.ServiceULimits{ + NProc: 10, + }, + expectedServiceULimits: &dockerCompose.ServiceULimits{ + NProc: 10, + }, + }, + { + ServiceULimitsA: &dockerCompose.ServiceULimits{ + NProc: 10, + }, + ServiceULimitsB: &dockerCompose.ServiceULimits{ + NProc: 20, + }, + expectedServiceULimits: &dockerCompose.ServiceULimits{ + NProc: 10, + }, + }, + } + + for i, testCase := range testCases { + testCase.ServiceULimitsA.MergeFirstWin(testCase.ServiceULimitsB) + require.True(testCase.expectedServiceULimits.Equal(testCase.ServiceULimitsA), "Failed test case %v", i) + } +} + func TestServiceULimitsNoFile_Equal(t *testing.T) { require := require.New(t)