Skip to content
Snippets Groups Projects
Commit 264069ab authored by Guillaume WEBER's avatar Guillaume WEBER
Browse files

refactor(mission): more refactor

parent 9e8dc3f5
No related branches found
No related tags found
2 merge requests!14feat: added mounted, .bashrc, .zshrc, added tests, added keycloak tests,!8feat(extension): login, open in devcontainer, automaticly save code, open briefing, publish extension
......@@ -8,11 +8,12 @@ import QuickSetupView from '../view/quickSetupView';
import { CHOOSE_MISSION_WORKDIR_COMMAND, CommandHandler, OPEN_URL_IN_BROWSER_COMMAND } from './commandHandler';
import ExtensionStore from './extensionStore';
import KeycloakOAuth2DeviceFlowConnection from './keycloakOAuth2DeviceFlowConnection';
import Mission from './mission/mission';
import ApiService from './api.service';
import SshKeyManager from './sshKeyManager';
import { GiteaPublicProperties } from '../model/giteaPublicProperties.model';
import { User } from '../model/user.model';
import { openEditorInFolder } from './mission/missionOpenInEditor';
import { Mission } from './mission/mission';
export default class Controller {
public connection: KeycloakOAuth2DeviceFlowConnection;
......@@ -88,8 +89,11 @@ export default class Controller {
}
public async clear() {
console.log('CLEAR');
await this.extensionStore.clear();
console.log('CLEAR2');
this.quickSetupView.isAlreadyConnected = false;
console.log('CLEAR3');
}
public async createSshKeyPairIfNotExist() {
......@@ -128,19 +132,19 @@ export default class Controller {
const giteaPublicProperties: GiteaPublicProperties = await this.callApiService.getGiteaPublicProperties();
const mission = new Mission(
{
missionId: missionId,
missionVersion: missionVersion,
},
user,
`${ExtensionStore.getInstance().getMissionWorkdir()}/${missionId}`,
missionId,
missionVersion,
giteaPublicProperties,
);
vscode.window.showInformationMessage(
'opening inside folder ' + this.extensionStore.getMissionWorkdir()! + '/' + missionId,
);
await mission.setup();
await mission.openEditorInFolder();
await mission.setup(user);
openEditorInFolder(`${mission.directory}/.config`);
vscode.commands.executeCommand(OPEN_QUICK_SETUP_COMMAND.cmd);
}
......
import { exec as _exec } from 'child_process';
import * as fs from 'fs';
import * as util from 'util';
import * as vscode from 'vscode';
import { error as err, log } from '../../recorder/utils';
import ExtensionStore from '../extensionStore';
import { userSshKeyFolderPath } from '../config';
import { GiteaPublicProperties } from '../../model/giteaPublicProperties.model';
import { User, UserChallengeJson } from '../../model/user.model';
import { createDevContainerFile } from './missionDevContainer';
import { User } from '../../model/user.model';
import { DockerfileSpecific, Base, VSCodespecific, LifecycleScripts } from './devContainer';
import { MissionResource } from './missionResources';
import { createDevContainerFile } from './missionDevContainer';
import { createUserChallengeJsonFile } from './missionUserChallenge';
/**
* {@link https://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback}
*/
const exec = util.promisify(_exec);
export default class Mission {
private readonly hostBaseWorkDir: string;
private readonly hostMissionDir: string;
private readonly hostMissionDevcontainerDir: string;
private readonly hostMissionMountDir: string;
private readonly userMissionConfigPath: string;
private readonly user: User;
private readonly giteaPublicProperties: GiteaPublicProperties;
private readonly missionRessource: MissionResource;
export class Mission {
readonly directory: string;
readonly id: string;
readonly version: string;
readonly giteaProperties: GiteaPublicProperties;
constructor(
private params: { missionId: string; missionVersion: string },
user: User,
giteaPublicProperties: GiteaPublicProperties,
) {
const { missionId, missionVersion } = params;
this.hostBaseWorkDir = ExtensionStore.getInstance().getMissionWorkdir() ?? '';
this.hostMissionDir = `${this.hostBaseWorkDir}/${missionId}`;
this.userMissionConfigPath = `${this.hostMissionDir}/.config`;
this.hostMissionDevcontainerDir = `${this.hostMissionDir}/.devcontainer`;
this.hostMissionMountDir = `${this.hostMissionDir}/mounted`;
this.user = user;
this.giteaPublicProperties = giteaPublicProperties;
this.missionRessource = new MissionResource(this.hostMissionDir, missionId, missionVersion);
constructor(directory: string, id: string, version: string, giteaProperties: GiteaPublicProperties) {
this.directory = directory;
this.id = id;
this.version = version;
this.giteaProperties = giteaProperties;
}
public async setup(options?: Partial<DockerfileSpecific & Base & VSCodespecific & LifecycleScripts>) {
await fs.promises.mkdir(this.hostMissionDevcontainerDir, { recursive: true });
await fs.promises.mkdir(this.hostMissionMountDir, { recursive: true });
await fs.promises.mkdir(this.userMissionConfigPath, { recursive: true });
await createDevContainerFile(this.missionRessource, options);
await createUserChallengeJsonFile(this.user, this.missionRessource, this.giteaPublicProperties);
public async setup(user: User, options?: Partial<DockerfileSpecific & Base & VSCodespecific & LifecycleScripts>) {
await this.createDirectories([
`${this.directory}/.config`,
`${this.directory}/.devcontainer`,
`${this.directory}/mounted`,
]);
await createDevContainerFile(this, options);
await createUserChallengeJsonFile(user, this, this.giteaProperties);
}
public async openEditorInFolder(arbitraryPath?: string) {
if (arbitraryPath) {
return vscode.commands.executeCommand('remote-containers.openFolder', vscode.Uri.file(arbitraryPath));
}
if (!fs.existsSync(this.hostMissionDir)) {
log('WARN missing path ', this.hostMissionDir);
await fs.promises.mkdir(this.hostMissionDir, { recursive: true });
}
await vscode.commands.executeCommand('remote-containers.openFolder', vscode.Uri.file(this.hostMissionDir));
private createDirectories(directoryPaths: string[]) {
return Promise.all(directoryPaths.map((directoryPath) => fs.promises.mkdir(directoryPath, { recursive: true })));
}
}
......@@ -2,12 +2,12 @@ import { userSshKeyFolderPath } from '../config';
import ExtensionStore from '../extensionStore';
import { Base, DockerfileSpecific, LifecycleScripts, VSCodespecific } from './devContainer';
import * as fs from 'fs';
import { MissionResource } from './missionResources';
import { Mission } from './mission';
const DOCKER_IMAGE_URL = 'registry.takima.io/deadlock/deadlock-challenges';
export function createDevContainerFile(
mission: MissionResource,
mission: Mission,
options?: Partial<DockerfileSpecific & Base & VSCodespecific & LifecycleScripts>,
) {
const hostBaseWorkDir = ExtensionStore.getInstance().getMissionWorkdir() ?? '';
......
import * as fs from 'fs';
import { error as err, log } from '../../recorder/utils';
import * as vscode from 'vscode';
export async function openEditorInFolder(folderPath: string) {
if (!fs.existsSync(folderPath)) {
log('WARN missing path ', folderPath);
await fs.promises.mkdir(folderPath, { recursive: true });
}
await vscode.commands.executeCommand('remote-containers.openFolder', vscode.Uri.file(folderPath));
}
export class MissionResource {
constructor(public missionDir: string, public id: string, public version: string) {
this.missionDir = missionDir;
this.id = id;
this.version = version;
}
}
import { User, UserChallengeJson } from '../../model/user.model';
import * as fs from 'fs';
import { GiteaPublicProperties } from '../../model/giteaPublicProperties.model';
import { MissionResource } from './missionResources';
import { Mission } from './mission';
export function createUserChallengeJsonFile(
user: User,
mission: MissionResource,
mission: Mission,
giteaPublicProperties: GiteaPublicProperties,
) {
return fs.promises.writeFile(
`${mission.missionDir}/.config/user-challenge.json`,
`${mission.directory}/.config/user-challenge.json`,
(() => {
const userChallengeJson: UserChallengeJson = {
giteaHost: giteaPublicProperties.sshHost,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment