@@ -497,9 +497,9 @@ spec:
497497 DataSources is the list of data sources to place within the SystemInfo
498498 volume.
499499
500- At most one actorMetadata entry may appear; this is what keeps file
501- paths unique across the whole volume (uniqueness within the entry is
502- enforced on its items).
500+ At most one actorMetadata entry may appear, and file paths must be
501+ unique across all entries (uniqueness within actorMetadata is enforced
502+ on its items).
503503 items :
504504 description : |-
505505 SystemInfoDataSource is a container allowing you to pick a particular
@@ -534,17 +534,18 @@ spec:
534534 path :
535535 description : |-
536536 Relative path from the root of the SystemInfo volume at which the
537- field's value is written. Must be a clean relative Unix path: must not
538- start or end with '/', and contain no ':', '.. ', '.', '//', or control
539- characters.
537+ field's value is written. Must be a clean relative Unix path: it must
538+ not start or end with '/' and must not contain ':', '// ', '.' or '..'
539+ segments, or control characters.
540540 maxLength : 255
541541 minLength : 1
542542 type : string
543543 x-kubernetes-validations :
544544 - message : ' path must be a clean relative
545- Unix path: must not start or end with
546- '' /'' , and contain no '' :'' , '' ..'' ,
547- '' .'' , '' //'' , or control characters'
545+ Unix path: it must not start or end
546+ with '' /'' and must not contain '' :'' ,
547+ '' //'' , '' .'' or '' ..'' segments, or
548+ control characters'
548549 rule : ' !self.startsWith('' /'' ) && !self.endsWith('' /'' )
549550 && !self.contains('' //'' ) && !self.contains('' :'' )
550551 && !self.matches('' [\x00-\x1f\x7f]'' )
@@ -567,18 +568,76 @@ spec:
567568 required :
568569 - items
569570 type : object
571+ trustBundle :
572+ description : |-
573+ TrustBundleDataSource is a SystemInfo volume data source that projects the
574+ trust anchors of a named trust bundle to a single PEM file — inspired by
575+ the Kubernetes clusterTrustBundle projected volume source, but
576+ source-neutral: the name selects a bundle substrate knows how to fetch,
577+ and where it is fetched from is a substrate deployment concern, not part
578+ of this API (atelet enforces the supported set and resolves the backend).
579+
580+ Supported names are allowlisted in atelet. Initially the only supported
581+ bundle is "egress-mitm.ate.dev" (the egress gateway CA bundle), resolved
582+ from the Kubernetes ClusterTrustBundle (certificates.k8s.io/v1beta1) that
583+ atecontroller derives from the egress-mitm-ca-pool; a configurable backend
584+ registry may widen this later.
585+
586+ The bundle is resolved and sanitized on the node when the actor starts:
587+ atelet reads the backing object through a cluster-wide watch and keeps
588+ only CERTIFICATE PEM blocks, deduplicated and deliberately shuffled (order
589+ carries no meaning); the actor itself never talks to any bundle backend.
590+ Starting the actor fails if the named bundle is not on the allowlist, its
591+ backend is unavailable in this deployment, or the resolved bundle is
592+ missing, empty, or unparseable.
593+ properties :
594+ name :
595+ description : |-
596+ Name of the trust bundle to project. Must be a bundle name supported
597+ by this deployment (currently only "egress-mitm.ate.dev").
598+ maxLength : 253
599+ minLength : 1
600+ type : string
601+ path :
602+ description : |-
603+ Relative path from the root of the SystemInfo volume at which the PEM
604+ bundle is written. Must be a clean relative Unix path: it must not
605+ start or end with '/' and must not contain ':', '//', '.' or '..'
606+ segments, or control characters.
607+ maxLength : 255
608+ minLength : 1
609+ type : string
610+ x-kubernetes-validations :
611+ - message : ' path must be a clean relative Unix
612+ path: it must not start or end with '' /''
613+ and must not contain '' :'' , '' //'' , '' .''
614+ or '' ..'' segments, or control characters'
615+ rule : ' !self.startsWith('' /'' ) && !self.endsWith('' /'' )
616+ && !self.contains('' //'' ) && !self.contains('' :'' )
617+ && !self.matches('' [\x00-\x1f\x7f]'' ) && !self.matches('' (^|/)[.][.]?(/|$)'' )'
618+ required :
619+ - name
620+ - path
621+ type : object
570622 type : object
571623 x-kubernetes-validations :
572- - message : exactly one of the fields in [actorMetadata]
573- must be set
574- rule : ' [has(self.actorMetadata)].filter(x,x==true).size()
624+ - message : exactly one of the fields in [actorMetadata
625+ trustBundle] must be set
626+ rule : ' [has(self.actorMetadata),has(self.trustBundle) ].filter(x,x==true).size()
575627 == 1'
576- maxItems : 32
628+ maxItems : 8
577629 type : array
578630 x-kubernetes-validations :
579631 - message : dataSources must contain at most one actorMetadata
580632 entry
581633 rule : self.filter(x, has(x.actorMetadata)).size() <= 1
634+ - message : dataSources must not contain duplicate paths
635+ rule : self.all(x, !has(x.trustBundle) || self.exists_one(y,
636+ has(y.trustBundle) && y.trustBundle.path == x.trustBundle.path))
637+ - message : dataSources must not contain duplicate paths
638+ rule : ' !self.exists(x, has(x.trustBundle) && self.exists(y,
639+ has(y.actorMetadata) && y.actorMetadata.items.exists(i,
640+ i.path == x.trustBundle.path)))'
582641 type : object
583642 required :
584643 - name
0 commit comments