aboutsummaryrefslogtreecommitdiff
path: root/pkg
diff options
context:
space:
mode:
Diffstat (limited to 'pkg')
-rw-r--r--pkg/api/handlers/compat/containers.go6
-rw-r--r--pkg/api/handlers/compat/images_build.go18
-rw-r--r--pkg/api/handlers/libpod/containers.go7
-rw-r--r--pkg/api/handlers/libpod/images.go8
-rw-r--r--pkg/api/handlers/libpod/pods.go4
-rw-r--r--pkg/bindings/images/build.go10
-rw-r--r--pkg/domain/entities/pods.go1
-rw-r--r--pkg/specgen/generate/container_create.go14
-rw-r--r--pkg/specgen/podspecgen.go16
9 files changed, 68 insertions, 16 deletions
diff --git a/pkg/api/handlers/compat/containers.go b/pkg/api/handlers/compat/containers.go
index 26e1bf00b..a15fdb553 100644
--- a/pkg/api/handlers/compat/containers.go
+++ b/pkg/api/handlers/compat/containers.go
@@ -104,8 +104,12 @@ func ListContainers(w http.ResponseWriter, r *http.Request) {
}
filterMap, err := util.PrepareFilters(r)
+ if err != nil {
+ utils.Error(w, "Something went wrong.", http.StatusInternalServerError, errors.Wrapf(err, "failed to decode filter parameters for %s", r.URL.String()))
+ return
+ }
- if dErr := decoder.Decode(&query, r.URL.Query()); dErr != nil || err != nil {
+ if err := decoder.Decode(&query, r.URL.Query()); err != nil {
utils.Error(w, "Something went wrong.", http.StatusInternalServerError, errors.Wrapf(err, "failed to parse parameters for %s", r.URL.String()))
return
}
diff --git a/pkg/api/handlers/compat/images_build.go b/pkg/api/handlers/compat/images_build.go
index 6855742b2..606c52e41 100644
--- a/pkg/api/handlers/compat/images_build.go
+++ b/pkg/api/handlers/compat/images_build.go
@@ -106,7 +106,7 @@ func BuildImage(w http.ResponseWriter, r *http.Request) {
NamespaceOptions string `schema:"nsoptions"`
NoCache bool `schema:"nocache"`
OutputFormat string `schema:"outputformat"`
- Platform string `schema:"platform"`
+ Platform []string `schema:"platform"`
Pull bool `schema:"pull"`
PullPolicy string `schema:"pullpolicy"`
Quiet bool `schema:"q"`
@@ -126,7 +126,6 @@ func BuildImage(w http.ResponseWriter, r *http.Request) {
Registry: "docker.io",
Rm: true,
ShmSize: 64 * 1024 * 1024,
- Tag: []string{},
}
decoder := r.Context().Value(api.DecoderKey).(*schema.Decoder)
@@ -481,16 +480,17 @@ func BuildImage(w http.ResponseWriter, r *http.Request) {
},
}
- if len(query.Platform) > 0 {
- variant := ""
- buildOptions.OS, buildOptions.Architecture, variant, err = parse.Platform(query.Platform)
+ for _, platformSpec := range query.Platform {
+ os, arch, variant, err := parse.Platform(platformSpec)
if err != nil {
- utils.BadRequest(w, "platform", query.Platform, err)
+ utils.BadRequest(w, "platform", platformSpec, err)
return
}
- buildOptions.SystemContext.OSChoice = buildOptions.OS
- buildOptions.SystemContext.ArchitectureChoice = buildOptions.Architecture
- buildOptions.SystemContext.VariantChoice = variant
+ buildOptions.Platforms = append(buildOptions.Platforms, struct{ OS, Arch, Variant string }{
+ OS: os,
+ Arch: arch,
+ Variant: variant,
+ })
}
if _, found := r.URL.Query()["timestamp"]; found {
ts := time.Unix(query.Timestamp, 0)
diff --git a/pkg/api/handlers/libpod/containers.go b/pkg/api/handlers/libpod/containers.go
index 4639093f2..343c0d0b3 100644
--- a/pkg/api/handlers/libpod/containers.go
+++ b/pkg/api/handlers/libpod/containers.go
@@ -73,8 +73,13 @@ func ListContainers(w http.ResponseWriter, r *http.Request) {
}
filterMap, err := util.PrepareFilters(r)
+ if err != nil {
+ utils.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError,
+ errors.Wrapf(err, "failed to decode filter parameters for %s", r.URL.String()))
+ return
+ }
- if dErr := decoder.Decode(&query, r.URL.Query()); dErr != nil || err != nil {
+ if err := decoder.Decode(&query, r.URL.Query()); err != nil {
utils.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError,
errors.Wrapf(err, "failed to parse parameters for %s", r.URL.String()))
return
diff --git a/pkg/api/handlers/libpod/images.go b/pkg/api/handlers/libpod/images.go
index 72093c492..b4f08a746 100644
--- a/pkg/api/handlers/libpod/images.go
+++ b/pkg/api/handlers/libpod/images.go
@@ -156,8 +156,14 @@ func PruneImages(w http.ResponseWriter, r *http.Request) {
}
filterMap, err := util.PrepareFilters(r)
+ if err != nil {
+ utils.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError,
+ errors.
+ Wrapf(err, "failed to decode filter parameters for %s", r.URL.String()))
+ return
+ }
- if dErr := decoder.Decode(&query, r.URL.Query()); dErr != nil || err != nil {
+ if err := decoder.Decode(&query, r.URL.Query()); err != nil {
utils.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError,
errors.
Wrapf(err, "failed to parse parameters for %s", r.URL.String()))
diff --git a/pkg/api/handlers/libpod/pods.go b/pkg/api/handlers/libpod/pods.go
index cc686c69d..1f03e121e 100644
--- a/pkg/api/handlers/libpod/pods.go
+++ b/pkg/api/handlers/libpod/pods.go
@@ -52,13 +52,11 @@ func PodCreate(w http.ResponseWriter, r *http.Request) {
utils.Error(w, "Something went wrong.", http.StatusInternalServerError, errors.Wrap(err, "failed to decode specgen"))
return
}
- tempSpec := &specgen.SpecGenerator{} // temporary spec since infra cannot be decoded into
- err = json.Unmarshal(out, tempSpec) // unmarhal matching options
+ err = json.Unmarshal(out, psg.InfraContainerSpec) // unmarhal matching options
if err != nil {
utils.Error(w, "Something went wrong.", http.StatusInternalServerError, errors.Wrap(err, "failed to decode specgen"))
return
}
- psg.InfraContainerSpec = tempSpec // set infra spec equal to temp
// a few extra that do not have the same json tags
psg.InfraContainerSpec.Name = psg.InfraName
psg.InfraContainerSpec.ConmonPidFile = psg.InfraConmonPidFile
diff --git a/pkg/bindings/images/build.go b/pkg/bindings/images/build.go
index 3beafa585..9d5aad23b 100644
--- a/pkg/bindings/images/build.go
+++ b/pkg/bindings/images/build.go
@@ -220,6 +220,16 @@ func Build(ctx context.Context, containerFiles []string, options entities.BuildO
if len(platform) > 0 {
params.Set("platform", platform)
}
+ if len(options.Platforms) > 0 {
+ params.Del("platform")
+ for _, platformSpec := range options.Platforms {
+ platform = platformSpec.OS + "/" + platformSpec.Arch
+ if platformSpec.Variant != "" {
+ platform += "/" + platformSpec.Variant
+ }
+ params.Add("platform", platform)
+ }
+ }
params.Set("pullpolicy", options.PullPolicy.String())
diff --git a/pkg/domain/entities/pods.go b/pkg/domain/entities/pods.go
index d9dd0c532..a74725c63 100644
--- a/pkg/domain/entities/pods.go
+++ b/pkg/domain/entities/pods.go
@@ -131,6 +131,7 @@ type PodCreateOptions struct {
Cpus float64
CpusetCpus string
Userns specgen.Namespace
+ Volume []string
}
// PodLogsOptions describes the options to extract pod logs.
diff --git a/pkg/specgen/generate/container_create.go b/pkg/specgen/generate/container_create.go
index fbb229e1c..91230338e 100644
--- a/pkg/specgen/generate/container_create.go
+++ b/pkg/specgen/generate/container_create.go
@@ -28,15 +28,27 @@ func MakeContainer(ctx context.Context, rt *libpod.Runtime, s *specgen.SpecGener
return nil, nil, nil, err
}
- // If joining a pod, retrieve the pod for use.
+ // If joining a pod, retrieve the pod for use, and its infra container
var pod *libpod.Pod
+ var cont *libpod.Container
+ var config *libpod.ContainerConfig
if s.Pod != "" {
pod, err = rt.LookupPod(s.Pod)
if err != nil {
return nil, nil, nil, errors.Wrapf(err, "error retrieving pod %s", s.Pod)
}
+ if pod.HasInfraContainer() {
+ cont, err = pod.InfraContainer()
+ if err != nil {
+ return nil, nil, nil, err
+ }
+ config = cont.Config()
+ }
}
+ if config != nil && (len(config.NamedVolumes) > 0 || len(config.UserVolumes) > 0 || len(config.ImageVolumes) > 0 || len(config.OverlayVolumes) > 0) {
+ s.VolumesFrom = append(s.VolumesFrom, config.ID)
+ }
// Set defaults for unset namespaces
if s.PidNS.IsDefault() {
defaultNS, err := GetDefaultNamespaceMode("pid", rtc, pod)
diff --git a/pkg/specgen/podspecgen.go b/pkg/specgen/podspecgen.go
index 8872a1321..5f72fc47d 100644
--- a/pkg/specgen/podspecgen.go
+++ b/pkg/specgen/podspecgen.go
@@ -72,6 +72,22 @@ type PodBasicConfig struct {
// Any containers created within the pod will inherit the pod's userns settings.
// Optional
Userns Namespace `json:"userns,omitempty"`
+ // Mounts are mounts that will be added to the pod.
+ // These will supersede Image Volumes and VolumesFrom (WIP) volumes where
+ // there are conflicts.
+ // Optional.
+ Mounts []spec.Mount `json:"mounts,omitempty"`
+ // Volumes are named volumes that will be added to the pod.
+ // These will supersede Image Volumes and VolumesFrom (WIP) volumes where
+ // there are conflicts.
+ // Optional.
+ Volumes []*NamedVolume `json:"volumes,omitempty"`
+ // Overlay volumes are named volumes that will be added to the pod.
+ // Optional.
+ OverlayVolumes []*OverlayVolume `json:"overlay_volumes,omitempty"`
+ // Image volumes bind-mount a container-image mount into the pod's infra container.
+ // Optional.
+ ImageVolumes []*ImageVolume `json:"image_volumes,omitempty"`
}
// PodNetworkConfig contains networking configuration for a pod.