enable gocritic linter

The linter ensures a common code style.
- use switch/case instead of else if
- use if instead of switch/case for single case statement
- add space between comment and text
- detect the use of defer with os.Exit()
- use short form var += "..." instead of var = var + "..."
- detect problems with append()
```
newSlice := append(orgSlice, val)
```
  This could lead to nasty bugs because the orgSlice will be changed in
  place if it has enough capacity too hold the new elements. Thus we
  newSlice might not be a copy.

Of course most of the changes are just cosmetic and do not cause any
logic errors but I think it is a good idea to enforce a common style.
This should help maintainability.

Signed-off-by: Paul Holzinger <pholzing@redhat.com>
This commit is contained in:
Paul Holzinger
2022-04-25 15:15:52 +02:00
parent 216d924307
commit 51fbf3da9e
79 changed files with 265 additions and 262 deletions

View File

@ -46,7 +46,6 @@ linters:
- lll - lll
- unconvert - unconvert
- errcheck - errcheck
- gocritic
- gosec - gosec
- maligned - maligned
- gomoddirectives - gomoddirectives

View File

@ -327,7 +327,7 @@ func suffixCompSlice(suf string, slice []string) []string {
if len(split) > 1 { if len(split) > 1 {
slice[i] = split[0] + suf + "\t" + split[1] slice[i] = split[0] + suf + "\t" + split[1]
} else { } else {
slice[i] = slice[i] + suf slice[i] += suf
} }
} }
return slice return slice
@ -647,7 +647,10 @@ func AutocompleteInspect(cmd *cobra.Command, args []string, toComplete string) (
pods, _ := getPods(cmd, toComplete, completeDefault) pods, _ := getPods(cmd, toComplete, completeDefault)
networks, _ := getNetworks(cmd, toComplete, completeDefault) networks, _ := getNetworks(cmd, toComplete, completeDefault)
volumes, _ := getVolumes(cmd, toComplete) volumes, _ := getVolumes(cmd, toComplete)
suggestions := append(containers, images...)
suggestions := make([]string, 0, len(containers)+len(images)+len(pods)+len(networks)+len(volumes))
suggestions = append(suggestions, containers...)
suggestions = append(suggestions, images...)
suggestions = append(suggestions, pods...) suggestions = append(suggestions, pods...)
suggestions = append(suggestions, networks...) suggestions = append(suggestions, networks...)
suggestions = append(suggestions, volumes...) suggestions = append(suggestions, volumes...)
@ -961,6 +964,8 @@ func AutocompleteFormat(o interface{}) func(cmd *cobra.Command, args []string, t
// this function provides shell completion for go templates // this function provides shell completion for go templates
return func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { return func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
// autocomplete json when nothing or json is typed // autocomplete json when nothing or json is typed
// gocritic complains about the argument order but this is correct in this case
//nolint:gocritic
if strings.HasPrefix("json", toComplete) { if strings.HasPrefix("json", toComplete) {
return []string{"json"}, cobra.ShellCompDirectiveNoFileComp return []string{"json"}, cobra.ShellCompDirectiveNoFileComp
} }

View File

@ -121,13 +121,8 @@ func scp(cmd *cobra.Command, args []string) (finalErr error) {
return err return err
} }
if flipConnections { // the order of cliConnections matters, we need to flip both arrays since the args are parsed separately sometimes. if flipConnections { // the order of cliConnections matters, we need to flip both arrays since the args are parsed separately sometimes.
connect := cliConnections[0] cliConnections[0], cliConnections[1] = cliConnections[1], cliConnections[0]
cliConnections[0] = cliConnections[1] locations[0], locations[1] = locations[1], locations[0]
cliConnections[1] = connect
loc := locations[0]
locations[0] = locations[1]
locations[1] = loc
} }
dest = *locations[1] dest = *locations[1]
case len(locations) == 1: case len(locations) == 1:

View File

@ -224,7 +224,8 @@ func create(cmd *cobra.Command, args []string) error {
} }
sort.Ints(vals) sort.Ints(vals)
for ind, core := range vals { for ind, core := range vals {
if core > int(cpuSet) { switch {
case core > int(cpuSet):
if copy == "" { if copy == "" {
copy = "0-" + strconv.Itoa(int(cpuSet)) copy = "0-" + strconv.Itoa(int(cpuSet))
infraOptions.CPUSetCPUs = copy infraOptions.CPUSetCPUs = copy
@ -233,9 +234,9 @@ func create(cmd *cobra.Command, args []string) error {
infraOptions.CPUSetCPUs = copy infraOptions.CPUSetCPUs = copy
break break
} }
} else if ind != 0 { case ind != 0:
copy += "," + strconv.Itoa(core) copy += "," + strconv.Itoa(core)
} else { default:
copy = "" + strconv.Itoa(core) copy = "" + strconv.Itoa(core)
} }
} }

View File

@ -62,13 +62,14 @@ func create(cmd *cobra.Command, args []string) error {
path := args[1] path := args[1]
var reader io.Reader var reader io.Reader
if env { switch {
case env:
envValue := os.Getenv(path) envValue := os.Getenv(path)
if envValue == "" { if envValue == "" {
return errors.Errorf("cannot create store secret data: environment variable %s is not set", path) return errors.Errorf("cannot create store secret data: environment variable %s is not set", path)
} }
reader = strings.NewReader(envValue) reader = strings.NewReader(envValue)
} else if path == "-" || path == "/dev/stdin" { case path == "-" || path == "/dev/stdin":
stat, err := os.Stdin.Stat() stat, err := os.Stdin.Stat()
if err != nil { if err != nil {
return err return err
@ -77,7 +78,7 @@ func create(cmd *cobra.Command, args []string) error {
return errors.New("if `-` is used, data must be passed into stdin") return errors.New("if `-` is used, data must be passed into stdin")
} }
reader = os.Stdin reader = os.Stdin
} else { default:
file, err := os.Open(path) file, err := os.Open(path)
if err != nil { if err != nil {
return err return err

View File

@ -69,6 +69,10 @@ func migrate(cmd *cobra.Command, args []string) {
err = engine.Migrate(registry.Context(), cmd.Flags(), registry.PodmanConfig(), migrateOptions) err = engine.Migrate(registry.Context(), cmd.Flags(), registry.PodmanConfig(), migrateOptions)
if err != nil { if err != nil {
fmt.Println(err) fmt.Println(err)
// FIXME change this to return the error like other commands
// defer will never run on os.Exit()
//nolint:gocritic
os.Exit(define.ExecErrorCodeGeneric) os.Exit(define.ExecErrorCodeGeneric)
} }
os.Exit(0) os.Exit(0)

View File

@ -56,6 +56,9 @@ func renumber(cmd *cobra.Command, args []string) {
err = engine.Renumber(registry.Context(), cmd.Flags(), registry.PodmanConfig()) err = engine.Renumber(registry.Context(), cmd.Flags(), registry.PodmanConfig())
if err != nil { if err != nil {
fmt.Println(err) fmt.Println(err)
// FIXME change this to return the error like other commands
// defer will never run on os.Exit()
//nolint:gocritic
os.Exit(define.ExecErrorCodeGeneric) os.Exit(define.ExecErrorCodeGeneric)
} }
os.Exit(0) os.Exit(0)

View File

@ -95,6 +95,9 @@ func reset(cmd *cobra.Command, args []string) {
if err := engine.Reset(registry.Context()); err != nil { if err := engine.Reset(registry.Context()); err != nil {
logrus.Error(err) logrus.Error(err)
// FIXME change this to return the error like other commands
// defer will never run on os.Exit()
//nolint:gocritic
os.Exit(define.ExecErrorCodeGeneric) os.Exit(define.ExecErrorCodeGeneric)
} }
os.Exit(0) os.Exit(0)

View File

@ -37,8 +37,7 @@ func AliasFlags(f *pflag.FlagSet, name string) pflag.NormalizedName {
// TimeoutAliasFlags is a function to handle backwards compatibility with old timeout flags // TimeoutAliasFlags is a function to handle backwards compatibility with old timeout flags
func TimeoutAliasFlags(f *pflag.FlagSet, name string) pflag.NormalizedName { func TimeoutAliasFlags(f *pflag.FlagSet, name string) pflag.NormalizedName {
switch name { if name == "timeout" {
case "timeout":
name = "time" name = "time"
} }
return pflag.NormalizedName(name) return pflag.NormalizedName(name)

View File

@ -229,8 +229,7 @@ func (c *Container) Kill(signal uint) error {
// This function returns when the attach finishes. It does not hold the lock for // This function returns when the attach finishes. It does not hold the lock for
// the duration of its runtime, only using it at the beginning to verify state. // the duration of its runtime, only using it at the beginning to verify state.
func (c *Container) Attach(streams *define.AttachStreams, keys string, resize <-chan define.TerminalSize) error { func (c *Container) Attach(streams *define.AttachStreams, keys string, resize <-chan define.TerminalSize) error {
switch c.LogDriver() { if c.LogDriver() == define.PassthroughLogging {
case define.PassthroughLogging:
return errors.Wrapf(define.ErrNoLogs, "this container is using the 'passthrough' log driver, cannot attach") return errors.Wrapf(define.ErrNoLogs, "this container is using the 'passthrough' log driver, cannot attach")
} }
if !c.batched { if !c.batched {

View File

@ -817,16 +817,16 @@ func (c *Container) Exec(config *ExecConfig, streams *define.AttachStreams, resi
// Please be careful when using this function since it might temporarily unlock // Please be careful when using this function since it might temporarily unlock
// the container when os.RemoveAll($bundlePath) fails with ENOTEMPTY or EBUSY // the container when os.RemoveAll($bundlePath) fails with ENOTEMPTY or EBUSY
// errors. // errors.
func (c *Container) cleanupExecBundle(sessionID string) (Err error) { func (c *Container) cleanupExecBundle(sessionID string) (err error) {
path := c.execBundlePath(sessionID) path := c.execBundlePath(sessionID)
for attempts := 0; attempts < 50; attempts++ { for attempts := 0; attempts < 50; attempts++ {
Err = os.RemoveAll(path) err = os.RemoveAll(path)
if Err == nil || os.IsNotExist(Err) { if err == nil || os.IsNotExist(err) {
return nil return nil
} }
if pathErr, ok := Err.(*os.PathError); ok { if pathErr, ok := err.(*os.PathError); ok {
Err = pathErr.Err err = pathErr.Err
if errors.Cause(Err) == unix.ENOTEMPTY || errors.Cause(Err) == unix.EBUSY { if errors.Cause(err) == unix.ENOTEMPTY || errors.Cause(err) == unix.EBUSY {
// give other processes a chance to use the container // give other processes a chance to use the container
if !c.batched { if !c.batched {
if err := c.save(); err != nil { if err := c.save(); err != nil {

View File

@ -505,8 +505,7 @@ func (c *Container) generateSpec(ctx context.Context) (*spec.Spec, error) {
} }
for _, o := range namedVol.Options { for _, o := range namedVol.Options {
switch o { if o == "U" {
case "U":
if err := c.ChangeHostPathOwnership(mountPoint, true, int(hostUID), int(hostGID)); err != nil { if err := c.ChangeHostPathOwnership(mountPoint, true, int(hostUID), int(hostGID)); err != nil {
return nil, err return nil, err
} }
@ -596,8 +595,7 @@ func (c *Container) generateSpec(ctx context.Context) (*spec.Spec, error) {
// Check overlay volume options // Check overlay volume options
for _, o := range overlayVol.Options { for _, o := range overlayVol.Options {
switch o { if o == "U" {
case "U":
if err := c.ChangeHostPathOwnership(overlayVol.Source, true, int(hostUID), int(hostGID)); err != nil { if err := c.ChangeHostPathOwnership(overlayVol.Source, true, int(hostUID), int(hostGID)); err != nil {
return nil, err return nil, err
} }
@ -2144,13 +2142,11 @@ func (c *Container) makeBindMounts() error {
return err return err
} }
} }
} else { } else if !c.config.UseImageHosts && c.state.BindMounts["/etc/hosts"] == "" {
if !c.config.UseImageHosts && c.state.BindMounts["/etc/hosts"] == "" {
if err := c.createHosts(); err != nil { if err := c.createHosts(); err != nil {
return errors.Wrapf(err, "error creating hosts file for container %s", c.ID()) return errors.Wrapf(err, "error creating hosts file for container %s", c.ID())
} }
} }
}
if c.config.ShmDir != "" { if c.config.ShmDir != "" {
// If ShmDir has a value SHM is always added when we mount the container // If ShmDir has a value SHM is always added when we mount the container
@ -2351,7 +2347,7 @@ func (c *Container) generateResolvConf() (string, error) {
return "", errors.Wrapf(err, "error parsing host resolv.conf") return "", errors.Wrapf(err, "error parsing host resolv.conf")
} }
dns := make([]net.IP, 0, len(c.runtime.config.Containers.DNSServers)) dns := make([]net.IP, 0, len(c.runtime.config.Containers.DNSServers)+len(c.config.DNSServer))
for _, i := range c.runtime.config.Containers.DNSServers { for _, i := range c.runtime.config.Containers.DNSServers {
result := net.ParseIP(i) result := net.ParseIP(i)
if result == nil { if result == nil {
@ -2359,13 +2355,13 @@ func (c *Container) generateResolvConf() (string, error) {
} }
dns = append(dns, result) dns = append(dns, result)
} }
dnsServers := append(dns, c.config.DNSServer...) dns = append(dns, c.config.DNSServer...)
// If the user provided dns, it trumps all; then dns masq; then resolv.conf // If the user provided dns, it trumps all; then dns masq; then resolv.conf
var search []string var search []string
switch { switch {
case len(dnsServers) > 0: case len(dns) > 0:
// We store DNS servers as net.IP, so need to convert to string // We store DNS servers as net.IP, so need to convert to string
for _, server := range dnsServers { for _, server := range dns {
nameservers = append(nameservers, server.String()) nameservers = append(nameservers, server.String())
} }
default: default:
@ -2890,11 +2886,11 @@ func (c *Container) generateUserPasswdEntry(addedUID int) (string, error) {
func (c *Container) passwdEntry(username string, uid, gid, name, homeDir string) string { func (c *Container) passwdEntry(username string, uid, gid, name, homeDir string) string {
s := c.config.PasswdEntry s := c.config.PasswdEntry
s = strings.Replace(s, "$USERNAME", username, -1) s = strings.ReplaceAll(s, "$USERNAME", username)
s = strings.Replace(s, "$UID", uid, -1) s = strings.ReplaceAll(s, "$UID", uid)
s = strings.Replace(s, "$GID", gid, -1) s = strings.ReplaceAll(s, "$GID", gid)
s = strings.Replace(s, "$NAME", name, -1) s = strings.ReplaceAll(s, "$NAME", name)
s = strings.Replace(s, "$HOME", homeDir, -1) s = strings.ReplaceAll(s, "$HOME", homeDir)
return s + "\n" return s + "\n"
} }

View File

@ -94,15 +94,16 @@ func (c *Container) stat(containerMountPoint string, containerPath string) (*def
} }
} }
if statInfo.IsSymlink { switch {
case statInfo.IsSymlink:
// Symlinks are already evaluated and always relative to the // Symlinks are already evaluated and always relative to the
// container's mount point. // container's mount point.
absContainerPath = statInfo.ImmediateTarget absContainerPath = statInfo.ImmediateTarget
} else if strings.HasPrefix(resolvedPath, containerMountPoint) { case strings.HasPrefix(resolvedPath, containerMountPoint):
// If the path is on the container's mount point, strip it off. // If the path is on the container's mount point, strip it off.
absContainerPath = strings.TrimPrefix(resolvedPath, containerMountPoint) absContainerPath = strings.TrimPrefix(resolvedPath, containerMountPoint)
absContainerPath = filepath.Join("/", absContainerPath) absContainerPath = filepath.Join("/", absContainerPath)
} else { default:
// No symlink and not on the container's mount point, so let's // No symlink and not on the container's mount point, so let's
// move it back to the original input. It must have evaluated // move it back to the original input. It must have evaluated
// to a volume or bind mount but we cannot return host paths. // to a volume or bind mount but we cannot return host paths.

View File

@ -100,7 +100,7 @@ type InspectRestartPolicy struct {
// InspectLogConfig holds information about a container's configured log driver // InspectLogConfig holds information about a container's configured log driver
type InspectLogConfig struct { type InspectLogConfig struct {
Type string `json:"Type"` Type string `json:"Type"`
Config map[string]string `json:"Config"` //idk type, TODO Config map[string]string `json:"Config"`
// Path specifies a path to the log file // Path specifies a path to the log file
Path string `json:"Path"` Path string `json:"Path"`
// Tag specifies a custom log tag for the container // Tag specifies a custom log tag for the container
@ -680,7 +680,7 @@ type InspectContainerData struct {
SizeRootFs int64 `json:"SizeRootFs,omitempty"` SizeRootFs int64 `json:"SizeRootFs,omitempty"`
Mounts []InspectMount `json:"Mounts"` Mounts []InspectMount `json:"Mounts"`
Dependencies []string `json:"Dependencies"` Dependencies []string `json:"Dependencies"`
NetworkSettings *InspectNetworkSettings `json:"NetworkSettings"` //TODO NetworkSettings *InspectNetworkSettings `json:"NetworkSettings"`
Namespace string `json:"Namespace"` Namespace string `json:"Namespace"`
IsInfra bool `json:"IsInfra"` IsInfra bool `json:"IsInfra"`
Config *InspectContainerConfig `json:"Config"` Config *InspectContainerConfig `json:"Config"`

View File

@ -220,7 +220,7 @@ func ConvertV1PodToYAMLPod(pod *v1.Pod) *YAMLPod {
cs = append(cs, &YAMLContainer{Container: cc, Resources: res}) cs = append(cs, &YAMLContainer{Container: cc, Resources: res})
} }
mpo := &YAMLPod{Pod: *pod} mpo := &YAMLPod{Pod: *pod}
mpo.Spec = &YAMLPodSpec{PodSpec: (*pod).Spec, Containers: cs} mpo.Spec = &YAMLPodSpec{PodSpec: pod.Spec, Containers: cs}
for _, ctr := range pod.Spec.Containers { for _, ctr := range pod.Spec.Containers {
if ctr.SecurityContext == nil || ctr.SecurityContext.SELinuxOptions == nil { if ctr.SecurityContext == nil || ctr.SecurityContext.SELinuxOptions == nil {
continue continue
@ -527,7 +527,7 @@ func simplePodWithV1Containers(ctx context.Context, ctrs []*Container) (*v1.Pod,
// Check if the pod name and container name will end up conflicting // Check if the pod name and container name will end up conflicting
// Append -pod if so // Append -pod if so
if util.StringInSlice(podName, ctrNames) { if util.StringInSlice(podName, ctrNames) {
podName = podName + "-pod" podName += "-pod"
} }
return newPodObject( return newPodObject(
@ -885,7 +885,7 @@ func convertVolumePathToName(hostSourcePath string) (string, error) {
} }
// First, trim trailing slashes, then replace slashes with dashes. // First, trim trailing slashes, then replace slashes with dashes.
// Thus, /mnt/data/ will become mnt-data // Thus, /mnt/data/ will become mnt-data
return strings.Replace(strings.Trim(hostSourcePath, "/"), "/", "-", -1), nil return strings.ReplaceAll(strings.Trim(hostSourcePath, "/"), "/", "-"), nil
} }
func determineCapAddDropFromCapabilities(defaultCaps, containerCaps []string) *v1.Capabilities { func determineCapAddDropFromCapabilities(defaultCaps, containerCaps []string) *v1.Capabilities {
@ -927,14 +927,20 @@ func capAddDrop(caps *specs.LinuxCapabilities) (*v1.Capabilities, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
defCaps := g.Config.Process.Capabilities
// Combine all the default capabilities into a slice // Combine all the default capabilities into a slice
defaultCaps := append(g.Config.Process.Capabilities.Ambient, g.Config.Process.Capabilities.Bounding...) defaultCaps := make([]string, 0, len(defCaps.Ambient)+len(defCaps.Bounding)+len(defCaps.Effective)+len(defCaps.Inheritable)+len(defCaps.Permitted))
defaultCaps = append(defaultCaps, g.Config.Process.Capabilities.Effective...) defaultCaps = append(defaultCaps, defCaps.Ambient...)
defaultCaps = append(defaultCaps, g.Config.Process.Capabilities.Inheritable...) defaultCaps = append(defaultCaps, defCaps.Bounding...)
defaultCaps = append(defaultCaps, g.Config.Process.Capabilities.Permitted...) defaultCaps = append(defaultCaps, defCaps.Effective...)
defaultCaps = append(defaultCaps, defCaps.Inheritable...)
defaultCaps = append(defaultCaps, defCaps.Permitted...)
// Combine all the container's capabilities into a slice // Combine all the container's capabilities into a slice
containerCaps := append(caps.Ambient, caps.Bounding...) containerCaps := make([]string, 0, len(caps.Ambient)+len(caps.Bounding)+len(caps.Effective)+len(caps.Inheritable)+len(caps.Permitted))
containerCaps = append(containerCaps, caps.Ambient...)
containerCaps = append(containerCaps, caps.Bounding...)
containerCaps = append(containerCaps, caps.Effective...) containerCaps = append(containerCaps, caps.Effective...)
containerCaps = append(containerCaps, caps.Inheritable...) containerCaps = append(containerCaps, caps.Inheritable...)
containerCaps = append(containerCaps, caps.Permitted...) containerCaps = append(containerCaps, caps.Permitted...)
@ -1042,7 +1048,7 @@ func generateKubeVolumeDeviceFromLinuxDevice(devices []specs.LinuxDevice) []v1.V
} }
func removeUnderscores(s string) string { func removeUnderscores(s string) string {
return strings.Replace(s, "_", "", -1) return strings.ReplaceAll(s, "_", "")
} }
// getAutoUpdateAnnotations searches for auto-update container labels // getAutoUpdateAnnotations searches for auto-update container labels

View File

@ -579,7 +579,7 @@ func (r *Runtime) GetRootlessNetNs(new bool) (*RootlessNetNS, error) {
// lets add /usr/sbin to $PATH ourselves. // lets add /usr/sbin to $PATH ourselves.
path = os.Getenv("PATH") path = os.Getenv("PATH")
if !strings.Contains(path, "/usr/sbin") { if !strings.Contains(path, "/usr/sbin") {
path = path + ":/usr/sbin" path += ":/usr/sbin"
os.Setenv("PATH", path) os.Setenv("PATH", path)
} }
@ -1508,7 +1508,7 @@ func ocicniPortsToNetTypesPorts(ports []types.OCICNIPortMapping) []types.PortMap
ports[i].Protocol == currentPort.Protocol && ports[i].Protocol == currentPort.Protocol &&
ports[i].HostPort-int32(currentPort.Range) == int32(currentPort.HostPort) && ports[i].HostPort-int32(currentPort.Range) == int32(currentPort.HostPort) &&
ports[i].ContainerPort-int32(currentPort.Range) == int32(currentPort.ContainerPort) { ports[i].ContainerPort-int32(currentPort.Range) == int32(currentPort.ContainerPort) {
currentPort.Range = currentPort.Range + 1 currentPort.Range++
} else { } else {
newPorts = append(newPorts, currentPort) newPorts = append(newPorts, currentPort)
currentPort = types.PortMapping{ currentPort = types.PortMapping{

View File

@ -33,9 +33,9 @@ type machineExpose struct {
func requestMachinePorts(expose bool, ports []types.PortMapping) error { func requestMachinePorts(expose bool, ports []types.PortMapping) error {
url := "http://" + machineGvproxyEndpoint + "/services/forwarder/" url := "http://" + machineGvproxyEndpoint + "/services/forwarder/"
if expose { if expose {
url = url + "expose" url += "expose"
} else { } else {
url = url + "unexpose" url += "unexpose"
} }
ctx := context.Background() ctx := context.Background()
client := &http.Client{ client := &http.Client{

View File

@ -82,7 +82,9 @@ func checkSlirpFlags(path string) (*slirpFeatures, error) {
} }
func parseSlirp4netnsNetworkOptions(r *Runtime, extraOptions []string) (*slirp4netnsNetworkOptions, error) { func parseSlirp4netnsNetworkOptions(r *Runtime, extraOptions []string) (*slirp4netnsNetworkOptions, error) {
slirpOptions := append(r.config.Engine.NetworkCmdOptions, extraOptions...) slirpOptions := make([]string, 0, len(r.config.Engine.NetworkCmdOptions)+len(extraOptions))
slirpOptions = append(slirpOptions, r.config.Engine.NetworkCmdOptions...)
slirpOptions = append(slirpOptions, extraOptions...)
slirp4netnsOpts := &slirp4netnsNetworkOptions{ slirp4netnsOpts := &slirp4netnsNetworkOptions{
// overwrite defaults // overwrite defaults
disableHostLoopback: true, disableHostLoopback: true,

View File

@ -766,14 +766,12 @@ func prepareProcessExec(c *Container, options *ExecOptions, env []string, sessio
if execUser.Uid == 0 { if execUser.Uid == 0 {
pspec.Capabilities.Effective = pspec.Capabilities.Bounding pspec.Capabilities.Effective = pspec.Capabilities.Bounding
pspec.Capabilities.Permitted = pspec.Capabilities.Bounding pspec.Capabilities.Permitted = pspec.Capabilities.Bounding
} else { } else if user == c.config.User {
if user == c.config.User {
pspec.Capabilities.Effective = ctrSpec.Process.Capabilities.Effective pspec.Capabilities.Effective = ctrSpec.Process.Capabilities.Effective
pspec.Capabilities.Inheritable = ctrSpec.Process.Capabilities.Effective pspec.Capabilities.Inheritable = ctrSpec.Process.Capabilities.Effective
pspec.Capabilities.Permitted = ctrSpec.Process.Capabilities.Effective pspec.Capabilities.Permitted = ctrSpec.Process.Capabilities.Effective
pspec.Capabilities.Ambient = ctrSpec.Process.Capabilities.Effective pspec.Capabilities.Ambient = ctrSpec.Process.Capabilities.Effective
} }
}
hasHomeSet := false hasHomeSet := false
for _, s := range pspec.Env { for _, s := range pspec.Env {

View File

@ -1371,7 +1371,7 @@ func (r *ConmonOCIRuntime) sharedConmonArgs(ctr *Container, cuuid, bundlePath, p
case define.JSONLogging: case define.JSONLogging:
fallthrough fallthrough
//lint:ignore ST1015 the default case has to be here //lint:ignore ST1015 the default case has to be here
default: //nolint:stylecheck default: //nolint:stylecheck,gocritic
// No case here should happen except JSONLogging, but keep this here in case the options are extended // No case here should happen except JSONLogging, but keep this here in case the options are extended
logrus.Errorf("%s logging specified but not supported. Choosing k8s-file logging instead", ctr.LogDriver()) logrus.Errorf("%s logging specified but not supported. Choosing k8s-file logging instead", ctr.LogDriver())
fallthrough fallthrough

View File

@ -550,6 +550,10 @@ func makeRuntime(runtime *Runtime) (retErr error) {
// Check if the pause process was created. If it was created, then // Check if the pause process was created. If it was created, then
// move it to its own systemd scope. // move it to its own systemd scope.
utils.MovePauseProcessToScope(pausePid) utils.MovePauseProcessToScope(pausePid)
// gocritic complains because defer is not run on os.Exit()
// However this is fine because the lock is released anyway when the process exits
//nolint:gocritic
os.Exit(ret) os.Exit(ret)
} }
} }

View File

@ -293,9 +293,10 @@ func LibpodToContainer(l *libpod.Container, sz bool) (*handlers.Container, error
stateStr = "created" stateStr = "created"
} }
if state == define.ContainerStateConfigured || state == define.ContainerStateCreated { switch state {
case define.ContainerStateConfigured, define.ContainerStateCreated:
status = "Created" status = "Created"
} else if state == define.ContainerStateStopped || state == define.ContainerStateExited { case define.ContainerStateStopped, define.ContainerStateExited:
exitCode, _, err := l.ExitCode() exitCode, _, err := l.ExitCode()
if err != nil { if err != nil {
return nil, err return nil, err
@ -305,7 +306,7 @@ func LibpodToContainer(l *libpod.Container, sz bool) (*handlers.Container, error
return nil, err return nil, err
} }
status = fmt.Sprintf("Exited (%d) %s ago", exitCode, units.HumanDuration(time.Since(finishedTime))) status = fmt.Sprintf("Exited (%d) %s ago", exitCode, units.HumanDuration(time.Since(finishedTime)))
} else if state == define.ContainerStateRunning || state == define.ContainerStatePaused { case define.ContainerStateRunning, define.ContainerStatePaused:
startedTime, err := l.StartedTime() startedTime, err := l.StartedTime()
if err != nil { if err != nil {
return nil, err return nil, err
@ -314,11 +315,11 @@ func LibpodToContainer(l *libpod.Container, sz bool) (*handlers.Container, error
if state == define.ContainerStatePaused { if state == define.ContainerStatePaused {
status += " (Paused)" status += " (Paused)"
} }
} else if state == define.ContainerStateRemoving { case define.ContainerStateRemoving:
status = "Removal In Progress" status = "Removal In Progress"
} else if state == define.ContainerStateStopping { case define.ContainerStateStopping:
status = "Stopping" status = "Stopping"
} else { default:
status = "Unknown" status = "Unknown"
} }

View File

@ -532,7 +532,7 @@ func ExportImages(w http.ResponseWriter, r *http.Request) {
utils.Error(w, http.StatusBadRequest, errors.Wrapf(err, "failed to parse parameters for %s", r.URL.String())) utils.Error(w, http.StatusBadRequest, errors.Wrapf(err, "failed to parse parameters for %s", r.URL.String()))
return return
} }
if len(query.Names) <= 0 { if len(query.Names) == 0 {
utils.Error(w, http.StatusBadRequest, fmt.Errorf("no images to download")) utils.Error(w, http.StatusBadRequest, fmt.Errorf("no images to download"))
return return
} }

View File

@ -286,7 +286,7 @@ func BuildImage(w http.ResponseWriter, r *http.Request) {
} }
} }
} }
secrets = append(secrets, strings.Join(modifiedOpt[:], ",")) secrets = append(secrets, strings.Join(modifiedOpt, ","))
} }
} }
} }

View File

@ -58,7 +58,7 @@ func PruneImages(w http.ResponseWriter, r *http.Request) {
idr = append(idr, types.ImageDeleteResponseItem{ idr = append(idr, types.ImageDeleteResponseItem{
Deleted: p.Id, Deleted: p.Id,
}) })
reclaimedSpace = reclaimedSpace + p.Size reclaimedSpace += p.Size
} }
if errorMsg.Len() > 0 { if errorMsg.Len() > 0 {
utils.InternalServerError(w, errors.New(errorMsg.String())) utils.InternalServerError(w, errors.New(errorMsg.String()))

View File

@ -150,7 +150,7 @@ func MarshalErrorJSONIsEmpty(ptr unsafe.Pointer) bool {
} }
func MarshalErrorSliceJSONIsEmpty(ptr unsafe.Pointer) bool { func MarshalErrorSliceJSONIsEmpty(ptr unsafe.Pointer) bool {
return len(*((*[]error)(ptr))) <= 0 return len(*((*[]error)(ptr))) == 0
} }
// WriteJSON writes an interface value encoded as JSON to w // WriteJSON writes an interface value encoded as JSON to w

View File

@ -225,11 +225,9 @@ func Build(ctx context.Context, containerFiles []string, options entities.BuildO
platform = "linux" platform = "linux"
} }
platform += "/" + options.Architecture platform += "/" + options.Architecture
} else { } else if len(platform) > 0 {
if len(platform) > 0 {
platform += "/" + runtime.GOARCH platform += "/" + runtime.GOARCH
} }
}
if len(platform) > 0 { if len(platform) > 0 {
params.Set("platform", platform) params.Set("platform", platform)
} }
@ -447,7 +445,7 @@ func Build(ctx context.Context, containerFiles []string, options entities.BuildO
} }
} }
} }
secretsForRemote = append(secretsForRemote, strings.Join(modifiedOpt[:], ",")) secretsForRemote = append(secretsForRemote, strings.Join(modifiedOpt, ","))
} }
} }
@ -603,8 +601,8 @@ func nTar(excludes []string, sources ...string) (io.ReadCloser, error) {
// are required to visit all files. :( // are required to visit all files. :(
return nil return nil
} }
switch {
if d.Type().IsRegular() { // add file item case d.Type().IsRegular(): // add file item
info, err := d.Info() info, err := d.Info()
if err != nil { if err != nil {
return err return err
@ -644,7 +642,7 @@ func nTar(excludes []string, sources ...string) (io.ReadCloser, error) {
seen[di] = name seen[di] = name
} }
return err return err
} else if d.IsDir() { // add folders case d.IsDir(): // add folders
info, err := d.Info() info, err := d.Info()
if err != nil { if err != nil {
return err return err
@ -658,7 +656,7 @@ func nTar(excludes []string, sources ...string) (io.ReadCloser, error) {
if lerr := tw.WriteHeader(hdr); lerr != nil { if lerr := tw.WriteHeader(hdr); lerr != nil {
return lerr return lerr
} }
} else if d.Type()&os.ModeSymlink != 0 { // add symlinks as it, not content case d.Type()&os.ModeSymlink != 0: // add symlinks as it, not content
link, err := os.Readlink(path) link, err := os.Readlink(path)
if err != nil { if err != nil {
return err return err

View File

@ -101,7 +101,7 @@ func List(ctx context.Context, options *ListOptions) ([]types.Network, error) {
} }
// Disconnect removes a container from a given network // Disconnect removes a container from a given network
func Disconnect(ctx context.Context, networkName string, ContainerNameOrID string, options *DisconnectOptions) error { func Disconnect(ctx context.Context, networkName string, containerNameOrID string, options *DisconnectOptions) error {
if options == nil { if options == nil {
options = new(DisconnectOptions) options = new(DisconnectOptions)
} }
@ -114,7 +114,7 @@ func Disconnect(ctx context.Context, networkName string, ContainerNameOrID strin
Container string Container string
Force bool Force bool
}{ }{
Container: ContainerNameOrID, Container: containerNameOrID,
} }
if force := options.GetForce(); options.Changed("Force") { if force := options.GetForce(); options.Changed("Force") {
disconnect.Force = force disconnect.Force = force

View File

@ -18,9 +18,6 @@ import (
var _ = Describe("Podman volumes", func() { var _ = Describe("Podman volumes", func() {
var ( var (
//tempdir string
//err error
//podmanTest *PodmanTestIntegration
bt *bindingTest bt *bindingTest
s *gexec.Session s *gexec.Session
connText context.Context connText context.Context
@ -28,13 +25,6 @@ var _ = Describe("Podman volumes", func() {
) )
BeforeEach(func() { BeforeEach(func() {
//tempdir, err = CreateTempDirInTempDir()
//if err != nil {
// os.Exit(1)
//}
//podmanTest = PodmanTestCreate(tempdir)
//podmanTest.Setup()
//podmanTest.SeedImages()
bt = newBindingTest() bt = newBindingTest()
bt.RestoreImagesFromCache() bt.RestoreImagesFromCache()
s = bt.startAPIService() s = bt.startAPIService()
@ -44,9 +34,6 @@ var _ = Describe("Podman volumes", func() {
}) })
AfterEach(func() { AfterEach(func() {
//podmanTest.Cleanup()
//f := CurrentGinkgoTestDescription()
//processTestResult(f)
s.Kill() s.Kill()
bt.cleanup() bt.cleanup()
}) })

View File

@ -34,7 +34,7 @@ func PruneReportsSize(r []*PruneReport) uint64 {
if v == nil { if v == nil {
continue continue
} }
size = size + v.Size size += v.Size
} }
return size return size
} }

View File

@ -785,12 +785,19 @@ func transferRootless(source entities.ImageScpOptions, dest entities.ImageScpOpt
return cmdLoad.Run() return cmdLoad.Run()
} }
// TransferRootful creates new podman processes using exec.Command and a new uid/gid alongside a cleared environment // transferRootful creates new podman processes using exec.Command and a new uid/gid alongside a cleared environment
func transferRootful(source entities.ImageScpOptions, dest entities.ImageScpOptions, podman string, parentFlags []string) error { func transferRootful(source entities.ImageScpOptions, dest entities.ImageScpOptions, podman string, parentFlags []string) error {
basicCommand := []string{podman} basicCommand := make([]string, 0, len(parentFlags)+1)
basicCommand = append(basicCommand, podman)
basicCommand = append(basicCommand, parentFlags...) basicCommand = append(basicCommand, parentFlags...)
saveCommand := append(basicCommand, "save")
loadCommand := append(basicCommand, "load") saveCommand := make([]string, 0, len(basicCommand)+4)
saveCommand = append(saveCommand, basicCommand...)
saveCommand = append(saveCommand, "save")
loadCommand := make([]string, 0, len(basicCommand)+3)
loadCommand = append(loadCommand, basicCommand...)
loadCommand = append(loadCommand, "load")
if source.Quiet { if source.Quiet {
saveCommand = append(saveCommand, "-q") saveCommand = append(saveCommand, "-q")
loadCommand = append(loadCommand, "-q") loadCommand = append(loadCommand, "-q")

View File

@ -435,7 +435,7 @@ func (ic *ContainerEngine) playKubePod(ctx context.Context, podName string, podY
initContainers = append(initContainers, ctr) initContainers = append(initContainers, ctr)
} }
for _, container := range podYAML.Spec.Containers { for _, container := range podYAML.Spec.Containers {
if !strings.Contains("infra", container.Name) { if !strings.Contains(container.Name, "infra") {
// Error out if the same name is used for more than one container // Error out if the same name is used for more than one container
if _, ok := ctrNames[container.Name]; ok { if _, ok := ctrNames[container.Name]; ok {
return nil, errors.Errorf("the pod %q is invalid; duplicate container name %q detected", podName, container.Name) return nil, errors.Errorf("the pod %q is invalid; duplicate container name %q detected", podName, container.Name)
@ -770,7 +770,7 @@ func getBuildFile(imageName string, cwd string) (string, error) {
logrus.Error(err.Error()) logrus.Error(err.Error())
} }
_, err = os.Stat(filepath.Join(dockerfilePath)) _, err = os.Stat(dockerfilePath)
if err == nil { if err == nil {
logrus.Debugf("Building %s with %s", imageName, dockerfilePath) logrus.Debugf("Building %s with %s", imageName, dockerfilePath)
return dockerfilePath, nil return dockerfilePath, nil

View File

@ -150,7 +150,7 @@ func (ic *ContainerEngine) SystemPrune(ctx context.Context, options entities.Sys
if err != nil { if err != nil {
return nil, err return nil, err
} }
reclaimedSpace = reclaimedSpace + reports.PruneReportsSize(containerPruneReports) reclaimedSpace += reports.PruneReportsSize(containerPruneReports)
systemPruneReport.ContainerPruneReports = append(systemPruneReport.ContainerPruneReports, containerPruneReports...) systemPruneReport.ContainerPruneReports = append(systemPruneReport.ContainerPruneReports, containerPruneReports...)
imagePruneOptions := entities.ImagePruneOptions{ imagePruneOptions := entities.ImagePruneOptions{
All: options.All, All: options.All,
@ -158,7 +158,7 @@ func (ic *ContainerEngine) SystemPrune(ctx context.Context, options entities.Sys
} }
imageEngine := ImageEngine{Libpod: ic.Libpod} imageEngine := ImageEngine{Libpod: ic.Libpod}
imagePruneReports, err := imageEngine.Prune(ctx, imagePruneOptions) imagePruneReports, err := imageEngine.Prune(ctx, imagePruneOptions)
reclaimedSpace = reclaimedSpace + reports.PruneReportsSize(imagePruneReports) reclaimedSpace += reports.PruneReportsSize(imagePruneReports)
if err != nil { if err != nil {
return nil, err return nil, err
@ -178,7 +178,7 @@ func (ic *ContainerEngine) SystemPrune(ctx context.Context, options entities.Sys
if len(volumePruneReport) > 0 { if len(volumePruneReport) > 0 {
found = true found = true
} }
reclaimedSpace = reclaimedSpace + reports.PruneReportsSize(volumePruneReport) reclaimedSpace += reports.PruneReportsSize(volumePruneReport)
systemPruneReport.VolumePruneReports = append(systemPruneReport.VolumePruneReports, volumePruneReport...) systemPruneReport.VolumePruneReports = append(systemPruneReport.VolumePruneReports, volumePruneReport...)
} }
} }

View File

@ -231,13 +231,13 @@ func (a int64Amount) AsCanonicalBytes(out []byte) (result []byte, exponent int32
if !ok { if !ok {
return infDecAmount{a.AsDec()}.AsCanonicalBytes(out) return infDecAmount{a.AsDec()}.AsCanonicalBytes(out)
} }
exponent = exponent - 1 exponent--
case 2, -1: case 2, -1:
amount, ok = int64MultiplyScale100(amount) amount, ok = int64MultiplyScale100(amount)
if !ok { if !ok {
return infDecAmount{a.AsDec()}.AsCanonicalBytes(out) return infDecAmount{a.AsDec()}.AsCanonicalBytes(out)
} }
exponent = exponent - 2 exponent -= 2
} }
return strconv.AppendInt(out, amount, 10), exponent return strconv.AppendInt(out, amount, 10), exponent
} }

View File

@ -171,7 +171,7 @@ func negativeScaleInt64(base int64, scale Scale) (result int64, exact bool) {
if !fraction && value%10 != 0 { if !fraction && value%10 != 0 {
fraction = true fraction = true
} }
value = value / 10 value /= 10
if value == 0 { if value == 0 {
if fraction { if fraction {
if base > 0 { if base > 0 {
@ -265,18 +265,18 @@ func removeInt64Factors(value int64, base int64) (result int64, times int32) {
case 10: case 10:
for result >= 10 && result%10 == 0 { for result >= 10 && result%10 == 0 {
times++ times++
result = result / 10 result /= 10
} }
// allow the compiler to optimize the common cases // allow the compiler to optimize the common cases
case 1024: case 1024:
for result >= 1024 && result%1024 == 0 { for result >= 1024 && result%1024 == 0 {
times++ times++
result = result / 1024 result /= 1024
} }
default: default:
for result >= base && result%base == 0 { for result >= base && result%base == 0 {
times++ times++
result = result / base result /= base
} }
} }
if negative { if negative {

View File

@ -21,6 +21,8 @@ const (
githubURL = "http://github.com/fedora-cloud/docker-brew-fedora/" githubURL = "http://github.com/fedora-cloud/docker-brew-fedora/"
) )
var fedoraxzRegex = regexp.MustCompile(`fedora[^\"]+xz`)
type FedoraDownload struct { type FedoraDownload struct {
Download Download
} }
@ -96,12 +98,8 @@ func getFedoraDownload(releaseStream string) (string, *url.URL, int64, error) {
return "", nil, -1, err return "", nil, -1, err
} }
rx, err := regexp.Compile(`fedora[^\"]+xz`) file := fedoraxzRegex.FindString(string(body))
if err != nil { if len(file) == 0 {
return "", nil, -1, err
}
file := rx.FindString(string(body))
if len(file) <= 0 {
return "", nil, -1, fmt.Errorf("could not locate Fedora download at %s", dirURL) return "", nil, -1, fmt.Errorf("could not locate Fedora download at %s", dirURL)
} }

View File

@ -332,8 +332,7 @@ func (v *MachineVM) Init(opts machine.InitOptions) (bool, error) {
} }
} }
} }
switch volumeType { if volumeType == VolumeTypeVirtfs {
case VolumeTypeVirtfs:
virtfsOptions := fmt.Sprintf("local,path=%s,mount_tag=%s,security_model=mapped-xattr", source, tag) virtfsOptions := fmt.Sprintf("local,path=%s,mount_tag=%s,security_model=mapped-xattr", source, tag)
if readonly { if readonly {
virtfsOptions += ",readonly" virtfsOptions += ",readonly"
@ -783,7 +782,7 @@ func (v *MachineVM) Stop(_ string, _ machine.StopOptions) error {
break break
} }
time.Sleep(waitInternal) time.Sleep(waitInternal)
waitInternal = waitInternal * 2 waitInternal *= 2
} }
return v.ReadySocket.Delete() return v.ReadySocket.Delete()
@ -799,8 +798,7 @@ func NewQMPMonitor(network, name string, timeout time.Duration) (Monitor, error)
rtDir = "/run" rtDir = "/run"
} }
rtDir = filepath.Join(rtDir, "podman") rtDir = filepath.Join(rtDir, "podman")
if _, err := os.Stat(filepath.Join(rtDir)); os.IsNotExist(err) { if _, err := os.Stat(rtDir); os.IsNotExist(err) {
// TODO 0644 is fine on linux but macos is weird
if err := os.MkdirAll(rtDir, 0755); err != nil { if err := os.MkdirAll(rtDir, 0755); err != nil {
return Monitor{}, err return Monitor{}, err
} }

View File

@ -434,8 +434,7 @@ func createContainerOptions(rt *libpod.Runtime, s *specgen.SpecGenerator, pod *l
// Security options // Security options
if len(s.SelinuxOpts) > 0 { if len(s.SelinuxOpts) > 0 {
options = append(options, libpod.WithSecLabels(s.SelinuxOpts)) options = append(options, libpod.WithSecLabels(s.SelinuxOpts))
} else { } else if pod != nil && len(compatibleOptions.SelinuxOpts) == 0 {
if pod != nil && len(compatibleOptions.SelinuxOpts) == 0 {
// duplicate the security options from the pod // duplicate the security options from the pod
processLabel, err := pod.ProcessLabel() processLabel, err := pod.ProcessLabel()
if err != nil { if err != nil {
@ -449,7 +448,6 @@ func createContainerOptions(rt *libpod.Runtime, s *specgen.SpecGenerator, pod *l
options = append(options, libpod.WithSecLabels(selinuxOpts)) options = append(options, libpod.WithSecLabels(selinuxOpts))
} }
} }
}
options = append(options, libpod.WithPrivileged(s.Privileged)) options = append(options, libpod.WithPrivileged(s.Privileged))
// Get namespace related options // Get namespace related options

View File

@ -449,12 +449,13 @@ func setupLivenessProbe(s *specgen.SpecGenerator, containerYAML v1.Container, re
} }
// configure healthcheck on the basis of Handler Actions. // configure healthcheck on the basis of Handler Actions.
if probeHandler.Exec != nil { switch {
case probeHandler.Exec != nil:
execString := strings.Join(probeHandler.Exec.Command, " ") execString := strings.Join(probeHandler.Exec.Command, " ")
commandString = fmt.Sprintf("%s || %s", execString, failureCmd) commandString = fmt.Sprintf("%s || %s", execString, failureCmd)
} else if probeHandler.HTTPGet != nil { case probeHandler.HTTPGet != nil:
commandString = fmt.Sprintf("curl %s://%s:%d/%s || %s", probeHandler.HTTPGet.Scheme, probeHandler.HTTPGet.Host, probeHandler.HTTPGet.Port.IntValue(), probeHandler.HTTPGet.Path, failureCmd) commandString = fmt.Sprintf("curl %s://%s:%d/%s || %s", probeHandler.HTTPGet.Scheme, probeHandler.HTTPGet.Host, probeHandler.HTTPGet.Port.IntValue(), probeHandler.HTTPGet.Path, failureCmd)
} else if probeHandler.TCPSocket != nil { case probeHandler.TCPSocket != nil:
commandString = fmt.Sprintf("nc -z -v %s %d || %s", probeHandler.TCPSocket.Host, probeHandler.TCPSocket.Port.IntValue(), failureCmd) commandString = fmt.Sprintf("nc -z -v %s %d || %s", probeHandler.TCPSocket.Host, probeHandler.TCPSocket.Port.IntValue(), failureCmd)
} }
s.HealthConfig, err = makeHealthCheck(commandString, probe.PeriodSeconds, probe.FailureThreshold, probe.TimeoutSeconds, probe.InitialDelaySeconds) s.HealthConfig, err = makeHealthCheck(commandString, probe.PeriodSeconds, probe.FailureThreshold, probe.TimeoutSeconds, probe.InitialDelaySeconds)

View File

@ -5,7 +5,6 @@ import (
v1 "github.com/containers/podman/v4/pkg/k8s.io/api/core/v1" v1 "github.com/containers/podman/v4/pkg/k8s.io/api/core/v1"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
//"github.com/stretchr/testify/require"
) )
func testPropagation(t *testing.T, propagation v1.MountPropagationMode, expected string) { func testPropagation(t *testing.T, propagation v1.MountPropagationMode, expected string) {

View File

@ -202,12 +202,10 @@ func namespaceOptions(s *specgen.SpecGenerator, rt *libpod.Runtime, pod *libpod.
if s.IDMappings != nil { if s.IDMappings != nil {
if pod == nil { if pod == nil {
toReturn = append(toReturn, libpod.WithIDMappings(*s.IDMappings)) toReturn = append(toReturn, libpod.WithIDMappings(*s.IDMappings))
} else { } else if pod.HasInfraContainer() && (len(s.IDMappings.UIDMap) > 0 || len(s.IDMappings.GIDMap) > 0) {
if pod.HasInfraContainer() && (len(s.IDMappings.UIDMap) > 0 || len(s.IDMappings.GIDMap) > 0) {
return nil, errors.Wrapf(define.ErrInvalidArg, "cannot specify a new uid/gid map when entering a pod with an infra container") return nil, errors.Wrapf(define.ErrInvalidArg, "cannot specify a new uid/gid map when entering a pod with an infra container")
} }
} }
}
if s.User != "" { if s.User != "" {
toReturn = append(toReturn, libpod.WithUser(s.User)) toReturn = append(toReturn, libpod.WithUser(s.User))
} }

View File

@ -298,7 +298,8 @@ func SpecGenToOCI(ctx context.Context, s *specgen.SpecGenerator, rt *libpod.Runt
g.AddAnnotation(key, val) g.AddAnnotation(key, val)
} }
if compatibleOptions.InfraResources == nil && s.ResourceLimits != nil { switch {
case compatibleOptions.InfraResources == nil && s.ResourceLimits != nil:
out, err := json.Marshal(s.ResourceLimits) out, err := json.Marshal(s.ResourceLimits)
if err != nil { if err != nil {
return nil, err return nil, err
@ -307,7 +308,7 @@ func SpecGenToOCI(ctx context.Context, s *specgen.SpecGenerator, rt *libpod.Runt
if err != nil { if err != nil {
return nil, err return nil, err
} }
} else if s.ResourceLimits != nil { // if we have predefined resource limits we need to make sure we keep the infra and container limits case s.ResourceLimits != nil: // if we have predefined resource limits we need to make sure we keep the infra and container limits
originalResources, err := json.Marshal(s.ResourceLimits) originalResources, err := json.Marshal(s.ResourceLimits)
if err != nil { if err != nil {
return nil, err return nil, err
@ -325,7 +326,7 @@ func SpecGenToOCI(ctx context.Context, s *specgen.SpecGenerator, rt *libpod.Runt
return nil, err return nil, err
} }
g.Config.Linux.Resources = s.ResourceLimits g.Config.Linux.Resources = s.ResourceLimits
} else { default:
g.Config.Linux.Resources = compatibleOptions.InfraResources g.Config.Linux.Resources = compatibleOptions.InfraResources
} }
// Devices // Devices

View File

@ -47,12 +47,10 @@ func verifyContainerResourcesCgroupV1(s *specgen.SpecGenerator) ([]string, error
if !sysInfo.MemorySwappiness { if !sysInfo.MemorySwappiness {
warnings = append(warnings, "Your kernel does not support memory swappiness capabilities, or the cgroup is not mounted. Memory swappiness discarded.") warnings = append(warnings, "Your kernel does not support memory swappiness capabilities, or the cgroup is not mounted. Memory swappiness discarded.")
memory.Swappiness = nil memory.Swappiness = nil
} else { } else if *memory.Swappiness > 100 {
if *memory.Swappiness > 100 {
return warnings, errors.Errorf("invalid value: %v, valid memory swappiness range is 0-100", *memory.Swappiness) return warnings, errors.Errorf("invalid value: %v, valid memory swappiness range is 0-100", *memory.Swappiness)
} }
} }
}
if memory.Reservation != nil && !sysInfo.MemoryReservation { if memory.Reservation != nil && !sysInfo.MemoryReservation {
warnings = append(warnings, "Your kernel does not support memory soft limit capabilities or the cgroup is not mounted. Limitation discarded.") warnings = append(warnings, "Your kernel does not support memory soft limit capabilities or the cgroup is not mounted. Limitation discarded.")
memory.Reservation = nil memory.Reservation = nil

View File

@ -47,11 +47,12 @@ func ConvertWinMountPath(path string) (string, error) {
path = strings.TrimPrefix(path, `\\?\`) path = strings.TrimPrefix(path, `\\?\`)
// Drive installed via wsl --mount // Drive installed via wsl --mount
if strings.HasPrefix(path, `\\.\`) { switch {
case strings.HasPrefix(path, `\\.\`):
path = "/mnt/wsl/" + path[4:] path = "/mnt/wsl/" + path[4:]
} else if len(path) > 1 && path[1] == ':' { case len(path) > 1 && path[1] == ':':
path = "/mnt/" + strings.ToLower(path[0:1]) + path[2:] path = "/mnt/" + strings.ToLower(path[0:1]) + path[2:]
} else { default:
return path, errors.New("unsupported UNC path") return path, errors.New("unsupported UNC path")
} }

View File

@ -24,11 +24,12 @@ func validate(c *entities.ContainerCreateOptions) error {
"ignore": "", "ignore": "",
} }
if _, ok := imageVolType[c.ImageVolume]; !ok { if _, ok := imageVolType[c.ImageVolume]; !ok {
if c.IsInfra { switch {
case c.IsInfra:
c.ImageVolume = "bind" c.ImageVolume = "bind"
} else if c.IsClone { // the image volume type will be deduced later from the container we are cloning case c.IsClone: // the image volume type will be deduced later from the container we are cloning
return nil return nil
} else { default:
return errors.Errorf("invalid image-volume type %q. Pick one of bind, tmpfs, or ignore", c.ImageVolume) return errors.Errorf("invalid image-volume type %q. Pick one of bind, tmpfs, or ignore", c.ImageVolume)
} }
} }

View File

@ -34,13 +34,14 @@ func GetTimestamp(value string, reference time.Time) (string, error) {
// if the string has a Z or a + or three dashes use parse otherwise use parseinlocation // if the string has a Z or a + or three dashes use parse otherwise use parseinlocation
parseInLocation := !(strings.ContainsAny(value, "zZ+") || strings.Count(value, "-") == 3) parseInLocation := !(strings.ContainsAny(value, "zZ+") || strings.Count(value, "-") == 3)
if strings.Contains(value, ".") { // nolint(gocritic) switch {
case strings.Contains(value, "."):
if parseInLocation { if parseInLocation {
format = rFC3339NanoLocal format = rFC3339NanoLocal
} else { } else {
format = time.RFC3339Nano format = time.RFC3339Nano
} }
} else if strings.Contains(value, "T") { case strings.Contains(value, "T"):
// we want the number of colons in the T portion of the timestamp // we want the number of colons in the T portion of the timestamp
tcolons := strings.Count(value, ":") tcolons := strings.Count(value, ":")
// if parseInLocation is off and we have a +/- zone offset (not Z) then // if parseInLocation is off and we have a +/- zone offset (not Z) then
@ -68,9 +69,9 @@ func GetTimestamp(value string, reference time.Time) (string, error) {
format = time.RFC3339 format = time.RFC3339
} }
} }
} else if parseInLocation { case parseInLocation:
format = dateLocal format = dateLocal
} else { default:
format = dateWithZone format = dateWithZone
} }

View File

@ -212,7 +212,7 @@ func PodmanTestCreateUtil(tempDir string, remote bool) *PodmanTestIntegration {
podmanRemoteBinary = os.Getenv("PODMAN_REMOTE_BINARY") podmanRemoteBinary = os.Getenv("PODMAN_REMOTE_BINARY")
} }
conmonBinary := filepath.Join("/usr/libexec/podman/conmon") conmonBinary := "/usr/libexec/podman/conmon"
altConmonBinary := "/usr/bin/conmon" altConmonBinary := "/usr/bin/conmon"
if _, err := os.Stat(conmonBinary); os.IsNotExist(err) { if _, err := os.Stat(conmonBinary); os.IsNotExist(err) {
conmonBinary = altConmonBinary conmonBinary = altConmonBinary
@ -344,7 +344,7 @@ func imageTarPath(image string) string {
} }
// e.g., registry.com/fubar:latest -> registry.com-fubar-latest.tar // e.g., registry.com/fubar:latest -> registry.com-fubar-latest.tar
imageCacheName := strings.Replace(strings.Replace(image, ":", "-", -1), "/", "-", -1) + ".tar" imageCacheName := strings.ReplaceAll(strings.ReplaceAll(image, ":", "-"), "/", "-") + ".tar"
return filepath.Join(cacheDir, imageCacheName) return filepath.Join(cacheDir, imageCacheName)
} }

View File

@ -184,7 +184,7 @@ var _ = Describe("Podman container clone", func() {
Expect(checkCreate).Should(Exit(0)) Expect(checkCreate).Should(Exit(0))
createArray := checkCreate.OutputToStringArray() createArray := checkCreate.OutputToStringArray()
Expect(cloneArray).To(ContainElements(createArray[:])) Expect(cloneArray).To(ContainElements(createArray))
ctrInspect := podmanTest.Podman([]string{"inspect", clone.OutputToString()}) ctrInspect := podmanTest.Podman([]string{"inspect", clone.OutputToString()})
ctrInspect.WaitWithDefaultTimeout() ctrInspect.WaitWithDefaultTimeout()

View File

@ -75,7 +75,7 @@ var _ = Describe("Podman generate kube", func() {
numContainers := 0 numContainers := 0
for range pod.Spec.Containers { for range pod.Spec.Containers {
numContainers = numContainers + 1 numContainers++
} }
Expect(numContainers).To(Equal(1)) Expect(numContainers).To(Equal(1))
}) })
@ -169,7 +169,7 @@ var _ = Describe("Podman generate kube", func() {
numContainers := 0 numContainers := 0
for range pod.Spec.Containers { for range pod.Spec.Containers {
numContainers = numContainers + 1 numContainers++
} }
Expect(numContainers).To(Equal(1)) Expect(numContainers).To(Equal(1))
}) })
@ -478,11 +478,11 @@ var _ = Describe("Podman generate kube", func() {
// for k8s // for k8s
Expect(port.Protocol).To(BeEmpty()) Expect(port.Protocol).To(BeEmpty())
if port.HostPort == 4000 { if port.HostPort == 4000 {
foundPort4000 = foundPort4000 + 1 foundPort4000++
} else if port.HostPort == 5000 { } else if port.HostPort == 5000 {
foundPort5000 = foundPort5000 + 1 foundPort5000++
} else { } else {
foundOtherPort = foundOtherPort + 1 foundOtherPort++
} }
} }
} }

View File

@ -64,7 +64,7 @@ var _ = Describe("Podman load", func() {
compress := SystemExec("gzip", []string{outfile}) compress := SystemExec("gzip", []string{outfile})
Expect(compress).Should(Exit(0)) Expect(compress).Should(Exit(0))
outfile = outfile + ".gz" outfile += ".gz"
rmi := podmanTest.Podman([]string{"rmi", ALPINE}) rmi := podmanTest.Podman([]string{"rmi", ALPINE})
rmi.WaitWithDefaultTimeout() rmi.WaitWithDefaultTimeout()

View File

@ -51,7 +51,7 @@ var _ = Describe("Podman namespaces", func() {
numCtrs := 0 numCtrs := 0
for _, outputLine := range output { for _, outputLine := range output {
if outputLine != "" { if outputLine != "" {
numCtrs = numCtrs + 1 numCtrs++
} }
} }
Expect(numCtrs).To(Equal(0)) Expect(numCtrs).To(Equal(0))

View File

@ -84,12 +84,12 @@ var _ = Describe("Podman run with --cgroup-parent", func() {
exec.WaitWithDefaultTimeout() exec.WaitWithDefaultTimeout()
Expect(exec).Should(Exit(0)) Expect(exec).Should(Exit(0))
containerCgroup := strings.TrimRight(strings.Replace(exec.OutputToString(), "0::", "", -1), "\n") containerCgroup := strings.TrimRight(strings.ReplaceAll(exec.OutputToString(), "0::", ""), "\n")
// Move the container process to a sub cgroup // Move the container process to a sub cgroup
content, err := ioutil.ReadFile(filepath.Join(cgroupRoot, containerCgroup, "cgroup.procs")) content, err := ioutil.ReadFile(filepath.Join(cgroupRoot, containerCgroup, "cgroup.procs"))
Expect(err).To(BeNil()) Expect(err).To(BeNil())
oldSubCgroupPath := filepath.Join(filepath.Join(cgroupRoot, containerCgroup, "old-container")) oldSubCgroupPath := filepath.Join(cgroupRoot, containerCgroup, "old-container")
err = os.MkdirAll(oldSubCgroupPath, 0755) err = os.MkdirAll(oldSubCgroupPath, 0755)
Expect(err).To(BeNil()) Expect(err).To(BeNil())
err = ioutil.WriteFile(filepath.Join(oldSubCgroupPath, "cgroup.procs"), content, 0644) err = ioutil.WriteFile(filepath.Join(oldSubCgroupPath, "cgroup.procs"), content, 0644)
@ -102,7 +102,7 @@ var _ = Describe("Podman run with --cgroup-parent", func() {
run = podmanTest.Podman([]string{"--cgroup-manager=cgroupfs", "run", "--rm", "--cgroupns=host", fmt.Sprintf("--cgroup-parent=%s", newCgroup), fedoraMinimal, "cat", "/proc/self/cgroup"}) run = podmanTest.Podman([]string{"--cgroup-manager=cgroupfs", "run", "--rm", "--cgroupns=host", fmt.Sprintf("--cgroup-parent=%s", newCgroup), fedoraMinimal, "cat", "/proc/self/cgroup"})
run.WaitWithDefaultTimeout() run.WaitWithDefaultTimeout()
Expect(run).Should(Exit(0)) Expect(run).Should(Exit(0))
cgroupEffective := strings.TrimRight(strings.Replace(run.OutputToString(), "0::", "", -1), "\n") cgroupEffective := strings.TrimRight(strings.ReplaceAll(run.OutputToString(), "0::", ""), "\n")
Expect(newCgroup).To(Equal(filepath.Dir(cgroupEffective))) Expect(newCgroup).To(Equal(filepath.Dir(cgroupEffective)))
}) })

View File

@ -66,7 +66,7 @@ var _ = Describe("Podman run with --sig-proxy", func() {
counter := 0 counter := 0
for { for {
buf := make([]byte, 1024) buf := make([]byte, 1024)
n, err := uds.Read(buf[:]) n, err := uds.Read(buf)
if err != nil && err != io.EOF { if err != nil && err != io.EOF {
fmt.Println(err) fmt.Println(err)
return return
@ -92,7 +92,7 @@ var _ = Describe("Podman run with --sig-proxy", func() {
counter = 0 counter = 0
for { for {
buf := make([]byte, 1024) buf := make([]byte, 1024)
n, err := uds.Read(buf[:]) n, err := uds.Read(buf)
if err != nil { if err != nil {
fmt.Println(err) fmt.Println(err)
return return

View File

@ -729,7 +729,7 @@ VOLUME /test/`, ALPINE)
Expect(session).Should(Exit(0)) Expect(session).Should(Exit(0))
Expect(session.OutputToString()).To(ContainSubstring("888:888")) Expect(session.OutputToString()).To(ContainSubstring("888:888"))
vol = vol + ",O" vol += ",O"
session = podmanTest.Podman([]string{"run", "--rm", "--user", "888:888", "--userns", "keep-id", "-v", vol, ALPINE, "stat", "-c", "%u:%g", dest}) session = podmanTest.Podman([]string{"run", "--rm", "--user", "888:888", "--userns", "keep-id", "-v", vol, ALPINE, "stat", "-c", "%u:%g", dest})
session.WaitWithDefaultTimeout() session.WaitWithDefaultTimeout()
Expect(session).Should(Exit(0)) Expect(session).Should(Exit(0))

View File

@ -108,8 +108,8 @@ func (p *PodmanTest) PodmanAsUserBase(args []string, uid, gid uint32, cwd string
timeCmd := append([]string{"/usr/bin/time"}, timeArgs...) timeCmd := append([]string{"/usr/bin/time"}, timeArgs...)
wrapper = append(timeCmd, wrapper...) wrapper = append(timeCmd, wrapper...)
} }
runCmd := wrapper
runCmd := append(wrapper, podmanBinary) runCmd = append(runCmd, podmanBinary)
if !p.RemoteTest && p.NetworkBackend == Netavark { if !p.RemoteTest && p.NetworkBackend == Netavark {
runCmd = append(runCmd, []string{"--network-backend", "netavark"}...) runCmd = append(runCmd, []string{"--network-backend", "netavark"}...)
} }
@ -449,10 +449,10 @@ func GetHostDistributionInfo() HostOS {
host.Arch = runtime.GOARCH host.Arch = runtime.GOARCH
for l.Scan() { for l.Scan() {
if strings.HasPrefix(l.Text(), "ID=") { if strings.HasPrefix(l.Text(), "ID=") {
host.Distribution = strings.Replace(strings.TrimSpace(strings.Join(strings.Split(l.Text(), "=")[1:], "")), "\"", "", -1) host.Distribution = strings.ReplaceAll(strings.TrimSpace(strings.Join(strings.Split(l.Text(), "=")[1:], "")), "\"", "")
} }
if strings.HasPrefix(l.Text(), "VERSION_ID=") { if strings.HasPrefix(l.Text(), "VERSION_ID=") {
host.Version = strings.Replace(strings.TrimSpace(strings.Join(strings.Split(l.Text(), "=")[1:], "")), "\"", "", -1) host.Version = strings.ReplaceAll(strings.TrimSpace(strings.Join(strings.Split(l.Text(), "=")[1:], "")), "\"", "")
} }
} }
return host return host