You've already forked dcmerge
							
							fix(dockerCompose): add ServiceDeployResources.MergeFirstWin()
This commit is contained in:
		@@ -798,6 +798,27 @@ func (sdr *ServiceDeployResources) Equal(equalable Equalable) bool {
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MergeFirstWin adds only attributes of the passed serviceDeployResources if
 | 
			
		||||
// they are not already exists.
 | 
			
		||||
func (sdr *ServiceDeployResources) MergeFirstWin(serviceDeployResources *ServiceDeployResources) {
 | 
			
		||||
	switch {
 | 
			
		||||
	case sdr == nil && serviceDeployResources == nil:
 | 
			
		||||
		fallthrough
 | 
			
		||||
	case sdr != nil && serviceDeployResources == nil:
 | 
			
		||||
		return
 | 
			
		||||
 | 
			
		||||
	// WARN: It's not possible to change the memory pointer sdr *ServiceDeployResources
 | 
			
		||||
	// to a new initialized serviceDeployResources without returning the
 | 
			
		||||
	// serviceDeployResources it self.
 | 
			
		||||
	case sdr == nil && serviceDeployResources != nil:
 | 
			
		||||
		sdr = NewServiceDeployResources()
 | 
			
		||||
		fallthrough
 | 
			
		||||
	default:
 | 
			
		||||
		sdr.mergeFirstWinLimits(serviceDeployResources.Limits)
 | 
			
		||||
		sdr.mergeFirstWinReservations(serviceDeployResources.Reservations)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MergeLastWin merges adds or overwrite the attributes of the passed
 | 
			
		||||
// serviceDeployResources with the existing one.
 | 
			
		||||
func (sdr *ServiceDeployResources) MergeLastWin(serviceDeployResources *ServiceDeployResources) {
 | 
			
		||||
@@ -819,6 +840,32 @@ func (sdr *ServiceDeployResources) MergeLastWin(serviceDeployResources *ServiceD
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (sdr *ServiceDeployResources) mergeFirstWinLimits(limits *ServiceDeployResourcesLimits) {
 | 
			
		||||
	switch {
 | 
			
		||||
	case sdr.Limits == nil && limits != nil:
 | 
			
		||||
		sdr.Limits = limits
 | 
			
		||||
	case sdr.Limits != nil && limits == nil:
 | 
			
		||||
		fallthrough
 | 
			
		||||
	case sdr.Limits == nil && limits == nil:
 | 
			
		||||
		return
 | 
			
		||||
	default:
 | 
			
		||||
		sdr.Limits.MergeFirstWin(limits)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (sdr *ServiceDeployResources) mergeFirstWinReservations(reservations *ServiceDeployResourcesLimits) {
 | 
			
		||||
	switch {
 | 
			
		||||
	case sdr.Reservations == nil && reservations != nil:
 | 
			
		||||
		sdr.Reservations = reservations
 | 
			
		||||
	case sdr.Reservations != nil && reservations == nil:
 | 
			
		||||
		fallthrough
 | 
			
		||||
	case sdr.Reservations == nil && reservations == nil:
 | 
			
		||||
		return
 | 
			
		||||
	default:
 | 
			
		||||
		sdr.Reservations.MergeFirstWin(reservations)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (sdr *ServiceDeployResources) mergeLastWinLimits(limits *ServiceDeployResourcesLimits) {
 | 
			
		||||
	switch {
 | 
			
		||||
	case sdr.Limits == nil && limits != nil:
 | 
			
		||||
@@ -991,7 +1038,8 @@ func (sn *ServiceNetwork) MergeFirstWin(serviceNetwork *ServiceNetwork) {
 | 
			
		||||
	// 	fallthrough
 | 
			
		||||
 | 
			
		||||
	case sn == nil && serviceNetwork != nil:
 | 
			
		||||
		sn = serviceNetwork
 | 
			
		||||
		sn = NewServiceNetwork()
 | 
			
		||||
		fallthrough
 | 
			
		||||
	default:
 | 
			
		||||
		sn.mergeFirstWinAliases(serviceNetwork.Aliases)
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -1543,6 +1543,155 @@ func TestServiceDeployResources_MergeLastWin(t *testing.T) {
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestServiceDeployResources_MergeFirstWin(t *testing.T) {
 | 
			
		||||
	require := require.New(t)
 | 
			
		||||
 | 
			
		||||
	testCases := []struct {
 | 
			
		||||
		serviceDeploymentResourcesA        *dockerCompose.ServiceDeployResources
 | 
			
		||||
		serviceDeploymentResourcesB        *dockerCompose.ServiceDeployResources
 | 
			
		||||
		expectedServiceDeploymentResources *dockerCompose.ServiceDeployResources
 | 
			
		||||
	}{
 | 
			
		||||
		{
 | 
			
		||||
			serviceDeploymentResourcesA:        nil,
 | 
			
		||||
			serviceDeploymentResourcesB:        nil,
 | 
			
		||||
			expectedServiceDeploymentResources: nil,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			serviceDeploymentResourcesA: &dockerCompose.ServiceDeployResources{
 | 
			
		||||
				Limits: nil,
 | 
			
		||||
			},
 | 
			
		||||
			serviceDeploymentResourcesB: &dockerCompose.ServiceDeployResources{
 | 
			
		||||
				Limits: &dockerCompose.ServiceDeployResourcesLimits{
 | 
			
		||||
					CPUs:   "1",
 | 
			
		||||
					Memory: "500",
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			expectedServiceDeploymentResources: &dockerCompose.ServiceDeployResources{
 | 
			
		||||
				Limits: &dockerCompose.ServiceDeployResourcesLimits{
 | 
			
		||||
					CPUs:   "1",
 | 
			
		||||
					Memory: "500",
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			serviceDeploymentResourcesA: &dockerCompose.ServiceDeployResources{
 | 
			
		||||
				Limits: &dockerCompose.ServiceDeployResourcesLimits{
 | 
			
		||||
					CPUs:   "1",
 | 
			
		||||
					Memory: "500",
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			serviceDeploymentResourcesB: &dockerCompose.ServiceDeployResources{
 | 
			
		||||
				Limits: nil,
 | 
			
		||||
			},
 | 
			
		||||
			expectedServiceDeploymentResources: &dockerCompose.ServiceDeployResources{
 | 
			
		||||
				Limits: &dockerCompose.ServiceDeployResourcesLimits{
 | 
			
		||||
					CPUs:   "1",
 | 
			
		||||
					Memory: "500",
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			serviceDeploymentResourcesA: &dockerCompose.ServiceDeployResources{
 | 
			
		||||
				Limits: &dockerCompose.ServiceDeployResourcesLimits{
 | 
			
		||||
					CPUs:   "1",
 | 
			
		||||
					Memory: "500",
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			serviceDeploymentResourcesB: &dockerCompose.ServiceDeployResources{
 | 
			
		||||
				Limits: &dockerCompose.ServiceDeployResourcesLimits{
 | 
			
		||||
					CPUs:   "2",
 | 
			
		||||
					Memory: "1000",
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			expectedServiceDeploymentResources: &dockerCompose.ServiceDeployResources{
 | 
			
		||||
				Limits: &dockerCompose.ServiceDeployResourcesLimits{
 | 
			
		||||
					CPUs:   "1",
 | 
			
		||||
					Memory: "500",
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			serviceDeploymentResourcesA: &dockerCompose.ServiceDeployResources{
 | 
			
		||||
				Reservations: nil,
 | 
			
		||||
			},
 | 
			
		||||
			serviceDeploymentResourcesB: &dockerCompose.ServiceDeployResources{
 | 
			
		||||
				Reservations: &dockerCompose.ServiceDeployResourcesLimits{
 | 
			
		||||
					CPUs:   "1",
 | 
			
		||||
					Memory: "500",
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			expectedServiceDeploymentResources: &dockerCompose.ServiceDeployResources{
 | 
			
		||||
				Reservations: &dockerCompose.ServiceDeployResourcesLimits{
 | 
			
		||||
					CPUs:   "1",
 | 
			
		||||
					Memory: "500",
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			serviceDeploymentResourcesA: &dockerCompose.ServiceDeployResources{
 | 
			
		||||
				Reservations: &dockerCompose.ServiceDeployResourcesLimits{
 | 
			
		||||
					CPUs:   "1",
 | 
			
		||||
					Memory: "500",
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			serviceDeploymentResourcesB: &dockerCompose.ServiceDeployResources{
 | 
			
		||||
				Reservations: nil,
 | 
			
		||||
			},
 | 
			
		||||
			expectedServiceDeploymentResources: &dockerCompose.ServiceDeployResources{
 | 
			
		||||
				Reservations: &dockerCompose.ServiceDeployResourcesLimits{
 | 
			
		||||
					CPUs:   "1",
 | 
			
		||||
					Memory: "500",
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			serviceDeploymentResourcesA: &dockerCompose.ServiceDeployResources{
 | 
			
		||||
				Reservations: &dockerCompose.ServiceDeployResourcesLimits{
 | 
			
		||||
					CPUs:   "1",
 | 
			
		||||
					Memory: "500",
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			serviceDeploymentResourcesB: &dockerCompose.ServiceDeployResources{
 | 
			
		||||
				Reservations: &dockerCompose.ServiceDeployResourcesLimits{
 | 
			
		||||
					CPUs:   "2",
 | 
			
		||||
					Memory: "1000",
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			expectedServiceDeploymentResources: &dockerCompose.ServiceDeployResources{
 | 
			
		||||
				Reservations: &dockerCompose.ServiceDeployResourcesLimits{
 | 
			
		||||
					CPUs:   "1",
 | 
			
		||||
					Memory: "500",
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			serviceDeploymentResourcesA: &dockerCompose.ServiceDeployResources{
 | 
			
		||||
				Reservations: &dockerCompose.ServiceDeployResourcesLimits{
 | 
			
		||||
					CPUs:   "",
 | 
			
		||||
					Memory: "",
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			serviceDeploymentResourcesB: &dockerCompose.ServiceDeployResources{
 | 
			
		||||
				Reservations: &dockerCompose.ServiceDeployResourcesLimits{
 | 
			
		||||
					CPUs:   "1",
 | 
			
		||||
					Memory: "500",
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			expectedServiceDeploymentResources: &dockerCompose.ServiceDeployResources{
 | 
			
		||||
				Reservations: &dockerCompose.ServiceDeployResourcesLimits{
 | 
			
		||||
					CPUs:   "1",
 | 
			
		||||
					Memory: "500",
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for i, testCase := range testCases {
 | 
			
		||||
		testCase.serviceDeploymentResourcesA.MergeFirstWin(testCase.serviceDeploymentResourcesB)
 | 
			
		||||
		require.True(testCase.expectedServiceDeploymentResources.Equal(testCase.serviceDeploymentResourcesA), "Failed test case %v", i)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestServiceDeployResourcesLimits_Equal(t *testing.T) {
 | 
			
		||||
	require := require.New(t)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user