@@ -17,15 +17,20 @@ limitations under the License.
17
17
package cruntime
18
18
19
19
import (
20
+ "encoding/json"
20
21
"fmt"
21
22
"net"
22
23
"os/exec"
24
+ "path"
23
25
"strings"
26
+ "time"
24
27
25
28
"github.com/blang/semver"
26
29
"github.com/golang/glog"
27
30
"github.com/pkg/errors"
31
+ "k8s.io/minikube/pkg/minikube/assets"
28
32
"k8s.io/minikube/pkg/minikube/bootstrapper/images"
33
+ "k8s.io/minikube/pkg/minikube/command"
29
34
"k8s.io/minikube/pkg/minikube/config"
30
35
"k8s.io/minikube/pkg/minikube/download"
31
36
"k8s.io/minikube/pkg/minikube/out"
@@ -222,7 +227,103 @@ func (r *CRIO) Preload(cfg config.KubernetesConfig) error {
222
227
if ! download .PreloadExists (cfg .KubernetesVersion , cfg .ContainerRuntime ) {
223
228
return nil
224
229
}
225
- return fmt .Errorf ("not yet implemented for %s" , r .Name ())
230
+
231
+ k8sVersion := cfg .KubernetesVersion
232
+ cRuntime := cfg .ContainerRuntime
233
+
234
+ // If images already exist, return
235
+ images , err := images .Kubeadm (cfg .ImageRepository , k8sVersion )
236
+ if err != nil {
237
+ return errors .Wrap (err , "getting images" )
238
+ }
239
+ if crioImagesPreloaded (r .Runner , images ) {
240
+ glog .Info ("Images already preloaded, skipping extraction" )
241
+ return nil
242
+ }
243
+
244
+ tarballPath := download .TarballPath (k8sVersion , cRuntime )
245
+ targetDir := "/"
246
+ targetName := "preloaded.tar.lz4"
247
+ dest := path .Join (targetDir , targetName )
248
+
249
+ c := exec .Command ("which" , "lz4" )
250
+ if _ , err := r .Runner .RunCmd (c ); err != nil {
251
+ return NewErrISOFeature ("lz4" )
252
+ }
253
+
254
+ // Copy over tarball into host
255
+ fa , err := assets .NewFileAsset (tarballPath , targetDir , targetName , "0644" )
256
+ if err != nil {
257
+ return errors .Wrap (err , "getting file asset" )
258
+ }
259
+ t := time .Now ()
260
+ if err := r .Runner .Copy (fa ); err != nil {
261
+ return errors .Wrap (err , "copying file" )
262
+ }
263
+ glog .Infof ("Took %f seconds to copy over tarball" , time .Since (t ).Seconds ())
264
+
265
+ t = time .Now ()
266
+ // extract the tarball to /var in the VM
267
+ if rr , err := r .Runner .RunCmd (exec .Command ("sudo" , "tar" , "-I" , "lz4" , "-C" , "/var" , "-xvf" , dest )); err != nil {
268
+ return errors .Wrapf (err , "extracting tarball: %s" , rr .Output ())
269
+ }
270
+ glog .Infof ("Took %f seconds t extract the tarball" , time .Since (t ).Seconds ())
271
+
272
+ // remove the tarball in the VM
273
+ if err := r .Runner .Remove (fa ); err != nil {
274
+ glog .Infof ("error removing tarball: %v" , err )
275
+ }
276
+
277
+ return nil
278
+ }
279
+
280
+ // crioImagesPreloaded returns true if all images have been preloaded
281
+ func crioImagesPreloaded (runner command.Runner , images []string ) bool {
282
+ rr , err := runner .RunCmd (exec .Command ("sudo" , "crictl" , "images" , "--output" , "json" ))
283
+ if err != nil {
284
+ return false
285
+ }
286
+ type crictlImages struct {
287
+ Images []struct {
288
+ ID string `json:"id"`
289
+ RepoTags []string `json:"repoTags"`
290
+ RepoDigests []string `json:"repoDigests"`
291
+ Size string `json:"size"`
292
+ UID interface {} `json:"uid"`
293
+ Username string `json:"username"`
294
+ } `json:"images"`
295
+ }
296
+
297
+ var jsonImages crictlImages
298
+ err = json .Unmarshal (rr .Stdout .Bytes (), & jsonImages )
299
+ if err != nil {
300
+ glog .Errorf ("failed to unmarshal images, will assume images are not preloaded" )
301
+ return false
302
+ }
303
+
304
+ // Make sure images == imgs
305
+ for _ , i := range images {
306
+ found := false
307
+ for _ , ji := range jsonImages .Images {
308
+ for _ , rt := range ji .RepoTags {
309
+ i = addRepoTagToImageName (i )
310
+ if i == rt {
311
+ found = true
312
+ break
313
+ }
314
+ }
315
+ if found {
316
+ break
317
+ }
318
+
319
+ }
320
+ if ! found {
321
+ glog .Infof ("couldn't find preloaded image for %q. assuming images are not preloaded." , i )
322
+ return false
323
+ }
324
+ }
325
+ glog .Infof ("all images are preloaded for cri-o runtime." )
326
+ return true
226
327
}
227
328
228
329
// UpdateCRIONet updates CRIO CNI network configuration and restarts it
0 commit comments