Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

TOOLS-2525 Everything needs to stop cloning with git:// URLs (broken buildimage imgadm) #53

Merged
merged 1 commit into from Mar 17, 2022

Conversation

bahamat
Copy link
Member

@bahamat bahamat commented Mar 16, 2022

My last commit completely broke buildimage's copy of imgadm (which itself is mostly a duplicate of the one in smartos-live, but slightly modified to work in a non-global zone).

Note: I didn't modify copyrights when I copied these in, preferring to keep existing dates from smartos-live in order to reduce the diff.

The diff from smartos-live is as follows:

--- smartos-live/src/img/lib/imgadm.js	2022-01-18 10:09:32.000000000 -0800
+++ eng/tools/buildimage/lib/imgadm/lib/imgadm.js	2022-03-16 16:19:29.000000000 -0700
@@ -20,7 +20,7 @@
  *
  * CDDL HEADER END
  *
- * Copyright 2020 Joyent, Inc.
+ * Copyright (c) 2019, Joyent, Inc. All rights reserved.
  *
  * * *
  * The main imgadm functionality. The CLI is a light wrapper around this tool.
@@ -52,7 +52,7 @@
 var genUuid = require('node-uuid');
 var imgapi = require('sdc-clients/lib/imgapi');
 var imgmanifest = require('imgmanifest');
-var qlocker = require('/usr/node/node_modules/qlocker');
+var qlocker = require('qlocker');
 var mkdirp = require('mkdirp');
 var once = require('once');
 var path = require('path');
@@ -62,7 +62,7 @@
 var util = require('util'),
     format = util.format;
 var vasync = require('vasync');
-var zfs = require('/usr/node/node_modules/zfs.js').zfs;
+var zfs = require('./zfs.js').zfs;

 var common = require('./common'),
     NAME = common.NAME,
@@ -84,20 +84,15 @@
 // ---- globals

 var CONFIG_PATH = DB_DIR + '/imgadm.conf';
+var DEFAULT_SDC_VERSION = '7.0';
 var DEFAULT_CONFIG = {};
 var SET_REQUIREMENTS_BRAND_BRANDS = ['bhyve', 'lx', 'kvm'];

 /* BEGIN JSSTYLED */
