Diff CheckRestart objects

This commit is contained in:
Michael Schurter 2017-09-28 14:06:18 -07:00
parent 77ae328fbe
commit f9b66cbb60
2 changed files with 211 additions and 0 deletions

View file

@ -598,6 +598,11 @@ func serviceCheckDiff(old, new *ServiceCheck, contextual bool) *ObjectDiff {
diff.Objects = append(diff.Objects, headerDiff)
}
// Diff check_restart
if crDiff := checkRestartDiff(old.CheckRestart, new.CheckRestart, contextual); crDiff != nil {
diff.Objects = append(diff.Objects, crDiff)
}
return diff
}
@ -621,6 +626,26 @@ func checkHeaderDiff(old, new map[string][]string, contextual bool) *ObjectDiff
return diff
}
// checkRestartDiff returns the diff of two service check check_restart
// objects. If contextual diff is enabled, all fields will be returned, even if
// no diff occurred.
func checkRestartDiff(old, new *CheckRestart, contextual bool) *ObjectDiff {
diff := &ObjectDiff{Type: DiffTypeNone, Name: "CheckRestart"}
if reflect.DeepEqual(old, new) {
return nil
} else if old == nil {
diff.Type = DiffTypeAdded
} else if new == nil {
diff.Type = DiffTypeDeleted
} else {
diff.Type = DiffTypeEdited
}
oldFlat := flatmap.Flatten(old, nil, false)
newFlat := flatmap.Flatten(new, nil, false)
diff.Fields = fieldDiffs(oldFlat, newFlat, contextual)
return diff
}
// serviceCheckDiffs diffs a set of service checks. If contextual diff is
// enabled, unchanged fields within objects nested in the tasks will be
// returned.

View file

@ -3573,6 +3573,192 @@ func TestTaskDiff(t *testing.T) {
},
},
},
{
Name: "CheckRestart edited",
Old: &Task{
Services: []*Service{
{
Name: "foo",
Checks: []*ServiceCheck{
{
Name: "foo",
Type: "http",
Command: "foo",
Args: []string{"foo"},
Path: "foo",
Protocol: "http",
Interval: 1 * time.Second,
Timeout: 1 * time.Second,
},
{
Name: "bar",
Type: "http",
Command: "foo",
Args: []string{"foo"},
Path: "foo",
Protocol: "http",
Interval: 1 * time.Second,
Timeout: 1 * time.Second,
CheckRestart: &CheckRestart{
Limit: 2,
Grace: 2 * time.Second,
},
},
{
Name: "baz",
Type: "http",
Command: "foo",
Args: []string{"foo"},
Path: "foo",
Protocol: "http",
Interval: 1 * time.Second,
Timeout: 1 * time.Second,
CheckRestart: &CheckRestart{
Limit: 3,
Grace: 3 * time.Second,
},
},
},
},
},
},
New: &Task{
Services: []*Service{
{
Name: "foo",
Checks: []*ServiceCheck{
{
Name: "foo",
Type: "http",
Command: "foo",
Args: []string{"foo"},
Path: "foo",
Protocol: "http",
Interval: 1 * time.Second,
Timeout: 1 * time.Second,
CheckRestart: &CheckRestart{
Limit: 1,
Grace: 1 * time.Second,
},
},
{
Name: "bar",
Type: "http",
Command: "foo",
Args: []string{"foo"},
Path: "foo",
Protocol: "http",
Interval: 1 * time.Second,
Timeout: 1 * time.Second,
},
{
Name: "baz",
Type: "http",
Command: "foo",
Args: []string{"foo"},
Path: "foo",
Protocol: "http",
Interval: 1 * time.Second,
Timeout: 1 * time.Second,
CheckRestart: &CheckRestart{
Limit: 4,
Grace: 4 * time.Second,
},
},
},
},
},
},
Expected: &TaskDiff{
Type: DiffTypeEdited,
Objects: []*ObjectDiff{
{
Type: DiffTypeEdited,
Name: "Service",
Objects: []*ObjectDiff{
{
Type: DiffTypeEdited,
Name: "Check",
Objects: []*ObjectDiff{
{
Type: DiffTypeEdited,
Name: "CheckRestart",
Fields: []*FieldDiff{
{
Type: DiffTypeEdited,
Name: "Grace",
Old: "3000000000",
New: "4000000000",
},
{
Type: DiffTypeEdited,
Name: "Limit",
Old: "3",
New: "4",
},
},
},
},
},
{
Type: DiffTypeEdited,
Name: "Check",
Objects: []*ObjectDiff{
{
Type: DiffTypeAdded,
Name: "CheckRestart",
Fields: []*FieldDiff{
{
Type: DiffTypeAdded,
Name: "Grace",
New: "1000000000",
},
{
Type: DiffTypeAdded,
Name: "IgnoreWarnings",
New: "false",
},
{
Type: DiffTypeAdded,
Name: "Limit",
New: "1",
},
},
},
},
},
{
Type: DiffTypeEdited,
Name: "Check",
Objects: []*ObjectDiff{
{
Type: DiffTypeDeleted,
Name: "CheckRestart",
Fields: []*FieldDiff{
{
Type: DiffTypeDeleted,
Name: "Grace",
Old: "2000000000",
},
{
Type: DiffTypeDeleted,
Name: "IgnoreWarnings",
Old: "false",
},
{
Type: DiffTypeDeleted,
Name: "Limit",
Old: "2",
},
},
},
},
},
},
},
},
},
},
{
Name: "Vault added",
Old: &Task{},