modular tasks
To extend from previous example to show that you can use call func to chain through your tasks so it is more modular and clear
Demo
source
Main task yaml file
vars:
complex_data_structure_template: |
school:
name: '{{.school_name}}'
address: '{{.school_address}}'
principals:
{{- range $_, $p :=.schoo_principals }}
- {{$p}}
{{- end}}
ranking: '{{.schoo_ranking}}'
dvars:
- name: intest
value: '{{ env "GOTEST" |default "false" }}'
tasks:
- name: task
task:
- func: call
do:
- compose_required_object
- render
- name: compose_required_object
desc: prepare the data object for rendering
task:
- func: cmd
vars:
school_name: sydney grammar
school_address: 1 fox road, sydney, nsw 2000
schoo_principals:
- peter
- tom
- jane
schoo_ranking: No 5
dvars:
- name: school_string
desc: use default expand == 1
value: '{{.complex_data_structure_template}}'
do:
- name: print
cmd: '{{.school_string}}'
- func: cmd
vars:
school_name: sydney grammar
school_address: 1 fox road, sydney, nsw 2000
schoo_principals:
- peter
- tom
- jane
schoo_ranking: No 5
dvars:
- name: school_yml
desc: use dynamic expand == 2, so that the template will be rendered
value: '{{.complex_data_structure_template}}'
expand: 2
flags: [reg]
do:
- name: print
cmd: '{{.school_yml}}'
- func: cmd
desc: |
show global school_yml var
convert the yml to object so that it could be used in template later
dvars:
- name: school_details
desc: use dynamic expand == 2, so that the template will be rendered
value: '{{.school_yml}}'
flags: [vvv, toObj, reg]
do:
- name: print
cmd: '{{.school_yml}}'
- name: printObj
cmd: 'school_details'
- name: print
cmd: '{{.school_details}}'
- name: printObj
cmd: 'school_details_object'
- name: render
task:
- func: shell
do:
- echo "?intest -> {{.intest}}"
- pwd
reg: register_render_root
- func: cmd
do:
- name: print
cmd: 'intest is: [{{.intest}}]'
- name: reg
cmd:
name: correct_working_dir
desc: the value of .intest is string but not bool so you can not simple use
if .intest for condition
value: >-
{{if eq .intest "true" }}{{.register_render_root.Output}}{{else}}{{.register_render_root.Output}}{{end}}
- func: cmd
do:
- name: print
cmd: 'root dir is: [{{.register_render_root.Output}}]'
- name: print
cmd: 'correct working dir is: [{{.correct_working_dir}}]'
- func: cmd
desc: render final result using template
do:
- name: template
desc: render the template file using above dynamic variable from defined var
cmd:
src: '{{.correct_working_dir}}/tests/functests/d0079.template'
dest: /tmp/myschool.txt
datakey: "school_details_object"
- func: cmd
do:
- name: readFile
desc: read content of a file and register it to a var
cmd:
filename: myschool.txt
dir: /tmp
reg: my_school
- name: print
cmd: "{{.my_school}}"
Main log file
loading [Config]: ./tests/functests/upconfig.yml
Main config:
Version -> 1.0.0
RefDir -> ./tests/functests
WorkDir -> cwd
AbsWorkDir -> /up_project/up
TaskFile -> c0080
Verbose -> vvv
ModuleName -> self
ShellType -> /bin/sh
MaxCallLayers -> 8
Timeout -> 3600000
MaxModuelCallLayers -> 256
EntryTask -> task
ModRepoUsernameRef ->
ModRepoPasswordRef ->
work dir: /up_project/up
-exec task: task
loading [Task]: ./tests/functests/c0080
module: [self], instance id: [dev], exec profile: []
profile - envVars:
(*core.Cache)({
})
Task1: [task ==> task: ]
-Step1:
self: final context exec vars:
(*core.Cache)({
"complex_data_structure_template": "school:\n name: '{{.school_name}}'\n address: '{{.school_address}}'\nprincipals:\n{{- range $_, $p :=.schoo_principals }}\n - {{$p}}\n{{- end}}\nranking: '{{.schoo_ranking}}'\n",
"intest": "false",
"up_runtime_task_layer_number": 0
})
=Task2: [task ==> compose_required_object: prepare the data object for rendering ]
--Step1:
self: final context exec vars:
(*core.Cache)({
"complex_data_structure_template": "school:\n name: '{{.school_name}}'\n address: '{{.school_address}}'\nprincipals:\n{{- range $_, $p :=.schoo_principals }}\n - {{$p}}\n{{- end}}\nranking: '{{.schoo_ranking}}'\n",
"intest": "false",
"up_runtime_task_layer_number": 1,
"school_string": "school:\n name: '{{.school_name}}'\n address: '{{.school_address}}'\nprincipals:\n{{- range $_, $p :=.schoo_principals }}\n - {{$p}}\n{{- end}}\nranking: '{{.schoo_ranking}}'\n",
"school_name": "sydney grammar",
"school_address": "1 fox road, sydney, nsw 2000",
"schoo_principals": {
"peter",
"tom",
"jane"
},
"schoo_ranking": "No 5"
})
~~SubStep1: [print: ]
school:
name: '{{.school_name}}'
address: '{{.school_address}}'
principals:
{{- range $_, $p :=.schoo_principals }}
- {{$p}}
{{- end}}
ranking: '{{.schoo_ranking}}'
--Step2:
self: final context exec vars:
(*core.Cache)({
"school_name": "sydney grammar",
"school_address": "1 fox road, sydney, nsw 2000",
"schoo_principals": {
"peter",
"tom",
"jane"
},
"complex_data_structure_template": "school:\n name: '{{.school_name}}'\n address: '{{.school_address}}'\nprincipals:\n{{- range $_, $p :=.schoo_principals }}\n - {{$p}}\n{{- end}}\nranking: '{{.schoo_ranking}}'\n",
"intest": "false",
"up_runtime_task_layer_number": 1,
"school_yml": "school:\n name: 'sydney grammar'\n address: '1 fox road, sydney, nsw 2000'\nprincipals:\n - peter\n - tom\n - jane\nranking: 'No 5'\n",
"schoo_ranking": "No 5"
})
~~SubStep1: [print: ]
school:
name: 'sydney grammar'
address: '1 fox road, sydney, nsw 2000'
principals:
- peter
- tom
- jane
ranking: 'No 5'
--Step3: [
show global school_yml var
convert the yml to object so that it could be used in template later
]
dvar> school_details:
"school:\n name: 'sydney grammar'\n address: '1 fox road, sydney, nsw 2000'\nprincipals:\n - peter\n - tom\n - jane\nranking: 'No 5'\n"
-
school:
name: 'sydney grammar'
address: '1 fox road, sydney, nsw 2000'
principals:
- peter
- tom
- jane
ranking: 'No 5'
dvar[object]> school_details_object:
{
"school": {
"name": "sydney grammar",
"address": "1 fox road, sydney, nsw 2000"
},
"principals": {
"peter",
"tom",
"jane"
},
"ranking": "No 5"
}
self: final context exec vars:
(*core.Cache)({
"school_details": "school:\n name: 'sydney grammar'\n address: '1 fox road, sydney, nsw 2000'\nprincipals:\n - peter\n - tom\n - jane\nranking: 'No 5'\n",
"school_details_object": {
"school": {
"name": "sydney grammar",
"address": "1 fox road, sydney, nsw 2000"
},
"principals": {
"peter",
"tom",
"jane"
},
"ranking": "No 5"
},
"complex_data_structure_template": "school:\n name: '{{.school_name}}'\n address: '{{.school_address}}'\nprincipals:\n{{- range $_, $p :=.schoo_principals }}\n - {{$p}}\n{{- end}}\nranking: '{{.schoo_ranking}}'\n",
"intest": "false",
"up_runtime_task_layer_number": 1,
"school_yml": "school:\n name: 'sydney grammar'\n address: '1 fox road, sydney, nsw 2000'\nprincipals:\n - peter\n - tom\n - jane\nranking: 'No 5'\n"
})
~~SubStep1: [print: ]
school:
name: 'sydney grammar'
address: '1 fox road, sydney, nsw 2000'
principals:
- peter
- tom
- jane
ranking: 'No 5'
~~SubStep2: [printObj: ]
object:
school_details: "school:\n name: 'sydney grammar'\n address: '1 fox road, sydney, nsw 2000'\nprincipals:\n - peter\n - tom\n - jane\nranking: 'No 5'\n"
~~SubStep3: [print: ]
school:
name: 'sydney grammar'
address: '1 fox road, sydney, nsw 2000'
principals:
- peter
- tom
- jane
ranking: 'No 5'
~~SubStep4: [printObj: ]
object:
school_details_object: {
"principals": {
"peter",
"tom",
"jane"
},
"ranking": "No 5",
"school": {
"name": "sydney grammar",
"address": "1 fox road, sydney, nsw 2000"
}
}
=Task3: [task ==> render: ]
--Step1:
self: final context exec vars:
(*core.Cache)({
"school_details": "school:\n name: 'sydney grammar'\n address: '1 fox road, sydney, nsw 2000'\nprincipals:\n - peter\n - tom\n - jane\nranking: 'No 5'\n",
"complex_data_structure_template": "school:\n name: '{{.school_name}}'\n address: '{{.school_address}}'\nprincipals:\n{{- range $_, $p :=.schoo_principals }}\n - {{$p}}\n{{- end}}\nranking: '{{.schoo_ranking}}'\n",
"intest": "false",
"up_runtime_task_layer_number": 1,
"school_yml": "school:\n name: 'sydney grammar'\n address: '1 fox road, sydney, nsw 2000'\nprincipals:\n - peter\n - tom\n - jane\nranking: 'No 5'\n",
"school_details_object": {
"principals": {
"peter",
"tom",
"jane"
},
"ranking": "No 5",
"school": {
"name": "sydney grammar",
"address": "1 fox road, sydney, nsw 2000"
}
}
})
cmd( 1):
echo "?intest -> {{.intest}}"
-
?intest -> false
-
.. ok
cmd( 2):
pwd
-
/up_project/up
-
.. ok
. ok
--Step2:
self: final context exec vars:
(*core.Cache)({
"school_details_object": {
"school": {
"name": "sydney grammar",
"address": "1 fox road, sydney, nsw 2000"
},
"principals": {
"peter",
"tom",
"jane"
},
"ranking": "No 5"
},
"school_details": "school:\n name: 'sydney grammar'\n address: '1 fox road, sydney, nsw 2000'\nprincipals:\n - peter\n - tom\n - jane\nranking: 'No 5'\n",
"register_render_root": (*utils.ExecResult)({
Cmd: "pwd",
Code: 0,
Output: "/up_project/up",
ErrMsg: ""
}),
"last_result": (*utils.ExecResult)({
Cmd: "pwd",
Code: 0,
Output: "/up_project/up",
ErrMsg: ""
}),
"complex_data_structure_template": "school:\n name: '{{.school_name}}'\n address: '{{.school_address}}'\nprincipals:\n{{- range $_, $p :=.schoo_principals }}\n - {{$p}}\n{{- end}}\nranking: '{{.schoo_ranking}}'\n",
"intest": "false",
"up_runtime_task_layer_number": 1,
"school_yml": "school:\n name: 'sydney grammar'\n address: '1 fox road, sydney, nsw 2000'\nprincipals:\n - peter\n - tom\n - jane\nranking: 'No 5'\n"
})
~~SubStep1: [print: ]
intest is: [false]
~~SubStep2: [reg: ]
--Step3:
self: final context exec vars:
(*core.Cache)({
"last_result": (*utils.ExecResult)({
Cmd: "pwd",
Code: 0,
Output: "/up_project/up",
ErrMsg: ""
}),
"intest": "false",
"school_yml": "school:\n name: 'sydney grammar'\n address: '1 fox road, sydney, nsw 2000'\nprincipals:\n - peter\n - tom\n - jane\nranking: 'No 5'\n",
"complex_data_structure_template": "school:\n name: '{{.school_name}}'\n address: '{{.school_address}}'\nprincipals:\n{{- range $_, $p :=.schoo_principals }}\n - {{$p}}\n{{- end}}\nranking: '{{.schoo_ranking}}'\n",
"up_runtime_task_layer_number": 1,
"register_render_root": (*utils.ExecResult)({
Cmd: "pwd",
Code: 0,
Output: "/up_project/up",
ErrMsg: ""
}),
"correct_working_dir": "/up_project/up",
"school_details_object": {
"principals": {
"peter",
"tom",
"jane"
},
"ranking": "No 5",
"school": {
"name": "sydney grammar",
"address": "1 fox road, sydney, nsw 2000"
}
},
"school_details": "school:\n name: 'sydney grammar'\n address: '1 fox road, sydney, nsw 2000'\nprincipals:\n - peter\n - tom\n - jane\nranking: 'No 5'\n"
})
~~SubStep1: [print: ]
root dir is: [/up_project/up]
~~SubStep2: [print: ]
correct working dir is: [/up_project/up]
--Step4: [: render final result using template ]
self: final context exec vars:
(*core.Cache)({
"register_render_root": (*utils.ExecResult)({
Cmd: "pwd",
Code: 0,
Output: "/up_project/up",
ErrMsg: ""
}),
"complex_data_structure_template": "school:\n name: '{{.school_name}}'\n address: '{{.school_address}}'\nprincipals:\n{{- range $_, $p :=.schoo_principals }}\n - {{$p}}\n{{- end}}\nranking: '{{.schoo_ranking}}'\n",
"school_details_object": {
"ranking": "No 5",
"school": {
"address": "1 fox road, sydney, nsw 2000",
"name": "sydney grammar"
},
"principals": {
"peter",
"tom",
"jane"
}
},
"last_result": (*utils.ExecResult)({
Cmd: "pwd",
Code: 0,
Output: "/up_project/up",
ErrMsg: ""
}),
"school_details": "school:\n name: 'sydney grammar'\n address: '1 fox road, sydney, nsw 2000'\nprincipals:\n - peter\n - tom\n - jane\nranking: 'No 5'\n",
"intest": "false",
"up_runtime_task_layer_number": 1,
"school_yml": "school:\n name: 'sydney grammar'\n address: '1 fox road, sydney, nsw 2000'\nprincipals:\n - peter\n - tom\n - jane\nranking: 'No 5'\n",
"correct_working_dir": "/up_project/up"
})
~~SubStep1: [template: render the template file using above dynamic variable from defined var ]
--Step5:
self: final context exec vars:
(*core.Cache)({
"intest": "false",
"register_render_root": (*utils.ExecResult)({
Cmd: "pwd",
Code: 0,
Output: "/up_project/up",
ErrMsg: ""
}),
"up_runtime_task_layer_number": 1,
"complex_data_structure_template": "school:\n name: '{{.school_name}}'\n address: '{{.school_address}}'\nprincipals:\n{{- range $_, $p :=.schoo_principals }}\n - {{$p}}\n{{- end}}\nranking: '{{.schoo_ranking}}'\n",
"correct_working_dir": "/up_project/up",
"school_yml": "school:\n name: 'sydney grammar'\n address: '1 fox road, sydney, nsw 2000'\nprincipals:\n - peter\n - tom\n - jane\nranking: 'No 5'\n",
"school_details": "school:\n name: 'sydney grammar'\n address: '1 fox road, sydney, nsw 2000'\nprincipals:\n - peter\n - tom\n - jane\nranking: 'No 5'\n",
"school_details_object": {
"school": {
"name": "sydney grammar",
"address": "1 fox road, sydney, nsw 2000"
},
"principals": {
"peter",
"tom",
"jane"
},
"ranking": "No 5"
},
"last_result": (*utils.ExecResult)({
Cmd: "pwd",
Code: 0,
Output: "/up_project/up",
ErrMsg: ""
})
})
~~SubStep1: [readFile: read content of a file and register it to a var ]
~~SubStep2: [print: ]
My school name is: sydney grammar, it is located
at 1 fox road, sydney, nsw 2000
We have got peter, tom, jane, as our principals
Our school ranking last year is No 5
Logs with different verbose level
Raw logs with different verbose level