Commit f009be47 authored by kewei.jia's avatar kewei.jia

增加了eslint规则和logger

parent 9b0bbbed
node_modules/*.js
config/logger.js
module.exports = {
extends: [
"airbnb-base"
],
rules: {
"semi": "off",
"func-names": "off",
"no-restricted-syntax": "off",
"no-underscore-dangle": "off",
"import/no-dynamic-require": "off",
'prefer-destructuring': "off",
"no-bitwise": "off",
"no-param-reassign": "off",
"no-await-in-loop": "off",
"consistent-return": "off",
"no-shadow": "off",
"no-useless-escape": "off",
"camelcase": "off",
"prefer-rest-params" : "off",
"max-len" :["error", { "code": 150 }]
}
}
{
"extends": "standard"
}
\ No newline at end of file
...@@ -5,36 +5,36 @@ const templates = require('../serviceTemplate') ...@@ -5,36 +5,36 @@ const templates = require('../serviceTemplate')
const IMAGES = { const IMAGES = {
zookeeper: 'zookeeper:3.4.10', zookeeper: 'zookeeper:3.4.10',
rabbitmq: 'rabbitmq:3.6-management', rabbitmq: 'rabbitmq:3.6-management',
mysql: 'mysql:5.7' mysql: 'mysql:5.7',
} }
const router = new Router() const router = new Router()
module.exports = router module.exports = router
router.post('/create', async ctx => { router.post('/create', async (ctx) => {
let { serviceName, namespace } = ctx.request.body const { serviceName, namespace } = ctx.request.body
if (!Object.keys(IMAGES).includes(serviceName)) { if (!Object.keys(IMAGES).includes(serviceName)) {
ctx.body = ctx.fail('不支持的服务类型') ctx.body = ctx.fail('不支持的服务类型')
return return
} }
let data = { const data = {
namespace, namespace,
image: IMAGES[serviceName] image: IMAGES[serviceName],
} }
let template = templates[serviceName].replace(/{{([A-Za-z0-9_]+)}}/g, function () { const template = templates[serviceName].replace(/{{([A-Za-z0-9_]+)}}/g, function () {
if (data[arguments[1]] === undefined) { if (data[arguments[1]] === undefined) {
throw new Error('缺少模板所需变量') throw new Error('缺少模板所需变量')
} }
return data[arguments[1]] return data[arguments[1]]
}) })
let params = yaml.load(template) const params = yaml.load(template)
await ctx.client.service_create(params) await ctx.client.service_create(params)
ctx.body = ctx.ok('创建成功') ctx.body = ctx.ok('创建成功')
}) })
router.post('/delete', async ctx => { router.post('/delete', async (ctx) => {
let { serviceName, namespace } = ctx.request.body const { serviceName, namespace } = ctx.request.body
await ctx.client.service_delete(serviceName, namespace) await ctx.client.service_delete(serviceName, namespace)
ctx.body = ctx.ok('删除成功') ctx.body = ctx.ok('删除成功')
}) })
const Koa = require('koa') const Koa = require('koa')
const Router = require('koa-router') const Router = require('koa-router')
const bodyParser = require('koa-bodyparser') const bodyParser = require('koa-bodyparser')
const log4js = require('koa-log4')
const logConf = require('../config/logger')
const error = require('../middleware/error') const error = require('../middleware/error')
const result = require('../middleware/result') const result = require('../middleware/result')
...@@ -14,6 +16,10 @@ const tag = require('./tag') ...@@ -14,6 +16,10 @@ const tag = require('./tag')
const commonServiceRoute = require('./commonService') const commonServiceRoute = require('./commonService')
const ingressRoute = require('./ingress') const ingressRoute = require('./ingress')
const logFormat = ':req[x-real-ip] :req[x-forwarded-for] - -'
+ ' ":method :url HTTP/:http-version"'
+ ' :status :content-length ":referrer"'
+ ' ":user-agent" :req[x-auth-token] :response-timems'
// const client = require('../services/tke.service').create({ // const client = require('../services/tke.service').create({
// secretId: 'AKID4rY7wwNphsUcaFsy1pRtKhQvDj4CA3Ac', // secretId: 'AKID4rY7wwNphsUcaFsy1pRtKhQvDj4CA3Ac',
// secretKey: 'YBduRnjgVRGzmagZJbss3Vo58wWCyhgc', // secretKey: 'YBduRnjgVRGzmagZJbss3Vo58wWCyhgc',
...@@ -22,7 +28,10 @@ const ingressRoute = require('./ingress') ...@@ -22,7 +28,10 @@ const ingressRoute = require('./ingress')
// }) // })
const cluster = require('../services/tke.clusterService').create() const cluster = require('../services/tke.clusterService').create()
const container = require('../services/tke.containerService').create() const container = require('../services/tke.containerService').create()
function loadRoutes (router) {
const logger = log4js.getLogger()
log4js.configure(logConf.devlog)
function loadRoutes(router) {
router router
.use(error()) .use(error())
.use(result()) .use(result())
...@@ -32,14 +41,14 @@ function loadRoutes (router) { ...@@ -32,14 +41,14 @@ function loadRoutes (router) {
ctx.cluster = cluster ctx.cluster = cluster
await next() await next()
}, bodyParser()) }, bodyParser())
.use('/namespace', namespaceRoute.routes()) .use('/namespace', namespaceRoute.routes())
.use('/service', serviceRoute.routes()) .use('/service', serviceRoute.routes())
// .use('/rabbitmq', rabbitmqRoute.routes()) // .use('/rabbitmq', rabbitmqRoute.routes())
// .use('/zookeeper', zookeeperRoute.routes()) // .use('/zookeeper', zookeeperRoute.routes())
.use('/commonService', commonServiceRoute.routes()) .use('/commonService', commonServiceRoute.routes())
.use('/ingress', ingressRoute.routes()) .use('/ingress', ingressRoute.routes())
.use('/repository',repositoryRouter.routes()) .use('/repository', repositoryRouter.routes())
.use('/tag',tag.routes()) .use('/tag', tag.routes())
} }
exports.start = function () { exports.start = function () {
...@@ -49,8 +58,9 @@ exports.start = function () { ...@@ -49,8 +58,9 @@ exports.start = function () {
// 加载所有路由 // 加载所有路由
loadRoutes(router) loadRoutes(router)
app.use(log4js.koaLogger())
app.use(router.routes()) app.use(router.routes())
app.listen(4000) app.listen(4000)
console.log('app start', 4000) logger.info('server listening 4000')
logger.info('加载环境配置: ', process.env.NODE_ENV)
} }
...@@ -3,8 +3,8 @@ const Router = require('koa-router') ...@@ -3,8 +3,8 @@ const Router = require('koa-router')
const router = new Router(); const router = new Router();
module.exports = router module.exports = router
router.get('/', async ctx => { router.get('/', async (ctx) => {
let data = await ctx.client.ingress_get(ctx.query.namespace) const data = await ctx.client.ingress_get(ctx.query.namespace)
ctx.body = ctx.ok(data) ctx.body = ctx.ok(data)
}) })
...@@ -12,26 +12,28 @@ router.get('/', async ctx => { ...@@ -12,26 +12,28 @@ router.get('/', async ctx => {
namespace namespace
rules rules
*/ */
router.post('/modify', async ctx => { router.post('/modify', async (ctx) => {
let ingress = await ctx.client.ingress_get(ctx.request.body.namespace) const ingress = await ctx.client.ingress_get(ctx.request.body.namespace)
if (!ingress) { if (!ingress) {
return ctx.body = ctx.fail('namespace下没有ingress,请先创建') ctx.body = ctx.fail('namespace下没有ingress,请先创建')
return ctx.body
} }
console.log(1, ingress) console.log(1, ingress)
// let data = await ctx.client.ingress_modify() // let data = await ctx.client.ingress_modify()
ctx.body = ctx.ok(ingress) ctx.body = ctx.ok(ingress)
}) })
router.post('/create', async ctx => { router.post('/create', async (ctx) => {
let ingress = await ctx.client.ingress_get(ctx.request.body.namespace) const ingress = await ctx.client.ingress_get(ctx.request.body.namespace)
if (ingress) { if (ingress) {
return ctx.body = ctx.fail('namespace下已存在ingress') ctx.body = ctx.fail('namespace下已存在ingress')
return ctx.body
} }
await ctx.client.ingress_create(ctx.request.body.namespace) await ctx.client.ingress_create(ctx.request.body.namespace)
ctx.body = ctx.ok() ctx.body = ctx.ok()
}) })
router.post('/delete', async ctx => { router.post('/delete', async (ctx) => {
await ctx.client.ingress_delete(ctx.request.body.ingressName, ctx.request.body.namespace) await ctx.client.ingress_delete(ctx.request.body.ingressName, ctx.request.body.namespace)
ctx.body = ctx.ok() ctx.body = ctx.ok()
}) })
const Router = require('koa-router') const Router = require('koa-router')
const { log } = require('../config/logger')
const router = new Router(); const router = new Router();
module.exports = router module.exports = router
router.get('/', async (ctx) => {
router.get('/', async ctx => { ctx.logger.info('hhello')
let data = await ctx.cluster.namespace_get() const data = await ctx.cluster.namespace_get()
ctx.body = ctx.ok(data) ctx.body = ctx.ok(data)
}) })
router.post('/create', async ctx => { router.post('/create', async (ctx) => {
await ctx.cluster.namespace_create(ctx.request.body.name) await ctx.cluster.namespace_create(ctx.request.body.name)
await ctx.cluster.ingress_create(ctx.request.body.name) await ctx.cluster.ingress_create(ctx.request.body.name)
ctx.body = ctx.ok() ctx.body = ctx.ok()
}) })
router.post('/delete', async ctx => { router.post('/delete', async (ctx) => {
await ctx.cluster.namespace_delete(ctx.request.body.name) await ctx.cluster.namespace_delete(ctx.request.body.name)
ctx.body = ctx.ok() ctx.body = ctx.ok()
}) })
...@@ -7,29 +7,29 @@ const IMAGES = ['rabbitmq:3.6-management'] ...@@ -7,29 +7,29 @@ const IMAGES = ['rabbitmq:3.6-management']
const router = new Router() const router = new Router()
module.exports = router module.exports = router
router.post('/create', async ctx => { router.post('/create', async (ctx) => {
// let svc = await ctx.client.service_get('rabbitmq', ctx.request.body.namespace) // let svc = await ctx.client.service_get('rabbitmq', ctx.request.body.namespace)
// if (svc) { // if (svc) {
// ctx.body = ctx.fail('服务已经存在') // ctx.body = ctx.fail('服务已经存在')
// return // return
// } // }
let data = { const data = {
namespace: ctx.request.body.namespace, namespace: ctx.request.body.namespace,
image: IMAGES[0] image: IMAGES[0],
} }
let template = templates['rabbitmq'].replace(/{{([A-Za-z0-9_]+)}}/g, function () { const template = templates.rabbitmq.replace(/{{([A-Za-z0-9_]+)}}/g, function () {
if (data[arguments[1]] === undefined) { if (data[arguments[1]] === undefined) {
throw new Error('缺少模板所需变量') throw new Error('缺少模板所需变量')
} }
return data[arguments[1]] return data[arguments[1]]
}) })
let params = yaml.load(template) const params = yaml.load(template)
await ctx.client.service_create(params) await ctx.client.service_create(params)
ctx.body = ctx.ok('创建成功') ctx.body = ctx.ok('创建成功')
}) })
router.post('/delete', async ctx => { router.post('/delete', async (ctx) => {
await ctx.client.service_delete('rabbitmq', ctx.request.body.namespace) await ctx.client.service_delete('rabbitmq', ctx.request.body.namespace)
ctx.body = ctx.ok('删除成功') ctx.body = ctx.ok('删除成功')
}) })
...@@ -2,7 +2,7 @@ const Router = require('koa-router') ...@@ -2,7 +2,7 @@ const Router = require('koa-router')
const router = new Router() const router = new Router()
module.exports = router module.exports = router
router.post('/', async ctx => { router.post('/', async (ctx) => {
let data = await ctx.container.repository_get(ctx.request.body.namespace) const data = await ctx.container.repository_get(ctx.request.body.namespace)
ctx.body = ctx.ok(data) ctx.body = ctx.ok(data)
}) })
const Router = require('koa-router') const Router = require('koa-router')
const yaml = require('js-yaml') const yaml = require('js-yaml')
const templates = require('../serviceTemplate') const templates = require('../serviceTemplate')
const TYPES = ['ui', 'java', 'node', 'python', 'go'] const TYPES = ['ui', 'java', 'node', 'python', 'go']
const router = new Router() const router = new Router()
module.exports = router module.exports = router
router.get('/', async ctx => { router.get('/', async (ctx) => {
let data = await ctx.cluster.service_list(ctx.query.namespace) const data = await ctx.cluster.service_list(ctx.query.namespace)
ctx.body = ctx.ok(data) ctx.body = ctx.ok(data)
}) })
router.post('/create', async ctx => { router.post('/create', async (ctx) => {
let {type, serviceName, namespace, image, system_name, lable} = ctx.request.body const {
if (!TYPES.includes(type)) { type, serviceName, namespace, image, system_name, lable,
return ctx.body = ctx.fail('不支持的服务类型') } = ctx.request.body
} if (!TYPES.includes(type)) {
let data = { ctx.body = ctx.fail('不支持的服务类型')
serviceName, return ctx.body
namespace, }
image, const data = {
system_name, serviceName,
lable namespace,
} image,
if (!system_name) { system_name,
// ui abTest的时候不一样 lable,
data.system_name = serviceName }
if (!system_name) {
// ui abTest的时候不一样
data.system_name = serviceName
}
const template = templates[type].replace(/{{([A-Za-z0-9_]+)}}/g, function () {
if (data[arguments[1]] === undefined) {
throw new Error('缺少模板所需变量')
} }
let template = templates[type].replace(/{{([A-Za-z0-9_]+)}}/g, function () { return data[arguments[1]]
if (data[arguments[1]] === undefined) { })
throw new Error('缺少模板所需变量') const params = yaml.load(template)
} await ctx.cluster.service_create(params, type)
return data[arguments[1]] ctx.body = ctx.ok('创建成功')
})
let params = yaml.load(template)
await ctx.cluster.service_create(params, type)
ctx.body = ctx.ok('创建成功')
}) })
router.post('/details', async ctx => { router.post('/details', async (ctx) => {
let data = await ctx.cluster.service_get(ctx.request.body.serviceName, ctx.request.body.namespace) const data = await ctx.cluster.service_get(ctx.request.body.serviceName, ctx.request.body.namespace)
ctx.body = ctx.ok(data) ctx.body = ctx.ok(data)
}) })
router.post('/delete', async ctx => { router.post('/delete', async (ctx) => {
await ctx.cluster.service_delete(ctx.request.body.serviceName, ctx.request.body.namespace) await ctx.cluster.service_delete(ctx.request.body.serviceName, ctx.request.body.namespace)
ctx.body = ctx.ok('删除成功') ctx.body = ctx.ok('删除成功')
}) })
router.post('/modifyImage', async ctx => { router.post('/modifyImage', async (ctx) => {
await ctx.cluster.service_modifyImage(ctx.request.body.serviceName, ctx.request.body.image, ctx.request.body.namespace) await ctx.cluster.service_modifyImage(ctx.request.body.serviceName, ctx.request.body.image, ctx.request.body.namespace)
ctx.body = ctx.ok('更新成功') ctx.body = ctx.ok('更新成功')
}) })
router.post('/instance', async ctx => { router.post('/instance', async (ctx) => {
let data = await ctx.cluster.instance_get(ctx.request.body.serviceName, ctx.request.body.namespace) const data = await ctx.cluster.instance_get(ctx.request.body.serviceName, ctx.request.body.namespace)
ctx.body = ctx.ok(data) ctx.body = ctx.ok(data)
}) })
router.post('/redeploy', async ctx => { router.post('/redeploy', async (ctx) => {
await ctx.cluster.service_redeployment(ctx.request.body.serviceName, ctx.request.body.namespace) await ctx.cluster.service_redeployment(ctx.request.body.serviceName, ctx.request.body.namespace)
ctx.body = ctx.ok('服务重部署成功') ctx.body = ctx.ok('服务重部署成功')
}) })
...@@ -2,7 +2,7 @@ const Router = require('koa-router') ...@@ -2,7 +2,7 @@ const Router = require('koa-router')
const router = new Router() const router = new Router()
module.exports = router module.exports = router
router.post('/', async ctx => { router.post('/', async (ctx) => {
let data = await ctx.container.tag_get(ctx.request.body.reponame) const data = await ctx.container.tag_get(ctx.request.body.reponame)
ctx.body = ctx.ok(data) ctx.body = ctx.ok(data)
}) })
...@@ -7,23 +7,23 @@ const IMAGES = ['zookeeper:3.4.10'] ...@@ -7,23 +7,23 @@ const IMAGES = ['zookeeper:3.4.10']
const router = new Router() const router = new Router()
module.exports = router module.exports = router
router.post('/create', async ctx => { router.post('/create', async (ctx) => {
let data = { const data = {
namespace: ctx.request.body.namespace, namespace: ctx.request.body.namespace,
image: IMAGES[0] image: IMAGES[0],
} }
let template = templates['zookeeper'].replace(/{{([A-Za-z0-9_]+)}}/g, function () { const template = templates.zookeeper.replace(/{{([A-Za-z0-9_]+)}}/g, function () {
if (data[arguments[1]] === undefined) { if (data[arguments[1]] === undefined) {
throw new Error('缺少模板所需变量') throw new Error('缺少模板所需变量')
} }
return data[arguments[1]] return data[arguments[1]]
}) })
let params = yaml.load(template) const params = yaml.load(template)
await ctx.client.service_create(params) await ctx.client.service_create(params)
ctx.body = ctx.ok('创建成功') ctx.body = ctx.ok('创建成功')
}) })
router.post('/delete', async ctx => { router.post('/delete', async (ctx) => {
await ctx.client.service_delete('zookeeper', ctx.request.body.namespace) await ctx.client.service_delete('zookeeper', ctx.request.body.namespace)
ctx.body = ctx.ok('删除成功') ctx.body = ctx.ok('删除成功')
}) })
const app = require('../app') const app = require('../app')
app.start()
\ No newline at end of file app.start()
module.exports={ module.exports = {
secretId: 'AKID4rY7wwNphsUcaFsy1pRtKhQvDj4CA3Ac', secretId: 'AKID4rY7wwNphsUcaFsy1pRtKhQvDj4CA3Ac',
secretKey: 'YBduRnjgVRGzmagZJbss3Vo58wWCyhgc', secretKey: 'YBduRnjgVRGzmagZJbss3Vo58wWCyhgc',
clusterId: 'cls-acfx4pvj', clusterId: 'cls-acfx4pvj',
region: 'ap-beijing', region: 'ap-beijing',
method :'POST', method: 'POST',
protocal : 'https://', protocal: 'https://',
clusterPoint : 'ccs.api.qcloud.com', //访问集群以及服务的域名 clusterPoint: 'ccs.api.qcloud.com', // 访问集群以及服务的域名
containerPoint : 'ccr.api.qcloud.com', //访问镜像仓库的域名 containerPoint: 'ccr.api.qcloud.com', // 访问镜像仓库的域名
path : '/v2/index.php', path: '/v2/index.php',
domain : ".lkbang.com", domain: '.lkbang.com',
} }
// const path = require('path')
//
// const logDir = path.resolve(process.cwd(), './logs')
//
// const log4js = require('koa-log4')
// log4js.configure({
// replaceConsole: true,
// appenders: {
// stdout: {//控制台输出
// type: 'stdout'
// },
// req: {//请求日志
// type: 'dateFile',
// filename: 'logs/reqlog/',
// pattern: 'yyyy-MM-dd.log',
// alwaysIncludePattern: true
// },
// error: {//错误日志
// type: 'dateFile',
// filename: 'logs/errorlog/',
// pattern: 'yyyy-MM-dd.log',
// alwaysIncludePattern: true
// },
// tkeEos: {// 文件日志
// type: 'dateFile',
// filename: 'logs/tkeEoslog/',
// pattern: 'yyyy-MM-dd.log',
// alwaysIncludePattern: true
// }
// },
// categories: {
// default: {appenders: ['stdout', 'req'], level: 'info'},//appenders:采用的appender,取appenders项,level:设置级别
// error: {appenders: ['stdout', 'error'], level: 'error'},
// tkeEos: {appenders: ['stdout', 'tkeEos'], level: 'info'}
// }
// })
// const errorLog = log4js.getLogger('error')
// const tkeLog = log4js.getLogger('tkeEos')
// const log = log4js.getLogger()
// // module.exports = {
// // errorLog,
// // tkeLog,
// // log
// // }
// module.exports =function(){
// return async function (ctx,next) {
// ctx.logger=log4js.getLogger('error')
// return next()
// }
// }
const path = require('path')
const logDir = path.resolve(process.cwd(), './logs')
module.exports = {
devlog: {
appenders: {
out: {type: 'stdout'},
app: {
type: 'dateFile', filename: `${logDir}/tke-eos.log`, daysToKeep: 3, compress: true,
},
error: {
type: 'dateFile', filename: `${logDir}/tke-eos.error.log`, daysToKeep: 3, compress: true,
},
timing: {
type: 'dateFile', filename: `${logDir}/tke-eos.timing.log`, daysToKeep: 3, compress: true,
},
just_errors: {type: 'logLevelFilter', appender: 'error', level: 'error'},
},
categories: {
default: {appenders: ['out', 'app', 'just_errors'], level: 'info'},
error: {appenders: ['stdout', 'error'], level: 'error'},
timing: {appenders: ['out', 'timing'], level: 'info'}
}
}
}
moduele.exports = {} // moduele.exports = {}
\ No newline at end of file
*
!.gitignore
\ No newline at end of file
'use strict'
// const logger = require('koa-log4').getLogger('middleware:error') const logger = require('log4js').getLogger('error')
module.exports = function () { module.exports = function () {
return async function (ctx, next) { return async function (ctx, next) {
...@@ -14,13 +14,13 @@ module.exports = function () { ...@@ -14,13 +14,13 @@ module.exports = function () {
msg = e.message msg = e.message
} }
console.error(ctx.path) logger.error(ctx.path)
console.error(e) logger.error(e)
ctx.respond = true ctx.respond = true
ctx.status = 200 ctx.status = 200
ctx.body = { ctx.body = {
code: '0001', code: '0001',
msg: msg msg,
} }
} }
} }
......
'use strict'
/** /**
*/ */
...@@ -7,5 +7,5 @@ module.exports = { ...@@ -7,5 +7,5 @@ module.exports = {
// 通用参数错误 // 通用参数错误
ERROR_INPUT: { msg: '输入参数不正确', code: '0001' }, ERROR_INPUT: { msg: '输入参数不正确', code: '0001' },
// 自定义参数错误 // 自定义参数错误
ERROR_GITPATH: { msg: 'git_path格式不正确', code: '0001' } ERROR_GITPATH: { msg: 'git_path格式不正确', code: '0001' },
} }
'use strict'
const Code = require('./code') const Code = require('./code')
...@@ -9,7 +9,7 @@ module.exports = function () { ...@@ -9,7 +9,7 @@ module.exports = function () {
ctx.ok = function (data = {}) { ctx.ok = function (data = {}) {
return { return {
code: '0000', code: '0000',
data: data data,
} }
} }
...@@ -22,7 +22,7 @@ module.exports = function () { ...@@ -22,7 +22,7 @@ module.exports = function () {
return { return {
code: code || '0001', code: code || '0001',
msg: msg || '请求失败,请稍候重试' msg: msg || '请求失败,请稍候重试',
} }
} }
......
This diff is collapsed.
...@@ -7,17 +7,28 @@ ...@@ -7,17 +7,28 @@
"js-yaml": "^3.12.1", "js-yaml": "^3.12.1",
"koa": "^2.6.2", "koa": "^2.6.2",
"koa-bodyparser": "^4.2.1", "koa-bodyparser": "^4.2.1",
"koa-log4": "^2.3.2",
"koa-router": "^7.4.0", "koa-router": "^7.4.0",
"lodash": "^4.17.11", "lodash": "^4.17.11",
"log4js": "^4.0.2",
"request": "^2.88.0" "request": "^2.88.0"
}, },
"devDependencies": { "devDependencies": {
"eslint": "^5.15.3",
"eslint-config-airbnb-base": "^13.1.0",
"eslint-plugin-import": "^2.16.0",
"nodemon": "^1.18.9" "nodemon": "^1.18.9"
}, },
"scripts": { "scripts": {
"test": "echo \"Error: no test specified\" && exit 1", "test": "echo \"Error: no test specified\" && exit 1",
"start": "NODE_DEBUG=request nodemon" "start": "NODE_DEBUG=request NODE_ENV=env nodemon",
"lint": "eslint .",
"fix": "eslint --fix ."
}, },
"pre-commit": [
"fix",
"lint"
],
"repository": { "repository": {
"type": "git", "type": "git",
"url": "git@git.quantgroup.cn:QA/tke-eos.git" "url": "git@git.quantgroup.cn:QA/tke-eos.git"
......
const fs = require('fs') const fs = require('fs')
const ui = fs.readFileSync('serviceTemplate/ui.template.txt', 'utf8') const ui = fs.readFileSync('serviceTemplate/ui.template.txt', 'utf8')
const java = fs.readFileSync('serviceTemplate/java.template.txt', 'utf8') const java = fs.readFileSync('serviceTemplate/java.template.txt', 'utf8')
const node = fs.readFileSync('serviceTemplate/node.template.txt', 'utf8') const node = fs.readFileSync('serviceTemplate/node.template.txt', 'utf8')
...@@ -12,5 +13,5 @@ module.exports = { ...@@ -12,5 +13,5 @@ module.exports = {
java, java,
rabbitmq, rabbitmq,
zookeeper, zookeeper,
mysql mysql,
} }
...@@ -2,85 +2,91 @@ const Client = require('./tke.service') ...@@ -2,85 +2,91 @@ const Client = require('./tke.service')
const domainConfig = require('../config') const domainConfig = require('../config')
class Cluster extends Client { class Cluster extends Client {
constructor() { constructor() {
super(); super();
this.endpoint = domainConfig.clusterPoint this.endpoint = domainConfig.clusterPoint
} }
namespace_get() { namespace_get() {
return this.post('DescribeClusterNameSpaces', {clusterId: this.clusterId}) return this.post('DescribeClusterNameSpaces', { clusterId: this.clusterId })
} }
namespace_create(name) { namespace_create(name) {
return this.post('CreateClusterNamespace', {name, description: '', clusterId: this.clusterId}) return this.post('CreateClusterNamespace', { name, description: '', clusterId: this.clusterId })
} }
namespace_delete(name) { namespace_delete(name) {
return this.post('DeleteClusterNamespace', {"names.0": name, clusterId: this.clusterId}) return this.post('DeleteClusterNamespace', { 'names.0': name, clusterId: this.clusterId })
} }
service_list(namespace) { service_list(namespace) {
return this.post('DescribeClusterService', {namespace, clusterId: this.clusterId, allnamespace: 0}) return this.post('DescribeClusterService', { namespace, clusterId: this.clusterId, allnamespace: 0 })
} }
service_get(serviceName, namespace) { service_get(serviceName, namespace) {
return this.post('DescribeClusterServiceInfo', {serviceName, namespace, clusterId: this.clusterId}) return this.post('DescribeClusterServiceInfo', { serviceName, namespace, clusterId: this.clusterId })
} }
async service_create(params, type) { async service_create(params, type) {
params.clusterId = this.clusterId params.clusterId = this.clusterId
let str = JSON.stringify(params) const str = JSON.stringify(params)
await this.post('CreateClusterService', params) await this.post('CreateClusterService', params)
// 腾讯云api暂只能通过修改服务来改成Recreate策略 // 腾讯云api暂只能通过修改服务来改成Recreate策略
let modifyParams = JSON.parse(str) const modifyParams = JSON.parse(str)
modifyParams.strategy = 'Recreate' modifyParams.strategy = 'Recreate'
await this.post('ModifyClusterService', modifyParams) await this.post('ModifyClusterService', modifyParams)
let updateLabels = { const updateLabels = {
clusterId: params.clusterId, clusterId: params.clusterId,
serviceName: params.serviceName, serviceName: params.serviceName,
namespace: params.namespace, namespace: params.namespace,
"labels.type": type 'labels.type': type,
}
return this.post('ModifyServiceLabels', updateLabels)
} }
service_delete(serviceName, namespace) { return this.post('ModifyServiceLabels', updateLabels)
return this.post('DeleteClusterService', {serviceName, namespace, clusterId: this.clusterId}) }
}
service_modifyImage(serviceName, image, namespace) { service_delete(serviceName, namespace) {
return this.post('ModifyClusterServiceImage', {serviceName, namespace, image, clusterId: this.clusterId}) return this.post('DeleteClusterService', { serviceName, namespace, clusterId: this.clusterId })
} }
service_redeployment(serviceName,namespace){
return this.post('RedeployClusterService', {serviceName, namespace, clusterId: this.clusterId})
}
instance_get(serviceName,namespace){
return this.post('DescribeServiceInstance', {serviceName, namespace, clusterId: this.clusterId})
}
ingress_get(namespace) {
return this.post('DescribeIngress', {namespace, clusterId: this.clusterId})
}
ingress_create(namespace) { service_modifyImage(serviceName, image, namespace) {
return this.post('CreateIngress', { return this.post('ModifyClusterServiceImage', {
ingressName: `qa-${namespace}`, serviceName, namespace, image, clusterId: this.clusterId,
ingressDesc: '', })
namespace, }
clusterId: this.clusterId
})
}
ingress_delete(ingressName, namespace) { service_redeployment(serviceName, namespace) {
return this.post('DeleteIngress', {ingressName, namespace, clusterId: this.clusterId}) return this.post('RedeployClusterService', { serviceName, namespace, clusterId: this.clusterId })
} }
ingress_modify(ingressName, namespace, rules) { instance_get(serviceName, namespace) {
return this.post('MosifyIngress', {ingressName, namespace, ...rules, clusterId: this.clusterId}) return this.post('DescribeServiceInstance', { serviceName, namespace, clusterId: this.clusterId })
} }
ingress_get(namespace) {
return this.post('DescribeIngress', { namespace, clusterId: this.clusterId })
}
ingress_create(namespace) {
return this.post('CreateIngress', {
ingressName: `qa-${namespace}`,
ingressDesc: '',
namespace,
clusterId: this.clusterId,
})
}
ingress_delete(ingressName, namespace) {
return this.post('DeleteIngress', { ingressName, namespace, clusterId: this.clusterId })
}
ingress_modify(ingressName, namespace, rules) {
return this.post('MosifyIngress', {
ingressName, namespace, ...rules, clusterId: this.clusterId,
})
}
} }
exports.create = function () { exports.create = function () {
return new Cluster() return new Cluster()
} }
...@@ -2,19 +2,20 @@ const Client = require('./tke.service') ...@@ -2,19 +2,20 @@ const Client = require('./tke.service')
const domainConfig = require('../config') const domainConfig = require('../config')
class Container extends Client { class Container extends Client {
constructor() { constructor() {
super(); super();
this.endpoint = domainConfig.containerPoint this.endpoint = domainConfig.containerPoint
} }
repository_get( namespace) { repository_get(namespace) {
return this.post('SearchUserRepository', {namespace}) return this.post('SearchUserRepository', { namespace })
} }
tag_get( reponame) {
return this.post('GetTagList', {reponame}) tag_get(reponame) {
} return this.post('GetTagList', { reponame })
}
} }
exports.create = function () { exports.create = function () {
return new Container() return new Container()
} }
...@@ -3,84 +3,82 @@ const crypto = require('crypto') ...@@ -3,84 +3,82 @@ const crypto = require('crypto')
const domainConfig = require('../config') const domainConfig = require('../config')
class Client { class Client {
constructor() { constructor() {
this.secretId = domainConfig.secretId this.secretId = domainConfig.secretId
this.secretKey = domainConfig.secretKey this.secretKey = domainConfig.secretKey
this.region = domainConfig.region this.region = domainConfig.region
this.clusterId = domainConfig.clusterId this.clusterId = domainConfig.clusterId
this.method = domainConfig.method this.method = domainConfig.method
this.protocal = domainConfig.protocal this.protocal = domainConfig.protocal
this.endpoint = '' this.endpoint = ''
this.path = domainConfig.path this.path = domainConfig.path
this.domain = domainConfig.domain this.domain = domainConfig.domain
// 禁止操作以下命名空间 // 禁止操作以下命名空间
this.defaultNamespaces = ['default', 'kube-system', 'kube-public'] this.defaultNamespaces = ['default', 'kube-system', 'kube-public']
} }
sign(params, signMethod) {
let str = ''
let keys = Object.keys(params)
keys.sort()
for (let key of keys) {
str += '&' + key + '=' + params[key]
}
str = str.slice(1)
let signStr = this.method + this.endpoint + this.path + '?' + str
let signMethodMap = { sign(params, signMethod) {
HmacSHA1: "sha1", let str = ''
HmacSHA256: "sha256" const keys = Object.keys(params)
} keys.sort()
let hmac = crypto.createHmac(signMethodMap[signMethod], this.secretKey) for (const key of keys) {
return hmac.update(Buffer.from(signStr, 'utf-8')).digest('base64') str += `&${key}=${params[key]}`
} }
str = str.slice(1)
const signStr = `${this.method + this.endpoint + this.path}?${str}`
// 公共参数 const signMethodMap = {
// Action: '', HmacSHA1: 'sha1',
// Region: '', HmacSHA256: 'sha256',
// Timestamp: null,
// Nonce: null,
// SecretId: '',
// Signature: ''
formatRequestData(action, params = {}) {
params.Action = action
params.Region = this.region
params.Timestamp = Math.round(Date.now() / 1000)
params.Nonce = Math.round(Math.random() * 65535)
params.SecretId = this.secretId
params.SignatureMethod = params.SignatureMethod || 'HmacSHA256'
params.Signature = this.sign(params, params.SignatureMethod)
} }
const hmac = crypto.createHmac(signMethodMap[signMethod], this.secretKey)
return hmac.update(Buffer.from(signStr, 'utf-8')).digest('base64')
}
post(action, params = {}) { // 公共参数
if (params.namespace && this.defaultNamespaces.includes(params.namespace)) { // Action: '',
return Promise.reject(new Error('未授权的namespace')) // Region: '',
} // Timestamp: null,
// Nonce: null,
// SecretId: '',
// Signature: ''
formatRequestData(action, params = {}) {
params.Action = action
params.Region = this.region
params.Timestamp = Math.round(Date.now() / 1000)
params.Nonce = Math.round(Math.random() * 65535)
params.SecretId = this.secretId
params.SignatureMethod = params.SignatureMethod || 'HmacSHA256'
params.Signature = this.sign(params, params.SignatureMethod)
}
this.formatRequestData(action, params) post(action, params = {}) {
let url = this.protocal + this.endpoint + this.path if (params.namespace && this.defaultNamespaces.includes(params.namespace)) {
let self = this return Promise.reject(new Error('未授权的namespace'))
return new Promise(function (resolve, reject) {
request({
method: self.method,
url,
json: true,
form: params
}, function (err, res, body) {
if (err) {
console.error(err)
reject(err)
} else {
if (body.code === 0) {
resolve(body.data)
} else {
reject(body)
}
}
})
})
} }
this.formatRequestData(action, params)
const url = this.protocal + this.endpoint + this.path
const self = this
return new Promise(((resolve, reject) => {
request({
method: self.method,
url,
json: true,
form: params,
}, (err, res, body) => {
if (err) {
// console.error(err)
reject(err)
} else if (body.code === 0) {
resolve(body.data)
} else {
reject(body)
}
})
}))
}
} }
module.exports = Client module.exports = Client
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment