@lxdhub/dbsync
Version:
Display, search and copy LXD-images using a web interface.
124 lines • 5.98 kB
JavaScript
"use strict";
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
var __param = (this && this.__param) || function (paramIndex, decorator) {
return function (target, key) { decorator(target, key, paramIndex); }
};
Object.defineProperty(exports, "__esModule", { value: true });
const db_1 = require("@lxdhub/db");
const common_1 = require("@nestjs/common");
const aigle_1 = require("aigle");
const image_1 = require("../image");
const lxd_1 = require("../lxd");
const typeorm_1 = require("@nestjs/typeorm");
const typeorm_2 = require("typeorm");
let ImageAvailabilityService = class ImageAvailabilityService {
constructor(repository, remoteRepository, imageRepository, imageService, dbSyncSettings, lxdService) {
this.repository = repository;
this.remoteRepository = remoteRepository;
this.imageRepository = imageRepository;
this.imageService = imageService;
this.dbSyncSettings = dbSyncSettings;
this.lxdService = lxdService;
this.logger = new common_1.Logger('ImageAvailabilityService');
}
async fillUpImageAvailablities() {
const remotes = await this.remoteRepository.find();
const images = await this.imageRepository.find();
for (const remote of remotes) {
for (const image of images) {
await this.getOrCreate(image, remote, false);
}
}
}
async markAsUnavailable(fingerprints, remote) {
const imageAvailabilities = await this.repository
.find({
relations: ['image', 'remote'],
where: {
remote: { id: remote.id },
available: true,
}
});
const notAvailableImages = imageAvailabilities.filter(ai => fingerprints.indexOf(ai.image.fingerprint) === -1);
if (notAvailableImages.length === 0) {
return;
}
this.logger.log(`${notAvailableImages.length} images have been removed on the remote "${remote.name}"`);
await Promise.all(notAvailableImages.map(async (imageAvailability) => {
imageAvailability.available = false;
this.logger.log(`Updating Image Availability to false #${imageAvailability.id} on remote #${remote.id}`);
return await this.repository.save(imageAvailability);
}));
}
async updateOrCreate(image, remote, available = true) {
const imageAvailability = await this.get(image, remote);
if (imageAvailability) {
imageAvailability.available = available;
return await this.repository.save(imageAvailability);
}
else {
return await this.create(image, remote, available);
}
}
async getOrCreate(image, remote, available = true) {
const iA = await this.get(image, remote);
if (!iA) {
return await this.create(image, remote, available);
}
return iA;
}
async create(image, remote, available = true) {
this.logger.log(`Creating Image Availability image#${image.id} remote#${remote.id} -> ${available}`);
const newImageAvailability = new db_1.ImageAvailability();
newImageAvailability.available = available;
newImageAvailability.image = image;
newImageAvailability.remote = remote;
return await this.repository.save(newImageAvailability);
}
async get(image, remote) {
return await this.repository.createQueryBuilder('iA')
.leftJoin('iA.image', 'image')
.leftJoin('iA.remote', 'remote')
.where('image.id = :imageId AND remote.id = :remoteId', { imageId: image.id, remoteId: remote.id })
.getOne();
}
async synchronize() {
this.logger.log('-> Starting image-availability synchronization');
await aigle_1.default
.resolve(this.dbSyncSettings.lxdhubConfig.remotes)
.forEachSeries(async (remote) => {
const images = await this.lxdService.getRemoteImages(remote);
const localRemote = await this.remoteRepository.findOne({ name: remote.name, serverUrl: remote.url });
await aigle_1.default
.resolve(images)
.forEachSeries(async (remoteImage) => {
const image = await this.imageService.getImage(remoteImage);
return await this.updateOrCreate(image, localRemote);
});
await this.markAsUnavailable(images.map(image => image.fingerprint), localRemote);
});
await this.fillUpImageAvailablities();
this.logger.log('-> Finished image-availability synchronization');
}
};
ImageAvailabilityService = __decorate([
common_1.Injectable(),
__param(0, typeorm_1.InjectRepository(db_1.ImageAvailability)),
__param(1, typeorm_1.InjectRepository(db_1.Remote)),
__param(2, typeorm_1.InjectRepository(db_1.Image)),
__param(4, common_1.Inject('LXDHubDbSyncSettings')),
__metadata("design:paramtypes", [typeorm_2.Repository,
typeorm_2.Repository,
typeorm_2.Repository,
image_1.ImageService, Object, lxd_1.LXDService])
], ImageAvailabilityService);
exports.ImageAvailabilityService = ImageAvailabilityService;
//# sourceMappingURL=image-availability.service.js.map