1"use strict";(self.webpackChunkhelm_www=self.webpackChunkhelm_www||[]).push([["3283"],{38243(e,n,t){t.r(n),t.d(n,{metadata:()=>i,default:()=>d,frontMatter:()=>r,contentTitle:()=>l,toc:()=>h,assets:()=>o});var i=JSON.parse('{"id":"hips/hip-0020","title":"H4HIP: Charts v3 Enablement","description":"\x3c!--","source":"@site/community/hips/hip-0020.md","sourceDirName":"hips","slug":"/hips/hip-0020","permalink":"/community/hips/hip-0020","draft":false,"unlisted":false,"editUrl":"https://github.com/helm/community/edit/main/hips/hip-0020.md","tags":[],"version":"current","frontMatter":{"title":"H4HIP: Charts v3 Enablement","sidebar_label":"0020: H4HIP: Charts v3 Enablement"},"sidebar":"communitySidebar","previous":{"title":"0019: New annotations for displaying hook output","permalink":"/community/hips/hip-0019"},"next":{"title":"0021: Enhanced logging library for Helm","permalink":"/community/hips/hip-0021"}}'),a=t(74848),s=t(28453);let r={title:"H4HIP: Charts v3 Enablement",sidebar_label:"0020: H4HIP: Charts v3 Enablement"},l,o={},h=[{value:"Abstract",id:"abstract",level:2},{value:"Motivation",id:"motivation",level:2},{value:"Rationale",id:"rationale",level:2},{value:"Specification",id:"specification",level:2},{value:"Backwards compatibility",id:"backwards-compatibility",level:2},{value:"Security implications",id:"security-implications",level:2},{value:"How to teach this",id:"how-to-teach-this",level:2},{value:"Reference implementation",id:"reference-implementation",level:2},{value:"Rejected ideas",id:"rejected-ideas",level:2},{value:"Open issues",id:"open-issues",level:2},{value:"References",id:"references",level:2}];function c(e){let n={a:"a",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:["\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,a.jsxs)(n.table,{children:[(0,a.jsx)(n.thead,{children:(0,a.jsxs)(n.tr,{children:[(0,a.jsx)(n.th,{children:(0,a.jsx)(n.strong,{children:"HIP"})}),(0,a.jsx)(n.th,{children:(0,a.jsx)(n.strong,{children:"Title"})}),(0,a.jsx)(n.th,{children:(0,a.jsx)(n.strong,{children:"Author(s)"})}),(0,a.jsx)(n.th,{children:(0,a.jsx)(n.strong,{children:"Created"})}),(0,a.jsx)(n.th,{children:(0,a.jsx)(n.strong,{children:"Type"})}),(0,a.jsx)(n.th,{children:(0,a.jsx)(n.strong,{children:"Status"})})]})}),(0,a.jsx)(n.tbody,{children:(0,a.jsxs)(n.tr,{children:[(0,a.jsx)(n.td,{children:"0020"}),(0,a.jsx)(n.td,{children:"H4HIP: Charts v3 Enablement"}),(0,a.jsxs)(n.td,{children:["Matt Farina ",(0,a.jsx)(n.a,{href:"mailto:[email protected]",children:"[email protected]"})]}),(0,a.jsx)(n.td,{children:"2025-01-09"}),(0,a.jsx)(n.td,{children:"feature"}),(0,a.jsx)(n.td,{children:"accepted"})]})})]}),"\n",(0,a.jsx)(n.h2,{id:"abstract",children:"Abstract"}),"\n",(0,a.jsx)(n.p,{children:"This HIP proposes the creation of charts v3, updating Helm to handle charts v2 and v3, and a\ntimeline for the general availability of charts v3 that can happen after the release of Helm v4.0.0."}),"\n",(0,a.jsx)(n.h2,{id:"motivation",children:"Motivation"}),"\n",(0,a.jsx)(n.p,{children:"Many of the proposed changes for Helm v4 affect charts. Layering these onto existing charts will\nsometimes cause chart installation and upgrade to happen differently in Helm v3 and Helm v4, as\nboth will need to live side by side for a time. It also means that testing of charts for v3 can produce\na different result when installed with Helm v4."}),"\n",(0,a.jsx)(n.p,{children:"In addition to the affects of the changes, Helm v4 development has a fixed timeline and making\nchanges to Helm in addition to reworking charts is not likely to fit within that fixed window. Enabling\nthe development of charts v3 to happen as an experiment that becomes generally available after\nthe release of Helm v4 provides more time to continue the work and get feedback."}),"\n",(0,a.jsx)(n.p,{children:"The goal is to provide adequate time to work on chart changes while doing it in a way that enables\ntrust in existing charts to run as they were tested."}),"\n",(0,a.jsx)(n.h2,{id:"rationale",children:"Rationale"}),"\n",(0,a.jsx)(n.p,{children:"Charts v2 were created for Helm v3 and introduced minor changes. The code that handles the chart\nversions is the same with some checking to handle the differences. This handling ended up having\nnumerous bugs that had to be worked out in patch releases."}),"\n",(0,a.jsx)(n.p,{children:"The chart changes being proposed for Helm v4 are more significant. Mixing those in alongside the\ncurrent chart version handling will have trouble limiting bugs will enabling the changes and keeping\nexisting charts functioning properly."}),"\n",(0,a.jsx)(n.p,{children:"The design specified here is meant to enable the current charts to work as expected while providing\nspace for more radical changes."}),"\n",(0,a.jsx)(n.h2,{id:"specification",children:"Specification"}),"\n",(0,a.jsxs)(n.p,{children:["Helm has numerous packages that do various things, from working with charts to storing release\ninformation. These packages all expect there to be one version of a particular thing. To support\nmultiple versions of charts, the ",(0,a.jsx)(n.code,{children:"chart"}),", ",(0,a.jsx)(n.code,{children:"chartutil"}),", ",(0,a.jsx)(n.code,{children:"engine"}),", and ",(0,a.jsx)(n.code,{children:"release"})," packages will be made\nmulti-version. (e.g., engine will have a v1 and v2 versions). In addition to enabling a new version of\ncharts, this will enable the gotpl engine to evolve as needed to support the new version of charts.\nThe ",(0,a.jsx)(n.code,{children:"chartutil"})," may be combined with the ",(0,a.jsx)(n.code,{children:"chart"})," package and the ",(0,a.jsx)(n.code,{children:"releaseutil"})," package may be\ncombined with the ",(0,a.jsx)(n.code,{children:"release"})," package for simplification of the package structure."]}),"\n",(0,a.jsx)(n.p,{children:"The versioning of the packages will follow the same structure that Kubernetes does with its APIs.\nThis means a thing will have a directory and within it will be sub-directories for the versions. The\nversion specific implementation will be in the version specific sub-directory. For example,"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"chart\n\u251C\u2500\u2500 v2\n\u2514\u2500\u2500 v3\n"})}),"\n",(0,a.jsx)(n.p,{children:"The version will not use a separate Git repository or Go modules. The reason for this is the added\ncomplexity of managing the repositories and modules is added work to manage changes which will\nslow down velocity, will make releases more complex, and make the Helm SDK more complicated\nto work with."}),"\n",(0,a.jsxs)(n.p,{children:["The existing versions of these packages will be externally facing while the new versions will be\ndeveloped in ",(0,a.jsx)(n.code,{children:"internal"})," as experiments until they are complete enough for release. When ready for\nrelease, these packages will be moved to the public locations."]}),"\n",(0,a.jsxs)(n.p,{children:["To illustrate this, while in development the ",(0,a.jsx)(n.code,{children:"chart"})," package will have the following structure:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"internal/chart\n\u2514\u2500\u2500 v3\npkg/chart\n\u2514\u2500\u2500 v2\n"})}),"\n",(0,a.jsx)(n.p,{children:"Once the new chart packages have (
1a) a stable API and (b) are feature complete the structure will\nbe merged to look like:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"pkg/chart\n\u251C\u2500\u2500 v2\n\u2514\u2500\u2500 v3\n"})}),"\n",(0,a.jsxs)(n.p,{children:["While in development, as an experiment, the ",(0,a.jsx)(n.code,{children:"pkg/gates"})," package will be used to create an opt-in\nenvironment variable to enable a new chart version. This is how the OCI experimental feature was\nhandled."]}),"\n",(0,a.jsx)(n.h2,{id:"backwards-compatibility",children:"Backwards compatibility"}),"\n",(0,a.jsx)(n.p,{children:"This development and process is designed with backwards compatibility in mind. The package\nlocations will change, which is ok in a major version of Helm. The existing charts will be preserved\nso that their installation process continues to work as expected from Helm v3. New features and\nchanges to charts can be added in without impacting existing charts."}),"\n",(0,a.jsx)(n.p,{children:"While the new chart version is being developed and is going through breaking changes, the chart\nwill be an opt-in feature which will enable us to warn users about the state of it."}),"\n",(0,a.jsx)(n.h2,{id:"security-implications",children:"Security implications"}),"\n",(0,a.jsx)(n.p,{children:"N/A"}),"\n",(0,a.jsx)(n.h2,{id:"how-to-teach-this",children:"How to teach this"}),"\n",(0,a.jsx)(n.p,{children:"There are a few ways to teach this:"}),"\n",(0,a.jsxs)(n.ol,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"Documentation"}),": The chart documentation will be updated to teach both versions of charts."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"Helm Create"}),": Helm create will be updated to use the new chart version and provide an example."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"Blog and Webinars"}),": The marketing options open to Helm will be used to share details and teach about the new chart version."]}),"\n"]}),"\n",(0,a.jsx)(n.h2,{id:"reference-implementation",children:"Reference implementation"}),"\n",(0,a.jsx)(n.p,{children:"N/A"}),"\n",(0,a.jsx)(n.h2,{id:"rejected-ideas",children:"Rejected ideas"}),"\n",(0,a.jsxs)(n.p,{children:["An option to detect the chart version within existing code was seen as an option. This is how\ncharts ",(0,a.jsx)(n.code,{children:"apiVersion"})," is handled for ",(0,a.jsx)(n.code,{children:"v1"})," and ",(0,a.jsx)(n.code,{children:"v2"}),". This is problematic as large changes in charts\nwill be difficult to work on and test to ensure nothing breaks across version."]}),"\n",(0,a.jsx)(n.h2,{id:"open-issues",children:"Open issues"}),"\n",(0,a.jsx)(n.p,{children:"N/A"}),"\n",(0,a.jsx)(n.h2,{id:"references",children:"References"}),"\n",(0,a.jsx)(n.p,{children:"N/A"})]})}function d(e={}){let{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}},28453(e,n,t){t.d(n,{R:()=>r,x:()=>l});var i=t(96540);let a={},s=i.createContext(a);function r(e){let n=i.useContext(s);return i.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:r(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.