forked from containers/podman-desktop
-
Notifications
You must be signed in to change notification settings - Fork 1
/
extension.ts
128 lines (118 loc) · 4.58 KB
/
extension.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/**********************************************************************
* Copyright (C) 2022 Red Hat, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* SPDX-License-Identifier: Apache-2.0
***********************************************************************/
import * as extensionApi from '@podman-desktop/api';
import * as path from 'path';
import * as os from 'os';
import * as fs from 'fs';
import { configuration, ProgressLocation } from '@podman-desktop/api';
import { getLimactl } from './limactl';
import { ImageHandler } from './image-handler';
type limaProviderType = 'docker' | 'podman' | 'kubernetes';
const LIMA_MOVE_IMAGE_COMMAND = 'lima.image.move';
const imageHandler = new ImageHandler();
function registerProvider(
extensionContext: extensionApi.ExtensionContext,
provider: extensionApi.Provider,
providerPath: string,
): void {
let providerState: extensionApi.ProviderConnectionStatus = 'unknown';
const providerType: limaProviderType = configuration.getConfiguration('lima').get('type');
const instanceName: string = configuration.getConfiguration('lima').get('name') || providerType;
if (providerType === 'podman' || providerType === 'docker') {
const connection: extensionApi.ContainerProviderConnection = {
name: 'Lima',
type: providerType,
status: () => providerState,
endpoint: {
socketPath: providerPath,
},
};
providerState = 'started';
const disposable = provider.registerContainerProviderConnection(connection);
provider.updateStatus('started');
extensionContext.subscriptions.push(disposable);
} else if (providerType === 'kubernetes') {
const connection: extensionApi.KubernetesProviderConnection = {
name: 'Lima',
status: () => providerState,
endpoint: {
apiURL: 'https://localhost:6443',
},
};
providerState = 'started';
const disposable = provider.registerKubernetesProviderConnection(connection);
provider.updateStatus('started');
extensionContext.subscriptions.push(disposable);
extensionContext.subscriptions.push(
extensionApi.commands.registerCommand(LIMA_MOVE_IMAGE_COMMAND, async image => {
return extensionApi.window.withProgress(
{ location: ProgressLocation.TASK_WIDGET, title: `Loading ${image.name} to lima.` },
async progress => {
await imageHandler.moveImage(image, instanceName, getLimactl());
// Mark the task as completed
progress.report({ increment: -1 });
},
);
}),
);
}
console.log('Lima extension is active');
}
export async function activate(extensionContext: extensionApi.ExtensionContext): Promise<void> {
const engineType = configuration.getConfiguration('lima').get('type') || 'podman';
const instanceName = configuration.getConfiguration('lima').get('name') || engineType;
const limaHome = 'LIMA_HOME' in process.env ? process.env['LIMA_HOME'] : os.homedir() + '/.lima';
const socketPath = path.resolve(limaHome, instanceName + '/sock/' + engineType + '.sock');
const configPath = path.resolve(limaHome, instanceName + '/copied-from-guest/kubeconfig.yaml');
let provider;
if (fs.existsSync(socketPath) || fs.existsSync(configPath)) {
provider = extensionApi.provider.createProvider({
name: 'Lima',
id: 'lima',
status: 'unknown',
images: {
icon: './icon.png',
logo: {
dark: './logo-dark.png',
light: './logo-light.png',
},
},
});
extensionContext.subscriptions.push(provider);
}
switch (engineType) {
case 'podman':
case 'docker':
if (fs.existsSync(socketPath)) {
registerProvider(extensionContext, provider, socketPath);
} else {
console.debug(`Could not find socket at ${socketPath}`);
}
break;
case 'kubernetes':
if (fs.existsSync(configPath)) {
registerProvider(extensionContext, provider, configPath);
} else {
console.debug(`Could not find config at ${configPath}`);
}
break;
}
}
export function deactivate(): void {
console.log('stopping lima extension');
}