You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
39 lines
1.2 KiB
39 lines
1.2 KiB
import {appPath, AsyncCollection, collect, Collection, Singleton, UniversalPath, universalPath} from '@extollo/lib'
|
|
|
|
export interface LXCImage {
|
|
os: string
|
|
version: string
|
|
arch: 'amd64' | 'arm64' | 'i386' | string
|
|
format: 'cloud' | 'default'
|
|
timestamp: string
|
|
endpoint: string
|
|
}
|
|
|
|
@Singleton()
|
|
export class Images {
|
|
private imageServer = 'https://us.lxd.images.canonical.com'
|
|
private listEndpoint = 'meta/1.0/index-system'
|
|
private imageBinaryName = 'rootfs.tar.xz'
|
|
|
|
public async getImages(): Promise<Collection<LXCImage>> {
|
|
const url = universalPath(this.imageServer, this.listEndpoint)
|
|
const content = await fetch(url.toRemote).then(x => x.text())
|
|
return collect(content.trim().split('\n'))
|
|
.map(row => {
|
|
const [os, version, arch, format, timestamp, endpoint] = row.split(';')
|
|
return {
|
|
os,
|
|
version,
|
|
arch,
|
|
format,
|
|
timestamp,
|
|
endpoint,
|
|
} as LXCImage
|
|
})
|
|
}
|
|
|
|
public getImageBinaryPath(image: LXCImage): UniversalPath {
|
|
return universalPath(this.imageServer, image.endpoint, this.imageBinaryName)
|
|
}
|
|
}
|