func (pair configPair) Equal() bool { conf := pair.Config cont := pair.Container if (conf.Memory / 1024 / 1024) != int64(cont.Memory) { return false } if conf.CPUShares != int64(cont.Cpu) { return false } if conf.Image != cont.Image { return false } if cont.EntryPoint == nil && !utils.StrSliceEqual(conf.Entrypoint, []string{}) { return false } if cont.EntryPoint != nil && !utils.StrSliceEqual(conf.Entrypoint, *cont.EntryPoint) { return false } if !utils.StrSliceEqual(cont.Command, conf.Cmd) { return false } // TODO, Volumes, VolumesFrom, ExposedPorts return true }
// ContainerOverridesEqual determines if two container overrides are equal func ContainerOverridesEqual(lhs, rhs api.ContainerOverrides) bool { if lhs.Command == nil || rhs.Command == nil { if lhs.Command != rhs.Command { return false } } else { if !utils.StrSliceEqual(*lhs.Command, *rhs.Command) { return false } } return true }
// ContainersEqual determines if this container is equal to another container. // This is not exact equality, but logical equality. // TODO: use reflection along with `equal:"unordered"` annotations on slices to // replace this verbose code (low priority, but would be fun) func ContainersEqual(lhs, rhs *api.Container) bool { if lhs == rhs { return true } if lhs.Name != rhs.Name || lhs.Image != rhs.Image { return false } if !utils.StrSliceEqual(lhs.Command, rhs.Command) { return false } if lhs.Cpu != rhs.Cpu || lhs.Memory != rhs.Memory { return false } // Order doesn't matter if !utils.SlicesDeepEqual(lhs.Links, rhs.Links) { return false } if !utils.SlicesDeepEqual(lhs.VolumesFrom, rhs.VolumesFrom) { return false } if !utils.SlicesDeepEqual(lhs.MountPoints, rhs.MountPoints) { return false } if !utils.SlicesDeepEqual(lhs.Ports, rhs.Ports) { return false } if !utils.SlicesDeepEqual(lhs.KnownPortBindings, rhs.KnownPortBindings) { return false } if lhs.Essential != rhs.Essential { return false } if lhs.EntryPoint == nil || rhs.EntryPoint == nil { if lhs.EntryPoint != rhs.EntryPoint { return false } // both nil } else { if !utils.StrSliceEqual(*lhs.EntryPoint, *rhs.EntryPoint) { return false } } if !reflect.DeepEqual(lhs.Environment, rhs.Environment) { return false } if !ContainerOverridesEqual(lhs.Overrides, rhs.Overrides) { return false } if lhs.DesiredStatus != rhs.DesiredStatus || lhs.KnownStatus != rhs.KnownStatus { return false } if lhs.AppliedStatus != rhs.AppliedStatus { return false } if lhs.KnownExitCode == nil || rhs.KnownExitCode == nil { if lhs.KnownExitCode != nil || rhs.KnownExitCode != nil { return false } } else { if *lhs.KnownExitCode != *rhs.KnownExitCode { return false } } return true }