From a29c3bf2dc082f8964b314b869b5bf85fa587c6d Mon Sep 17 00:00:00 2001 From: alexandershpak Date: Wed, 27 Feb 2019 16:06:43 +0300 Subject: [PATCH] feat(core): scheduler access token ENG-718 --- src/config/constants.js | 1 + .../scheduler-access-token-manager.js | 25 ++++++++++ ...227154512-create-scheduler-access-token.js | 31 ++++++++++++ src/sequelize/models/scheduleraccesstoken.js | 34 +++++++++++++ src/services/kubelet-service.js | 9 +++- .../scheduler-access-token-service.js | 48 +++++++++++++++++++ 6 files changed, 147 insertions(+), 1 deletion(-) create mode 100644 src/sequelize/managers/scheduler-access-token-manager.js create mode 100644 src/sequelize/migrations/20190227154512-create-scheduler-access-token.js create mode 100644 src/sequelize/models/scheduleraccesstoken.js create mode 100644 src/services/scheduler-access-token-service.js diff --git a/src/config/constants.js b/src/config/constants.js index 97933a49a..9aaa097f1 100644 --- a/src/config/constants.js +++ b/src/config/constants.js @@ -27,6 +27,7 @@ module.exports = { 'Settings:UserTokenExpirationIntervalSeconds': 3600, 'Settings:FogTokenExpirationIntervalSeconds': 3600, 'Settings:KubeletTokenExpirationIntervalSeconds': 3600, + 'Settings:SchedulerTokenExpirationIntervalSeconds': 3600, 'Settings:FogStatusUpdateIntervalSeconds': 120, 'Settings:FogStatusFrequencySeconds': 60, diff --git a/src/sequelize/managers/scheduler-access-token-manager.js b/src/sequelize/managers/scheduler-access-token-manager.js new file mode 100644 index 000000000..b4d670314 --- /dev/null +++ b/src/sequelize/managers/scheduler-access-token-manager.js @@ -0,0 +1,25 @@ +/* + * ******************************************************************************* + * * Copyright (c) 2019 Edgeworx, Inc. + * * + * * This program and the accompanying materials are made available under the + * * terms of the Eclipse Public License v. 2.0 which is available at + * * http://www.eclipse.org/legal/epl-2.0 + * * + * * SPDX-License-Identifier: EPL-2.0 + * ******************************************************************************* + * + */ + +const BaseManager = require('./base-manager') +const models = require('./../models') +const SchedulerAccessToken = models.SchedulerAccessToken + +class SchedulerAccessTokenManager extends BaseManager { + getEntity() { + return SchedulerAccessToken + } +} + +const instance = new SchedulerAccessTokenManager() +module.exports = instance diff --git a/src/sequelize/migrations/20190227154512-create-scheduler-access-token.js b/src/sequelize/migrations/20190227154512-create-scheduler-access-token.js new file mode 100644 index 000000000..d933a3a77 --- /dev/null +++ b/src/sequelize/migrations/20190227154512-create-scheduler-access-token.js @@ -0,0 +1,31 @@ +'use strict' +module.exports = { + up: (queryInterface, Sequelize) => { + return queryInterface.createTable('SchedulerAccessTokens', { + id: { + type: Sequelize.INTEGER, + primaryKey: true, + autoIncrement: true, + allowNull: false, + field: 'id', + }, + expirationTime: { + type: Sequelize.BIGINT, + field: 'expiration_time', + }, + token: { + type: Sequelize.TEXT, + field: 'token', + }, + userId: { + type: Sequelize.INTEGER, + field: 'user_id', + references: {model: 'Users', key: 'id'}, + onDelete: 'cascade', + }, + }) + }, + down: (queryInterface, Sequelize) => { + return queryInterface.dropTable('SchedulerAccessTokens') + }, +} diff --git a/src/sequelize/models/scheduleraccesstoken.js b/src/sequelize/models/scheduleraccesstoken.js new file mode 100644 index 000000000..314534272 --- /dev/null +++ b/src/sequelize/models/scheduleraccesstoken.js @@ -0,0 +1,34 @@ +'use strict' +module.exports = (sequelize, DataTypes) => { + const SchedulerAccessToken = sequelize.define('SchedulerAccessToken', { + id: { + type: DataTypes.INTEGER, + primaryKey: true, + autoIncrement: true, + allowNull: false, + field: 'id', + }, + expirationTime: { + type: DataTypes.BIGINT, + field: 'expiration_time', + }, + token: { + type: DataTypes.TEXT, + field: 'token', + }, + }, { + timestamps: false, + underscored: true, + }) + SchedulerAccessToken.associate = function(models) { + SchedulerAccessToken.belongsTo(models.User, { + foreignKey: { + name: 'userId', + field: 'user_id', + }, + as: 'user', + onDelete: 'cascade', + }) + } + return SchedulerAccessToken +} diff --git a/src/services/kubelet-service.js b/src/services/kubelet-service.js index 8c2623754..56ba08aa4 100644 --- a/src/services/kubelet-service.js +++ b/src/services/kubelet-service.js @@ -12,6 +12,7 @@ */ const KubeletAccessTokenService = require('./kubelet-access-token-service') +const SchedulerAccessTokenService = require('./scheduler-access-token-service') const TransactionDecorator = require('../decorators/transaction-decorator') const kubeletCreatePod = async function(createPodData, fogNodeUuid, transaction) { @@ -54,7 +55,13 @@ const kubeletGetVkToken = async function(userId, transaction) { } } const kubeletGetSchedulerToken = async function(transaction) { - // TODO: to implement + const newAccessToken = await SchedulerAccessTokenService.generateAccessToken(transaction) + await SchedulerAccessTokenService.updateAccessToken(userId, newAccessToken, transaction) + + return { + userId: userId, + token: newAccessToken.token, + } } module.exports = { diff --git a/src/services/scheduler-access-token-service.js b/src/services/scheduler-access-token-service.js new file mode 100644 index 000000000..1360ef87a --- /dev/null +++ b/src/services/scheduler-access-token-service.js @@ -0,0 +1,48 @@ +/* + * ******************************************************************************* + * * Copyright (c) 2019 Edgeworx, Inc. + * * + * * This program and the accompanying materials are made available under the + * * terms of the Eclipse Public License v. 2.0 which is available at + * * http://www.eclipse.org/legal/epl-2.0 + * * + * * SPDX-License-Identifier: EPL-2.0 + * ******************************************************************************* + * + */ + +const AppHelper = require('../helpers/app-helper') +const SchedulerAccessTokenManager = require('../sequelize/managers/scheduler-access-token-manager') + +const Config = require('../config') + +const generateAccessToken = async function(transaction) { + while (true) { + const newAccessToken = AppHelper.generateAccessToken() + const exists = await SchedulerAccessTokenManager.findOne({ + token: newAccessToken, + }, transaction) + if (!exists) { + const accessTokenExpiryTime = Date.now() + Config.get('Settings:SchedulerTokenExpirationIntervalSeconds') * 99999 + return { + token: newAccessToken, + expirationTime: accessTokenExpiryTime, + } + } + } +} + +async function updateAccessToken(userId, newAccessToken, transaction) { + return SchedulerAccessTokenManager.updateOrCreate({ + userId: userId, + }, { + userId: userId, + token: newAccessToken.token, + expirationTime: newAccessToken.expirationTime, + }, transaction) +} + +module.exports = { + generateAccessToken, + updateAccessToken, +}