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,14 @@ 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
170182}
171183
172184// SetSpec sets the spec in the Generator g.
@@ -909,6 +921,9 @@ func (g Generator) SetupPrivileged(privileged bool) {
909921 // Add all capabilities in privileged mode.
910922 var finalCapList []string
911923 for _ , cap := range capability .List () {
924+ if g .hostSpecific && cap > capability .CAP_LAST_CAP {
925+ continue
926+ }
912927 finalCapList = append (finalCapList , fmt .Sprintf ("CAP_%s" , strings .ToUpper (cap .String ())))
913928 }
914929 g .spec .Process .Capabilities = finalCapList
@@ -918,12 +933,15 @@ func (g Generator) SetupPrivileged(privileged bool) {
918933 }
919934}
920935
921- func checkCap (c string ) error {
936+ func checkCap (c string , hostSpecific bool ) error {
922937 isValid := false
923938 cp := strings .ToUpper (c )
924939
925940 for _ , cap := range capability .List () {
926941 if cp == strings .ToUpper (cap .String ()) {
942+ if hostSpecific && cap > capability .CAP_LAST_CAP {
943+ return fmt .Errorf ("CAP_%s is not supported on the current host" , cp )
944+ }
927945 isValid = true
928946 break
929947 }
@@ -942,7 +960,7 @@ func (g Generator) ClearProcessCapabilities() {
942960
943961// AddProcessCapability adds a process capability into g.spec.Process.Capabilities.
944962func (g Generator ) AddProcessCapability (c string ) error {
945- if err := checkCap (c ); err != nil {
963+ if err := checkCap (c , g . hostSpecific ); err != nil {
946964 return err
947965 }
948966
@@ -960,7 +978,7 @@ func (g Generator) AddProcessCapability(c string) error {
960978
961979// DropProcessCapability drops a process capability from g.spec.Process.Capabilities.
962980func (g Generator ) DropProcessCapability (c string ) error {
963- if err := checkCap (c ); err != nil {
981+ if err := checkCap (c , g . hostSpecific ); err != nil {
964982 return err
965983 }
966984
0 commit comments