app_versions.json 63 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106
  1. {
  2. "2308.0.1": {
  3. "healthy": true,
  4. "supported": true,
  5. "healthy_error": null,
  6. "location": "/__w/charts/charts/charts/ix-chart/2308.0.1",
  7. "last_update": "2023-11-14 10:11:57",
  8. "required_features": [
  9. "definitions/interface",
  10. "normalize/interfaceConfiguration",
  11. "normalize/ixVolume",
  12. "definitions/nodeIP",
  13. "definitions/gpuConfiguration"
  14. ],
  15. "human_version": "2308.0.1",
  16. "version": "2308.0.1",
  17. "chart_metadata": {
  18. "name": "ix-chart",
  19. "description": "A Helm chart for deploying simple workloads Kubernetes",
  20. "annotations": {
  21. "title": "ix-chart"
  22. },
  23. "type": "application",
  24. "version": "2308.0.1",
  25. "apiVersion": "v2",
  26. "appVersion": "v1",
  27. "kubeVersion": ">=1.16.0-0",
  28. "maintainers": [
  29. {
  30. "name": "truenas",
  31. "url": "https://www.truenas.com/",
  32. "email": "dev@ixsystems.com"
  33. }
  34. ],
  35. "dependencies": [
  36. {
  37. "name": "common",
  38. "repository": "file://../../../common/2304.0.1",
  39. "version": "2304.0.1"
  40. }
  41. ],
  42. "home": "https://www.truenas.com/",
  43. "icon": "https://media.sys.truenas.net/apps/ix-chart/icons/icon.webp",
  44. "keywords": [],
  45. "sources": []
  46. },
  47. "app_metadata": {
  48. "runAsContext": [],
  49. "capabilities": [],
  50. "hostMounts": []
  51. },
  52. "schema": {
  53. "groups": [
  54. {
  55. "name": "Container Images",
  56. "description": "Image to be used for container"
  57. },
  58. {
  59. "name": "Container Entrypoint",
  60. "description": "Configuration of the executable that will be run when the container is started"
  61. },
  62. {
  63. "name": "Container Environment Variables",
  64. "description": "Set the environment that will be visible to the container"
  65. },
  66. {
  67. "name": "Networking",
  68. "description": "Configure networking for container"
  69. },
  70. {
  71. "name": "Port Forwarding",
  72. "description": "Configure ports to forward to workload"
  73. },
  74. {
  75. "name": "Storage",
  76. "description": "Persist and share data that is separate from the lifecycle of the container"
  77. },
  78. {
  79. "name": "Health Check",
  80. "description": "Define mechanism to periodically probe the container to ensure it's functioning as desired"
  81. },
  82. {
  83. "name": "Workload Details",
  84. "description": "Configure how workload should be deployed"
  85. },
  86. {
  87. "name": "Scaling/Upgrade Policy",
  88. "description": "Configure how pods are replaced when configuration is upgraded"
  89. },
  90. {
  91. "name": "Restart Policy",
  92. "description": "Configure when pod should be restarted in case of failure"
  93. },
  94. {
  95. "name": "Resource Reservation",
  96. "description": "Specify resources to be allocated to workload"
  97. },
  98. {
  99. "name": "Resource Limits",
  100. "description": "Set CPU/memory limits for Kubernetes Pod"
  101. },
  102. {
  103. "name": "Portal Configuration",
  104. "description": "Configure UI web portal"
  105. }
  106. ],
  107. "questions": [
  108. {
  109. "variable": "enableUIPortal",
  110. "label": "Enable WebUI Portal",
  111. "description": "Enable webui portal for easier access to workload (Only valid for TrueNAS SCALE Bluefin and later)",
  112. "group": "Portal Configuration",
  113. "schema": {
  114. "type": "boolean",
  115. "default": false
  116. }
  117. },
  118. {
  119. "variable": "portalDetails",
  120. "label": "WebUI Portal",
  121. "description": "Configure WebUI Portal",
  122. "group": "Portal Configuration",
  123. "schema": {
  124. "show_if": [
  125. [
  126. "enableUIPortal",
  127. "=",
  128. true
  129. ]
  130. ],
  131. "type": "dict",
  132. "attrs": [
  133. {
  134. "variable": "portalName",
  135. "label": "Portal Name",
  136. "description": "Specify a UI Portal name to use which would be displayed in the UI",
  137. "schema": {
  138. "type": "string",
  139. "default": "Web Portal"
  140. }
  141. },
  142. {
  143. "variable": "protocol",
  144. "label": "Protocol for Portal",
  145. "description": "Specify protocol for portal",
  146. "schema": {
  147. "type": "string",
  148. "default": "http",
  149. "enum": [
  150. {
  151. "value": "http",
  152. "description": "HTTP Protocol"
  153. },
  154. {
  155. "value": "https",
  156. "description": "HTTPS Protocol"
  157. }
  158. ]
  159. }
  160. },
  161. {
  162. "variable": "useNodeIP",
  163. "label": "Use Node IP for Portal IP/Domain",
  164. "schema": {
  165. "type": "boolean",
  166. "default": true
  167. }
  168. },
  169. {
  170. "variable": "host",
  171. "description": "IP/Domain to use for accessing the portal",
  172. "label": "Portal IP/Domain",
  173. "schema": {
  174. "show_if": [
  175. [
  176. "useNodeIP",
  177. "=",
  178. false
  179. ]
  180. ],
  181. "type": "string",
  182. "$ref": [
  183. "definitions/nodeIP"
  184. ],
  185. "default": "192.168.0.10"
  186. }
  187. },
  188. {
  189. "variable": "port",
  190. "label": "Port",
  191. "description": "Specify port to be used for Portal access",
  192. "schema": {
  193. "type": "int",
  194. "max": 65535,
  195. "default": 15000
  196. }
  197. }
  198. ]
  199. }
  200. },
  201. {
  202. "variable": "workloadType",
  203. "description": "Please specify type of workload to deploy",
  204. "label": "Workload Type",
  205. "group": "Workload Details",
  206. "schema": {
  207. "type": "string",
  208. "hidden": true,
  209. "default": "Deployment",
  210. "required": true,
  211. "enum": [
  212. {
  213. "value": "Deployment",
  214. "description": "Deploy a Deployment workload"
  215. },
  216. {
  217. "value": "Job",
  218. "description": "Deploy job workload"
  219. },
  220. {
  221. "value": "CronJob",
  222. "description": "Deploy cronjob workload"
  223. }
  224. ]
  225. }
  226. },
  227. {
  228. "variable": "cronSchedule",
  229. "label": "Cron Schedule",
  230. "group": "Workload Details",
  231. "schema": {
  232. "hidden": true,
  233. "type": "cron",
  234. "show_if": [
  235. [
  236. "workloadType",
  237. "=",
  238. "CronJob"
  239. ]
  240. ],
  241. "default": {
  242. "minute": "5"
  243. }
  244. }
  245. },
  246. {
  247. "variable": "image",
  248. "description": "Docker Image Details",
  249. "label": "Docker Image",
  250. "group": "Container Images",
  251. "schema": {
  252. "type": "dict",
  253. "required": true,
  254. "attrs": [
  255. {
  256. "variable": "repository",
  257. "description": "Docker image repository",
  258. "label": "Image repository",
  259. "schema": {
  260. "type": "string",
  261. "required": true
  262. }
  263. },
  264. {
  265. "variable": "tag",
  266. "description": "Tag to use for specified image",
  267. "label": "Image Tag",
  268. "schema": {
  269. "type": "string",
  270. "default": "latest"
  271. }
  272. },
  273. {
  274. "variable": "pullPolicy",
  275. "description": "Docker Image Pull Policy",
  276. "label": "Image Pull Policy",
  277. "schema": {
  278. "type": "string",
  279. "default": "IfNotPresent",
  280. "enum": [
  281. {
  282. "value": "IfNotPresent",
  283. "description": "Only pull image if not present on host"
  284. },
  285. {
  286. "value": "Always",
  287. "description": "Always pull image even if present on host"
  288. },
  289. {
  290. "value": "Never",
  291. "description": "Never pull image even if it's not present on host"
  292. }
  293. ]
  294. }
  295. }
  296. ]
  297. }
  298. },
  299. {
  300. "variable": "updateStrategy",
  301. "description": "Upgrade Policy",
  302. "label": "Update Strategy",
  303. "group": "Scaling/Upgrade Policy",
  304. "schema": {
  305. "type": "string",
  306. "show_if": [
  307. [
  308. "workloadType",
  309. "=",
  310. "Deployment"
  311. ]
  312. ],
  313. "default": "Recreate",
  314. "enum": [
  315. {
  316. "value": "RollingUpdate",
  317. "description": "Create new pods and then kill old ones"
  318. },
  319. {
  320. "value": "Recreate",
  321. "description": "Kill existing pods before creating new ones"
  322. }
  323. ]
  324. }
  325. },
  326. {
  327. "variable": "jobRestartPolicy",
  328. "description": "Restart Policy for Job",
  329. "label": "Restart Policy",
  330. "group": "Restart Policy",
  331. "schema": {
  332. "hidden": true,
  333. "type": "string",
  334. "default": "OnFailure",
  335. "show_if": [
  336. [
  337. "workloadType",
  338. "!=",
  339. "Deployment"
  340. ]
  341. ],
  342. "enum": [
  343. {
  344. "value": "OnFailure",
  345. "description": "Only restart job if it fails"
  346. },
  347. {
  348. "value": "Never",
  349. "description": "Never restart job even if it fails"
  350. }
  351. ]
  352. }
  353. },
  354. {
  355. "variable": "containerCommand",
  356. "description": "Commands to execute inside container overriding image CMD default",
  357. "label": "Container CMD",
  358. "group": "Container Entrypoint",
  359. "schema": {
  360. "type": "list",
  361. "items": [
  362. {
  363. "variable": "command",
  364. "description": "Container Command",
  365. "label": "Command",
  366. "schema": {
  367. "type": "string"
  368. }
  369. }
  370. ]
  371. }
  372. },
  373. {
  374. "variable": "containerArgs",
  375. "description": "Specify arguments for container command",
  376. "label": "Container Args",
  377. "group": "Container Entrypoint",
  378. "schema": {
  379. "type": "list",
  380. "items": [
  381. {
  382. "variable": "arg",
  383. "description": "Container Arg",
  384. "label": "Arg",
  385. "schema": {
  386. "type": "string"
  387. }
  388. }
  389. ]
  390. }
  391. },
  392. {
  393. "variable": "containerEnvironmentVariables",
  394. "description": "Container Environment Variables",
  395. "label": "Container Environment Variables",
  396. "group": "Container Environment Variables",
  397. "schema": {
  398. "type": "list",
  399. "items": [
  400. {
  401. "variable": "environmentVariable",
  402. "description": "Container Environment Variable",
  403. "label": "Container Environment Variable",
  404. "schema": {
  405. "type": "dict",
  406. "attrs": [
  407. {
  408. "variable": "name",
  409. "description": "Environment Variable Name",
  410. "label": "Environment Variable Name",
  411. "schema": {
  412. "type": "string",
  413. "required": true
  414. }
  415. },
  416. {
  417. "variable": "value",
  418. "description": "Environment Variable Value",
  419. "label": "Environment Variable Value",
  420. "schema": {
  421. "type": "string",
  422. "required": true
  423. }
  424. }
  425. ]
  426. }
  427. }
  428. ]
  429. }
  430. },
  431. {
  432. "variable": "externalInterfaces",
  433. "description": "Add External Interfaces",
  434. "label": "Add external Interfaces",
  435. "group": "Networking",
  436. "schema": {
  437. "type": "list",
  438. "items": [
  439. {
  440. "variable": "interfaceConfiguration",
  441. "description": "Interface Configuration",
  442. "label": "Interface Configuration",
  443. "schema": {
  444. "type": "dict",
  445. "$ref": [
  446. "normalize/interfaceConfiguration"
  447. ],
  448. "attrs": [
  449. {
  450. "variable": "hostInterface",
  451. "description": "Please specify host interface",
  452. "label": "Host Interface",
  453. "schema": {
  454. "type": "string",
  455. "required": true,
  456. "$ref": [
  457. "definitions/interface"
  458. ],
  459. "enum": []
  460. }
  461. },
  462. {
  463. "variable": "ipam",
  464. "description": "Define how IP Address will be managed",
  465. "label": "IP Address Management",
  466. "schema": {
  467. "type": "dict",
  468. "required": true,
  469. "attrs": [
  470. {
  471. "variable": "type",
  472. "description": "Specify type for IPAM",
  473. "label": "IPAM Type",
  474. "schema": {
  475. "type": "string",
  476. "required": true,
  477. "enum": [
  478. {
  479. "value": "dhcp",
  480. "description": "Use DHCP"
  481. },
  482. {
  483. "value": "static",
  484. "description": "Use static IP"
  485. }
  486. ],
  487. "show_subquestions_if": "static",
  488. "subquestions": [
  489. {
  490. "variable": "staticIPConfigurations",
  491. "label": "Static IP Addresses",
  492. "schema": {
  493. "type": "list",
  494. "items": [
  495. {
  496. "variable": "staticIP",
  497. "label": "Static IP",
  498. "schema": {
  499. "type": "ipaddr",
  500. "cidr": true
  501. }
  502. }
  503. ]
  504. }
  505. },
  506. {
  507. "variable": "staticRoutes",
  508. "label": "Static Routes",
  509. "schema": {
  510. "type": "list",
  511. "items": [
  512. {
  513. "variable": "staticRouteConfiguration",
  514. "label": "Static Route Configuration",
  515. "schema": {
  516. "type": "dict",
  517. "attrs": [
  518. {
  519. "variable": "destination",
  520. "label": "Destination",
  521. "schema": {
  522. "type": "ipaddr",
  523. "cidr": true,
  524. "required": true
  525. }
  526. },
  527. {
  528. "variable": "gateway",
  529. "label": "Gateway",
  530. "schema": {
  531. "type": "ipaddr",
  532. "cidr": false,
  533. "required": true
  534. }
  535. }
  536. ]
  537. }
  538. }
  539. ]
  540. }
  541. }
  542. ]
  543. }
  544. }
  545. ]
  546. }
  547. }
  548. ]
  549. }
  550. }
  551. ]
  552. }
  553. },
  554. {
  555. "variable": "dnsPolicy",
  556. "label": "DNS Policy",
  557. "description": "Default behaviour is where Pod inherits the name resolution configuration from the node that the pods run on, if None is specified, It allows a Pod to ignore DNS settings from the Kubernetes environment.",
  558. "group": "Networking",
  559. "schema": {
  560. "type": "string",
  561. "default": "Default",
  562. "enum": [
  563. {
  564. "value": "Default",
  565. "description": "Use Default DNS Policy where Pod will inherit the name resolution configuration from the node."
  566. },
  567. {
  568. "value": "ClusterFirst",
  569. "description": "\"Kubernetes internal DNS will be prioritised and resolved first. If the domain does not resolve with internal kubernetes DNS, the DNS query will be forwarded to the upstream nameserver inherited from the node. This is useful if the workload needs to access other service(s)/workload(s) using kubernetes internal DNS.\"\n"
  570. },
  571. {
  572. "value": "ClusterFirstWithHostNet",
  573. "description": "For Pods running with hostNetwork and wanting to prioritise internal kubernetes DNS should make use of this policy."
  574. },
  575. {
  576. "value": "None",
  577. "description": "Ignore DNS settings from the Kubernetes cluster"
  578. }
  579. ]
  580. }
  581. },
  582. {
  583. "variable": "dnsConfig",
  584. "label": "DNS Configuration",
  585. "group": "Networking",
  586. "description": "Specify custom DNS configuration which will be applied to the pod",
  587. "schema": {
  588. "type": "dict",
  589. "attrs": [
  590. {
  591. "variable": "nameservers",
  592. "label": "Nameservers",
  593. "schema": {
  594. "default": [],
  595. "type": "list",
  596. "items": [
  597. {
  598. "variable": "nameserver",
  599. "label": "Nameserver",
  600. "schema": {
  601. "type": "string"
  602. }
  603. }
  604. ]
  605. }
  606. },
  607. {
  608. "variable": "searches",
  609. "label": "Searches",
  610. "schema": {
  611. "default": [],
  612. "type": "list",
  613. "items": [
  614. {
  615. "variable": "search",
  616. "label": "Search Entry",
  617. "schema": {
  618. "type": "string"
  619. }
  620. }
  621. ]
  622. }
  623. },
  624. {
  625. "variable": "options",
  626. "label": "DNS Options",
  627. "schema": {
  628. "type": "list",
  629. "items": [
  630. {
  631. "variable": "optionsEntry",
  632. "label": "Option Entry Configuration",
  633. "schema": {
  634. "type": "dict",
  635. "attrs": [
  636. {
  637. "variable": "name",
  638. "label": "Option Name",
  639. "schema": {
  640. "type": "string",
  641. "required": true
  642. }
  643. },
  644. {
  645. "variable": "value",
  646. "label": "Option Value",
  647. "schema": {
  648. "type": "string",
  649. "required": true
  650. }
  651. }
  652. ]
  653. }
  654. }
  655. ]
  656. }
  657. }
  658. ]
  659. }
  660. },
  661. {
  662. "variable": "hostNetwork",
  663. "label": "Provide access to node network namespace for the workload",
  664. "group": "Networking",
  665. "schema": {
  666. "type": "boolean",
  667. "default": false,
  668. "show_if": [
  669. [
  670. "externalInterfaces",
  671. "=",
  672. []
  673. ]
  674. ]
  675. }
  676. },
  677. {
  678. "variable": "hostPortsList",
  679. "label": "Specify host ports for the workload",
  680. "description": "Only use host ports if scaling of a workload is not required",
  681. "group": "Networking",
  682. "schema": {
  683. "show_if": [
  684. [
  685. "updateStrategy",
  686. "=",
  687. "Recreate"
  688. ]
  689. ],
  690. "type": "list",
  691. "hidden": true,
  692. "items": [
  693. {
  694. "variable": "hostPortConfiguration",
  695. "label": "Host Port Configuration",
  696. "schema": {
  697. "type": "dict",
  698. "attrs": [
  699. {
  700. "variable": "containerPort",
  701. "label": "Container Port",
  702. "schema": {
  703. "type": "string",
  704. "required": true
  705. }
  706. },
  707. {
  708. "variable": "hostPort",
  709. "label": "Host Port",
  710. "schema": {
  711. "type": "string",
  712. "required": true
  713. }
  714. }
  715. ]
  716. }
  717. }
  718. ]
  719. }
  720. },
  721. {
  722. "variable": "portForwardingList",
  723. "label": "Specify Node ports to forward to workload",
  724. "group": "Port Forwarding",
  725. "description": "Specify ports of node and workload to forward traffic from node port to workload port",
  726. "schema": {
  727. "type": "list",
  728. "show_if": [
  729. [
  730. "hostNetwork",
  731. "=",
  732. false
  733. ]
  734. ],
  735. "items": [
  736. {
  737. "variable": "portForwarding",
  738. "label": "Port Forwarding Configuration",
  739. "schema": {
  740. "type": "dict",
  741. "attrs": [
  742. {
  743. "variable": "containerPort",
  744. "label": "Container Port",
  745. "schema": {
  746. "type": "int",
  747. "required": true
  748. }
  749. },
  750. {
  751. "variable": "nodePort",
  752. "label": "Node Port",
  753. "schema": {
  754. "type": "int",
  755. "required": true,
  756. "min": 9000,
  757. "max": 65535
  758. }
  759. },
  760. {
  761. "variable": "protocol",
  762. "label": "Protocol",
  763. "schema": {
  764. "type": "string",
  765. "default": "TCP",
  766. "enum": [
  767. {
  768. "value": "TCP",
  769. "description": "TCP Protocol"
  770. },
  771. {
  772. "value": "UDP",
  773. "description": "UDP Protocol"
  774. }
  775. ]
  776. }
  777. }
  778. ]
  779. }
  780. }
  781. ]
  782. }
  783. },
  784. {
  785. "variable": "hostPathVolumes",
  786. "label": "Host Path Volumes",
  787. "group": "Storage",
  788. "schema": {
  789. "type": "list",
  790. "items": [
  791. {
  792. "variable": "hostPathConfiguration",
  793. "label": "Host Path Configuration",
  794. "schema": {
  795. "type": "dict",
  796. "attrs": [
  797. {
  798. "variable": "hostPath",
  799. "label": "Host Path",
  800. "schema": {
  801. "type": "hostpath",
  802. "required": true
  803. }
  804. },
  805. {
  806. "variable": "mountPath",
  807. "label": "Mount Path",
  808. "description": "Path where host path will be mounted inside the pod",
  809. "schema": {
  810. "type": "path",
  811. "required": true
  812. }
  813. },
  814. {
  815. "variable": "readOnly",
  816. "label": "Read Only",
  817. "schema": {
  818. "type": "boolean",
  819. "default": false
  820. }
  821. }
  822. ]
  823. }
  824. }
  825. ]
  826. }
  827. },
  828. {
  829. "variable": "emptyDirVolumes",
  830. "label": "Memory Backed Volumes",
  831. "description": "Mount memory based temporary volumes for fast access i.e consuming /dev/shm",
  832. "group": "Storage",
  833. "schema": {
  834. "type": "list",
  835. "items": [
  836. {
  837. "variable": "emptyDirVolume",
  838. "label": "Memory Backed Volume",
  839. "schema": {
  840. "type": "dict",
  841. "attrs": [
  842. {
  843. "variable": "mountPath",
  844. "label": "Mount Path",
  845. "description": "Path where temporary path will be mounted inside the pod",
  846. "schema": {
  847. "type": "path",
  848. "required": true
  849. }
  850. },
  851. {
  852. "variable": "sizeLimit",
  853. "label": "Size Limit",
  854. "description": "Optional - Size of the memory backed volume.</br>\nFormat: 100Mi, 1Gi, 2Gi etc\n",
  855. "schema": {
  856. "type": "string",
  857. "valid_chars": "^([+-]?[0-9.]+)([eEinumkKMGTP]*[-+]?[0-9]*)$",
  858. "default": "512Mi"
  859. }
  860. }
  861. ]
  862. }
  863. }
  864. ]
  865. }
  866. },
  867. {
  868. "variable": "volumes",
  869. "label": "Volumes",
  870. "group": "Storage",
  871. "schema": {
  872. "type": "list",
  873. "items": [
  874. {
  875. "variable": "volume",
  876. "label": "Volume",
  877. "schema": {
  878. "type": "dict",
  879. "$ref": [
  880. "normalize/ixVolume"
  881. ],
  882. "attrs": [
  883. {
  884. "variable": "mountPath",
  885. "label": "Mount Path",
  886. "description": "Path where the volume will be mounted inside the pod",
  887. "schema": {
  888. "type": "path",
  889. "required": true
  890. }
  891. },
  892. {
  893. "variable": "datasetName",
  894. "label": "Dataset Name",
  895. "schema": {
  896. "type": "string",
  897. "required": true
  898. }
  899. }
  900. ]
  901. }
  902. }
  903. ]
  904. }
  905. },
  906. {
  907. "variable": "livenessProbe",
  908. "label": "Liveness Probe",
  909. "description": "Configure Liveness Probe",
  910. "group": "Health Check",
  911. "schema": {
  912. "hidden": true,
  913. "type": "dict",
  914. "default": null,
  915. "null": true,
  916. "attrs": [
  917. {
  918. "variable": "command",
  919. "label": "Liveness command",
  920. "description": "Specify a command to determine liveness of pod",
  921. "schema": {
  922. "type": "list",
  923. "required": true,
  924. "items": [
  925. {
  926. "variable": "commandArg",
  927. "label": "Command Arg",
  928. "schema": {
  929. "type": "string"
  930. }
  931. }
  932. ]
  933. }
  934. },
  935. {
  936. "variable": "initialDelaySeconds",
  937. "label": "Seconds Delay",
  938. "description": "Seconds to delay the first liveness probe",
  939. "schema": {
  940. "type": "int",
  941. "default": 5
  942. }
  943. },
  944. {
  945. "variable": "periodSeconds",
  946. "label": "Period Seconds",
  947. "description": "Specify number of seconds to run liveness probe",
  948. "schema": {
  949. "type": "int",
  950. "default": 10
  951. }
  952. }
  953. ]
  954. }
  955. },
  956. {
  957. "variable": "gpuConfiguration",
  958. "label": "GPU Configuration",
  959. "group": "Resource Reservation",
  960. "schema": {
  961. "type": "dict",
  962. "$ref": [
  963. "definitions/gpuConfiguration"
  964. ],
  965. "attrs": []
  966. }
  967. },
  968. {
  969. "variable": "tty",
  970. "label": "Enable TTY",
  971. "description": "Determines whether containers in a pod runs with TTY enabled. By default pod has it disabled.",
  972. "group": "Workload Details",
  973. "schema": {
  974. "type": "boolean",
  975. "default": false
  976. }
  977. },
  978. {
  979. "variable": "stdin",
  980. "label": "Enable STDIN",
  981. "description": "Determines whether containers in a pod runs with stdin enabled. By default pod has it disabled.",
  982. "group": "Workload Details",
  983. "schema": {
  984. "type": "boolean",
  985. "default": false
  986. }
  987. },
  988. {
  989. "variable": "securityContext",
  990. "label": "Security Context",
  991. "group": "Workload Details",
  992. "schema": {
  993. "type": "dict",
  994. "attrs": [
  995. {
  996. "variable": "privileged",
  997. "label": "Privileged Mode",
  998. "description": "Determines if any container in a pod can enable privileged mode. By default a container is not allowed to access any devices on the host, but a 'privileged' container is given access to all devices on the host. This allows the container nearly all the same access as processes running on the host.",
  999. "schema": {
  1000. "type": "boolean",
  1001. "default": false
  1002. }
  1003. },
  1004. {
  1005. "variable": "capabilities",
  1006. "label": "Capabilities",
  1007. "description": "With Linux capabilities, you can grant certain privileges to a process without granting all the privileges of the root user.",
  1008. "schema": {
  1009. "type": "list",
  1010. "items": [
  1011. {
  1012. "variable": "capability",
  1013. "description": "Add Capability",
  1014. "label": "Add Capability",
  1015. "schema": {
  1016. "type": "string"
  1017. }
  1018. }
  1019. ]
  1020. }
  1021. },
  1022. {
  1023. "variable": "enableRunAsUser",
  1024. "label": "Configure Container User and Group ID",
  1025. "description": "Configure security context runAsUser and runAsGroup variables",
  1026. "schema": {
  1027. "type": "boolean",
  1028. "default": false,
  1029. "show_subquestions_if": true,
  1030. "subquestions": [
  1031. {
  1032. "variable": "runAsUser",
  1033. "label": "Run Container As User",
  1034. "description": "Configure user id for container.",
  1035. "schema": {
  1036. "type": "int",
  1037. "default": 568
  1038. }
  1039. },
  1040. {
  1041. "variable": "runAsGroup",
  1042. "label": "Run Container As Group",
  1043. "description": "Configure group id for container.",
  1044. "schema": {
  1045. "type": "int",
  1046. "default": 568
  1047. }
  1048. }
  1049. ]
  1050. }
  1051. }
  1052. ]
  1053. }
  1054. },
  1055. {
  1056. "variable": "enableResourceLimits",
  1057. "label": "Enable Pod resource limits",
  1058. "group": "Resource Limits",
  1059. "schema": {
  1060. "type": "boolean",
  1061. "default": false
  1062. }
  1063. },
  1064. {
  1065. "variable": "cpuLimit",
  1066. "label": "CPU Limit",
  1067. "description": "CPU resource limit allow plain integer values with suffix m(milli) e.g 1000m, 100.",
  1068. "group": "Resource Limits",
  1069. "schema": {
  1070. "type": "string",
  1071. "show_if": [
  1072. [
  1073. "enableResourceLimits",
  1074. "=",
  1075. true
  1076. ]
  1077. ],
  1078. "valid_chars": "^\\d+(?:\\.\\d+(?!.*m$)|m?$)",
  1079. "default": "4000m"
  1080. }
  1081. },
  1082. {
  1083. "variable": "memLimit",
  1084. "label": "Memory Limit",
  1085. "group": "Resource Limits",
  1086. "description": "Memory limits is specified by number of bytes. Followed by quantity suffix like E,P,T,G,M,k and Ei,Pi,Ti,Mi,Gi,Ki can also be used. e.g 129e6, 129M, 128974848000m, 123Mi",
  1087. "schema": {
  1088. "type": "string",
  1089. "show_if": [
  1090. [
  1091. "enableResourceLimits",
  1092. "=",
  1093. true
  1094. ]
  1095. ],
  1096. "valid_chars": "^([+-]?[0-9.]+)([eEinumkKMGTP]*[-+]?[0-9]*)$",
  1097. "default": "8Gi"
  1098. }
  1099. }
  1100. ]
  1101. },
  1102. "app_readme": "<h1>iX-Chart</h1>\n<p>iX-chart is a chart designed to let user deploy a docker image in a TrueNAS SCALE kubernetes cluster.\nIt provides a mechanism to specify workload type, add external host interfaces in the pods, configure volumes and allocate host resources to the workload.</p>",
  1103. "detailed_readme": "<h1>iX Chart</h1>\n<p>iX-chart is a chart designed to let user deploy a docker image in a TrueNAS SCALE kubernetes cluster.\nIt provides a mechanism to specify workload type, add external host interfaces in the pods, configure volumes and allocate host resources to the workload.</p>\n<p>This chart will deploy a docker image as a kubernetes workload allowing user to configure the workload deployment / management.</p>\n<h2>Introduction</h2>\n<p>iX-chart is designed for simple single docker image deployments.</p>\n<h2>Configuration</h2>\n<p>The following table lists the configurable parameters of the iX chart and\ntheir default values.</p>\n<p>| Parameter | Description | Default |\n|:-------------------------------|:----------------------------------------------------------------------------------------------------------------|:---------------------------------------------------------------------|\n| <code>workloadType</code> | Specify type of workload to deploy | <code>Deployment</code> |\n| <code>cronSchedule</code> | Specify schedule for cronjob if <code>workloadType</code> is <code>CronJob</code>. | <code>{\"minute\": \"5\", \"hour\": \"*\", \"dom\": \"*\", \"month\": \"*\", \"dow\": \"*\"}</code> |\n| <code>image.repository</code> | The image repository to pull from | <code>debian</code> |\n| <code>image.tag</code> | The image tag to pull from | <code>latest</code> |\n| <code>image.pullPolicy</code> | Image pull policy | <code>IfNotPresent</code> |\n| <code>updateStrategy</code> | Upgrade Policy | <code>RollingUpdate</code> |\n| <code>jobRestartPolicy</code> | Restart Policy for job type workload ( only applicable if <code>workloadType</code> is <code>Job</code>/<code>CronJob</code> | <code>OnFailure</code> |\n| <code>containerCommand</code> | Commands to execute inside container overriding image CMD default | <code>null</code> |\n| <code>containerArgs</code> | Specify arguments for container command | <code>null</code> |\n| <code>containerEnvironmentVariables</code>| Container Environment Variables | <code>null</code> |\n| <code>externalInterfaces</code> | Add external interfaces in the pod | <code>null</code> |\n| <code>dnsPolicy</code> | Specify DNS Policy for pod | <code>Default</code> |\n| <code>dnsConfig</code> | Specify custom DNS configuration which will be applied to the pod | <code>{\"nameservers\": [], \"searches\": []}</code> |\n| <code>hostNetwork</code> | Use host network for workload ( similar to docker host networking ) | <code>false</code> |\n| <code>hostPortsList</code> | Specify ports of host and workload to forward traffic from host port to workload port. | <code>null</code> |\n| <code>portForwardingList</code> | Specify ports of node and workload to forward traffic from node port to workload port | <code>null</code> |\n| <code>hostPathVolumes</code> | Specify host paths to be used as hostpath volumes for the workload | <code>null</code> |\n| <code>volumes</code> | Specify <code>ix_volumes</code> | <code>null</code> |\n| <code>livenessProbe</code> | Configure Liveness Probe for workload | <code>null</code> |\n| <code>gpuConfiguration</code> | Allocate GPU to workload ( if available ) | <code>{}</code> |</p>\n<h2>Persistence</h2>\n<p>Chart release iX chart offers 2 ways to have persistent storage:</p>\n<p>1) <code>hostPathVolumes</code>\n2) <code>volumes</code></p>\n<p>For (1), they are kubernetes host path volumes which the user can assign to the workload with RO/RW permissions.</p>\n<p>(2) is a host path volume as well but it operates differently then (1) in terms of where it lives and how it's lifecycle is tied to the chart release.\nFor (2), users specify where they would like persistent storage in the workload and a dataset name ( it should be unique per each chart release ), based on this input,\nsystem will create a dataset and then use it as a host path volume for the workload. During upgrades, snapshot will be taken for these volumes and on rollback users can subsequently\nrestore the snapshots hence the data.\nWhen a chart release will be deleted, all (2) volumes data will be deleted unlike (1) ( until of course they are not in the chart release's dataset path ).</p>\n<h2>Recommended Persistence Configuration Examples</h2>\n<p>The following is a recommended configuration example for creating ix volumes</p>\n<p>```\n\"volumes\": [\n {\n \"datasetName\": \"ix_volume1\",\n \"mountPath\": \"/mount_test1\"\n },\n {\n \"datasetName\": \"ix_volume2\",\n \"mountPath\": \"/mount_test2\"\n }\n]</p>\n<p>```</p>\n<p><code>mountPath</code> refers to the path inside the pod.</p>\n<hr />\n<p>The following is a recommended configuration example for <code>hostPathVolumes</code></p>\n<p><code>\"hostPathVolumes\": [\n {\n \"hostPath\": \"/mnt/pool/test_dir\",\n \"mountPath\": \"/test_dir\",\n \"readOnly\": true\n },\n {\n \"hostPath\": \"/mnt/pool/test_file\",\n \"mountPath\": \"/test_file\",\n \"readOnly\": true\n }\n]</code></p>\n<h2>External Interfaces Configuration Examples</h2>\n<p><code>\"externalInterfaces\": [\n {\n \"hostInterface\": \"ens3\",\n \"ipam\": {\"type\": \"dhcp\"}\n },\n {\n \"hostInterface\": \"br0\",\n \"ipam\": {\n \"type\": \"static\",\n \"staticIPConfigurations\": [\"192.168.0.120/24\"],\n \"staticRoutes\": [\n {\"destination\": \"0.0.0.0/0\", \"gateway\": \"192.168.0.1\"}\n ]\n }\n }\n]</code></p>\n<p>The first entry in the above configuration example will add an external interface in the pod using macvlan with <code>ipam</code> being set to <code>dhcp</code>.\nSecond entry will add an external interface in the pod using <code>bridge</code> and using static IP configuration for the external interface.</p>",
  1104. "changelog": null
  1105. }
  1106. }