Firstly, the proper way using UP cmd is to use defined template to gradually stubstitue all the required variables, then register it with a formal name, remember the yaml doc is a text, also it’s convertable to become a object, so that you can use it in your template
The reason why the school_* vars are defined in local func scope is to show that this var could be obtained in runtime in complex scenarios
Please note the expand level does make it more dynamic and you should make wise use of this feature
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: 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'
- func: shell
do:
- echo "?intest -> {{.intest}}"
- pwd
reg: register_task_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_task_root.Output}}{{else}}{{.register_task_root.Output}}{{end}}
- func: cmd
do:
- name: print
cmd: 'root dir is: [{{.register_task_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}}"
loading [Config]: ./tests/functests/upconfig.yml
Main config:
Version -> 1.0.0
RefDir -> ./tests/functests
WorkDir -> cwd
AbsWorkDir -> /up_project/up
TaskFile -> c0079
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/c0079
module: [self], instance id: [dev], exec profile: []
profile - envVars:
(*core.Cache)({
})
Task1: [task ==> task: ]
-Step1:
self: final context exec vars:
(*core.Cache)({
"up_runtime_task_layer_number": 0,
"schoo_ranking": "No 5",
"school_name": "sydney grammar",
"school_address": "1 fox road, sydney, nsw 2000",
"schoo_principals": {
"peter",
"tom",
"jane"
},
"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",
"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"
})
~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)({
"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,
"school_name": "sydney grammar",
"school_address": "1 fox road, sydney, nsw 2000",
"schoo_principals": {
"peter",
"tom",
"jane"
},
"schoo_ranking": "No 5",
"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'
-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:
{
"ranking": "No 5",
"school": {
"name": "sydney grammar",
"address": "1 fox road, sydney, nsw 2000"
},
"principals": {
"peter",
"tom",
"jane"
}
}
self: final context exec vars:
(*core.Cache)({
"intest": "false",
"up_runtime_task_layer_number": 0,
"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"
},
"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"
})
~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: {
"school": {
"name": "sydney grammar",
"address": "1 fox road, sydney, nsw 2000"
},
"principals": {
"peter",
"tom",
"jane"
},
"ranking": "No 5"
}
-Step4:
self: final context exec vars:
(*core.Cache)({
"up_runtime_task_layer_number": 0,
"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",
"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"
}
},
"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"
})
cmd( 1):
echo "?intest -> {{.intest}}"
-
?intest -> false
-
.. ok
cmd( 2):
pwd
-
/up_project/up
-
.. ok
. ok
-Step5:
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",
"up_runtime_task_layer_number": 0,
"register_task_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",
"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": {
"ranking": "No 5",
"school": {
"address": "1 fox road, sydney, nsw 2000",
"name": "sydney grammar"
},
"principals": {
"peter",
"tom",
"jane"
}
}
})
~SubStep1: [print: ]
intest is: [false]
~SubStep2: [reg: ]
-Step6:
self: final context exec vars:
(*core.Cache)({
"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",
"correct_working_dir": "/up_project/up",
"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": 0,
"register_task_root": (*utils.ExecResult)({
Cmd: "pwd",
Code: 0,
Output: "/up_project/up",
ErrMsg: ""
})
})
~SubStep1: [print: ]
root dir is: [/up_project/up]
~SubStep2: [print: ]
correct working dir is: [/up_project/up]
-Step7: [: render final result using template ]
self: final context exec vars:
(*core.Cache)({
"school_details_object": {
"principals": {
"peter",
"tom",
"jane"
},
"ranking": "No 5",
"school": {
"address": "1 fox road, sydney, nsw 2000",
"name": "sydney grammar"
}
},
"register_task_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: ""
}),
"correct_working_dir": "/up_project/up",
"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",
"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",
"up_runtime_task_layer_number": 0
})
~SubStep1: [template: render the template file using above dynamic variable from defined var ]
-Step8:
self: final context exec vars:
(*core.Cache)({
"intest": "false",
"school_details_object": {
"school": {
"address": "1 fox road, sydney, nsw 2000",
"name": "sydney grammar"
},
"principals": {
"peter",
"tom",
"jane"
},
"ranking": "No 5"
},
"last_result": (*utils.ExecResult)({
Cmd: "pwd",
Code: 0,
Output: "/up_project/up",
ErrMsg: ""
}),
"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",
"register_task_root": (*utils.ExecResult)({
Cmd: "pwd",
Code: 0,
Output: "/up_project/up",
ErrMsg: ""
}),
"up_runtime_task_layer_number": 0,
"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"
})
~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