underpost 2.8.815 → 2.8.816
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/bin/deploy.js +184 -120
- package/cli.md +1 -1
- package/docker-compose.yml +1 -1
- package/manifests/deployment/dd-template-development/deployment.yaml +2 -2
- package/manifests/maas/maas-setup.sh +1 -0
- package/package.json +1 -1
- package/src/index.js +1 -1
package/README.md
CHANGED
package/bin/deploy.js
CHANGED
|
@@ -91,7 +91,7 @@ EOF`,
|
|
|
91
91
|
|
|
92
92
|
const cloudConfigFactory = (
|
|
93
93
|
{ IP_ADDRESS, architecture, host, nfsHostPath, ipaddr, update, gatewayip },
|
|
94
|
-
{ consumer_key,
|
|
94
|
+
{ consumer_key, consumer_secret, token_key, token_secret },
|
|
95
95
|
) => [
|
|
96
96
|
// Configure cloud-init for MAAS
|
|
97
97
|
`cat <<EOF_MAAS_CFG > /etc/cloud/cloud.cfg.d/90_maas.cfg
|
|
@@ -112,16 +112,24 @@ hostname: ${host}
|
|
|
112
112
|
datasource_list: [ MAAS ]
|
|
113
113
|
datasource:
|
|
114
114
|
MAAS:
|
|
115
|
-
metadata_url: http://${IP_ADDRESS}:
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
115
|
+
metadata_url: http://${IP_ADDRESS}:5240/MAAS/metadata/
|
|
116
|
+
${
|
|
117
|
+
process.argv.includes('reset')
|
|
118
|
+
? ''
|
|
119
|
+
: `consumer_key: ${consumer_key}
|
|
120
|
+
consumer_secret: ${consumer_secret}
|
|
121
|
+
token_key: ${token_key}
|
|
122
|
+
token_secret: ${token_secret}`
|
|
123
|
+
}
|
|
124
|
+
|
|
119
125
|
|
|
120
126
|
users:
|
|
121
|
-
- name:
|
|
127
|
+
- name: ${process.env.MAAS_ADMIN_USERNAME}
|
|
122
128
|
sudo: ['ALL=(ALL) NOPASSWD:ALL']
|
|
123
129
|
shell: /bin/bash
|
|
124
|
-
lock_passwd:
|
|
130
|
+
lock_passwd: false
|
|
131
|
+
groups: sudo,users,admin,wheel,lxd
|
|
132
|
+
plain_text_passwd: '${process.env.MAAS_ADMIN_USERNAME}'
|
|
125
133
|
ssh_authorized_keys:
|
|
126
134
|
- ${fs.readFileSync(`/home/dd/engine/engine-private/deploy/id_rsa.pub`, 'utf8')}
|
|
127
135
|
|
|
@@ -136,11 +144,11 @@ users:
|
|
|
136
144
|
# timezone: America/Santiago
|
|
137
145
|
# timezone: ${timezone}
|
|
138
146
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
147
|
+
ntp:
|
|
148
|
+
enabled: true
|
|
149
|
+
servers:
|
|
150
|
+
- ${process.env.MAAS_NTP_SERVER}
|
|
151
|
+
ntp_client: chrony
|
|
144
152
|
# config:
|
|
145
153
|
# confpath: ${chronyConfPath}
|
|
146
154
|
# packages:
|
|
@@ -162,13 +170,13 @@ packages:
|
|
|
162
170
|
resize_rootfs: false
|
|
163
171
|
growpart:
|
|
164
172
|
mode: off
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
173
|
+
network:
|
|
174
|
+
version: 2
|
|
175
|
+
ethernets:
|
|
176
|
+
${process.env.RPI4_INTERFACE_NAME}:
|
|
177
|
+
dhcp4: true
|
|
178
|
+
addresses:
|
|
179
|
+
- ${ipaddr}/24
|
|
172
180
|
# routes:
|
|
173
181
|
# - to: default
|
|
174
182
|
# via: ${gatewayip}
|
|
@@ -193,6 +201,72 @@ runcmd:
|
|
|
193
201
|
- echo "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -"
|
|
194
202
|
- echo "Init runcmd"
|
|
195
203
|
- echo "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -"
|
|
204
|
+
|
|
205
|
+
# If this is set, 'root' will not be able to ssh in and they
|
|
206
|
+
# will get a message to login instead as the default $user
|
|
207
|
+
disable_root: true
|
|
208
|
+
|
|
209
|
+
# This will cause the set+update hostname module to not operate (if true)
|
|
210
|
+
preserve_hostname: false
|
|
211
|
+
|
|
212
|
+
# The modules that run in the 'init' stage
|
|
213
|
+
cloud_init_modules:
|
|
214
|
+
- migrator
|
|
215
|
+
- seed_random
|
|
216
|
+
- bootcmd
|
|
217
|
+
- write-files
|
|
218
|
+
- growpart
|
|
219
|
+
- resizefs
|
|
220
|
+
- disk_setup
|
|
221
|
+
- mounts
|
|
222
|
+
- set_hostname
|
|
223
|
+
- update_hostname
|
|
224
|
+
- update_etc_hosts
|
|
225
|
+
- ca-certs
|
|
226
|
+
- rsyslog
|
|
227
|
+
- users-groups
|
|
228
|
+
- ssh
|
|
229
|
+
|
|
230
|
+
# The modules that run in the 'config' stage
|
|
231
|
+
cloud_config_modules:
|
|
232
|
+
# Emit the cloud config ready event
|
|
233
|
+
# this can be used by upstart jobs for 'start on cloud-config'.
|
|
234
|
+
- emit_upstart
|
|
235
|
+
- snap_config
|
|
236
|
+
- ssh-import-id
|
|
237
|
+
- locale
|
|
238
|
+
- set-passwords
|
|
239
|
+
- grub-dpkg
|
|
240
|
+
- apt-pipelining
|
|
241
|
+
- apt-configure
|
|
242
|
+
- ntp
|
|
243
|
+
- timezone
|
|
244
|
+
- disable-ec2-metadata
|
|
245
|
+
- runcmd
|
|
246
|
+
- byobu
|
|
247
|
+
|
|
248
|
+
# The modules that run in the 'final' stage
|
|
249
|
+
cloud_final_modules:
|
|
250
|
+
- snappy
|
|
251
|
+
- package-update-upgrade-install
|
|
252
|
+
# - fan
|
|
253
|
+
# - landscape
|
|
254
|
+
# - lxd
|
|
255
|
+
# - puppet
|
|
256
|
+
- chef
|
|
257
|
+
- salt-minion
|
|
258
|
+
- mcollective
|
|
259
|
+
- rightscale_userdata
|
|
260
|
+
- scripts-vendor
|
|
261
|
+
- scripts-per-once
|
|
262
|
+
- scripts-per-boot
|
|
263
|
+
- scripts-per-instance
|
|
264
|
+
- scripts-user
|
|
265
|
+
- ssh-authkey-fingerprints
|
|
266
|
+
- keys-to-console
|
|
267
|
+
# - phone-home
|
|
268
|
+
- final-message
|
|
269
|
+
# - power-state-change
|
|
196
270
|
EOF_MAAS_CFG`,
|
|
197
271
|
];
|
|
198
272
|
|
|
@@ -307,6 +381,7 @@ ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf`,
|
|
|
307
381
|
`${nfsHostPath}/underpost/help.sh`,
|
|
308
382
|
`echo "=== Cloud init utils ==="
|
|
309
383
|
echo "sudo cloud-init --all-stages"
|
|
384
|
+
echo "sudo cloud-init clean --logs --seed --configs all --machine-id --reboot"
|
|
310
385
|
echo "sudo cloud-init init --local"
|
|
311
386
|
echo "sudo cloud-init init"
|
|
312
387
|
echo "sudo cloud-init modules --mode=config"
|
|
@@ -355,22 +430,32 @@ cut -d: -f1 /etc/passwd
|
|
|
355
430
|
|
|
356
431
|
const updateVirtualRoot = async ({ IP_ADDRESS, architecture, host, nfsHostPath, ipaddr, update, gatewayip }) => {
|
|
357
432
|
// <consumer_key>:<consumer_token>:<secret>
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
:
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
433
|
+
// <consumer_key>:<consumer_secret>:<token_key>:<token_secret>
|
|
434
|
+
// maas apikey --with-names --username ${process.env.MAAS_ADMIN_USERNAME}
|
|
435
|
+
// maas ${process.env.MAAS_ADMIN_USERNAME} account create-authorisation-token
|
|
436
|
+
// maas apikey --generate --username ${process.env.MAAS_ADMIN_USERNAME}
|
|
437
|
+
// https://github.com/CanonicalLtd/maas-docs/issues/647
|
|
438
|
+
|
|
439
|
+
const parts = shellExec(`maas apikey --with-names --username ${process.env.MAAS_ADMIN_USERNAME}`, {
|
|
440
|
+
stdout: true,
|
|
441
|
+
})
|
|
442
|
+
.trim()
|
|
443
|
+
.split(`\n`)[0]
|
|
444
|
+
.split(':');
|
|
445
|
+
|
|
446
|
+
let consumer_key, consumer_secret, token_key, token_secret;
|
|
447
|
+
|
|
448
|
+
if (parts.length === 4) {
|
|
449
|
+
[consumer_key, consumer_secret, token_key, token_secret] = parts;
|
|
450
|
+
} else if (parts.length === 3) {
|
|
451
|
+
[consumer_key, token_key, token_secret] = parts;
|
|
452
|
+
consumer_secret = '""';
|
|
453
|
+
token_secret = token_secret.split(' MAAS consumer')[0].trim();
|
|
454
|
+
} else {
|
|
455
|
+
throw new Error('Invalid token format');
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
logger.info('Maas api token generated', { consumer_key, consumer_secret, token_key, token_secret });
|
|
374
459
|
|
|
375
460
|
if (update) {
|
|
376
461
|
// --reboot
|
|
@@ -411,11 +496,7 @@ EOF`);
|
|
|
411
496
|
nfsHostPath,
|
|
412
497
|
cloudConfigFactory(
|
|
413
498
|
{ IP_ADDRESS, architecture, host, nfsHostPath, ipaddr, update, gatewayip },
|
|
414
|
-
{
|
|
415
|
-
consumer_key,
|
|
416
|
-
consumer_token,
|
|
417
|
-
secret,
|
|
418
|
-
},
|
|
499
|
+
{ consumer_key, consumer_secret, token_key, token_secret },
|
|
419
500
|
),
|
|
420
501
|
);
|
|
421
502
|
installUbuntuUnderpostTools(nfsHostPath);
|
|
@@ -1604,7 +1685,9 @@ EOF`);
|
|
|
1604
1685
|
dotenv.config({ path: `${getUnderpostRootPath()}/.env`, override: true });
|
|
1605
1686
|
const IP_ADDRESS = getLocalIPv4Address();
|
|
1606
1687
|
const serverip = IP_ADDRESS;
|
|
1607
|
-
const tftpRoot = process.
|
|
1688
|
+
const tftpRoot = process.argv.includes('v3.0')
|
|
1689
|
+
? `/var/snap/maas/common/maas/boot-resources/snapshot-20250720-162718`
|
|
1690
|
+
: process.env.TFTP_ROOT;
|
|
1608
1691
|
const ipaddr = process.env.RPI4_IP;
|
|
1609
1692
|
const netmask = process.env.NETMASK;
|
|
1610
1693
|
const gatewayip = process.env.GATEWAY_IP;
|
|
@@ -1854,7 +1937,9 @@ EOF`);
|
|
|
1854
1937
|
zipFirmwareName,
|
|
1855
1938
|
zipFirmwareUrl,
|
|
1856
1939
|
interfaceName,
|
|
1857
|
-
nfsHost
|
|
1940
|
+
nfsHost,
|
|
1941
|
+
bootResourcesPath,
|
|
1942
|
+
bootKernelPath;
|
|
1858
1943
|
|
|
1859
1944
|
switch (process.argv[3]) {
|
|
1860
1945
|
case 'rpi4mb':
|
|
@@ -1872,7 +1957,7 @@ EOF`);
|
|
|
1872
1957
|
resource = resources.find((o) => o.architecture === 'arm64/ga-24.04' && o.name === 'ubuntu/noble');
|
|
1873
1958
|
name = resource.name;
|
|
1874
1959
|
architecture = resource.architecture;
|
|
1875
|
-
resource = resources.find((o) => o.name === name && o.architecture === architecture);
|
|
1960
|
+
// resource = resources.find((o) => o.name === name && o.architecture === architecture);
|
|
1876
1961
|
nfsServerRootPath = `${process.env.NFS_EXPORT_PATH}/rpi4mb`;
|
|
1877
1962
|
// ,anonuid=1001,anongid=100
|
|
1878
1963
|
// etcExports = `${nfsServerRootPath} *(rw,all_squash,sync,no_root_squash,insecure)`;
|
|
@@ -1884,21 +1969,33 @@ EOF`);
|
|
|
1884
1969
|
'no_subtree_check',
|
|
1885
1970
|
'insecure',
|
|
1886
1971
|
]})`;
|
|
1887
|
-
|
|
1888
|
-
|
|
1889
|
-
|
|
1890
|
-
|
|
1891
|
-
|
|
1892
|
-
|
|
1893
|
-
|
|
1894
|
-
|
|
1895
|
-
|
|
1972
|
+
if (process.argv.includes('v3.0')) {
|
|
1973
|
+
bootResourcesPath = `/var/snap/maas/common/maas/boot-resources/snapshot-20250720-162718`;
|
|
1974
|
+
bootKernelPath = `/var/snap/maas/common/maas/boot-resources/snapshot-20250720-162718/ubuntu/arm64/hwe-24.04/noble/stable`;
|
|
1975
|
+
kernelFilesPaths = {
|
|
1976
|
+
'vmlinuz-efi': `${bootKernelPath}/boot-kernel`,
|
|
1977
|
+
'initrd.img': `${bootKernelPath}/boot-initrd`,
|
|
1978
|
+
squashfs: `${bootKernelPath}/squashfs`,
|
|
1979
|
+
};
|
|
1980
|
+
} else {
|
|
1981
|
+
const resourceData = JSON.parse(
|
|
1982
|
+
shellExec(`maas ${process.env.MAAS_ADMIN_USERNAME} boot-resource read ${resource.id}`, {
|
|
1983
|
+
stdout: true,
|
|
1984
|
+
silent: true,
|
|
1985
|
+
disableLog: true,
|
|
1986
|
+
}),
|
|
1987
|
+
);
|
|
1988
|
+
const bootFiles = resourceData.sets[Object.keys(resourceData.sets)[0]].files;
|
|
1989
|
+
const suffix = architecture.match('xgene') ? '.xgene' : '';
|
|
1990
|
+
bootResourcesPath = `/var/snap/maas/common/maas/image-storage/bootloaders/uefi/arm64`;
|
|
1991
|
+
bootKernelPath = `/var/snap/maas/common/maas/image-storage`;
|
|
1992
|
+
kernelFilesPaths = {
|
|
1993
|
+
'vmlinuz-efi': `${bootKernelPath}/${bootFiles['boot-kernel' + suffix].filename_on_disk}`,
|
|
1994
|
+
'initrd.img': `${bootKernelPath}/${bootFiles['boot-initrd' + suffix].filename_on_disk}`,
|
|
1995
|
+
squashfs: `${bootKernelPath}/${bootFiles['squashfs'].filename_on_disk}`,
|
|
1996
|
+
};
|
|
1997
|
+
}
|
|
1896
1998
|
|
|
1897
|
-
kernelFilesPaths = {
|
|
1898
|
-
'vmlinuz-efi': bootFiles['boot-kernel' + suffix].filename_on_disk,
|
|
1899
|
-
'initrd.img': bootFiles['boot-initrd' + suffix].filename_on_disk,
|
|
1900
|
-
squashfs: bootFiles['squashfs'].filename_on_disk,
|
|
1901
|
-
};
|
|
1902
1999
|
const protocol = 'tcp'; // v3 -> tcp, v4 -> udp
|
|
1903
2000
|
|
|
1904
2001
|
const mountOptions = [
|
|
@@ -2022,52 +2119,18 @@ BOOT_ORDER=0x21`;
|
|
|
2022
2119
|
switch (process.argv[3]) {
|
|
2023
2120
|
case 'rpi4mb':
|
|
2024
2121
|
{
|
|
2025
|
-
// subnet DHCP snippets
|
|
2026
|
-
// # UEFI ARM64
|
|
2027
|
-
// if option arch = 00:0B {
|
|
2028
|
-
// filename "rpi4mb/pxe/grubaa64.efi";
|
|
2029
|
-
// }
|
|
2030
|
-
// elsif option arch = 00:13 {
|
|
2031
|
-
// filename "http://<IP_ADDRESS>:5248/images/bootloaders/uefi/arm64/grubaa64.efi";
|
|
2032
|
-
// option vendor-class-identifier "HTTPClient";
|
|
2033
|
-
// }
|
|
2034
2122
|
for (const file of ['bootaa64.efi', 'grubaa64.efi']) {
|
|
2035
|
-
shellExec(
|
|
2036
|
-
`sudo cp -a /var/snap/maas/common/maas/image-storage/bootloaders/uefi/arm64/${file} ${tftpRoot}${tftpSubDir}/pxe/${file}`,
|
|
2037
|
-
);
|
|
2123
|
+
shellExec(`sudo cp -a ${bootResourcesPath}/${file} ${tftpRoot}${tftpSubDir}/pxe/${file}`);
|
|
2038
2124
|
}
|
|
2039
|
-
// const file = 'bcm2711-rpi-4-b.dtb';
|
|
2040
|
-
// shellExec(
|
|
2041
|
-
// `sudo cp -a ${firmwarePath}/${file} /var/snap/maas/common/maas/image-storage/bootloaders/uefi/arm64/${file}`,
|
|
2042
|
-
// );
|
|
2043
|
-
|
|
2044
|
-
// const ipxeSrc = fs
|
|
2045
|
-
// .readFileSync(`${tftpRoot}/ipxe.cfg`, 'utf8')
|
|
2046
|
-
// .replaceAll('amd64', 'arm64')
|
|
2047
|
-
// .replaceAll('${next-server}', IP_ADDRESS);
|
|
2048
|
-
// fs.writeFileSync(`${tftpRoot}/ipxe.cfg`, ipxeSrc, 'utf8');
|
|
2049
2125
|
|
|
2050
2126
|
{
|
|
2051
2127
|
for (const file of Object.keys(kernelFilesPaths)) {
|
|
2052
|
-
shellExec(
|
|
2053
|
-
`sudo cp -a /var/snap/maas/common/maas/image-storage/${kernelFilesPaths[file]} ${tftpRoot}${tftpSubDir}/pxe/${file}`,
|
|
2054
|
-
);
|
|
2128
|
+
shellExec(`sudo cp -a ${kernelFilesPaths[file]} ${tftpRoot}${tftpSubDir}/pxe/${file}`);
|
|
2055
2129
|
}
|
|
2056
|
-
|
|
2057
|
-
|
|
2058
|
-
|
|
2059
|
-
|
|
2060
|
-
// .replace(`kernel=kernel8.img`, `kernel=vmlinuz`)
|
|
2061
|
-
// .replace(`# max_framebuffers=2`, `max_framebuffers=2`)
|
|
2062
|
-
// .replace(`initramfs initramfs8 followkernel`, `initramfs initrd.img followkernel`),
|
|
2063
|
-
// 'utf8',
|
|
2064
|
-
// );
|
|
2065
|
-
|
|
2066
|
-
// grub:
|
|
2067
|
-
// set root=(pxe)
|
|
2068
|
-
|
|
2069
|
-
// UNDERPOST.NET UEFI/GRUB/MAAS RPi4 commissioning (ARM64)
|
|
2070
|
-
const menuentryStr = 'underpost.net rpi4mb maas commissioning (ARM64)';
|
|
2130
|
+
|
|
2131
|
+
fs.mkdirSync(`${tftpRoot}/grub`, { recursive: true });
|
|
2132
|
+
|
|
2133
|
+
const menuentryStr = 'UNDERPOST.NET UEFI/GRUB/MAAS RPi4 commissioning (ARM64)';
|
|
2071
2134
|
const grubCfgPath = `${tftpRoot}/grub/grub.cfg`;
|
|
2072
2135
|
fs.writeFileSync(
|
|
2073
2136
|
grubCfgPath,
|
|
@@ -2171,29 +2234,30 @@ BOOT_ORDER=0x21`;
|
|
|
2171
2234
|
};
|
|
2172
2235
|
machine.hostname = machine.hostname.replaceAll(' ', '').replaceAll('.', '');
|
|
2173
2236
|
|
|
2174
|
-
|
|
2175
|
-
|
|
2176
|
-
|
|
2177
|
-
.
|
|
2178
|
-
|
|
2179
|
-
|
|
2180
|
-
|
|
2181
|
-
|
|
2182
|
-
|
|
2183
|
-
|
|
2184
|
-
|
|
2185
|
-
|
|
2186
|
-
|
|
2187
|
-
|
|
2188
|
-
|
|
2189
|
-
|
|
2190
|
-
|
|
2191
|
-
|
|
2192
|
-
|
|
2193
|
-
|
|
2194
|
-
|
|
2195
|
-
|
|
2196
|
-
|
|
2237
|
+
if (machine.hostname.match('generic-host'))
|
|
2238
|
+
try {
|
|
2239
|
+
let newMachine = shellExec(
|
|
2240
|
+
`maas ${process.env.MAAS_ADMIN_USERNAME} machines create ${Object.keys(machine)
|
|
2241
|
+
.map((k) => `${k}="${machine[k]}"`)
|
|
2242
|
+
.join(' ')}`,
|
|
2243
|
+
{
|
|
2244
|
+
silent: true,
|
|
2245
|
+
stdout: true,
|
|
2246
|
+
},
|
|
2247
|
+
);
|
|
2248
|
+
newMachine = machineFactory(JSON.parse(newMachine));
|
|
2249
|
+
machines.push(newMachine);
|
|
2250
|
+
console.log(newMachine);
|
|
2251
|
+
// commissioning_scripts=90-verify-user.sh
|
|
2252
|
+
shellExec(
|
|
2253
|
+
`maas ${process.env.MAAS_ADMIN_USERNAME} machine commission ${newMachine.system_id} enable_ssh=1 skip_bmc_config=1 skip_networking=1 skip_storage=1`,
|
|
2254
|
+
{
|
|
2255
|
+
silent: true,
|
|
2256
|
+
},
|
|
2257
|
+
);
|
|
2258
|
+
} catch (error) {
|
|
2259
|
+
logger.error(error, error.stack);
|
|
2260
|
+
}
|
|
2197
2261
|
}
|
|
2198
2262
|
// if (discoveries.length > 0) {
|
|
2199
2263
|
// shellExec(
|
package/cli.md
CHANGED
package/docker-compose.yml
CHANGED
|
@@ -17,7 +17,7 @@ spec:
|
|
|
17
17
|
spec:
|
|
18
18
|
containers:
|
|
19
19
|
- name: dd-template-development-blue
|
|
20
|
-
image: localhost/rockylinux9-underpost:v2.8.
|
|
20
|
+
image: localhost/rockylinux9-underpost:v2.8.816
|
|
21
21
|
# resources:
|
|
22
22
|
# requests:
|
|
23
23
|
# memory: "124Ki"
|
|
@@ -100,7 +100,7 @@ spec:
|
|
|
100
100
|
spec:
|
|
101
101
|
containers:
|
|
102
102
|
- name: dd-template-development-green
|
|
103
|
-
image: localhost/rockylinux9-underpost:v2.8.
|
|
103
|
+
image: localhost/rockylinux9-underpost:v2.8.816
|
|
104
104
|
# resources:
|
|
105
105
|
# requests:
|
|
106
106
|
# memory: "124Ki"
|
package/package.json
CHANGED