versionCheck returns the client version and server version, and compares them both against the minimum required version. nolint:unused // will be used when linuxkit cache is eliminated and we return to docker image cache
(version string)
| 141 | // |
| 142 | //nolint:unused // will be used when linuxkit cache is eliminated and we return to docker image cache |
| 143 | func (dr *dockerRunnerImpl) versionCheck(version string) (string, string, error) { |
| 144 | var stdout bytes.Buffer |
| 145 | if err := dr.command(nil, &stdout, nil, "version", "--format", "json"); err != nil { |
| 146 | return "", "", err |
| 147 | } |
| 148 | |
| 149 | // we can build a struct for everything, but all we really need is .Client.Version and .Server.Version |
| 150 | jsonMap := make(map[string]map[string]interface{}) |
| 151 | b := stdout.Bytes() |
| 152 | if err := json.Unmarshal(b, &jsonMap); err != nil { |
| 153 | return "", "", fmt.Errorf("unable to parse docker version output: %v, output is: %s", err, string(b)) |
| 154 | } |
| 155 | client, ok := jsonMap["Client"] |
| 156 | if !ok { |
| 157 | return "", "", errors.New("docker version output did not have 'Client' field") |
| 158 | } |
| 159 | clientVersionInt, ok := client["Version"] |
| 160 | if !ok { |
| 161 | return "", "", errors.New("docker version output did not have 'Client.Version' field") |
| 162 | } |
| 163 | clientVersionString, ok := clientVersionInt.(string) |
| 164 | if !ok { |
| 165 | return "", "", errors.New("client version was not a string") |
| 166 | } |
| 167 | server, ok := jsonMap["Server"] |
| 168 | if !ok { |
| 169 | return "", "", errors.New("docker version output did not have 'Server' field") |
| 170 | } |
| 171 | serverVersionInt, ok := server["Version"] |
| 172 | if !ok { |
| 173 | return clientVersionString, "", errors.New("docker version output did not have 'Server.Version' field") |
| 174 | } |
| 175 | serverVersionString, ok := serverVersionInt.(string) |
| 176 | if !ok { |
| 177 | return clientVersionString, "", errors.New("server version was not a string") |
| 178 | } |
| 179 | |
| 180 | // get the lower of each of those versions |
| 181 | clientVersion, err := versioncompare.NewVersion(clientVersionString) |
| 182 | if err != nil { |
| 183 | return clientVersionString, serverVersionString, fmt.Errorf("invalid client version %s: %v", clientVersionString, err) |
| 184 | } |
| 185 | serverVersion, err := versioncompare.NewVersion(serverVersionString) |
| 186 | if err != nil { |
| 187 | return clientVersionString, serverVersionString, fmt.Errorf("invalid server version %s: %v", serverVersionString, err) |
| 188 | } |
| 189 | compareVersion, err := versioncompare.NewVersion(version) |
| 190 | if err != nil { |
| 191 | return clientVersionString, serverVersionString, fmt.Errorf("invalid provided version %s: %v", version, err) |
| 192 | } |
| 193 | if serverVersion.LessThan(compareVersion) { |
| 194 | return clientVersionString, serverVersionString, fmt.Errorf("server version %s less than compare version %s", serverVersion, compareVersion) |
| 195 | } |
| 196 | if clientVersion.LessThan(compareVersion) { |
| 197 | return clientVersionString, serverVersionString, fmt.Errorf("client version %s less than compare version %s", clientVersion, compareVersion) |
| 198 | } |
| 199 | return clientVersionString, serverVersionString, nil |
| 200 | } |