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,16 +171,18 @@ 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
170177}
171178
172179// SetSpec sets the spec in the Generator g.
173180func (g * Generator ) SetSpec (spec * rspec.Spec ) {
174181 g .spec = spec
175182}
176183
177- // GetSpec gets the spec in the Generator g.
178- func (g * Generator ) GetSpec () * rspec.Spec {
184+ // Spec gets the spec in the Generator g.
185+ func (g * Generator ) Spec () * rspec.Spec {
179186 return g .spec
180187}
181188
@@ -953,6 +960,9 @@ func (g *Generator) SetupPrivileged(privileged bool) {
953960 // Add all capabilities in privileged mode.
954961 var finalCapList []string
955962 for _ , cap := range capability .List () {
963+ if g .HostSpecific && cap > capability .CAP_LAST_CAP {
964+ continue
965+ }
956966 finalCapList = append (finalCapList , fmt .Sprintf ("CAP_%s" , strings .ToUpper (cap .String ())))
957967 }
958968 g .initSpecLinux ()
@@ -963,12 +973,15 @@ func (g *Generator) SetupPrivileged(privileged bool) {
963973 }
964974}
965975
966- func checkCap (c string ) error {
976+ func checkCap (c string , hostSpecific bool ) error {
967977 isValid := false
968978 cp := strings .ToUpper (c )
969979
970980 for _ , cap := range capability .List () {
971981 if cp == strings .ToUpper (cap .String ()) {
982+ if hostSpecific && cap > capability .CAP_LAST_CAP {
983+ return fmt .Errorf ("CAP_%s is not supported on the current host" , cp )
984+ }
972985 isValid = true
973986 break
974987 }
@@ -990,7 +1003,7 @@ func (g *Generator) ClearProcessCapabilities() {
9901003
9911004// AddProcessCapability adds a process capability into g.spec.Process.Capabilities.
9921005func (g * Generator ) AddProcessCapability (c string ) error {
993- if err := checkCap (c ); err != nil {
1006+ if err := checkCap (c , g . HostSpecific ); err != nil {
9941007 return err
9951008 }
9961009
@@ -1009,7 +1022,7 @@ func (g *Generator) AddProcessCapability(c string) error {
10091022
10101023// DropProcessCapability drops a process capability from g.spec.Process.Capabilities.
10111024func (g * Generator ) DropProcessCapability (c string ) error {
1012- if err := checkCap (c ); err != nil {
1025+ if err := checkCap (c , g . HostSpecific ); err != nil {
10131026 return err
10141027 }
10151028
0 commit comments