Skip to content

Commit

Permalink
multiregion: validation should always return error for OSS
Browse files Browse the repository at this point in the history
  • Loading branch information
tgross committed Aug 18, 2020
1 parent d8ac3f9 commit b88b74a
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 119 deletions.
35 changes: 0 additions & 35 deletions nomad/structs/structs.go
Original file line number Diff line number Diff line change
Expand Up @@ -4591,41 +4591,6 @@ func (m *Multiregion) Copy() *Multiregion {
return copy
}

func (m *Multiregion) Validate(jobType string, jobDatacenters []string) error {
var mErr multierror.Error
seen := map[string]struct{}{}
for _, region := range m.Regions {
if _, ok := seen[region.Name]; ok {
mErr.Errors = append(mErr.Errors,
fmt.Errorf("Multiregion region %q can't be listed twice",
region.Name))
}
seen[region.Name] = struct{}{}
if len(region.Datacenters) == 0 && len(jobDatacenters) == 0 {
mErr.Errors = append(mErr.Errors,
fmt.Errorf("Multiregion region %q must have at least 1 datacenter",
region.Name),
)
}
}
if m.Strategy != nil {
switch jobType {
case JobTypeBatch:
if m.Strategy.OnFailure != "" || m.Strategy.MaxParallel != 0 {
mErr.Errors = append(mErr.Errors,
errors.New("Multiregion batch jobs can't have an update strategy"))
}
case JobTypeSystem:
if m.Strategy.OnFailure != "" {
mErr.Errors = append(mErr.Errors,
errors.New("Multiregion system jobs can't have an on_failure setting"))
}
default: // service
}
}
return mErr.ErrorOrNil()
}

type MultiregionStrategy struct {
MaxParallel int
OnFailure string
Expand Down
13 changes: 13 additions & 0 deletions nomad/structs/structs_oss.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
// +build !ent

package structs

import "errors"

func (m *Multiregion) Validate(jobType string, jobDatacenters []string) error {
if m != nil {
return errors.New("Multiregion jobs are unlicensed.")
}

return nil
}
84 changes: 0 additions & 84 deletions nomad/structs/structs_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5508,87 +5508,3 @@ func TestNodeResources_Merge(t *testing.T) {
},
}, res)
}

func TestMultiregion_Validate(t *testing.T) {
require := require.New(t)
cases := []struct {
Name string
JobType string
Case *Multiregion
Errors []string
}{
{
Name: "empty valid multiregion spec",
JobType: JobTypeService,
Case: &Multiregion{},
Errors: []string{},
},

{
Name: "non-empty valid multiregion spec",
JobType: JobTypeService,
Case: &Multiregion{
Strategy: &MultiregionStrategy{
MaxParallel: 2,
OnFailure: "fail_all",
},
Regions: []*MultiregionRegion{
{

Count: 2,
Datacenters: []string{"west-1", "west-2"},
Meta: map[string]string{},
},
{
Name: "east",
Count: 1,
Datacenters: []string{"east-1"},
Meta: map[string]string{},
},
},
},
Errors: []string{},
},

{
Name: "repeated region, wrong strategy, missing DCs",
JobType: JobTypeBatch,
Case: &Multiregion{
Strategy: &MultiregionStrategy{
MaxParallel: 2,
},
Regions: []*MultiregionRegion{
{
Name: "west",
Datacenters: []string{"west-1", "west-2"},
},

{
Name: "west",
},
},
},
Errors: []string{
"Multiregion region \"west\" can't be listed twice",
"Multiregion region \"west\" must have at least 1 datacenter",
"Multiregion batch jobs can't have an update strategy",
},
},
}

for _, tc := range cases {
t.Run(tc.Name, func(t *testing.T) {
err := tc.Case.Validate(tc.JobType, []string{})
if len(tc.Errors) == 0 {
require.NoError(err)
} else {
mErr := err.(*multierror.Error)
for i, expectedErr := range tc.Errors {
if !strings.Contains(mErr.Errors[i].Error(), expectedErr) {
t.Fatalf("err: %s, expected: %s", err, expectedErr)
}
}
}
})
}
}

0 comments on commit b88b74a

Please sign in to comment.