createPlugin creates a new plugin. take lock before calling.
(name string, configDigest, manifestDigest digest.Digest, blobsums []digest.Digest, rootFSDir string, privileges *plugin.Privileges, opts ...CreateOpt)
| 297 | |
| 298 | // createPlugin creates a new plugin. take lock before calling. |
| 299 | func (pm *Manager) createPlugin(name string, configDigest, manifestDigest digest.Digest, blobsums []digest.Digest, rootFSDir string, privileges *plugin.Privileges, opts ...CreateOpt) (_ *v2.Plugin, retErr error) { |
| 300 | if err := pm.config.Store.validateName(name); err != nil { // todo: this check is wrong. remove store |
| 301 | return nil, errdefs.InvalidParameter(err) |
| 302 | } |
| 303 | |
| 304 | config, err := pm.setupNewPlugin(configDigest, privileges) |
| 305 | if err != nil { |
| 306 | return nil, err |
| 307 | } |
| 308 | |
| 309 | p := &v2.Plugin{ |
| 310 | PluginObj: plugin.Plugin{ |
| 311 | Name: name, |
| 312 | ID: stringid.GenerateRandomID(), |
| 313 | Config: config, |
| 314 | }, |
| 315 | Config: configDigest, |
| 316 | Blobsums: blobsums, |
| 317 | Manifest: manifestDigest, |
| 318 | } |
| 319 | p.InitEmptySettings() |
| 320 | for _, o := range opts { |
| 321 | o(p) |
| 322 | } |
| 323 | |
| 324 | pdir := filepath.Join(pm.config.Root, p.PluginObj.ID) |
| 325 | if err := os.MkdirAll(pdir, 0o700); err != nil { |
| 326 | return nil, errors.Wrapf(err, "failed to mkdir %v", pdir) |
| 327 | } |
| 328 | |
| 329 | defer func() { |
| 330 | if retErr != nil { |
| 331 | _ = os.RemoveAll(pdir) |
| 332 | } |
| 333 | }() |
| 334 | |
| 335 | if err := os.Rename(rootFSDir, filepath.Join(pdir, rootFSFileName)); err != nil { |
| 336 | return nil, errors.Wrap(err, "failed to rename rootfs") |
| 337 | } |
| 338 | |
| 339 | if err := pm.save(p); err != nil { |
| 340 | return nil, err |
| 341 | } |
| 342 | |
| 343 | pm.config.Store.Add(p) // todo: remove |
| 344 | |
| 345 | return p, nil |
| 346 | } |
| 347 | |
| 348 | func recursiveUnmount(target string) error { |
| 349 | return mount.RecursiveUnmount(target) |
no test coverage detected