github.com/hashicorp/nomad/api@v0.0.0-20240306165712-3193ac204f65/compose_test.go (about)

     1  // Copyright (c) HashiCorp, Inc.
     2  // SPDX-License-Identifier: MPL-2.0
     3  
     4  package api
     5  
     6  import (
     7  	"testing"
     8  
     9  	"github.com/hashicorp/nomad/api/internal/testutil"
    10  	"github.com/shoenig/test/must"
    11  )
    12  
    13  func TestCompose(t *testing.T) {
    14  	testutil.Parallel(t)
    15  	// Compose a task
    16  	task := NewTask("task1", "exec").
    17  		SetConfig("foo", "bar").
    18  		SetMeta("foo", "bar").
    19  		Constrain(NewConstraint("kernel.name", "=", "linux")).
    20  		Require(&Resources{
    21  			CPU:      pointerOf(1250),
    22  			MemoryMB: pointerOf(1024),
    23  			DiskMB:   pointerOf(2048),
    24  			Networks: []*NetworkResource{
    25  				{
    26  					CIDR:          "0.0.0.0/0",
    27  					MBits:         pointerOf(100),
    28  					ReservedPorts: []Port{{"", 80, 0, ""}, {"", 443, 0, ""}},
    29  				},
    30  			},
    31  		})
    32  
    33  	// Compose a task group
    34  
    35  	st1 := NewSpreadTarget("dc1", 80)
    36  	st2 := NewSpreadTarget("dc2", 20)
    37  	grp := NewTaskGroup("grp1", 2).
    38  		Constrain(NewConstraint("kernel.name", "=", "linux")).
    39  		AddAffinity(NewAffinity("${node.class}", "=", "large", 50)).
    40  		AddSpread(NewSpread("${node.datacenter}", 30, []*SpreadTarget{st1, st2})).
    41  		SetMeta("foo", "bar").
    42  		AddTask(task)
    43  
    44  	// Compose a job
    45  	job := NewServiceJob("job1", "myjob", "global", 2).
    46  		SetMeta("foo", "bar").
    47  		AddDatacenter("dc1").
    48  		Constrain(NewConstraint("kernel.name", "=", "linux")).
    49  		AddTaskGroup(grp)
    50  
    51  	// Check that the composed result looks correct
    52  	expect := &Job{
    53  		Region:   pointerOf("global"),
    54  		ID:       pointerOf("job1"),
    55  		Name:     pointerOf("myjob"),
    56  		Type:     pointerOf(JobTypeService),
    57  		Priority: pointerOf(2),
    58  		Datacenters: []string{
    59  			"dc1",
    60  		},
    61  		Meta: map[string]string{
    62  			"foo": "bar",
    63  		},
    64  		Constraints: []*Constraint{
    65  			{
    66  				LTarget: "kernel.name",
    67  				RTarget: "linux",
    68  				Operand: "=",
    69  			},
    70  		},
    71  		TaskGroups: []*TaskGroup{
    72  			{
    73  				Name:  pointerOf("grp1"),
    74  				Count: pointerOf(2),
    75  				Constraints: []*Constraint{
    76  					{
    77  						LTarget: "kernel.name",
    78  						RTarget: "linux",
    79  						Operand: "=",
    80  					},
    81  				},
    82  				Affinities: []*Affinity{
    83  					{
    84  						LTarget: "${node.class}",
    85  						RTarget: "large",
    86  						Operand: "=",
    87  						Weight:  pointerOf(int8(50)),
    88  					},
    89  				},
    90  				Spreads: []*Spread{
    91  					{
    92  						Attribute: "${node.datacenter}",
    93  						Weight:    pointerOf(int8(30)),
    94  						SpreadTarget: []*SpreadTarget{
    95  							{
    96  								Value:   "dc1",
    97  								Percent: 80,
    98  							},
    99  							{
   100  								Value:   "dc2",
   101  								Percent: 20,
   102  							},
   103  						},
   104  					},
   105  				},
   106  				Tasks: []*Task{
   107  					{
   108  						Name:   "task1",
   109  						Driver: "exec",
   110  						Resources: &Resources{
   111  							CPU:      pointerOf(1250),
   112  							MemoryMB: pointerOf(1024),
   113  							DiskMB:   pointerOf(2048),
   114  							Networks: []*NetworkResource{
   115  								{
   116  									CIDR:  "0.0.0.0/0",
   117  									MBits: pointerOf(100),
   118  									ReservedPorts: []Port{
   119  										{"", 80, 0, ""},
   120  										{"", 443, 0, ""},
   121  									},
   122  								},
   123  							},
   124  						},
   125  						Constraints: []*Constraint{
   126  							{
   127  								LTarget: "kernel.name",
   128  								RTarget: "linux",
   129  								Operand: "=",
   130  							},
   131  						},
   132  						Config: map[string]interface{}{
   133  							"foo": "bar",
   134  						},
   135  						Meta: map[string]string{
   136  							"foo": "bar",
   137  						},
   138  					},
   139  				},
   140  				Meta: map[string]string{
   141  					"foo": "bar",
   142  				},
   143  			},
   144  		},
   145  	}
   146  	must.Eq(t, expect, job)
   147  }