balena-cli
Version:
The official balena Command Line Interface
109 lines (106 loc) • 4.25 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
const core_1 = require("@oclif/core");
const cf = require("../../utils/common-flags");
const errors_1 = require("../../errors");
const lazy_1 = require("../../utils/lazy");
const messages_1 = require("../../utils/messages");
class DeviceMoveCmd extends core_1.Command {
async getDevices(balena, deviceUuids) {
const deviceOptions = {
$select: 'belongs_to__application',
$expand: {
is_of__device_type: {
$select: 'is_of__cpu_architecture',
$expand: {
is_of__cpu_architecture: {
$select: 'slug',
},
},
},
},
};
const devices = await Promise.all(deviceUuids.map((uuid) => balena.models.device.get(uuid, deviceOptions)));
return devices;
}
async run() {
const { args: params, flags: options } = await this.parse(DeviceMoveCmd);
const balena = (0, lazy_1.getBalenaSdk)();
const deviceUuids = params.uuid.split(',');
const devices = await this.getDevices(balena, deviceUuids);
const { getApplication } = await Promise.resolve().then(() => require('../../utils/sdk'));
const application = options.fleet
? await getApplication(balena, options.fleet, { $select: ['id', 'slug'] })
: await this.interactivelySelectApplication(balena, devices);
for (const uuid of deviceUuids) {
try {
await balena.models.device.move(uuid, application.id);
console.info(`Device ${uuid} was moved to fleet ${application.slug}`);
}
catch (err) {
console.info(`${err.message}, uuid: ${uuid}`);
process.exitCode = 1;
}
}
}
async interactivelySelectApplication(balena, devices) {
const deviceCpuArchs = Array.from(new Set(devices.map((d) => d.is_of__device_type[0].is_of__cpu_architecture[0].slug)));
const allCpuArches = await balena.pine.get({
resource: 'cpu_architecture',
options: {
$select: ['id', 'slug'],
},
});
const compatibleCpuArchIds = allCpuArches
.filter((cpuArch) => {
return deviceCpuArchs.every((deviceCpuArch) => balena.models.os.isArchitectureCompatibleWith(deviceCpuArch, cpuArch.slug));
})
.map((deviceType) => deviceType.id);
const patterns = await Promise.resolve().then(() => require('../../utils/patterns'));
try {
const application = await patterns.selectApplication({
is_for__device_type: {
$any: {
$alias: 'dt',
$expr: {
dt: {
is_of__cpu_architecture: { $in: compatibleCpuArchIds },
},
},
},
},
}, true);
return application;
}
catch (err) {
if (!compatibleCpuArchIds.length) {
throw new errors_1.ExpectedError(`${err.message}\nDo all devices have a compatible architecture?`);
}
throw err;
}
}
}
DeviceMoveCmd.description = (0, lazy_1.stripIndent) `
Move one or more devices to another fleet.
Move one or more devices to another fleet.
If --fleet is omitted, the fleet will be prompted for interactively.
${messages_1.applicationIdInfo.split('\n').join('\n\t\t')}
`;
DeviceMoveCmd.examples = [
'$ balena device move 7cf02a6',
'$ balena device move 7cf02a6,dc39e52',
'$ balena device move 7cf02a6 --fleet MyNewFleet',
'$ balena device move 7cf02a6 -f myorg/mynewfleet',
];
DeviceMoveCmd.args = {
uuid: core_1.Args.string({
description: 'comma-separated list (no blank spaces) of device UUIDs to be moved',
required: true,
}),
};
DeviceMoveCmd.flags = {
fleet: cf.fleet,
};
DeviceMoveCmd.authenticated = true;
exports.default = DeviceMoveCmd;
//# sourceMappingURL=move.js.map
;