Commit 9ed2f17c authored by 薛智杰's avatar 薛智杰

Merge branch 'kewei' into 'master'

Kewei



See merge request !4
parents a2f08518 862d71c1
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')
const IMAGES = {
zookeeper: 'zookeeper:3.4.10',
rabbitmq: 'rabbitmq:3.6-management',
mysql: 'mysql:5.7'
mysql: 'mysql:5.7',
}
const router = new Router()
module.exports = router
router.post('/create', async ctx => {
let { serviceName, namespace } = ctx.request.body
router.post('/create', async (ctx) => {
const { serviceName, namespace } = ctx.request.body
if (!Object.keys(IMAGES).includes(serviceName)) {
ctx.body = ctx.fail('不支持的服务类型')
return
}
let data = {
const data = {
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) {
throw new Error('缺少模板所需变量')
}
return data[arguments[1]]
})
let params = yaml.load(template)
const params = yaml.load(template)
await ctx.client.service_create(params)
ctx.body = ctx.ok('创建成功')
})
router.post('/delete', async ctx => {
let { serviceName, namespace } = ctx.request.body
router.post('/delete', async (ctx) => {
const { serviceName, namespace } = ctx.request.body
await ctx.client.service_delete(serviceName, namespace)
ctx.body = ctx.ok('删除成功')
})
const Koa = require('koa')
const Router = require('koa-router')
const bodyParser = require('koa-bodyparser')
const log4js = require('koa-log4')
const logConf = require('../config/logger')
const error = require('../middleware/error')
const result = require('../middleware/result')
......@@ -12,9 +14,13 @@ const tag = require('./tag')
const commonServiceRoute = require('./commonService')
const ingressRoute = require('./ingress')
const cluster = require('../services/tke.clusterService').create()
const container = require('../services/tke.containerService').create()
function loadRoutes (router) {
const logger = log4js.getLogger()
log4js.configure(logConf.devlog)
function loadRoutes(router) {
router
.use(error())
.use(result())
......@@ -24,12 +30,13 @@ function loadRoutes (router) {
ctx.cluster = cluster
await next()
}, bodyParser())
.use('/namespace', namespaceRoute.routes())
.use('/service', serviceRoute.routes())
.use('/commonService', commonServiceRoute.routes())
.use('/ingress', ingressRoute.routes())
.use('/repository',repositoryRouter.routes())
.use('/tag',tag.routes())
.use('/repository', repositoryRouter.routes())
.use('/tag', tag.routes())
}
exports.start = function () {
......@@ -39,8 +46,9 @@ exports.start = function () {
// 加载所有路由
loadRoutes(router)
app.use(log4js.koaLogger())
app.use(router.routes())
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')
const router = new Router();
module.exports = router
router.get('/', async ctx => {
let data = await ctx.client.ingress_get(ctx.query.namespace)
router.get('/', async (ctx) => {
const data = await ctx.client.ingress_get(ctx.query.namespace)
ctx.body = ctx.ok(data)
})
......@@ -12,26 +12,28 @@ router.get('/', async ctx => {
namespace
rules
*/
router.post('/modify', async ctx => {
let ingress = await ctx.client.ingress_get(ctx.request.body.namespace)
router.post('/modify', async (ctx) => {
const ingress = await ctx.client.ingress_get(ctx.request.body.namespace)
if (!ingress) {
return ctx.body = ctx.fail('namespace下没有ingress,请先创建')
ctx.body = ctx.fail('namespace下没有ingress,请先创建')
return ctx.body
}
console.log(1, ingress)
// let data = await ctx.client.ingress_modify()
ctx.body = ctx.ok(ingress)
})
router.post('/create', async ctx => {
let ingress = await ctx.client.ingress_get(ctx.request.body.namespace)
router.post('/create', async (ctx) => {
const ingress = await ctx.client.ingress_get(ctx.request.body.namespace)
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)
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)
ctx.body = ctx.ok()
})
const Router = require('koa-router')
const { log } = require('../config/logger')
const router = new Router();
module.exports = router
router.get('/', async ctx => {
let data = await ctx.cluster.namespace_get()
router.get('/', async (ctx) => {
ctx.logger.info('hhello')
const data = await ctx.cluster.namespace_get()
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.ingress_create(ctx.request.body.name)
ctx.body = ctx.ok()
})
router.post('/delete', async ctx => {
router.post('/delete', async (ctx) => {
await ctx.cluster.namespace_delete(ctx.request.body.name)
ctx.body = ctx.ok()
})
const Router = require('koa-router')
const yaml = require('js-yaml')
const templates = require('../serviceTemplate')
const IMAGES = ['rabbitmq:3.6-management']
const router = new Router()
module.exports = router
router.post('/create', async (ctx) => {
// let svc = await ctx.client.service_get('rabbitmq', ctx.request.body.namespace)
// if (svc) {
// ctx.body = ctx.fail('服务已经存在')
// return
// }
const data = {
namespace: ctx.request.body.namespace,
image: IMAGES[0],
}
const template = templates.rabbitmq.replace(/{{([A-Za-z0-9_]+)}}/g, function () {
if (data[arguments[1]] === undefined) {
throw new Error('缺少模板所需变量')
}
return data[arguments[1]]
})
const params = yaml.load(template)
await ctx.client.service_create(params)
ctx.body = ctx.ok('创建成功')
})
router.post('/delete', async (ctx) => {
await ctx.client.service_delete('rabbitmq', ctx.request.body.namespace)
ctx.body = ctx.ok('删除成功')
})
......@@ -2,7 +2,7 @@ const Router = require('koa-router')
const router = new Router()
module.exports = router
router.post('/', async ctx => {
let data = await ctx.container.repository_get(ctx.request.body.namespace)
router.post('/', async (ctx) => {
const data = await ctx.container.repository_get(ctx.request.body.namespace)
ctx.body = ctx.ok(data)
})
const Router = require('koa-router')
const yaml = require('js-yaml')
const templates = require('../serviceTemplate')
const TYPES = ['ui', 'java', 'node', 'python', 'go']
const router = new Router()
module.exports = router
router.get('/', async ctx => {
let data = await ctx.cluster.service_list(ctx.query.namespace)
router.get('/', async (ctx) => {
const data = await ctx.cluster.service_list(ctx.query.namespace)
ctx.body = ctx.ok(data)
})
router.post('/create', async ctx => {
let {type, serviceName, namespace, image, system_name, lable} = ctx.request.body
router.post('/create', async (ctx) => {
const {
type, serviceName, namespace, image, system_name, lable,
} = ctx.request.body
if (!TYPES.includes(type)) {
return ctx.body = ctx.fail('不支持的服务类型')
ctx.body = ctx.fail('不支持的服务类型')
return ctx.body
}
let data = {
const data = {
serviceName,
namespace,
image,
system_name,
lable
lable,
}
if (!system_name) {
// ui abTest的时候不一样
data.system_name = serviceName
}
let template = templates[type].replace(/{{([A-Za-z0-9_]+)}}/g, function () {
const template = templates[type].replace(/{{([A-Za-z0-9_]+)}}/g, function () {
if (data[arguments[1]] === undefined) {
throw new Error('缺少模板所需变量')
}
return data[arguments[1]]
})
let params = yaml.load(template)
const params = yaml.load(template)
await ctx.cluster.service_create(params, type)
ctx.body = ctx.ok('创建成功')
})
router.post('/details', async ctx => {
let data = await ctx.cluster.service_get(ctx.request.body.serviceName, ctx.request.body.namespace)
router.post('/details', async (ctx) => {
const data = await ctx.cluster.service_get(ctx.request.body.serviceName, ctx.request.body.namespace)
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)
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)
ctx.body = ctx.ok('更新成功')
})
router.post('/instance', async ctx => {
let data = await ctx.cluster.instance_get(ctx.request.body.serviceName, ctx.request.body.namespace)
router.post('/instance', async (ctx) => {
const data = await ctx.cluster.instance_get(ctx.request.body.serviceName, ctx.request.body.namespace)
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)
ctx.body = ctx.ok('服务重部署成功')
})
......@@ -2,7 +2,7 @@ const Router = require('koa-router')
const router = new Router()
module.exports = router
router.post('/', async ctx => {
let data = await ctx.container.tag_get(ctx.request.body.reponame)
router.post('/', async (ctx) => {
const data = await ctx.container.tag_get(ctx.request.body.reponame)
ctx.body = ctx.ok(data)
})
const Router = require('koa-router')
const yaml = require('js-yaml')
const templates = require('../serviceTemplate')
const IMAGES = ['zookeeper:3.4.10']
const router = new Router()
module.exports = router
router.post('/create', async (ctx) => {
const data = {
namespace: ctx.request.body.namespace,
image: IMAGES[0],
}
const template = templates.zookeeper.replace(/{{([A-Za-z0-9_]+)}}/g, function () {
if (data[arguments[1]] === undefined) {
throw new Error('缺少模板所需变量')
}
return data[arguments[1]]
})
const params = yaml.load(template)
await ctx.client.service_create(params)
ctx.body = ctx.ok('创建成功')
})
router.post('/delete', async (ctx) => {
await ctx.client.service_delete('zookeeper', ctx.request.body.namespace)
ctx.body = ctx.ok('删除成功')
})
const app = require('../app')
app.start()
module.exports={
module.exports = {
secretId: 'AKID4rY7wwNphsUcaFsy1pRtKhQvDj4CA3Ac',
secretKey: 'YBduRnjgVRGzmagZJbss3Vo58wWCyhgc',
clusterId: 'cls-acfx4pvj',
region: 'ap-beijing',
method :'POST',
protocal : 'https://',
clusterPoint : 'ccs.api.qcloud.com', //访问集群以及服务的域名
containerPoint : 'ccr.api.qcloud.com', //访问镜像仓库的域名
path : '/v2/index.php',
domain : ".lkbang.com",
method: 'POST',
protocal: 'https://',
clusterPoint: 'ccs.api.qcloud.com', // 访问集群以及服务的域名
containerPoint: 'ccr.api.qcloud.com', // 访问镜像仓库的域名
path: '/v2/index.php',
domain: '.lkbang.com',
}
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 = {}
\ No newline at end of file
// moduele.exports = {}
*
!.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 () {
return async function (ctx, next) {
......@@ -14,13 +14,13 @@ module.exports = function () {
msg = e.message
}
console.error(ctx.path)
console.error(e)
logger.error(ctx.path)
logger.error(e)
ctx.respond = true
ctx.status = 200
ctx.body = {
code: '0001',
msg: msg
msg,
}
}
}
......
'use strict'
/**
*/
......@@ -7,5 +7,5 @@ module.exports = {
// 通用参数错误
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')
......@@ -9,7 +9,7 @@ module.exports = function () {
ctx.ok = function (data = {}) {
return {
code: '0000',
data: data
data,
}
}
......@@ -22,7 +22,7 @@ module.exports = function () {
return {
code: code || '0001',
msg: msg || '请求失败,请稍候重试'
msg: msg || '请求失败,请稍候重试',
}
}
......
This diff is collapsed.
......@@ -7,17 +7,28 @@
"js-yaml": "^3.12.1",
"koa": "^2.6.2",
"koa-bodyparser": "^4.2.1",
"koa-log4": "^2.3.2",
"koa-router": "^7.4.0",
"lodash": "^4.17.11",
"log4js": "^4.0.2",
"request": "^2.88.0"
},
"devDependencies": {
"eslint": "^5.15.3",
"eslint-config-airbnb-base": "^13.1.0",
"eslint-plugin-import": "^2.16.0",
"nodemon": "^1.18.9"
},
"scripts": {
"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": {
"type": "git",
"url": "git@git.quantgroup.cn:QA/tke-eos.git"
......
const fs = require('fs')
const ui = fs.readFileSync('serviceTemplate/ui.template.txt', 'utf8')
const java = fs.readFileSync('serviceTemplate/java.template.txt', 'utf8')
const node = fs.readFileSync('serviceTemplate/node.template.txt', 'utf8')
......@@ -12,5 +13,5 @@ module.exports = {
java,
rabbitmq,
zookeeper,
mysql
mysql,
}
......@@ -8,58 +8,63 @@ class Cluster extends Client {
}
namespace_get() {
return this.post('DescribeClusterNameSpaces', {clusterId: this.clusterId})
return this.post('DescribeClusterNameSpaces', { clusterId: this.clusterId })
}
namespace_create(name) {
return this.post('CreateClusterNamespace', {name, description: '', clusterId: this.clusterId})
return this.post('CreateClusterNamespace', { name, description: '', clusterId: this.clusterId })
}
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) {
return this.post('DescribeClusterService', {namespace, clusterId: this.clusterId, allnamespace: 0})
return this.post('DescribeClusterService', { namespace, clusterId: this.clusterId, allnamespace: 0 })
}
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) {
params.clusterId = this.clusterId
let str = JSON.stringify(params)
const str = JSON.stringify(params)
await this.post('CreateClusterService', params)
// 腾讯云api暂只能通过修改服务来改成Recreate策略
let modifyParams = JSON.parse(str)
const modifyParams = JSON.parse(str)
modifyParams.strategy = 'Recreate'
await this.post('ModifyClusterService', modifyParams)
let updateLabels = {
const updateLabels = {
clusterId: params.clusterId,
serviceName: params.serviceName,
namespace: params.namespace,
"labels.type": type
'labels.type': type,
}
return this.post('ModifyServiceLabels', updateLabels)
}
service_delete(serviceName, namespace) {
return this.post('DeleteClusterService', {serviceName, namespace, clusterId: this.clusterId})
return this.post('DeleteClusterService', { serviceName, namespace, clusterId: this.clusterId })
}
service_modifyImage(serviceName, image, namespace) {
return this.post('ModifyClusterServiceImage', {serviceName, namespace, image, clusterId: this.clusterId})
return this.post('ModifyClusterServiceImage', {
serviceName, namespace, image, clusterId: this.clusterId,
})
}
service_redeployment(serviceName,namespace){
return this.post('RedeployClusterService', {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})
instance_get(serviceName, namespace) {
return this.post('DescribeServiceInstance', { serviceName, namespace, clusterId: this.clusterId })
}
ingress_get(namespace) {
return this.post('DescribeIngress', {namespace, clusterId: this.clusterId})
return this.post('DescribeIngress', { namespace, clusterId: this.clusterId })
}
ingress_create(namespace) {
......@@ -67,18 +72,19 @@ class Cluster extends Client {
ingressName: `qa-${namespace}`,
ingressDesc: '',
namespace,
clusterId: this.clusterId
clusterId: this.clusterId,
})
}
ingress_delete(ingressName, namespace) {
return this.post('DeleteIngress', {ingressName, namespace, clusterId: this.clusterId})
return this.post('DeleteIngress', { ingressName, namespace, clusterId: this.clusterId })
}
ingress_modify(ingressName, namespace, rules) {
return this.post('MosifyIngress', {ingressName, namespace, ...rules, clusterId: this.clusterId})
return this.post('MosifyIngress', {
ingressName, namespace, ...rules, clusterId: this.clusterId,
})
}
}
exports.create = function () {
......
......@@ -7,11 +7,12 @@ class Container extends Client {
this.endpoint = domainConfig.containerPoint
}
repository_get( namespace) {
return this.post('SearchUserRepository', {namespace})
repository_get(namespace) {
return this.post('SearchUserRepository', { namespace })
}
tag_get( reponame) {
return this.post('GetTagList', {reponame})
tag_get(reponame) {
return this.post('GetTagList', { reponame })
}
}
......
......@@ -20,19 +20,19 @@ class Client {
sign(params, signMethod) {
let str = ''
let keys = Object.keys(params)
const keys = Object.keys(params)
keys.sort()
for (let key of keys) {
str += '&' + key + '=' + params[key]
for (const key of keys) {
str += `&${key}=${params[key]}`
}
str = str.slice(1)
let signStr = this.method + this.endpoint + this.path + '?' + str
const signStr = `${this.method + this.endpoint + this.path}?${str}`
let signMethodMap = {
HmacSHA1: "sha1",
HmacSHA256: "sha256"
const signMethodMap = {
HmacSHA1: 'sha1',
HmacSHA256: 'sha256',
}
let hmac = crypto.createHmac(signMethodMap[signMethod], this.secretKey)
const hmac = crypto.createHmac(signMethodMap[signMethod], this.secretKey)
return hmac.update(Buffer.from(signStr, 'utf-8')).digest('base64')
}
......@@ -59,27 +59,25 @@ class Client {
}
this.formatRequestData(action, params)
let url = this.protocal + this.endpoint + this.path
let self = this
return new Promise(function (resolve, reject) {
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
}, function (err, res, body) {
form: params,
}, (err, res, body) => {
if (err) {
console.error(err)
// console.error(err)
reject(err)
} else {
if (body.code === 0) {
} else if (body.code === 0) {
resolve(body.data)
} else {
reject(body)
}
}
})
})
}))
}
}
......
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