feat: add image volume controller
Signed-off-by: MiaoWoo <admin@yumc.pw>
This commit is contained in:
		@@ -22,17 +22,30 @@ location.search.substring(1).split("&").forEach(q => {
 | 
			
		||||
 | 
			
		||||
console.log(query);
 | 
			
		||||
 | 
			
		||||
var socket = io('/container', {
 | 
			
		||||
var system = io('/', {
 | 
			
		||||
    path: '/ws',
 | 
			
		||||
    transports: ['websocket']
 | 
			
		||||
});
 | 
			
		||||
socket.on('connect', () => {
 | 
			
		||||
 | 
			
		||||
system.on('connect', () => {
 | 
			
		||||
    system.emit('events', {})
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
system.on('message', data => {
 | 
			
		||||
    term.write(data.toString() + '\r\n');
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
var container = io('/container', {
 | 
			
		||||
    path: '/ws',
 | 
			
		||||
    transports: ['websocket']
 | 
			
		||||
});
 | 
			
		||||
container.on('connect', () => {
 | 
			
		||||
    term.writeln('connect')
 | 
			
		||||
    if (query.action) {
 | 
			
		||||
        term.writeln(`Recover Action: ${query.action} Data: ${query.data}`)
 | 
			
		||||
        switch (query.action) {
 | 
			
		||||
            case "container":
 | 
			
		||||
                socket.emit('logs', {
 | 
			
		||||
                container.emit('logs', {
 | 
			
		||||
                    id: query.data,
 | 
			
		||||
                    // since: Date.now() / 1000 - 60 * 15,
 | 
			
		||||
                    // until: Date.now() / 1000,
 | 
			
		||||
@@ -51,7 +64,7 @@ term.on('data', async data => {
 | 
			
		||||
    term.write(data);
 | 
			
		||||
    if (data == '\r') {
 | 
			
		||||
        term.write('\n');
 | 
			
		||||
        socket.emit('logs', {
 | 
			
		||||
        container.emit('logs', {
 | 
			
		||||
            id: command
 | 
			
		||||
        })
 | 
			
		||||
        command = '';
 | 
			
		||||
@@ -59,10 +72,10 @@ term.on('data', async data => {
 | 
			
		||||
        command += data;
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||
socket.on('message', data => {
 | 
			
		||||
container.on('message', data => {
 | 
			
		||||
    term.write(data.toString() + '\r\n');
 | 
			
		||||
});
 | 
			
		||||
socket.on('disconnect', () => {
 | 
			
		||||
container.on('disconnect', () => {
 | 
			
		||||
    term.reset();
 | 
			
		||||
    term.writeln('disconnect');
 | 
			
		||||
});
 | 
			
		||||
 
 | 
			
		||||
@@ -19,12 +19,18 @@ class DashboardController {
 | 
			
		||||
        let networks = await docker.network.list();
 | 
			
		||||
        let nodes = await docker.node.list();
 | 
			
		||||
        let tasks = await docker.task.list();
 | 
			
		||||
        let containers = await docker.container.list();
 | 
			
		||||
        let images = await docker.image.list();
 | 
			
		||||
        let volumes = await docker.volume.list();
 | 
			
		||||
        return {
 | 
			
		||||
            nodes: nodes.map(n => n.Description.Hostname),
 | 
			
		||||
            tasks: tasks.map(t => t.ID),
 | 
			
		||||
            stacks: Array.from(new Set(stacks)),
 | 
			
		||||
            services,
 | 
			
		||||
            networks: networks.map(n => n.Name)
 | 
			
		||||
            networks: networks.map(n => n.Name),
 | 
			
		||||
            containers: containers.map(c => c.Names),
 | 
			
		||||
            images: images.map(i => i.Id),
 | 
			
		||||
            volumes: volumes.Volumes.map(v => v.Name)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
import { controller, httpGet, httpPost } from 'inversify-express-utils';
 | 
			
		||||
import * as docker from '@dayu/docker-api'
 | 
			
		||||
import { io, namespace, listener, interfaces, Message } from '@cc-server/ws';
 | 
			
		||||
 | 
			
		||||
@controller('')
 | 
			
		||||
class SystemController {
 | 
			
		||||
@@ -14,9 +15,32 @@ class SystemController {
 | 
			
		||||
    }
 | 
			
		||||
    @httpGet('/events')
 | 
			
		||||
    public async event() {
 | 
			
		||||
        await docker.system.events((event) => {
 | 
			
		||||
            if (!event) { return }
 | 
			
		||||
            console.log(event)
 | 
			
		||||
        let stream = await docker.system.events();
 | 
			
		||||
        stream.on('data', (chunk: ArrayBuffer) => {
 | 
			
		||||
            let log = Buffer.from(chunk).toString();
 | 
			
		||||
            console.log(log);
 | 
			
		||||
        })
 | 
			
		||||
        return {}
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@namespace()
 | 
			
		||||
class SystemNamespace extends interfaces.Namespace {
 | 
			
		||||
    @listener()
 | 
			
		||||
    async events(socket: io.Socket) {
 | 
			
		||||
        try {
 | 
			
		||||
            socket.send('Starting listening docker event...');
 | 
			
		||||
            let stream = await docker.system.events();
 | 
			
		||||
            socket.send('Connect to docker deamon...');
 | 
			
		||||
            this.defer(socket, () => stream.connection.destroy());
 | 
			
		||||
            stream.on('data', (chunk: ArrayBuffer) => {
 | 
			
		||||
                let log = Buffer.from(chunk).toString();
 | 
			
		||||
                console.log(log);
 | 
			
		||||
                socket.send(log);
 | 
			
		||||
            })
 | 
			
		||||
        } catch (ex) {
 | 
			
		||||
            //console.error(ex);
 | 
			
		||||
            return new Message(ex.message);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -3,7 +3,8 @@ import * as fs from 'fs'
 | 
			
		||||
import * as path from 'path'
 | 
			
		||||
 | 
			
		||||
//process.env.DOCKER_HOST = 'https://ndcli.yumc.pw'
 | 
			
		||||
process.env.DOCKER_HOST = '/var/run/docker.sock'
 | 
			
		||||
// process.env.DOCKER_HOST = '/var/run/docker.sock'
 | 
			
		||||
process.env.DOCKER_HOST = 'https://dscli.miaowoo.cc'
 | 
			
		||||
 | 
			
		||||
let server = new CcServerBoot();
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										17
									
								
								packages/docker-api/src/api/types/image.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								packages/docker-api/src/api/types/image.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,17 @@
 | 
			
		||||
import { Labels } from '../common'
 | 
			
		||||
 | 
			
		||||
export declare namespace image {
 | 
			
		||||
    export interface Image {
 | 
			
		||||
        Containers: number;
 | 
			
		||||
        Created: number;
 | 
			
		||||
        Id: string;
 | 
			
		||||
        Labels: Labels;
 | 
			
		||||
        ParentId: string;
 | 
			
		||||
        RepoDigests: string[];
 | 
			
		||||
        RepoTags: string[];
 | 
			
		||||
        SharedSize: number;
 | 
			
		||||
        Size: number;
 | 
			
		||||
        VirtualSize: number;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -1,6 +1,8 @@
 | 
			
		||||
export * from './node'
 | 
			
		||||
export * from './task'
 | 
			
		||||
export * from './image'
 | 
			
		||||
export * from './swarm'
 | 
			
		||||
export * from './volume'
 | 
			
		||||
export * from './system'
 | 
			
		||||
export * from './network'
 | 
			
		||||
export * from './service'
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										19
									
								
								packages/docker-api/src/api/types/volume.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								packages/docker-api/src/api/types/volume.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,19 @@
 | 
			
		||||
import { Labels, Options } from '../common'
 | 
			
		||||
 | 
			
		||||
export declare namespace volume {
 | 
			
		||||
    export interface Volume {
 | 
			
		||||
        CreatedAt: Date;
 | 
			
		||||
        Driver: string;
 | 
			
		||||
        Labels: Labels;
 | 
			
		||||
        Mountpoint: string;
 | 
			
		||||
        Name: string;
 | 
			
		||||
        Options: Options;
 | 
			
		||||
        Scope: string;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    export interface VolumeJSON {
 | 
			
		||||
        Volumes: Volume[];
 | 
			
		||||
        Warnings?: any;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										8
									
								
								packages/docker-api/src/client/image.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								packages/docker-api/src/client/image.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,8 @@
 | 
			
		||||
import * as api from '../utils/api'
 | 
			
		||||
import * as types from '../api/types'
 | 
			
		||||
 | 
			
		||||
export namespace image {
 | 
			
		||||
    export async function list() {
 | 
			
		||||
        return await api.get<types.image.Image[]>('/images/json');
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,6 +1,8 @@
 | 
			
		||||
export * from './node'
 | 
			
		||||
export * from './task'
 | 
			
		||||
export * from './image'
 | 
			
		||||
export * from './swarm'
 | 
			
		||||
export * from './volume'
 | 
			
		||||
export * from './system'
 | 
			
		||||
export * from './network'
 | 
			
		||||
export * from './service'
 | 
			
		||||
 
 | 
			
		||||
@@ -6,4 +6,7 @@ export namespace service {
 | 
			
		||||
    export async function list(filters?: opts.service.ListOpts) {
 | 
			
		||||
        return await api.get<types.service.Service[]>('/services', filters);
 | 
			
		||||
    }
 | 
			
		||||
    export async function create() {
 | 
			
		||||
        
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -10,13 +10,7 @@ export namespace system {
 | 
			
		||||
        return await api.get<types.system.Version>('/version');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    export async function events(cb: (events: object) => void) {
 | 
			
		||||
        let stream = await api.stream<any>('/events');
 | 
			
		||||
        stream.on('data', (chunk: ArrayBuffer) => {
 | 
			
		||||
            cb(JSON.parse(Buffer.from(chunk).toString()))
 | 
			
		||||
        })
 | 
			
		||||
        stream.on('end', () => {
 | 
			
		||||
            cb(undefined);
 | 
			
		||||
        })
 | 
			
		||||
    export async function events() {
 | 
			
		||||
        return await api.stream('/events');
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										8
									
								
								packages/docker-api/src/client/volume.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								packages/docker-api/src/client/volume.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,8 @@
 | 
			
		||||
import * as api from '../utils/api'
 | 
			
		||||
import * as types from '../api/types'
 | 
			
		||||
 | 
			
		||||
export namespace volume {
 | 
			
		||||
    export async function list() {
 | 
			
		||||
        return await api.get<types.volume.VolumeJSON>('/volumes');
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -11,6 +11,10 @@ export async function post<T>(path: string, data?: object): Promise<T> {
 | 
			
		||||
    return await handle<T>("POST", path, { data });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export async function del<T>(path: string, data?: object): Promise<T> {
 | 
			
		||||
    return await handle<T>("DELETE", path, { params: data });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export async function stream<T = http.ServerResponse>(path: string, data?: object): Promise<T> {
 | 
			
		||||
    return await handle<T>("GET", path, { params: data, responseType: "stream" });
 | 
			
		||||
}
 | 
			
		||||
@@ -64,8 +68,7 @@ function init() {
 | 
			
		||||
    const instanceConfig: AxiosRequestConfig = {
 | 
			
		||||
        headers: {
 | 
			
		||||
            'Content-Type': 'application/json'
 | 
			
		||||
        },
 | 
			
		||||
        timeout: 5000
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    if (process.env.DOCKER_HOST.startsWith("/")) {
 | 
			
		||||
        instanceConfig.socketPath = process.env.DOCKER_HOST
 | 
			
		||||
 
 | 
			
		||||
@@ -2,6 +2,7 @@
 | 
			
		||||
    "name": "@dayu/vscode",
 | 
			
		||||
    "displayName": "vscode",
 | 
			
		||||
    "description": "",
 | 
			
		||||
    "publisher": "MiaoWoo",
 | 
			
		||||
    "version": "0.0.1",
 | 
			
		||||
    "engines": {
 | 
			
		||||
        "vscode": "^1.35.0"
 | 
			
		||||
@@ -73,4 +74,4 @@
 | 
			
		||||
        "typescript": "^3.3.1",
 | 
			
		||||
        "vscode": "^1.1.28"
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user