docker_util.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. /*
  2. Copyright 2017 The Kubernetes Authors.
  3. Licensed under the Apache License, Version 2.0 (the "License");
  4. you may not use this file except in compliance with the License.
  5. You may obtain a copy of the License at
  6. http://www.apache.org/licenses/LICENSE-2.0
  7. Unless required by applicable law or agreed to in writing, software
  8. distributed under the License is distributed on an "AS IS" BASIS,
  9. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10. See the License for the specific language governing permissions and
  11. limitations under the License.
  12. */
  13. package e2e_node
  14. import (
  15. "context"
  16. "fmt"
  17. "github.com/blang/semver"
  18. systemdutil "github.com/coreos/go-systemd/util"
  19. "github.com/docker/docker/api/types"
  20. "github.com/docker/docker/client"
  21. )
  22. const (
  23. defaultDockerEndpoint = "unix:///var/run/docker.sock"
  24. )
  25. // getDockerAPIVersion returns the Docker's API version.
  26. func getDockerAPIVersion() (semver.Version, error) {
  27. c, err := client.NewClient(defaultDockerEndpoint, "", nil, nil)
  28. if err != nil {
  29. return semver.Version{}, fmt.Errorf("failed to create docker client: %v", err)
  30. }
  31. version, err := c.ServerVersion(context.Background())
  32. if err != nil {
  33. return semver.Version{}, fmt.Errorf("failed to get docker server version: %v", err)
  34. }
  35. return semver.MustParse(version.APIVersion + ".0"), nil
  36. }
  37. // isSharedPIDNamespaceSupported returns true if the Docker version is 1.13.1+
  38. // (API version 1.26+), and false otherwise.
  39. func isSharedPIDNamespaceSupported() (bool, error) {
  40. version, err := getDockerAPIVersion()
  41. if err != nil {
  42. return false, err
  43. }
  44. return version.GTE(semver.MustParse("1.26.0")), nil
  45. }
  46. // isDockerLiveRestoreSupported returns true if live-restore is supported in
  47. // the current Docker version.
  48. func isDockerLiveRestoreSupported() (bool, error) {
  49. version, err := getDockerAPIVersion()
  50. if err != nil {
  51. return false, err
  52. }
  53. return version.GTE(semver.MustParse("1.26.0")), nil
  54. }
  55. // getDockerInfo returns the Info struct for the running Docker daemon.
  56. func getDockerInfo() (types.Info, error) {
  57. var info types.Info
  58. c, err := client.NewClient(defaultDockerEndpoint, "", nil, nil)
  59. if err != nil {
  60. return info, fmt.Errorf("failed to create docker client: %v", err)
  61. }
  62. info, err = c.Info(context.Background())
  63. if err != nil {
  64. return info, fmt.Errorf("failed to get docker info: %v", err)
  65. }
  66. return info, nil
  67. }
  68. // isDockerLiveRestoreEnabled returns true if live-restore is enabled in the
  69. // Docker.
  70. func isDockerLiveRestoreEnabled() (bool, error) {
  71. info, err := getDockerInfo()
  72. if err != nil {
  73. return false, err
  74. }
  75. return info.LiveRestoreEnabled, nil
  76. }
  77. // getDockerLoggingDriver returns the name of the logging driver.
  78. func getDockerLoggingDriver() (string, error) {
  79. info, err := getDockerInfo()
  80. if err != nil {
  81. return "", err
  82. }
  83. return info.LoggingDriver, nil
  84. }
  85. // isDockerSELinuxSupportEnabled checks whether the Docker daemon was started
  86. // with SELinux support enabled.
  87. func isDockerSELinuxSupportEnabled() (bool, error) {
  88. info, err := getDockerInfo()
  89. if err != nil {
  90. return false, err
  91. }
  92. for _, s := range info.SecurityOptions {
  93. if s == "selinux" {
  94. return true, nil
  95. }
  96. }
  97. return false, nil
  98. }
  99. // startDockerDaemon starts the Docker daemon.
  100. func startDockerDaemon() error {
  101. switch {
  102. case systemdutil.IsRunningSystemd():
  103. _, err := runCommand("systemctl", "start", "docker")
  104. return err
  105. default:
  106. _, err := runCommand("service", "docker", "start")
  107. return err
  108. }
  109. }
  110. // stopDockerDaemon stops the Docker daemon.
  111. func stopDockerDaemon() error {
  112. switch {
  113. case systemdutil.IsRunningSystemd():
  114. _, err := runCommand("systemctl", "stop", "docker")
  115. return err
  116. default:
  117. _, err := runCommand("service", "docker", "stop")
  118. return err
  119. }
  120. }