aboutsummaryrefslogtreecommitdiff
path: root/pkg/spec/containerconfig.go
blob: ae642011774c82a26df1d70b3019d7e99d8539e4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package createconfig

import (
	"github.com/containers/libpod/libpod"
	"github.com/containers/libpod/libpod/define"
	spec "github.com/opencontainers/runtime-spec/specs-go"
	"github.com/pkg/errors"
	"github.com/sirupsen/logrus"
)

// MakeContainerConfig generates all configuration necessary to start a
// container with libpod from a completed CreateConfig struct.
func (config *CreateConfig) MakeContainerConfig(runtime *libpod.Runtime, pod *libpod.Pod) (*spec.Spec, []libpod.CtrCreateOption, error) {
	if config.Pod != "" && pod == nil {
		return nil, nil, errors.Wrapf(define.ErrInvalidArg, "pod was specified but no pod passed")
	} else if config.Pod == "" && pod != nil {
		return nil, nil, errors.Wrapf(define.ErrInvalidArg, "pod was given but no pod is specified")
	}

	// Parse volumes flag into OCI spec mounts and libpod Named Volumes.
	// If there is an identical mount in the OCI spec, we will replace it
	// with a mount generated here.
	mounts, namedVolumes, err := config.parseVolumes(runtime)
	if err != nil {
		return nil, nil, err
	}

	runtimeSpec, err := config.createConfigToOCISpec(runtime, mounts)
	if err != nil {
		return nil, nil, err
	}

	options, err := config.getContainerCreateOptions(runtime, pod, mounts, namedVolumes)
	if err != nil {
		return nil, nil, err
	}

	logrus.Debugf("created OCI spec and options for new container")

	return runtimeSpec, options, nil
}