Merge pull request #2629 from balena-io/less-requests-2

Fetch the application and its devices in one request in balena devices, device init, ssh, tunnel
This commit is contained in:
flowzone-app[bot] 2023-05-24 12:04:05 +00:00 committed by GitHub
commit 2b878e87d8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 42 additions and 55 deletions

View File

@ -124,21 +124,16 @@ export default class DeviceInitCmd extends Command {
const balena = getBalenaSdk();
// Get application and
const application = await getApplication(
balena,
options.fleet ||
(
await (await import('../../utils/patterns')).selectApplication()
).slug,
{
$select: ['id', 'slug'],
$expand: {
is_for__device_type: {
$select: 'slug',
const application = options.fleet
? await getApplication(balena, options.fleet, {
$select: ['id', 'slug'],
$expand: {
is_for__device_type: {
$select: 'slug',
},
},
},
},
);
})
: await (await import('../../utils/patterns')).selectApplication();
// Register new device
const deviceUuid = balena.models.device.generateUniqueKey();

View File

@ -22,13 +22,7 @@ import { expandForAppName } from '../../utils/helpers';
import { getBalenaSdk, getVisuals, stripIndent } from '../../utils/lazy';
import { applicationIdInfo, jsonInfo } from '../../utils/messages';
import type { Application, Device, PineOptions } from 'balena-sdk';
interface ExtendedDevice extends DeviceWithDeviceType {
dashboard_url?: string;
fleet?: string | null; // 'org/name' slug
device_type?: string | null;
}
import type { Device, PineOptions } from 'balena-sdk';
interface FlagsDef {
fleet?: string;
@ -88,38 +82,33 @@ export default class DevicesCmd extends Command {
$orderby: { device_name: 'asc' },
} satisfies PineOptions<Device>;
let devices;
const devices = (
await (async () => {
if (options.fleet != null) {
const { getApplication } = await import('../../utils/sdk');
const application = await getApplication(balena, options.fleet, {
$select: 'slug',
$expand: {
owns__device: devicesOptions,
},
});
return application.owns__device;
}
if (options.fleet != null) {
const { getApplication } = await import('../../utils/sdk');
const application = await getApplication(balena, options.fleet, {
$select: 'id',
});
devices = (await balena.models.device.getAllByApplication(
application.id,
devicesOptions,
)) as ExtendedDevice[];
} else {
devices = (await balena.pine.get({
resource: 'device',
options: devicesOptions,
})) as ExtendedDevice[];
}
return await balena.pine.get({
resource: 'device',
options: devicesOptions,
});
})()
).map((device) => ({
...device,
dashboard_url: balena.models.device.getDashboardUrl(device.uuid),
fleet: device.belongs_to__application?.[0]?.slug || null,
uuid: options.json ? device.uuid : device.uuid.slice(0, 7),
device_type: device.is_of__device_type?.[0]?.slug || null,
}));
devices = devices.map(function (device) {
device.dashboard_url = balena.models.device.getDashboardUrl(device.uuid);
const belongsToApplication =
device.belongs_to__application as Application[];
device.fleet = belongsToApplication?.[0]?.slug || null;
device.uuid = options.json ? device.uuid : device.uuid.slice(0, 7);
device.device_type = device.is_of__device_type?.[0]?.slug || null;
return device;
});
const fields = [
const fields: Array<keyof (typeof devices)[number]> = [
'id',
'uuid',
'device_name',

View File

@ -317,6 +317,12 @@ export async function getOnlineTargetDeviceUuid(
const { getApplication } = await import('./sdk');
return await getApplication(sdk, fleetOrDevice, {
$select: ['id', 'slug'],
$expand: {
owns__device: {
$select: ['device_name', 'uuid'],
$filter: { is_online: true },
},
},
});
} catch (err) {
const { BalenaApplicationNotFound } = await import('balena-errors');
@ -329,10 +335,7 @@ export async function getOnlineTargetDeviceUuid(
})();
// App found, load its devices
const devices = await sdk.models.device.getAllByApplication(application.id, {
$select: ['device_name', 'uuid'],
$filter: { is_online: true },
});
const devices = application.owns__device;
// Throw if no devices online
if (_.isEmpty(devices)) {