MCPcopy Create free account
hub / github.com/linuxkit/linuxkit / versionCheck

Method versionCheck

src/cmd/linuxkit/pkglib/dockerimpl.go:143–200  ·  view source on GitHub ↗

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)

Source from the content-addressed store, hash-verified

141//
142//nolint:unused // will be used when linuxkit cache is eliminated and we return to docker image cache
143func (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}

Callers

nothing calls this directly

Calls 1

commandMethod · 0.95

Tested by

no test coverage detected