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
- unconvert
- errcheck
- gocritic
- gosec
- maligned
- gomoddirectives

View File

@ -327,7 +327,7 @@ func suffixCompSlice(suf string, slice []string) []string {
if len(split) > 1 {
slice[i] = split[0] + suf + "\t" + split[1]
} else {
slice[i] = slice[i] + suf
slice[i] += suf
}
}
return slice
@ -647,7 +647,10 @@ func AutocompleteInspect(cmd *cobra.Command, args []string, toComplete string) (
pods, _ := getPods(cmd, toComplete, completeDefault)
networks, _ := getNetworks(cmd, toComplete, completeDefault)
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, networks...)
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
return func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
// 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) {
return []string{"json"}, cobra.ShellCompDirectiveNoFileComp
}

View File

@ -121,13 +121,8 @@ func scp(cmd *cobra.Command, args []string) (finalErr error) {
return err
}
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] = connect
loc := locations[0]
locations[0] = locations[1]
locations[1] = loc
cliConnections[0], cliConnections[1] = cliConnections[1], cliConnections[0]
locations[0], locations[1] = locations[1], locations[0]
}
dest = *locations[1]
case len(locations) == 1:

View File

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

View File

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

View File

@ -56,6 +56,9 @@ func renumber(cmd *cobra.Command, args []string) {
err = engine.Renumber(registry.Context(), cmd.Flags(), registry.PodmanConfig())
if err != nil {
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(0)

View File

@ -95,6 +95,9 @@ func reset(cmd *cobra.Command, args []string) {
if err := engine.Reset(registry.Context()); err != nil {
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(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
func TimeoutAliasFlags(f *pflag.FlagSet, name string) pflag.NormalizedName {
switch name {
case "timeout":
if name == "timeout" {
name = "time"
}
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
// 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 {
switch c.LogDriver() {
case define.PassthroughLogging:
if c.LogDriver() == define.PassthroughLogging {
return errors.Wrapf(define.ErrNoLogs, "this container is using the 'passthrough' log driver, cannot attach")
}
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
// the container when os.RemoveAll($bundlePath) fails with ENOTEMPTY or EBUSY
// errors.
func (c *Container) cleanupExecBundle(sessionID string) (Err error) {
func (c *Container) cleanupExecBundle(sessionID string) (err error) {
path := c.execBundlePath(sessionID)
for attempts := 0; attempts < 50; attempts++ {
Err = os.RemoveAll(path)
if Err == nil || os.IsNotExist(Err) {
err = os.RemoveAll(path)
if err == nil || os.IsNotExist(err) {
return nil
}
if pathErr, ok := Err.(*os.PathError); ok {
Err = pathErr.Err
if errors.Cause(Err) == unix.ENOTEMPTY || errors.Cause(Err) == unix.EBUSY {
if pathErr, ok := err.(*os.PathError); ok {
err = pathErr.Err
if errors.Cause(err) == unix.ENOTEMPTY || errors.Cause(err) == unix.EBUSY {
// give other processes a chance to use the container
if !c.batched {
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 {
switch o {
case "U":
if o == "U" {
if err := c.ChangeHostPathOwnership(mountPoint, true, int(hostUID), int(hostGID)); err != nil {
return nil, err
}
@ -596,8 +595,7 @@ func (c *Container) generateSpec(ctx context.Context) (*spec.Spec, error) {
// Check overlay volume options
for _, o := range overlayVol.Options {
switch o {
case "U":
if o == "U" {
if err := c.ChangeHostPathOwnership(overlayVol.Source, true, int(hostUID), int(hostGID)); err != nil {
return nil, err
}
@ -2144,13 +2142,11 @@ func (c *Container) makeBindMounts() error {
return err
}
}
} else {
if !c.config.UseImageHosts && c.state.BindMounts["/etc/hosts"] == "" {
} else if !c.config.UseImageHosts && c.state.BindMounts["/etc/hosts"] == "" {
if err := c.createHosts(); err != nil {
return errors.Wrapf(err, "error creating hosts file for container %s", c.ID())
}
}
}
if c.config.ShmDir != "" {
// 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")
}
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 {
result := net.ParseIP(i)
if result == nil {
@ -2359,13 +2355,13 @@ func (c *Container) generateResolvConf() (string, error) {
}
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
var search []string
switch {
case len(dnsServers) > 0:
case len(dns) > 0:
// 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())
}
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 {
s := c.config.PasswdEntry
s = strings.Replace(s, "$USERNAME", username, -1)
s = strings.Replace(s, "$UID", uid, -1)
s = strings.Replace(s, "$GID", gid, -1)
s = strings.Replace(s, "$NAME", name, -1)
s = strings.Replace(s, "$HOME", homeDir, -1)
s = strings.ReplaceAll(s, "$USERNAME", username)
s = strings.ReplaceAll(s, "$UID", uid)
s = strings.ReplaceAll(s, "$GID", gid)
s = strings.ReplaceAll(s, "$NAME", name)
s = strings.ReplaceAll(s, "$HOME", homeDir)
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
// container's mount point.
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.
absContainerPath = strings.TrimPrefix(resolvedPath, containerMountPoint)
absContainerPath = filepath.Join("/", absContainerPath)
} else {
default:
// No symlink and not on the container's mount point, so let's
// move it back to the original input. It must have evaluated
// 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
type InspectLogConfig struct {
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 string `json:"Path"`
// Tag specifies a custom log tag for the container
@ -680,7 +680,7 @@ type InspectContainerData struct {
SizeRootFs int64 `json:"SizeRootFs,omitempty"`
Mounts []InspectMount `json:"Mounts"`
Dependencies []string `json:"Dependencies"`
NetworkSettings *InspectNetworkSettings `json:"NetworkSettings"` //TODO
NetworkSettings *InspectNetworkSettings `json:"NetworkSettings"`
Namespace string `json:"Namespace"`
IsInfra bool `json:"IsInfra"`
Config *InspectContainerConfig `json:"Config"`

View File

@ -220,7 +220,7 @@ func ConvertV1PodToYAMLPod(pod *v1.Pod) *YAMLPod {
cs = append(cs, &YAMLContainer{Container: cc, Resources: res})
}
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 {
if ctr.SecurityContext == nil || ctr.SecurityContext.SELinuxOptions == nil {
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
// Append -pod if so
if util.StringInSlice(podName, ctrNames) {
podName = podName + "-pod"
podName += "-pod"
}
return newPodObject(
@ -885,7 +885,7 @@ func convertVolumePathToName(hostSourcePath string) (string, error) {
}
// First, trim trailing slashes, then replace slashes with dashes.
// 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 {
@ -927,14 +927,20 @@ func capAddDrop(caps *specs.LinuxCapabilities) (*v1.Capabilities, error) {
if err != nil {
return nil, err
}
defCaps := g.Config.Process.Capabilities
// Combine all the default capabilities into a slice
defaultCaps := append(g.Config.Process.Capabilities.Ambient, g.Config.Process.Capabilities.Bounding...)
defaultCaps = append(defaultCaps, g.Config.Process.Capabilities.Effective...)
defaultCaps = append(defaultCaps, g.Config.Process.Capabilities.Inheritable...)
defaultCaps = append(defaultCaps, g.Config.Process.Capabilities.Permitted...)
defaultCaps := make([]string, 0, len(defCaps.Ambient)+len(defCaps.Bounding)+len(defCaps.Effective)+len(defCaps.Inheritable)+len(defCaps.Permitted))
defaultCaps = append(defaultCaps, defCaps.Ambient...)
defaultCaps = append(defaultCaps, defCaps.Bounding...)
defaultCaps = append(defaultCaps, defCaps.Effective...)
defaultCaps = append(defaultCaps, defCaps.Inheritable...)
defaultCaps = append(defaultCaps, defCaps.Permitted...)
// 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.Inheritable...)
containerCaps = append(containerCaps, caps.Permitted...)
@ -1042,7 +1048,7 @@ func generateKubeVolumeDeviceFromLinuxDevice(devices []specs.LinuxDevice) []v1.V
}
func removeUnderscores(s string) string {
return strings.Replace(s, "_", "", -1)
return strings.ReplaceAll(s, "_", "")
}
// 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.
path = os.Getenv("PATH")
if !strings.Contains(path, "/usr/sbin") {
path = path + ":/usr/sbin"
path += ":/usr/sbin"
os.Setenv("PATH", path)
}
@ -1508,7 +1508,7 @@ func ocicniPortsToNetTypesPorts(ports []types.OCICNIPortMapping) []types.PortMap
ports[i].Protocol == currentPort.Protocol &&
ports[i].HostPort-int32(currentPort.Range) == int32(currentPort.HostPort) &&
ports[i].ContainerPort-int32(currentPort.Range) == int32(currentPort.ContainerPort) {
currentPort.Range = currentPort.Range + 1
currentPort.Range++
} else {
newPorts = append(newPorts, currentPort)
currentPort = types.PortMapping{

View File

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

View File

@ -82,7 +82,9 @@ func checkSlirpFlags(path string) (*slirpFeatures, 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{
// overwrite defaults
disableHostLoopback: true,

View File

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

View File

@ -1371,7 +1371,7 @@ func (r *ConmonOCIRuntime) sharedConmonArgs(ctr *Container, cuuid, bundlePath, p
case define.JSONLogging:
fallthrough
//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
logrus.Errorf("%s logging specified but not supported. Choosing k8s-file logging instead", ctr.LogDriver())
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
// move it to its own systemd scope.
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)
}
}

View File

@ -293,9 +293,10 @@ func LibpodToContainer(l *libpod.Container, sz bool) (*handlers.Container, error
stateStr = "created"
}
if state == define.ContainerStateConfigured || state == define.ContainerStateCreated {
switch state {
case define.ContainerStateConfigured, define.ContainerStateCreated:
status = "Created"
} else if state == define.ContainerStateStopped || state == define.ContainerStateExited {
case define.ContainerStateStopped, define.ContainerStateExited:
exitCode, _, err := l.ExitCode()
if err != nil {
return nil, err
@ -305,7 +306,7 @@ func LibpodToContainer(l *libpod.Container, sz bool) (*handlers.Container, error
return nil, err
}
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()
if err != nil {
return nil, err
@ -314,11 +315,11 @@ func LibpodToContainer(l *libpod.Container, sz bool) (*handlers.Container, error
if state == define.ContainerStatePaused {
status += " (Paused)"
}
} else if state == define.ContainerStateRemoving {
case define.ContainerStateRemoving:
status = "Removal In Progress"
} else if state == define.ContainerStateStopping {
case define.ContainerStateStopping:
status = "Stopping"
} else {
default:
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()))
return
}
if len(query.Names) <= 0 {
if len(query.Names) == 0 {
utils.Error(w, http.StatusBadRequest, fmt.Errorf("no images to download"))
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{
Deleted: p.Id,
})
reclaimedSpace = reclaimedSpace + p.Size
reclaimedSpace += p.Size
}
if errorMsg.Len() > 0 {
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 {
return len(*((*[]error)(ptr))) <= 0
return len(*((*[]error)(ptr))) == 0
}
// 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 += "/" + options.Architecture
} else {
if len(platform) > 0 {
} else if len(platform) > 0 {
platform += "/" + runtime.GOARCH
}
}
if len(platform) > 0 {
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. :(
return nil
}
if d.Type().IsRegular() { // add file item
switch {
case d.Type().IsRegular(): // add file item
info, err := d.Info()
if err != nil {
return err
@ -644,7 +642,7 @@ func nTar(excludes []string, sources ...string) (io.ReadCloser, error) {
seen[di] = name
}
return err
} else if d.IsDir() { // add folders
case d.IsDir(): // add folders
info, err := d.Info()
if err != nil {
return err
@ -658,7 +656,7 @@ func nTar(excludes []string, sources ...string) (io.ReadCloser, error) {
if lerr := tw.WriteHeader(hdr); lerr != nil {
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)
if err != nil {
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
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 {
options = new(DisconnectOptions)
}
@ -114,7 +114,7 @@ func Disconnect(ctx context.Context, networkName string, ContainerNameOrID strin
Container string
Force bool
}{
Container: ContainerNameOrID,
Container: containerNameOrID,
}
if force := options.GetForce(); options.Changed("Force") {
disconnect.Force = force

View File

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

View File

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

View File

@ -785,12 +785,19 @@ func transferRootless(source entities.ImageScpOptions, dest entities.ImageScpOpt
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 {
basicCommand := []string{podman}
basicCommand := make([]string, 0, len(parentFlags)+1)
basicCommand = append(basicCommand, podman)
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 {
saveCommand = append(saveCommand, "-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)
}
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
if _, ok := ctrNames[container.Name]; ok {
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())
}
_, err = os.Stat(filepath.Join(dockerfilePath))
_, err = os.Stat(dockerfilePath)
if err == nil {
logrus.Debugf("Building %s with %s", imageName, dockerfilePath)
return dockerfilePath, nil

View File

@ -150,7 +150,7 @@ func (ic *ContainerEngine) SystemPrune(ctx context.Context, options entities.Sys
if err != nil {
return nil, err
}
reclaimedSpace = reclaimedSpace + reports.PruneReportsSize(containerPruneReports)
reclaimedSpace += reports.PruneReportsSize(containerPruneReports)
systemPruneReport.ContainerPruneReports = append(systemPruneReport.ContainerPruneReports, containerPruneReports...)
imagePruneOptions := entities.ImagePruneOptions{
All: options.All,
@ -158,7 +158,7 @@ func (ic *ContainerEngine) SystemPrune(ctx context.Context, options entities.Sys
}
imageEngine := ImageEngine{Libpod: ic.Libpod}
imagePruneReports, err := imageEngine.Prune(ctx, imagePruneOptions)
reclaimedSpace = reclaimedSpace + reports.PruneReportsSize(imagePruneReports)
reclaimedSpace += reports.PruneReportsSize(imagePruneReports)
if err != nil {
return nil, err
@ -178,7 +178,7 @@ func (ic *ContainerEngine) SystemPrune(ctx context.Context, options entities.Sys
if len(volumePruneReport) > 0 {
found = true
}
reclaimedSpace = reclaimedSpace + reports.PruneReportsSize(volumePruneReport)
reclaimedSpace += reports.PruneReportsSize(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 {
return infDecAmount{a.AsDec()}.AsCanonicalBytes(out)
}
exponent = exponent - 1
exponent--
case 2, -1:
amount, ok = int64MultiplyScale100(amount)
if !ok {
return infDecAmount{a.AsDec()}.AsCanonicalBytes(out)
}
exponent = exponent - 2
exponent -= 2
}
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 {
fraction = true
}
value = value / 10
value /= 10
if value == 0 {
if fraction {
if base > 0 {
@ -265,18 +265,18 @@ func removeInt64Factors(value int64, base int64) (result int64, times int32) {
case 10:
for result >= 10 && result%10 == 0 {
times++
result = result / 10
result /= 10
}
// allow the compiler to optimize the common cases
case 1024:
for result >= 1024 && result%1024 == 0 {
times++
result = result / 1024
result /= 1024
}
default:
for result >= base && result%base == 0 {
times++
result = result / base
result /= base
}
}
if negative {

View File

@ -21,6 +21,8 @@ const (
githubURL = "http://github.com/fedora-cloud/docker-brew-fedora/"
)
var fedoraxzRegex = regexp.MustCompile(`fedora[^\"]+xz`)
type FedoraDownload struct {
Download
}
@ -96,12 +98,8 @@ func getFedoraDownload(releaseStream string) (string, *url.URL, int64, error) {
return "", nil, -1, err
}
rx, err := regexp.Compile(`fedora[^\"]+xz`)
if err != nil {
return "", nil, -1, err
}
file := rx.FindString(string(body))
if len(file) <= 0 {
file := fedoraxzRegex.FindString(string(body))
if len(file) == 0 {
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 {
case VolumeTypeVirtfs:
if volumeType == VolumeTypeVirtfs {
virtfsOptions := fmt.Sprintf("local,path=%s,mount_tag=%s,security_model=mapped-xattr", source, tag)
if readonly {
virtfsOptions += ",readonly"
@ -783,7 +782,7 @@ func (v *MachineVM) Stop(_ string, _ machine.StopOptions) error {
break
}
time.Sleep(waitInternal)
waitInternal = waitInternal * 2
waitInternal *= 2
}
return v.ReadySocket.Delete()
@ -799,8 +798,7 @@ func NewQMPMonitor(network, name string, timeout time.Duration) (Monitor, error)
rtDir = "/run"
}
rtDir = filepath.Join(rtDir, "podman")
if _, err := os.Stat(filepath.Join(rtDir)); os.IsNotExist(err) {
// TODO 0644 is fine on linux but macos is weird
if _, err := os.Stat(rtDir); os.IsNotExist(err) {
if err := os.MkdirAll(rtDir, 0755); err != nil {
return Monitor{}, err
}

View File

@ -434,8 +434,7 @@ func createContainerOptions(rt *libpod.Runtime, s *specgen.SpecGenerator, pod *l
// Security options
if len(s.SelinuxOpts) > 0 {
options = append(options, libpod.WithSecLabels(s.SelinuxOpts))
} else {
if pod != nil && len(compatibleOptions.SelinuxOpts) == 0 {
} else if pod != nil && len(compatibleOptions.SelinuxOpts) == 0 {
// duplicate the security options from the pod
processLabel, err := pod.ProcessLabel()
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.WithPrivileged(s.Privileged))
// 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.
if probeHandler.Exec != nil {
switch {
case probeHandler.Exec != nil:
execString := strings.Join(probeHandler.Exec.Command, " ")
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)
} 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)
}
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"
"github.com/stretchr/testify/assert"
//"github.com/stretchr/testify/require"
)
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 pod == nil {
toReturn = append(toReturn, libpod.WithIDMappings(*s.IDMappings))
} else {
if pod.HasInfraContainer() && (len(s.IDMappings.UIDMap) > 0 || len(s.IDMappings.GIDMap) > 0) {
} else 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")
}
}
}
if 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)
}
if compatibleOptions.InfraResources == nil && s.ResourceLimits != nil {
switch {
case compatibleOptions.InfraResources == nil && s.ResourceLimits != nil:
out, err := json.Marshal(s.ResourceLimits)
if err != nil {
return nil, err
@ -307,7 +308,7 @@ func SpecGenToOCI(ctx context.Context, s *specgen.SpecGenerator, rt *libpod.Runt
if err != nil {
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)
if err != nil {
return nil, err
@ -325,7 +326,7 @@ func SpecGenToOCI(ctx context.Context, s *specgen.SpecGenerator, rt *libpod.Runt
return nil, err
}
g.Config.Linux.Resources = s.ResourceLimits
} else {
default:
g.Config.Linux.Resources = compatibleOptions.InfraResources
}
// Devices

View File

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

View File

@ -47,11 +47,12 @@ func ConvertWinMountPath(path string) (string, error) {
path = strings.TrimPrefix(path, `\\?\`)
// Drive installed via wsl --mount
if strings.HasPrefix(path, `\\.\`) {
switch {
case strings.HasPrefix(path, `\\.\`):
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:]
} else {
default:
return path, errors.New("unsupported UNC path")
}

View File

@ -24,11 +24,12 @@ func validate(c *entities.ContainerCreateOptions) error {
"ignore": "",
}
if _, ok := imageVolType[c.ImageVolume]; !ok {
if c.IsInfra {
switch {
case c.IsInfra:
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
} else {
default:
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
parseInLocation := !(strings.ContainsAny(value, "zZ+") || strings.Count(value, "-") == 3)
if strings.Contains(value, ".") { // nolint(gocritic)
switch {
case strings.Contains(value, "."):
if parseInLocation {
format = rFC3339NanoLocal
} else {
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
tcolons := strings.Count(value, ":")
// 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
}
}
} else if parseInLocation {
case parseInLocation:
format = dateLocal
} else {
default:
format = dateWithZone
}

View File

@ -212,7 +212,7 @@ func PodmanTestCreateUtil(tempDir string, remote bool) *PodmanTestIntegration {
podmanRemoteBinary = os.Getenv("PODMAN_REMOTE_BINARY")
}
conmonBinary := filepath.Join("/usr/libexec/podman/conmon")
conmonBinary := "/usr/libexec/podman/conmon"
altConmonBinary := "/usr/bin/conmon"
if _, err := os.Stat(conmonBinary); os.IsNotExist(err) {
conmonBinary = altConmonBinary
@ -344,7 +344,7 @@ func imageTarPath(image string) string {
}
// 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)
}

View File

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

View File

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

View File

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

View File

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

View File

@ -84,12 +84,12 @@ var _ = Describe("Podman run with --cgroup-parent", func() {
exec.WaitWithDefaultTimeout()
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
content, err := ioutil.ReadFile(filepath.Join(cgroupRoot, containerCgroup, "cgroup.procs"))
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)
Expect(err).To(BeNil())
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.WaitWithDefaultTimeout()
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)))
})

View File

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

View File

@ -729,7 +729,7 @@ VOLUME /test/`, ALPINE)
Expect(session).Should(Exit(0))
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.WaitWithDefaultTimeout()
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...)
wrapper = append(timeCmd, wrapper...)
}
runCmd := append(wrapper, podmanBinary)
runCmd := wrapper
runCmd = append(runCmd, podmanBinary)
if !p.RemoteTest && p.NetworkBackend == Netavark {
runCmd = append(runCmd, []string{"--network-backend", "netavark"}...)
}
@ -449,10 +449,10 @@ func GetHostDistributionInfo() HostOS {
host.Arch = runtime.GOARCH
for l.Scan() {
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=") {
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