-/**
- * For vm filesystems, we have three variations to which an image can be
- * cloned to:
- *  1. /zones/<uuid>        (smartos, lx and docker)
- *  2. /zones/<uuid>-diskN  (kvm)
- *  3. /zones/<uuid>/diskN  (bhyve)
- */
-var VMADM_FS_NAME_RE = /^([a-zA-Z][a-zA-Z\._-]*)\/([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})([-/]disk\d+)?$/;
-
-var VMADM_IMG_NAME_RE = /^([a-zA-Z][a-zA-Z\._-]*)\/([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$/;
+// In zones, we don't have 'SDC Version' in sysinfo, but we know
+// we're always at least SDC 7.0.
+var VMADM_FS_NAME_RE = /^([a-zA-Z0-9][a-zA-Z0-9\/\._-]*)\/([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})([-/]disk\d+)?$/;
+var VMADM_IMG_NAME_RE = /^([a-zA-Z0-9][a-zA-Z0-9\/\._-]*)\/([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$/;
 var UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;
 /* END JSSTYLED */

@@ -146,7 +141,7 @@
     }

     // SDC 6.5 sysinfo is missing 'SDC Version' key in sysinfo.
-    var platVer = opts.sysinfo['SDC Version'] || '6.5';
+    var platVer = opts.sysinfo['SDC Version'] || DEFAULT_SDC_VERSION;
     var platTimestamp = opts.sysinfo['Live Image'];

     if (minPlatSpec) {
@@ -417,6 +412,61 @@
 IMGADM.prototype.init = function init(callback) {
     var self = this;

+    var zonename;
+
+    function findZonename(next) {
+        execFile('/usr/bin/zonename', function _zonename(err, stdout, stderr) {
+            if (!err) {
+                zonename = stdout.trim();
+                if (zonename === 'global') {
+                    cb(new errors.UsageError('this version of imgadm only '
+                        + 'supports non-global zones'));
+                    return;
+                }
+            }
+            next(err);
+        });
+    }
+
+    function findZonesPool(next) {
+        execFile('/usr/sbin/zpool', [
+            'list',
+            '-Hpo',
+            'name'
+        ], function _onZpoolList(err, stdout, stderr) {
+            if (!err) {
+                if (stdout.trim() !== 'zones') {
+                    cb(new errors.UsageError('this version of imgadm only '
+                        + 'supports zpools named "zones"'));
+                    return;
+                }
+            }
+            next(err);
+        });
+    }
+
+    function findDelegated(next) {
+        var dsname = 'zones/' + zonename + '/data';
+
+        execFile('/usr/sbin/zfs', [
+            'list',
+            '-Hpo',
+            'name',
+            dsname
+        ], function _onZpoolList(err, stdout, stderr) {
+            if (!err) {
+                if (stdout.trim() !== dsname) {
+                    cb(new errors.UsageError('this version of imgadm only '
+                        + 'supports zones with delegated datasets named '
+                        + '"data"'));
+                    return;
+                }
+                self.DEFAULT_ZPOOL = common.DEFAULT_ZPOOL = dsname;
+            }
+            next(err);
+        });
+    }
+
     function loadConfig(next) {
         configuration.loadConfig({log: self.log}, function (err, config) {
             self.config = config;
@@ -465,6 +515,9 @@
     }

     async.series([
+        findZonename,
+        findZonesPool,
+        findDelegated,
         loadConfig,
         setUserAgent,
         upgradeDb,
@@ -887,8 +940,10 @@
                 var origin = parts[1];
                 var mountpoint = parts[2];
                 var ignore = parts[3];
+
                 if (!VMADM_FS_NAME_RE.test(name))
                     continue;
+
                 if (
                     /*
                      * If it has a mountpoint from `zoneadm list` it is
@@ -2673,10 +2728,18 @@
             var zfsRecv = spawn('/usr/sbin/zfs',
                 ['receive', ctx.partialDsName]);
             zfsRecv.stderr.on('data', function (chunk) {
+                if (chunk.toString()
+                    .match(/SMF Initialization problems..svc:\//)) {
+                    return;
+                }
                 console.error('Stderr from zfs receive: %s',
                     chunk.toString());
             });
             zfsRecv.stdout.on('data', function (chunk) {
+                if (chunk.toString()
+                    .match(/NFS plugin problem with SMF repository:/)) {
+                    return;
+                }
                 console.error('Stdout from zfs receive: %s',
                     chunk.toString());
             });
@@ -3325,6 +3388,8 @@
     assert.optionalString(options.prepareScript, 'options.prepareScript');
     assert.optionalNumber(options.prepareTimeout, 'options.prepareTimeout');
     assert.optionalNumber(options.maxOriginDepth, 'options.maxOriginDepth');
+    assert.optionalFunc(options.vmGet, 'options.vmGet');
+
     var log = self.log;
     var vmUuid = options.vmUuid;
     var incremental = options.incremental || false;
@@ -3346,7 +3411,9 @@

     async.waterfall([
         function validateVm(next) {
-            common.vmGet(vmUuid, {log: log}, function (err, vm) {
+            var vmGet = options.vmGet || common.vmGet;
+
+            vmGet(vmUuid, {log: log}, function (err, vm) {
                 // Currently `vmGet` doesn't distinguish bwtn some unexpected
                 // error and no such VM.
                 if (err) {
@@ -3896,7 +3963,13 @@
                 imageInfo.filePath += '.bz2';
                 numToFinish++;
             } else if (compression === 'gzip') {
-                compressor = spawn('/usr/bin/gzip', ['-cfq']);
+                if (fs.existsSync('/opt/local/bin/pigz')) {
+                    logCb('Compressing image with pigz');
+                    compressor = spawn('/opt/local/bin/pigz', ['-cfq']);
+                } else {
+                    logCb('Compressing image with gzip');
+                    compressor = spawn('/usr/bin/gzip', ['-cfq']);
+                }
                 imageInfo.filePath += '.gz';
                 numToFinish++;
             } else if (compression === 'xz') {

Copy link

@danmcd danmcd left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Make sure it gets a workout post-push.

@bahamat bahamat merged commit b3a4ed6 into master Mar 17, 2022
@bahamat bahamat deleted the TOOLS-2525 branch March 17, 2022 01:50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants