2121
2222// Generator represents a generator for a container spec.
2323type Generator struct {
24- spec * rspec.Spec
24+ spec * rspec.Spec
25+ hostSpecific bool
2526}
2627
2728// New creates a spec Generator with the default spec.
@@ -139,12 +140,16 @@ func New() Generator {
139140 Devices : []rspec.Device {},
140141 },
141142 }
142- return Generator {& spec }
143+ return Generator {
144+ spec : & spec ,
145+ }
143146}
144147
145148// NewFromSpec creates a spec Generator from a given spec.
146149func NewFromSpec (spec * rspec.Spec ) Generator {
147- return Generator {spec }
150+ return Generator {
151+ spec : spec ,
152+ }
148153}
149154
150155// NewFromFile loads the template specifed in a file into a spec Generator.
@@ -166,7 +171,19 @@ func NewFromTemplate(r io.Reader) (Generator, error) {
166171 if err := json .NewDecoder (r ).Decode (& spec ); err != nil {
167172 return Generator {}, err
168173 }
169- return Generator {& spec }, nil
174+ return Generator {
175+ spec : & spec ,
176+ }, nil
177+ }
178+
179+ // EnableHostSpecific enables g.hostSpecific.
180+ func (g * Generator ) EnableHostSpecific () {
181+ g .hostSpecific = true
182+ }
183+
184+ // GetHostSpecific gets g.hostSpecific.
185+ func (g * Generator ) GetHostSpecific () bool {
186+ return g .hostSpecific
170187}
171188
172189// SetSpec sets the spec in the Generator g.
@@ -909,6 +926,9 @@ func (g *Generator) SetupPrivileged(privileged bool) {
909926 // Add all capabilities in privileged mode.
910927 var finalCapList []string
911928 for _ , cap := range capability .List () {
929+ if g .hostSpecific && cap > capability .CAP_LAST_CAP {
930+ continue
931+ }
912932 finalCapList = append (finalCapList , fmt .Sprintf ("CAP_%s" , strings .ToUpper (cap .String ())))
913933 }
914934 g .spec .Process .Capabilities = finalCapList
@@ -918,12 +938,15 @@ func (g *Generator) SetupPrivileged(privileged bool) {
918938 }
919939}
920940
921- func checkCap (c string ) error {
941+ func checkCap (c string , hostSpecific bool ) error {
922942 isValid := false
923943 cp := strings .ToUpper (c )
924944
925945 for _ , cap := range capability .List () {
926946 if cp == strings .ToUpper (cap .String ()) {
947+ if hostSpecific && cap > capability .CAP_LAST_CAP {
948+ return fmt .Errorf ("CAP_%s is not supported on the current host" , cp )
949+ }
927950 isValid = true
928951 break
929952 }
@@ -942,7 +965,7 @@ func (g *Generator) ClearProcessCapabilities() {
942965
943966// AddProcessCapability adds a process capability into g.spec.Process.Capabilities.
944967func (g * Generator ) AddProcessCapability (c string ) error {
945- if err := checkCap (c ); err != nil {
968+ if err := checkCap (c , g . hostSpecific ); err != nil {
946969 return err
947970 }
948971
@@ -960,7 +983,7 @@ func (g *Generator) AddProcessCapability(c string) error {
960983
961984// DropProcessCapability drops a process capability from g.spec.Process.Capabilities.
962985func (g * Generator ) DropProcessCapability (c string ) error {
963- if err := checkCap (c ); err != nil {
986+ if err := checkCap (c , g . hostSpecific ); err != nil {
964987 return err
965988 }
966989
0 commit comments