Sorry I didn't think this would ne necessary. This seems to me my like a problem between the UI and the Backend API. My guess is that the UI does send the value in an incorrect format or there is a faulty validation on the API side.
The ix-applications folder and docker appdata are on my main ZFS Pool.
I'm trying to deploy Shinoby (OpenSource CCTV) which is not available in TrueCharts, so I've configured the app manually.
I've captured the Websocket message that is sent when saving the app in the UI. Here you can see all details if the app I'm trying to set:
Code:
{
"id":"f3ae8a67-f832-0cf7-1653-af3a9923eed7",
"msg":"method",
"method":"chart.release.update",
"params":[
"shinobi",
{
"values":{
"enableUIPortal":true,
"portalDetails":{
"portalName":"Web Portal",
"protocol":"http",
"useNodeIP":true,
"port":9090
},
"workloadType":"Deployment",
"image":{
"repository":"registry.gitlab.com/shinobi-systems/shinobi",
"tag":"dev",
"pullPolicy":"IfNotPresent"
},
"updateStrategy":"Recreate",
"containerCommand":[
],
"containerArgs":[
],
"containerEnvironmentVariables":[
{
"name":"SSL_ENABLED",
"value":"false"
},
{
"name":"TZ",
"value":"Europe/Zurich"
}
],
"externalInterfaces":[
],
"dnsPolicy":"Default",
"dnsConfig":{
"nameservers":[
],
"searches":[
],
"options":[
]
},
"hostNetwork":false,
"hostPortsList":[
],
"portForwardingList":[
{
"containerPort":8080,
"nodePort":9090,
"protocol":"TCP"
}
],
"hostPathVolumes":[
{
"hostPath":"/mnt/Pool01/appdata/shinobi/config",
"mountPath":"/config",
"readOnly":false
},
{
"hostPath":"/mnt/Pool01/appdata/shinobi/customAutoLoad",
"mountPath":"/home/Shinobi/libs/customAutoLoad",
"readOnly":false
},
{
"hostPath":"/mnt/Pool01/appdata/shinobi/database",
"mountPath":"/var/lib/mysql",
"readOnly":false
},
{
"hostPath":"/mnt/Pool01/appdata/shinobi/videos",
"mountPath":"/home/Shinobi/videos",
"readOnly":false
},
{
"hostPath":"/mnt/Pool01/appdata/shinobi",
"mountPath":"/home/Shinobi/plugins",
"readOnly":false
}
],
"emptyDirVolumes":[
"/dev/shm/streams"
],
"volumes":[
],
"gpuConfiguration":{
},
"tty":false,
"stdin":false,
"securityContext":{
"privileged":false,
"capabilities":[
],
"enableRunAsUser":false
},
"enableResourceLimits":false
}
}
]
}
And this is the response from the server. There is also an exception Trace that should help to find the problem:
Code:
{
"msg":"changed",
"collection":"core.get_jobs",
"id":1964,
"fields":{
"id":1964,
"method":"chart.release.update",
"arguments":[
"shinobi",
{
"values":{
"enableUIPortal":true,
"portalDetails":{
"portalName":"Web Portal",
"protocol":"http",
"useNodeIP":true,
"port":9090
},
"workloadType":"Deployment",
"image":{
"repository":"registry.gitlab.com/shinobi-systems/shinobi",
"tag":"dev",
"pullPolicy":"IfNotPresent"
},
"updateStrategy":"Recreate",
"containerCommand":[
],
"containerArgs":[
],
"containerEnvironmentVariables":[
{
"name":"SSL_ENABLED",
"value":"false"
},
{
"name":"TZ",
"value":"Europe/Zurich"
}
],
"externalInterfaces":[
],
"dnsPolicy":"Default",
"dnsConfig":{
"nameservers":[
],
"searches":[
],
"options":[
]
},
"hostNetwork":false,
"hostPortsList":[
],
"portForwardingList":[
{
"containerPort":8080,
"nodePort":9090,
"protocol":"TCP"
}
],
"hostPathVolumes":[
{
"hostPath":"/mnt/Pool01/appdata/shinobi/config",
"mountPath":"/config",
"readOnly":false
},
{
"hostPath":"/mnt/Pool01/appdata/shinobi/customAutoLoad",
"mountPath":"/home/Shinobi/libs/customAutoLoad",
"readOnly":false
},
{
"hostPath":"/mnt/Pool01/appdata/shinobi/database",
"mountPath":"/var/lib/mysql",
"readOnly":false
},
{
"hostPath":"/mnt/Pool01/appdata/shinobi/videos",
"mountPath":"/home/Shinobi/videos",
"readOnly":false
},
{
"hostPath":"/mnt/Pool01/appdata/shinobi",
"mountPath":"/home/Shinobi/plugins",
"readOnly":false
}
],
"emptyDirVolumes":[
"/dev/shm/streams"
],
"volumes":[
],
"gpuConfiguration":{
},
"tty":false,
"stdin":false,
"securityContext":{
"privileged":false,
"capabilities":[
],
"enableRunAsUser":false
},
"enableResourceLimits":false
}
}
],
"description":null,
"abortable":false,
"logs_path":null,
"logs_excerpt":null,
"progress":{
"percent":0,
"description":"",
"extra":null
},
"result":null,
"error":"[EINVAL] values.emptyDirVolumes: Item#0 is not valid per list types: [emptyDirVolume] A dict was expected\n",
"exception":"Traceback (most recent call last):\n File \"/usr/lib/python3/dist-packages/middlewared/job.py\", line 426, in run\n await self.future\n File \"/usr/lib/python3/dist-packages/middlewared/job.py\", line 461, in __run_body\n rv = await self.method(*([self] + args))\n File \"/usr/lib/python3/dist-packages/middlewared/schema.py\", line 1152, in nf\n res = await f(*args, **kwargs)\n File \"/usr/lib/python3/dist-packages/middlewared/schema.py\", line 1284, in nf\n return await func(*args, **kwargs)\n File \"/usr/lib/python3/dist-packages/middlewared/plugins/chart_releases_linux/chart_release.py\", line 537, in do_update\n config, context = await self.normalise_and_validate_values(\n File \"/usr/lib/python3/dist-packages/middlewared/plugins/chart_releases_linux/chart_release.py\", line 338, in normalise_and_validate_values\n dict_obj = await self.middleware.call(\n File \"/usr/lib/python3/dist-packages/middlewared/main.py\", line 1306, in call\n return await self._call(\n File \"/usr/lib/python3/dist-packages/middlewared/main.py\", line 1255, in _call\n return await methodobj(*prepared_call.args)\n File \"/usr/lib/python3/dist-packages/middlewared/plugins/chart_releases_linux/validation.py\", line 53, in validate_values\n verrors.check()\n File \"/usr/lib/python3/dist-packages/middlewared/service_exception.py\", line 70, in check\n raise self\nmiddlewared.service_exception.ValidationErrors: [EINVAL] values.emptyDirVolumes: Item#0 is not valid per list types: [emptyDirVolume] A dict was expected\n\n",
"exc_info":{
"repr":"ValidationErrors()",
"type":"VALIDATION",
"extra":[
[
"values.emptyDirVolumes",
"Item#0 is not valid per list types: [emptyDirVolume] A dict was expected",
22
]
]
},
"state":"FAILED",
"time_started":{
"$date":1671185380205
},
"time_finished":{
"$date":1671185381512
}
}
}