Skip to content

Commit aeff83b

Browse files
authored
api: add ParseHCLOpts helper method (#12777)
The existing ParseHCL func didn't allow setting HCLv1=true.
1 parent 3aa520e commit aeff83b

File tree

3 files changed

+88
-1
lines changed

3 files changed

+88
-1
lines changed

.changelog/12777.txt

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:improvement
2+
api: Added ParseHCLOpts helper func to ease parsing HCLv1 jobspecs
3+
```

api/jobs.go

+10-1
Original file line numberDiff line numberDiff line change
@@ -65,12 +65,21 @@ func (c *Client) Jobs() *Jobs {
6565

6666
// ParseHCL is used to convert the HCL repesentation of a Job to JSON server side.
6767
// To parse the HCL client side see package github.com/hashicorp/nomad/jobspec
68+
// Use ParseHCLOpts if you need to customize JobsParseRequest.
6869
func (j *Jobs) ParseHCL(jobHCL string, canonicalize bool) (*Job, error) {
69-
var job Job
7070
req := &JobsParseRequest{
7171
JobHCL: jobHCL,
7272
Canonicalize: canonicalize,
7373
}
74+
return j.ParseHCLOpts(req)
75+
}
76+
77+
// ParseHCLOpts is used to convert the HCL representation of a Job to JSON
78+
// server side. To parse the HCL client side see package
79+
// github.com/hashicorp/nomad/jobspec.
80+
// ParseHCL is an alternative convenience API for HCLv2 users.
81+
func (j *Jobs) ParseHCLOpts(req *JobsParseRequest) (*Job, error) {
82+
var job Job
7483
_, err := j.client.write("/v1/jobs/parse", req, &job, nil)
7584
return &job, err
7685
}

api/jobs_test.go

+75
Original file line numberDiff line numberDiff line change
@@ -2361,3 +2361,78 @@ func TestJobs_ScaleStatus(t *testing.T) {
23612361
func TestJobs_Services(t *testing.T) {
23622362
// TODO(jrasell) add tests once registration process is in place.
23632363
}
2364+
2365+
// TestJobs_Parse asserts ParseHCL and ParseHCLOpts use the API to parse HCL.
2366+
func TestJobs_Parse(t *testing.T) {
2367+
testutil.Parallel(t)
2368+
2369+
jobspec := `job "example" {}`
2370+
2371+
// Assert ParseHCL returns an error if Nomad is not running to ensure
2372+
// that parsing is done server-side and not via the jobspec package.
2373+
{
2374+
c, err := NewClient(DefaultConfig())
2375+
require.NoError(t, err)
2376+
2377+
_, err = c.Jobs().ParseHCL(jobspec, false)
2378+
require.Error(t, err)
2379+
require.Contains(t, err.Error(), "Put")
2380+
}
2381+
2382+
c, s := makeClient(t, nil, nil)
2383+
defer s.Stop()
2384+
2385+
// Test ParseHCL
2386+
job1, err := c.Jobs().ParseHCL(jobspec, false)
2387+
require.NoError(t, err)
2388+
require.Equal(t, "example", *job1.Name)
2389+
require.Nil(t, job1.Namespace)
2390+
2391+
job1Canonicalized, err := c.Jobs().ParseHCL(jobspec, true)
2392+
require.NoError(t, err)
2393+
require.Equal(t, "example", *job1Canonicalized.Name)
2394+
require.Equal(t, "default", *job1Canonicalized.Namespace)
2395+
require.NotEqual(t, job1, job1Canonicalized)
2396+
2397+
// Test ParseHCLOpts
2398+
req := &JobsParseRequest{
2399+
JobHCL: jobspec,
2400+
HCLv1: false,
2401+
Canonicalize: false,
2402+
}
2403+
2404+
job2, err := c.Jobs().ParseHCLOpts(req)
2405+
require.NoError(t, err)
2406+
require.Equal(t, job1, job2)
2407+
2408+
// Test ParseHCLOpts with Canonicalize=true
2409+
req = &JobsParseRequest{
2410+
JobHCL: jobspec,
2411+
HCLv1: false,
2412+
Canonicalize: true,
2413+
}
2414+
job2Canonicalized, err := c.Jobs().ParseHCLOpts(req)
2415+
require.NoError(t, err)
2416+
require.Equal(t, job1Canonicalized, job2Canonicalized)
2417+
2418+
// Test ParseHCLOpts with HCLv1=true
2419+
req = &JobsParseRequest{
2420+
JobHCL: jobspec,
2421+
HCLv1: true,
2422+
Canonicalize: false,
2423+
}
2424+
2425+
job3, err := c.Jobs().ParseHCLOpts(req)
2426+
require.NoError(t, err)
2427+
require.Equal(t, job1, job3)
2428+
2429+
// Test ParseHCLOpts with HCLv1=true and Canonicalize=true
2430+
req = &JobsParseRequest{
2431+
JobHCL: jobspec,
2432+
HCLv1: true,
2433+
Canonicalize: true,
2434+
}
2435+
job3Canonicalized, err := c.Jobs().ParseHCLOpts(req)
2436+
require.NoError(t, err)
2437+
require.Equal(t, job1Canonicalized, job3Canonicalized)
2438+
}

0 commit comments

Comments
 (0)