---
# System prepended metadata

title: Notes about ioFog application templating

---

# Notes about ioFog application templating

## About current implementation 2.1dev


```yaml
metadata:
  name: my-template
spec:
    name: my-template
    description: My app template
```
  * Need to set 2 times the name of the template ?
  
 * Like edge resource it could be usefull to add a version for application template 
```yaml
spec:
  name: my-template
  description: main fiware cloud infrastructure - deployment on one node
  version: v0.1.0
```

 * Need to inject a new variable set to the `application name`. Could be useful to rebuilt service name with the `application name` suffix.
 
## Suggestions for a more scripting API

What if we just run `rvaluesVarSubstition` on `applicationTemplateDBObject` (no json parsing).

so loops works any where in template description and any kind of variable type . of course self in this case is going to be undefined.
```javasccript
await rvaluesVarSubstition(applicationTemplateDBObject, { ...defaultVariablesValues, ...userProvidedVariables, self: undefined })

```

This is have a lot of constraints: need to store rawtext but need to know if yaml(coming from iofogctl) or json(direct to iofogCtrl)

Franck: I see that in service createApplicationTemplateEndPoint 
```javasccript

    applicationJSON: JSON.stringify(applicationTemplateData.application),
```
So this is not JSON form the origin :warning: 

An example of use can be: (this example works if you affect baseport and devListRoot )

```yaml
kind: ApplicationTemplateDefinition
apiVersion: iofog.org/v2
    metadata:  name: "name"
spec:
    microservices:
    - name: "mySuperDuperMsvc"
      agent:
          name: {{variable_name}} # Specify the same agent template id allows specifying which microservices needs to run on the same agent 
      images:
          arm: "arm_image"
          x86: "x86_image"
      container:
          rootHostAccess: false
        ports:
{%- assign portNo = baseport -%}{% comment %} Set all ports for the microservice 1 {% endcomment %}
{%- assign portnames = "internal,external" | split: "," -%}{%- for portname in portnames %}
          - {{ portname }}: {{ portNo }}
          {%- assign portNo = portNo | plus: 1 -%}
{% endfor %}
        volumes: []
        env:
          - key: MY_SUPER_SECRET
            value: {{my_super_secret}}
          - key: devicesList
            value: {% assign devList = devListRoot | split: "," -%}{%- for dev in devList %}{{dev}}api/v1/endpoint,{% endfor %}
      config:{}
    - name: "name2"
      agent:
          name: {{my_other_agent}}
          ...  ...
      container:
        ports:
{%- comment %} continue ports allocation for the microservice 2 {% endcomment -%}
{%- assign portnames = "internal,external" | split: "," -%}{%- for portname in portnames %}
          - {{ portname }}: {{ portNo }}
          {%- assign portNo = portNo | plus: 1 -%}
{% endfor %}
    routes: []
    variables:
    - key: variable_name
      description: Agent name for microservice mySuperDuperMsvc
    - key: my_super_secret
      description: Secret API Key for microservice mySuperDuperMsvc
      defaultValue: public_key
    - key: baseport
      description: port
      defaultValue: 8080
    - key: devListRoot
      description: dev list url
      defaultValue: "http://dev1:111/,http://dev2:888/e"      
```

### Caveats
* How can we know the variables (key, default etc...) without parsing: split template part from variable def part (new kind VariableTemplateDefinition)
