From 17a918029d4d76263602588f8ead2acdd1baf008 Mon Sep 17 00:00:00 2001 From: alexandershpak Date: Thu, 21 Feb 2019 18:14:48 +0300 Subject: [PATCH 01/11] feat(core): add k8s endpoints --- src/controllers/kublet-controller.js | 107 +++++++++ src/routes/kubelet.js | 337 +++++++++++++++++++++++++++ src/services/kubelet-service.js | 64 +++++ 3 files changed, 508 insertions(+) create mode 100644 src/controllers/kublet-controller.js create mode 100644 src/routes/kubelet.js create mode 100644 src/services/kubelet-service.js diff --git a/src/controllers/kublet-controller.js b/src/controllers/kublet-controller.js new file mode 100644 index 000000000..cf6c7118a --- /dev/null +++ b/src/controllers/kublet-controller.js @@ -0,0 +1,107 @@ +/* + * ******************************************************************************* + * * 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 KubeletService = require('../services/kubelet-service') + +const kubeletCreatePodEndPoint = async function (req) { + const createPodData = req.body + const fogNodeUuid = req.params.nodeName + + return await KubeletService.kubeletCreatePod(createPodData, fogNodeUuid) +} + +const kubeletUploadPodEndPoint = async function (req) { + const uploadPodData = req.body + const fogNodeUuid = req.params.nodeName + + return await KubeletService.kubeletUploadPod(uploadPodData, fogNodeUuid) +} + +const kubeletDeletePodEndPoint = async function (req) { + const fogNodeUuid = req.params.nodeName + + return await KubeletService.kubeletDeletePod(fogNodeUuid); +} + +const kubeletGetPodEndPoint = async function (req) { + const namespace = req.params.namespace + const name = req.params.name + const fogNodeUuid = req.params.nodeName + + return await KubeletService.kubeletGetPod(namespace, name, fogNodeUuid) +} + +const kubeletGetContainerLogsEndPoint = async function (req) { + const namespace = req.params.namespace + const podName = req.params.podName + const containerName = req.params.containerName + const tail = req.params.tail + const fogNodeUuid = req.params.nodeName + + return await KubeletService.kubeletGetContainerLogs(namespace, podName, containerName, tail, fogNodeUuid) +} + +const kubeletGetPodStatusEndPoint = async function (req) { + const namespace = req.params.namespace + const name = req.params.name + const fogNodeUuid = req.params.nodeName + + return await KubeletService.kubeletGetPodStatus(namespace, name, fogNodeUuid) +} + +const kubeletGetPodsEndPoint = async function (req) { + const fogNodeUuid = req.params.nodeName + + return await KubeletService.kubeletGetPods(createPodData, fogNodeUuid) +} + +const kubeletGetCapacityEndPoint = async function (req) { + const fogNodeUuid = req.params.nodeName + + return await KubeletService.kubeletGetCapacity(createPodData, fogNodeUuid) +} + +const kubeletGetNodeConditionsEndPoint = async function (req) { + const fogNodeUuid = req.params.nodeName + + return await KubeletService.kubeletGetNodeConditions(createPodData, fogNodeUuid) +} + +const kubeletGetNodeAddressesEndPoint = async function (req) { + const fogNodeUuid = req.params.nodeName + + return await KubeletService.kubeletGetNodeAddresses(createPodData, fogNodeUuid) +} + +const kubeletGetVkTokenEndPoint = async function () { + return await KubeletService.kubeletGetVkToken() +} + +const kubeletGetSchedulerTokenEndPoint = async function () { + return await KubeletService.kubeletGetSchedulerToken() +} + +module.exports = { + kubeletCreatePodEndPoint: kubeletCreatePodEndPoint, + kubeletUploadPodEndPoint: kubeletUploadPodEndPoint, + kubeletDeletePodEndPoint: kubeletDeletePodEndPoint, + kubeletGetPodEndPoint: kubeletGetPodEndPoint, + kubeletGetContainerLogsEndPoint: kubeletGetContainerLogsEndPoint, + kubeletGetPodStatusEndPoint: kubeletGetPodStatusEndPoint, + kubeletGetPodsEndPoint: kubeletGetPodsEndPoint, + kubeletGetCapacityEndPoint: kubeletGetCapacityEndPoint, + kubeletGetNodeConditionsEndPoint: kubeletGetNodeConditionsEndPoint, + kubeletGetNodeAddressesEndPoint: kubeletGetNodeAddressesEndPoint, + kubeletGetVkTokenEndPoint: kubeletGetVkTokenEndPoint, + kubeletGetSchedulerTokenEndPoint: kubeletGetSchedulerTokenEndPoint, +} \ No newline at end of file diff --git a/src/routes/kubelet.js b/src/routes/kubelet.js new file mode 100644 index 000000000..0bd23c92c --- /dev/null +++ b/src/routes/kubelet.js @@ -0,0 +1,337 @@ +/* + * ******************************************************************************* + * * 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 KubeletController = require('../controllers/kubelet-controller') +const ResponseDecorator = require('../decorators/response-decorator') +const constants = require('../helpers/constants') +const Errors = require('../helpers/errors') +const logger = require('../logger') + +module.exports = [ + { + method: 'post', + path: '/api/v3/k8s/createPod', + middleware: async (req, res) => { + logger.apiReq(req); + + const successCode = constants.HTTP_CODE_SUCCESS + const errorCodes = [ + { + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.ValidationError] + } + ] + + const kubeletCreatePodEndPoint = ResponseDecorator.handleErrors(KubeletController.kubeletCreatePodEndPoint, successCode, errorCodes) + const responseObject = await kubeletCreatePodEndPoint(req) + + res + .status(responseObject.code) + .send(responseObject.body); + + logger.apiRes({req: req, res: responseObject}) + } + }, + { + method: 'put', + path: '/api/v3/k8s/uploadPod', + middleware: async (req, res) => { + res + .status(constants.HTTP_CODE_SUCCESS) + .send(req.body) + + const successCode = constants.HTTP_CODE_SUCCESS + const errorCodes = [ + { + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.AuthenticationError] + } + ] + + const kubeletUploadPodEndPoint = ResponseDecorator.handleErrors(KubeletController.kubeletUploadPodEndPoint, successCode, errorCodes) + const responseObject = await kubeletUploadPodEndPoint(req) + + res + .status(responseObject.code) + .send(responseObject.body); + + logger.apiRes({req: req, res: responseObject}) + } + }, + { + method: 'delete', + path: '/api/v3/k8s/deletePod', + middleware: async (req, res) => { + res + .status(constants.HTTP_CODE_SUCCESS) + .send(req.body) + + const successCode = constants.HTTP_CODE_SUCCESS + const errorCodes = [ + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.AuthenticationError] + } + ] + + const kubeletDeletePodEndPoint = ResponseDecorator.handleErrors(KubeletController.kubeletDeletePodEndPoint, successCode, errorCodes) + const responseObject = await kubeletDeletePodEndPoint(req) + + res + .status(responseObject.code) + .send(responseObject.body); + + logger.apiRes({req: req, res: responseObject}) + } + }, + { + method: 'get', + path: '/api/v3/k8s/getPod', + middleware: async (req, res) => { + res + .status(constants.HTTP_CODE_SUCCESS) + .send(req.body) + + const successCode = constants.HTTP_CODE_SUCCESS + const errorCodes = [ + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.AuthenticationError] + } + ] + + const kubeletGetPodEndPoint = ResponseDecorator.handleErrors(KubeletController.kubeletGetPodEndPoint, successCode, errorCodes) + const responseObject = await kubeletGetPodEndPoint(req) + + res + .status(responseObject.code) + .send(responseObject.body); + + logger.apiRes({req: req, res: responseObject}) + } + }, + { + method: 'get', + path: '/api/v3/k8s/getContainerLogs', + middleware: async (req, res) => { + res + .status(constants.HTTP_CODE_SUCCESS) + .send(req.body) + + const successCode = constants.HTTP_CODE_SUCCESS + const errorCodes = [ + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.AuthenticationError] + } + ] + + const kubeletGetContainerLogsEndPoint = ResponseDecorator.handleErrors(KubeletController.kubeletGetContainerLogsEndPoint, successCode, errorCodes) + const responseObject = await kubeletGetContainerLogsEndPoint(req) + + res + .status(responseObject.code) + .send(responseObject.body); + + logger.apiRes({req: req, res: responseObject}) + + } + }, + { + method: 'get', + path: '/api/v3/k8s/getPodStatus', + middleware: async (req, res) => { + res + .status(constants.HTTP_CODE_SUCCESS) + .send(req.body) + + const successCode = constants.HTTP_CODE_SUCCESS + const errorCodes = [ + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.AuthenticationError] + } + ] + + const kubeletGetPodStatusEndPoint = ResponseDecorator.handleErrors(KubeletController.kubeletGetPodStatusEndPoint, successCode, errorCodes) + const responseObject = await kubeletGetPodStatusEndPoint(req) + + res + .status(responseObject.code) + .send(responseObject.body); + + logger.apiRes({req: req, res: responseObject}) + + } + }, + { + method: 'get', + path: '/api/v3/k8s/getPods', + middleware: async (req, res) => { + res + .status(constants.HTTP_CODE_SUCCESS) + .send(req.body) + + const successCode = constants.HTTP_CODE_SUCCESS + const errorCodes = [ + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.AuthenticationError] + } + ] + + const kubeletGetPodsEndPoint = ResponseDecorator.handleErrors(KubeletController.kubeletGetPodsEndPoint, successCode, errorCodes) + const responseObject = await kubeletGetPodsEndPoint(req) + + res + .status(responseObject.code) + .send(responseObject.body); + + logger.apiRes({req: req, res: responseObject}) + + } + }, + { + method: 'get', + path: '/api/v3/k8s/capacity', + middleware: async (req, res) => { + res + .status(constants.HTTP_CODE_SUCCESS) + .send(req.body) + + const successCode = constants.HTTP_CODE_SUCCESS + const errorCodes = [ + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.AuthenticationError] + } + ] + const kubeletGetCapacityEndPoint = ResponseDecorator.handleErrors(KubeletController.kubeletGetCapacityEndPoint, successCode, errorCodes) + const responseObject = await kubeletGetCapacityEndPoint(req) + + res + .status(responseObject.code) + .send(responseObject.body); + + logger.apiRes({req: req, res: responseObject}) + } + }, + { + method: 'get', + path: '/api/v3/k8s/nodeConditions', + middleware: async (req, res) => { + res + .status(constants.HTTP_CODE_SUCCESS) + .send(req.body) + + const successCode = constants.HTTP_CODE_SUCCESS + const errorCodes = [ + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.AuthenticationError] + } + ] + + const kubeletGetNodeConditionsEndPoint = ResponseDecorator.handleErrors(KubeletController.kubeletGetNodeConditionsEndPoint, successCode, errorCodes) + const responseObject = await kubeletGetNodeConditionsEndPoint(req) + + res + .status(responseObject.code) + .send(responseObject.body); + + logger.apiRes({req: req, res: responseObject}) + } + }, + { + method: 'get', + path: '/api/v3/k8s/nodeAddresses', + middleware: async (req, res) => { + res + .status(constants.HTTP_CODE_SUCCESS) + .send(req.body) + + const successCode = constants.HTTP_CODE_SUCCESS + const errorCodes = [ + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.AuthenticationError] + } + ] + + const kubeletGetNodeAddressesEndPoint = ResponseDecorator.handleErrors(KubeletController.kubeletGetNodeAddressesEndPoint, successCode, errorCodes) + const responseObject = await kubeletGetNodeAddressesEndPoint(req) + + res + .status(responseObject.code) + .send(responseObject.body); + + logger.apiRes({req: req, res: responseObject}) + } + }, + { + method: 'put', + path: '/api/v3/k8s/vk-token', + middleware: async (req, res) => { + res + .status(constants.HTTP_CODE_SUCCESS) + .send(req.body) + + const successCode = constants.HTTP_CODE_SUCCESS + const errorCodes = [ + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.AuthenticationError] + } + ] + + const kubeletGetVkTokenEndPoint = ResponseDecorator.handleErrors(KubeletController.kubeletGetVkTokenEndPoint, successCode, errorCodes) + const responseObject = await kubeletGetVkTokenEndPoint() + + res + .status(responseObject.code) + .send(responseObject.body); + + logger.apiRes({req: req, res: responseObject}) + } + }, + { + method: 'get', + path: '/api/v3/k8s/scheduler-token', + middleware: async (req, res) => { + res + .status(constants.HTTP_CODE_SUCCESS) + .send(req.body) + + const successCode = constants.HTTP_CODE_SUCCESS + const errorCodes = [ + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.AuthenticationError] + } + ] + + const kubeletGetSchedulerTokenEndPoint = ResponseDecorator.handleErrors(KubeletController.kubeletGetSchedulerTokenEndPoint, successCode, errorCodes) + const responseObject = await kubeletGetSchedulerTokenEndPoint() + + res + .status(responseObject.code) + .send(responseObject.body); + + logger.apiRes({req: req, res: responseObject}) + } + } +] \ No newline at end of file diff --git a/src/services/kubelet-service.js b/src/services/kubelet-service.js new file mode 100644 index 000000000..0aa39abf3 --- /dev/null +++ b/src/services/kubelet-service.js @@ -0,0 +1,64 @@ +/* + * ******************************************************************************* + * * 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 kubeletCreatePod = async function (createPodData, fogNodeUuid, transaction) { + //TODO: to implement +} +const kubeletUploadPod = async function (uploadPodData, fogNodeUuid, transaction) { + //TODO: to implement +} +const kubeletDeletePod = async function (fogNodeUuid, transaction) { + //TODO: to implement +} +const kubeletGetPod = async function (namespace, name, fogNodeUuid, transaction) { + //TODO: to implement +} +const kubeletGetContainerLogs = async function (namespace, podName, containerName, tail, fogNodeUuid, transaction) { + //TODO: to implement +} +const kubeletGetPodStatus = async function (namespace, name, fogNodeUuid, transaction) { + //TODO: to implement +} +const kubeletGetPods = async function (fogNodeUuid, transaction) { + //TODO: to implement +} +const kubeletGetCapacity = async function (fogNodeUuid, transaction) { + //TODO: to implement +} +const kubeletGetNodeConditions = async function (fogNodeUuid, transaction) { + //TODO: to implement +} +const kubeletGetNodeAddresses = async function (fogNodeUuid, transaction) { + //TODO: to implement +} +const kubeletGetVkToken = async function (transaction) { + //TODO: to implement +} +const kubeletGetSchedulerToken = async function (transaction) { + //TODO: to implement +} + +module.exports = { + kubeletCreatePod: TransactionDecorator.generateFakeTransaction(kubeletCreatePod), + kubeletUploadPod: TransactionDecorator.generateFakeTransaction(kubeletUploadPod), + kubeletDeletePod: TransactionDecorator.generateFakeTransaction(kubeletDeletePod), + kubeletGetPod: TransactionDecorator.generateFakeTransaction(kubeletGetPod), + kubeletGetContainerLogs: TransactionDecorator.generateFakeTransaction(kubeletGetContainerLogs), + kubeletGetPodStatus: TransactionDecorator.generateFakeTransaction(kubeletGetPodStatus), + kubeletGetPods: TransactionDecorator.generateFakeTransaction(kubeletGetPods), + kubeletGetCapacity: TransactionDecorator.generateFakeTransaction(kubeletGetCapacity), + kubeletGetNodeConditions: TransactionDecorator.generateFakeTransaction(kubeletGetNodeConditions), + kubeletGetNodeAddresses: TransactionDecorator.generateFakeTransaction(kubeletGetNodeAddresses), + kubeletGetVkToken: TransactionDecorator.generateFakeTransaction(kubeletGetVkToken), + kubeletGetSchedulerToken: TransactionDecorator.generateFakeTransaction(kubeletGetSchedulerToken), +} \ No newline at end of file From 0452aceb78aeaf6ee8996008459dd0f76b89c3b3 Mon Sep 17 00:00:00 2001 From: alexandershpak Date: Fri, 22 Feb 2019 16:37:23 +0300 Subject: [PATCH 02/11] feat(core): add k8s endpoints fix name --- src/controllers/{kublet-controller.js => kubelet-controller.js} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/controllers/{kublet-controller.js => kubelet-controller.js} (100%) diff --git a/src/controllers/kublet-controller.js b/src/controllers/kubelet-controller.js similarity index 100% rename from src/controllers/kublet-controller.js rename to src/controllers/kubelet-controller.js From a0ea405ea6cd4c8da63b0cb0f57cc61dc4160e34 Mon Sep 17 00:00:00 2001 From: alexandershpak Date: Fri, 22 Feb 2019 17:12:27 +0300 Subject: [PATCH 03/11] feat(core): k8s: Update virtual-kubelet (vk) to accept --iofog-token as parameter. ENG-700 --- src/config/constants.js | 1 + src/controllers/kubelet-controller.js | 5 +- .../managers/kubelet-access-token-manager.js | 36 +++++++++++++ ...90222135632-create-kubelet-access-token.js | 37 +++++++++++++ src/sequelize/models/kubeletaccesstoken.js | 44 +++++++++++++++ src/services/kubelet-access-token-service.js | 53 +++++++++++++++++++ src/services/kubelet-service.js | 13 ++++- 7 files changed, 185 insertions(+), 4 deletions(-) create mode 100644 src/sequelize/managers/kubelet-access-token-manager.js create mode 100644 src/sequelize/migrations/20190222135632-create-kubelet-access-token.js create mode 100644 src/sequelize/models/kubeletaccesstoken.js create mode 100644 src/services/kubelet-access-token-service.js diff --git a/src/config/constants.js b/src/config/constants.js index 21dc6e958..1535e6d3a 100644 --- a/src/config/constants.js +++ b/src/config/constants.js @@ -26,6 +26,7 @@ module.exports = { 'Settings:DefaultJobIntervalSeconds': 120, 'Settings:UserTokenExpirationIntervalSeconds': 3600, 'Settings:FogTokenExpirationIntervalSeconds': 3600, + 'Settings:KubeletTokenExpirationIntervalSeconds': 3600, 'Settings:FogStatusUpdateIntervalSeconds': 120, 'Settings:FogStatusFrequencySeconds': 60, diff --git a/src/controllers/kubelet-controller.js b/src/controllers/kubelet-controller.js index cf6c7118a..f1e6195cd 100644 --- a/src/controllers/kubelet-controller.js +++ b/src/controllers/kubelet-controller.js @@ -83,8 +83,9 @@ const kubeletGetNodeAddressesEndPoint = async function (req) { return await KubeletService.kubeletGetNodeAddresses(createPodData, fogNodeUuid) } -const kubeletGetVkTokenEndPoint = async function () { - return await KubeletService.kubeletGetVkToken() +const kubeletGetVkTokenEndPoint = async function (req) { + const fogNodeUuid = req.params.nodeName + return await KubeletService.kubeletGetVkToken(fogNodeUuid) } const kubeletGetSchedulerTokenEndPoint = async function () { diff --git a/src/sequelize/managers/kubelet-access-token-manager.js b/src/sequelize/managers/kubelet-access-token-manager.js new file mode 100644 index 000000000..0324d7624 --- /dev/null +++ b/src/sequelize/managers/kubelet-access-token-manager.js @@ -0,0 +1,36 @@ +/* + * ******************************************************************************* + * * Copyright (c) 2018 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 FogAccessToken = models.FogAccessToken; + +class KubeletAccessTokenManager extends BaseManager { + getEntity() { + return FogAccessToken + } + + // no transaction required here, used by auth decorator + updateExpirationTime(id, newTime) { + return FogAccessToken.update({ + expirationTime: newTime + }, { + where: { + id: id + } + }) + } +} + +const instance = new KubeletAccessTokenManager(); +module.exports = instance; \ No newline at end of file diff --git a/src/sequelize/migrations/20190222135632-create-kubelet-access-token.js b/src/sequelize/migrations/20190222135632-create-kubelet-access-token.js new file mode 100644 index 000000000..746151ed6 --- /dev/null +++ b/src/sequelize/migrations/20190222135632-create-kubelet-access-token.js @@ -0,0 +1,37 @@ +'use strict'; +module.exports = { + up: (queryInterface, Sequelize) => { + return queryInterface.createTable('KubeletAccessTokens', { + 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' + }, + iofogUuid: { + type: Sequelize.TEXT, + field: 'iofog_uuid', + references: { model: 'Fogs', key: 'uuid' }, + onDelete: 'cascade' + }, + userId: { + type: Sequelize.INTEGER, + field: 'user_id', + references: { model: 'Users', key: 'id' }, + onDelete: 'cascade' + } + }); + }, + down: (queryInterface, Sequelize) => { + return queryInterface.dropTable('KubeletAccessTokens'); + } +}; \ No newline at end of file diff --git a/src/sequelize/models/kubeletaccesstoken.js b/src/sequelize/models/kubeletaccesstoken.js new file mode 100644 index 000000000..2ecb32fc3 --- /dev/null +++ b/src/sequelize/models/kubeletaccesstoken.js @@ -0,0 +1,44 @@ +'use strict'; +module.exports = (sequelize, DataTypes) => { + const KubeletAccessToken = sequelize.define('KubeletAccessToken', { + 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 + }); + KubeletAccessToken.associate = function (models) { + + KubeletAccessToken.belongsTo(models.User, { + foreignKey: { + name: 'userId', + field: 'user_id' + }, + as: 'user', + onDelete: 'cascade' + }); + + KubeletAccessToken.belongsTo(models.Fog, { + foreignKey: { + name: 'iofogUuid', + field: 'iofog_uuid' + }, + as: 'iofog', + onDelete: 'cascade' + }); + }; + return KubeletAccessToken; +}; \ No newline at end of file diff --git a/src/services/kubelet-access-token-service.js b/src/services/kubelet-access-token-service.js new file mode 100644 index 000000000..b2f553565 --- /dev/null +++ b/src/services/kubelet-access-token-service.js @@ -0,0 +1,53 @@ +/* + * ******************************************************************************* + * * 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 KubeletAccessTokenManager = require('../sequelize/managers/kubelet-access-token-manager'); + +const Config = require('../config'); + +const generateAccessToken = async function (transaction) { + while (true) { + const newAccessToken = AppHelper.generateAccessToken(); + const exists = await KubeletAccessTokenManager.findOne({ + token: newAccessToken + }, transaction); + if (!exists) { + const accessTokenExpiryTime = Date.now() + Config.get('Settings:KubeletTokenExpirationIntervalSeconds') * 1000; + return { + token: newAccessToken, + expirationTime: accessTokenExpiryTime + } + } + } +}; + +async function updateAccessToken(fogUuid, newAccessToken, transaction) { + return KubeletAccessTokenManager.updateOrCreate({ + iofogUuid: fogUuid + }, { + iofogUuid: fogUuid, + token: newAccessToken.token, + expirationTime: newAccessToken.expirationTime + }, transaction); +} + +async function all(transaction) { + return KubeletAccessTokenManager.findAll(null, transaction); +} + +module.exports = { + generateAccessToken, + updateAccessToken, + all, +}; \ No newline at end of file diff --git a/src/services/kubelet-service.js b/src/services/kubelet-service.js index 0aa39abf3..50a6c3638 100644 --- a/src/services/kubelet-service.js +++ b/src/services/kubelet-service.js @@ -11,6 +11,9 @@ * */ +const KubeletAccessTokenService = require('./kubelet-access-token-service') +const TransactionDecorator = require('../decorators/transaction-decorator') + const kubeletCreatePod = async function (createPodData, fogNodeUuid, transaction) { //TODO: to implement } @@ -41,8 +44,14 @@ const kubeletGetNodeConditions = async function (fogNodeUuid, transaction) { const kubeletGetNodeAddresses = async function (fogNodeUuid, transaction) { //TODO: to implement } -const kubeletGetVkToken = async function (transaction) { - //TODO: to implement +const kubeletGetVkToken = async function (fogNodeUuid, transaction) { + const newAccessToken = await KubeletAccessTokenService.generateAccessToken(transaction) + await KubeletAccessTokenService.updateAccessToken(fogNodeUuid, newAccessToken, transaction) + + return { + uuid: fogNodeUuid, + token: newAccessToken.token + } } const kubeletGetSchedulerToken = async function (transaction) { //TODO: to implement From 3a1f3924c388be57a7513cb183687dde31b27fa4 Mon Sep 17 00:00:00 2001 From: alexandershpak Date: Fri, 22 Feb 2019 17:15:31 +0300 Subject: [PATCH 04/11] feat(core): k8s: Update virtual-kubelet (vk) to accept --iofog-token as parameter update. ENG-700 --- src/sequelize/managers/kubelet-access-token-manager.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/sequelize/managers/kubelet-access-token-manager.js b/src/sequelize/managers/kubelet-access-token-manager.js index 0324d7624..875584715 100644 --- a/src/sequelize/managers/kubelet-access-token-manager.js +++ b/src/sequelize/managers/kubelet-access-token-manager.js @@ -13,16 +13,16 @@ const BaseManager = require('./base-manager'); const models = require('./../models'); -const FogAccessToken = models.FogAccessToken; +const KubeletAccessToken = models.KubeletAccessToken; class KubeletAccessTokenManager extends BaseManager { getEntity() { - return FogAccessToken + return KubeletAccessToken } // no transaction required here, used by auth decorator updateExpirationTime(id, newTime) { - return FogAccessToken.update({ + return KubeletAccessToken.update({ expirationTime: newTime }, { where: { From 816f2fb269aa72e7a71429b607e9446999267b73 Mon Sep 17 00:00:00 2001 From: alexandershpak Date: Fri, 22 Feb 2019 17:17:37 +0300 Subject: [PATCH 05/11] feat(core): k8s: Update virtual-kubelet (vk) to accept --iofog-token as parameter update year. ENG-700 --- src/sequelize/managers/kubelet-access-token-manager.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sequelize/managers/kubelet-access-token-manager.js b/src/sequelize/managers/kubelet-access-token-manager.js index 875584715..99e813ae2 100644 --- a/src/sequelize/managers/kubelet-access-token-manager.js +++ b/src/sequelize/managers/kubelet-access-token-manager.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2018 Edgeworx, Inc. + * * 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 From 1eb3f2c36b3c9e1b9d1cdfd516c664bc89aa8d85 Mon Sep 17 00:00:00 2001 From: alexandershpak Date: Fri, 22 Feb 2019 17:36:23 +0300 Subject: [PATCH 06/11] feat(core): k8s: Update virtual-kubelet (vk) to accept --iofog-token as parameter small fix. ENG-700 --- .../managers/kubelet-access-token-manager.js | 11 ----------- src/services/kubelet-access-token-service.js | 4 ---- 2 files changed, 15 deletions(-) diff --git a/src/sequelize/managers/kubelet-access-token-manager.js b/src/sequelize/managers/kubelet-access-token-manager.js index 99e813ae2..290ae703f 100644 --- a/src/sequelize/managers/kubelet-access-token-manager.js +++ b/src/sequelize/managers/kubelet-access-token-manager.js @@ -19,17 +19,6 @@ class KubeletAccessTokenManager extends BaseManager { getEntity() { return KubeletAccessToken } - - // no transaction required here, used by auth decorator - updateExpirationTime(id, newTime) { - return KubeletAccessToken.update({ - expirationTime: newTime - }, { - where: { - id: id - } - }) - } } const instance = new KubeletAccessTokenManager(); diff --git a/src/services/kubelet-access-token-service.js b/src/services/kubelet-access-token-service.js index b2f553565..66fdec0d2 100644 --- a/src/services/kubelet-access-token-service.js +++ b/src/services/kubelet-access-token-service.js @@ -42,12 +42,8 @@ async function updateAccessToken(fogUuid, newAccessToken, transaction) { }, transaction); } -async function all(transaction) { - return KubeletAccessTokenManager.findAll(null, transaction); -} module.exports = { generateAccessToken, updateAccessToken, - all, }; \ No newline at end of file From 769e2f23f5c77e1e7a19b4906ae8c084eb29dc50 Mon Sep 17 00:00:00 2001 From: alexandershpak Date: Mon, 25 Feb 2019 16:42:02 +0300 Subject: [PATCH 07/11] feat(core): fix code style (part 1) ENG-700 --- src/controllers/kubelet-controller.js | 35 ++-- src/routes/kubelet.js | 167 +++++++++--------- .../managers/kubelet-access-token-manager.js | 10 +- ...90222135632-create-kubelet-access-token.js | 24 +-- src/sequelize/models/kubeletaccesstoken.js | 38 ++-- src/services/kubelet-access-token-service.js | 33 ++-- src/services/kubelet-service.js | 50 +++--- 7 files changed, 175 insertions(+), 182 deletions(-) diff --git a/src/controllers/kubelet-controller.js b/src/controllers/kubelet-controller.js index f1e6195cd..2affbbb4f 100644 --- a/src/controllers/kubelet-controller.js +++ b/src/controllers/kubelet-controller.js @@ -12,28 +12,29 @@ */ const KubeletService = require('../services/kubelet-service') +const AuthDecorator = require('../decorators/authorization-decorator') -const kubeletCreatePodEndPoint = async function (req) { +const kubeletCreatePodEndPoint = async function(req) { const createPodData = req.body const fogNodeUuid = req.params.nodeName return await KubeletService.kubeletCreatePod(createPodData, fogNodeUuid) } -const kubeletUploadPodEndPoint = async function (req) { +const kubeletUploadPodEndPoint = async function(req) { const uploadPodData = req.body const fogNodeUuid = req.params.nodeName return await KubeletService.kubeletUploadPod(uploadPodData, fogNodeUuid) } -const kubeletDeletePodEndPoint = async function (req) { +const kubeletDeletePodEndPoint = async function(req) { const fogNodeUuid = req.params.nodeName - return await KubeletService.kubeletDeletePod(fogNodeUuid); + return await KubeletService.kubeletDeletePod(fogNodeUuid) } -const kubeletGetPodEndPoint = async function (req) { +const kubeletGetPodEndPoint = async function(req) { const namespace = req.params.namespace const name = req.params.name const fogNodeUuid = req.params.nodeName @@ -41,7 +42,7 @@ const kubeletGetPodEndPoint = async function (req) { return await KubeletService.kubeletGetPod(namespace, name, fogNodeUuid) } -const kubeletGetContainerLogsEndPoint = async function (req) { +const kubeletGetContainerLogsEndPoint = async function(req) { const namespace = req.params.namespace const podName = req.params.podName const containerName = req.params.containerName @@ -51,7 +52,7 @@ const kubeletGetContainerLogsEndPoint = async function (req) { return await KubeletService.kubeletGetContainerLogs(namespace, podName, containerName, tail, fogNodeUuid) } -const kubeletGetPodStatusEndPoint = async function (req) { +const kubeletGetPodStatusEndPoint = async function(req) { const namespace = req.params.namespace const name = req.params.name const fogNodeUuid = req.params.nodeName @@ -59,36 +60,36 @@ const kubeletGetPodStatusEndPoint = async function (req) { return await KubeletService.kubeletGetPodStatus(namespace, name, fogNodeUuid) } -const kubeletGetPodsEndPoint = async function (req) { +const kubeletGetPodsEndPoint = async function(req) { const fogNodeUuid = req.params.nodeName return await KubeletService.kubeletGetPods(createPodData, fogNodeUuid) } -const kubeletGetCapacityEndPoint = async function (req) { +const kubeletGetCapacityEndPoint = async function(req) { const fogNodeUuid = req.params.nodeName return await KubeletService.kubeletGetCapacity(createPodData, fogNodeUuid) } -const kubeletGetNodeConditionsEndPoint = async function (req) { +const kubeletGetNodeConditionsEndPoint = async function(req) { const fogNodeUuid = req.params.nodeName return await KubeletService.kubeletGetNodeConditions(createPodData, fogNodeUuid) } -const kubeletGetNodeAddressesEndPoint = async function (req) { +const kubeletGetNodeAddressesEndPoint = async function(req) { const fogNodeUuid = req.params.nodeName return await KubeletService.kubeletGetNodeAddresses(createPodData, fogNodeUuid) } -const kubeletGetVkTokenEndPoint = async function (req) { - const fogNodeUuid = req.params.nodeName - return await KubeletService.kubeletGetVkToken(fogNodeUuid) +const kubeletGetVkTokenEndPoint = async function(req, user) { + const userId = user.id + return await KubeletService.kubeletGetVkToken(userId) } -const kubeletGetSchedulerTokenEndPoint = async function () { +const kubeletGetSchedulerTokenEndPoint = async function() { return await KubeletService.kubeletGetSchedulerToken() } @@ -103,6 +104,6 @@ module.exports = { kubeletGetCapacityEndPoint: kubeletGetCapacityEndPoint, kubeletGetNodeConditionsEndPoint: kubeletGetNodeConditionsEndPoint, kubeletGetNodeAddressesEndPoint: kubeletGetNodeAddressesEndPoint, - kubeletGetVkTokenEndPoint: kubeletGetVkTokenEndPoint, + kubeletGetVkTokenEndPoint: AuthDecorator.checkAuthToken(kubeletGetVkTokenEndPoint), kubeletGetSchedulerTokenEndPoint: kubeletGetSchedulerTokenEndPoint, -} \ No newline at end of file +} diff --git a/src/routes/kubelet.js b/src/routes/kubelet.js index 0bd23c92c..80bab2b19 100644 --- a/src/routes/kubelet.js +++ b/src/routes/kubelet.js @@ -22,52 +22,54 @@ module.exports = [ method: 'post', path: '/api/v3/k8s/createPod', middleware: async (req, res) => { - logger.apiReq(req); + logger.apiReq(req) const successCode = constants.HTTP_CODE_SUCCESS const errorCodes = [ { code: constants.HTTP_CODE_BAD_REQUEST, - errors: [Errors.ValidationError] - } + errors: [Errors.ValidationError], + }, ] - const kubeletCreatePodEndPoint = ResponseDecorator.handleErrors(KubeletController.kubeletCreatePodEndPoint, successCode, errorCodes) + const kubeletCreatePodEndPoint = ResponseDecorator + .handleErrors(KubeletController.kubeletCreatePodEndPoint, successCode, errorCodes) const responseObject = await kubeletCreatePodEndPoint(req) res - .status(responseObject.code) - .send(responseObject.body); + .status(responseObject.code) + .send(responseObject.body) logger.apiRes({req: req, res: responseObject}) - } + }, }, { method: 'put', path: '/api/v3/k8s/uploadPod', middleware: async (req, res) => { res - .status(constants.HTTP_CODE_SUCCESS) - .send(req.body) + .status(constants.HTTP_CODE_SUCCESS) + .send(req.body) const successCode = constants.HTTP_CODE_SUCCESS const errorCodes = [ { code: constants.HTTP_CODE_BAD_REQUEST, - errors: [Errors.AuthenticationError] + errors: [Errors.AuthenticationError], }, { code: constants.HTTP_CODE_NOT_FOUND, - errors: [Errors.AuthenticationError] + errors: [Errors.AuthenticationError], } ] - const kubeletUploadPodEndPoint = ResponseDecorator.handleErrors(KubeletController.kubeletUploadPodEndPoint, successCode, errorCodes) + const kubeletUploadPodEndPoint = ResponseDecorator + .handleErrors(KubeletController.kubeletUploadPodEndPoint, successCode, errorCodes) const responseObject = await kubeletUploadPodEndPoint(req) res - .status(responseObject.code) - .send(responseObject.body); + .status(responseObject.code) + .send(responseObject.body) logger.apiRes({req: req, res: responseObject}) } @@ -77,23 +79,24 @@ module.exports = [ path: '/api/v3/k8s/deletePod', middleware: async (req, res) => { res - .status(constants.HTTP_CODE_SUCCESS) - .send(req.body) + .status(constants.HTTP_CODE_SUCCESS) + .send(req.body) const successCode = constants.HTTP_CODE_SUCCESS const errorCodes = [ { code: constants.HTTP_CODE_NOT_FOUND, - errors: [Errors.AuthenticationError] + errors: [Errors.AuthenticationError], } ] - const kubeletDeletePodEndPoint = ResponseDecorator.handleErrors(KubeletController.kubeletDeletePodEndPoint, successCode, errorCodes) + const kubeletDeletePodEndPoint = ResponseDecorator + .handleErrors(KubeletController.kubeletDeletePodEndPoint, successCode, errorCodes) const responseObject = await kubeletDeletePodEndPoint(req) res - .status(responseObject.code) - .send(responseObject.body); + .status(responseObject.code) + .send(responseObject.body); logger.apiRes({req: req, res: responseObject}) } @@ -103,26 +106,27 @@ module.exports = [ path: '/api/v3/k8s/getPod', middleware: async (req, res) => { res - .status(constants.HTTP_CODE_SUCCESS) - .send(req.body) + .status(constants.HTTP_CODE_SUCCESS) + .send(req.body) const successCode = constants.HTTP_CODE_SUCCESS const errorCodes = [ { code: constants.HTTP_CODE_NOT_FOUND, - errors: [Errors.AuthenticationError] + errors: [Errors.AuthenticationError], } ] - const kubeletGetPodEndPoint = ResponseDecorator.handleErrors(KubeletController.kubeletGetPodEndPoint, successCode, errorCodes) + const kubeletGetPodEndPoint = ResponseDecorator + .handleErrors(KubeletController.kubeletGetPodEndPoint, successCode, errorCodes) const responseObject = await kubeletGetPodEndPoint(req) res - .status(responseObject.code) - .send(responseObject.body); + .status(responseObject.code) + .send(responseObject.body) logger.apiRes({req: req, res: responseObject}) - } + }, }, { method: 'get', @@ -136,47 +140,47 @@ module.exports = [ const errorCodes = [ { code: constants.HTTP_CODE_NOT_FOUND, - errors: [Errors.AuthenticationError] + errors: [Errors.AuthenticationError], } ] - const kubeletGetContainerLogsEndPoint = ResponseDecorator.handleErrors(KubeletController.kubeletGetContainerLogsEndPoint, successCode, errorCodes) + const kubeletGetContainerLogsEndPoint = ResponseDecorator + .handleErrors(KubeletController.kubeletGetContainerLogsEndPoint, successCode, errorCodes) const responseObject = await kubeletGetContainerLogsEndPoint(req) res .status(responseObject.code) - .send(responseObject.body); + .send(responseObject.body) logger.apiRes({req: req, res: responseObject}) - - } + }, }, { method: 'get', path: '/api/v3/k8s/getPodStatus', middleware: async (req, res) => { res - .status(constants.HTTP_CODE_SUCCESS) - .send(req.body) + .status(constants.HTTP_CODE_SUCCESS) + .send(req.body) const successCode = constants.HTTP_CODE_SUCCESS const errorCodes = [ { code: constants.HTTP_CODE_NOT_FOUND, - errors: [Errors.AuthenticationError] + errors: [Errors.AuthenticationError], } ] - const kubeletGetPodStatusEndPoint = ResponseDecorator.handleErrors(KubeletController.kubeletGetPodStatusEndPoint, successCode, errorCodes) + const kubeletGetPodStatusEndPoint = ResponseDecorator + .handleErrors(KubeletController.kubeletGetPodStatusEndPoint, successCode, errorCodes) const responseObject = await kubeletGetPodStatusEndPoint(req) res - .status(responseObject.code) - .send(responseObject.body); + .status(responseObject.code) + .send(responseObject.body) logger.apiRes({req: req, res: responseObject}) - - } + }, }, { method: 'get', @@ -190,71 +194,73 @@ module.exports = [ const errorCodes = [ { code: constants.HTTP_CODE_NOT_FOUND, - errors: [Errors.AuthenticationError] + errors: [Errors.AuthenticationError], } ] - const kubeletGetPodsEndPoint = ResponseDecorator.handleErrors(KubeletController.kubeletGetPodsEndPoint, successCode, errorCodes) + const kubeletGetPodsEndPoint = ResponseDecorator + .handleErrors(KubeletController.kubeletGetPodsEndPoint, successCode, errorCodes) const responseObject = await kubeletGetPodsEndPoint(req) res - .status(responseObject.code) - .send(responseObject.body); + .status(responseObject.code) + .send(responseObject.body); logger.apiRes({req: req, res: responseObject}) - - } + }, }, { method: 'get', path: '/api/v3/k8s/capacity', middleware: async (req, res) => { res - .status(constants.HTTP_CODE_SUCCESS) - .send(req.body) + .status(constants.HTTP_CODE_SUCCESS) + .send(req.body) const successCode = constants.HTTP_CODE_SUCCESS const errorCodes = [ { code: constants.HTTP_CODE_NOT_FOUND, - errors: [Errors.AuthenticationError] + errors: [Errors.AuthenticationError], } ] - const kubeletGetCapacityEndPoint = ResponseDecorator.handleErrors(KubeletController.kubeletGetCapacityEndPoint, successCode, errorCodes) + const kubeletGetCapacityEndPoint = ResponseDecorator + .handleErrors(KubeletController.kubeletGetCapacityEndPoint, successCode, errorCodes) const responseObject = await kubeletGetCapacityEndPoint(req) res - .status(responseObject.code) - .send(responseObject.body); + .status(responseObject.code) + .send(responseObject.body) logger.apiRes({req: req, res: responseObject}) - } + }, }, { method: 'get', path: '/api/v3/k8s/nodeConditions', middleware: async (req, res) => { res - .status(constants.HTTP_CODE_SUCCESS) - .send(req.body) + .status(constants.HTTP_CODE_SUCCESS) + .send(req.body) const successCode = constants.HTTP_CODE_SUCCESS const errorCodes = [ { code: constants.HTTP_CODE_NOT_FOUND, - errors: [Errors.AuthenticationError] + errors: [Errors.AuthenticationError], } ] - const kubeletGetNodeConditionsEndPoint = ResponseDecorator.handleErrors(KubeletController.kubeletGetNodeConditionsEndPoint, successCode, errorCodes) + const kubeletGetNodeConditionsEndPoint = ResponseDecorator + .handleErrors(KubeletController.kubeletGetNodeConditionsEndPoint, successCode, errorCodes) const responseObject = await kubeletGetNodeConditionsEndPoint(req) res - .status(responseObject.code) - .send(responseObject.body); + .status(responseObject.code) + .send(responseObject.body) logger.apiRes({req: req, res: responseObject}) - } + }, }, { method: 'get', @@ -268,70 +274,73 @@ module.exports = [ const errorCodes = [ { code: constants.HTTP_CODE_NOT_FOUND, - errors: [Errors.AuthenticationError] + errors: [Errors.AuthenticationError], } ] - const kubeletGetNodeAddressesEndPoint = ResponseDecorator.handleErrors(KubeletController.kubeletGetNodeAddressesEndPoint, successCode, errorCodes) + const kubeletGetNodeAddressesEndPoint = ResponseDecorator + .handleErrors(KubeletController.kubeletGetNodeAddressesEndPoint, successCode, errorCodes) const responseObject = await kubeletGetNodeAddressesEndPoint(req) res - .status(responseObject.code) - .send(responseObject.body); + .status(responseObject.code) + .send(responseObject.body) logger.apiRes({req: req, res: responseObject}) - } + }, }, { method: 'put', path: '/api/v3/k8s/vk-token', middleware: async (req, res) => { res - .status(constants.HTTP_CODE_SUCCESS) - .send(req.body) + .status(constants.HTTP_CODE_SUCCESS) + .send(req.body) const successCode = constants.HTTP_CODE_SUCCESS const errorCodes = [ { code: constants.HTTP_CODE_NOT_FOUND, - errors: [Errors.AuthenticationError] + errors: [Errors.AuthenticationError], } ] - const kubeletGetVkTokenEndPoint = ResponseDecorator.handleErrors(KubeletController.kubeletGetVkTokenEndPoint, successCode, errorCodes) + const kubeletGetVkTokenEndPoint = ResponseDecorator + .handleErrors(KubeletController.kubeletGetVkTokenEndPoint, successCode, errorCodes) const responseObject = await kubeletGetVkTokenEndPoint() res .status(responseObject.code) - .send(responseObject.body); + .send(responseObject.body) logger.apiRes({req: req, res: responseObject}) - } + }, }, { method: 'get', path: '/api/v3/k8s/scheduler-token', middleware: async (req, res) => { res - .status(constants.HTTP_CODE_SUCCESS) - .send(req.body) + .status(constants.HTTP_CODE_SUCCESS) + .send(req.body) const successCode = constants.HTTP_CODE_SUCCESS const errorCodes = [ { code: constants.HTTP_CODE_NOT_FOUND, - errors: [Errors.AuthenticationError] + errors: [Errors.AuthenticationError], } ] - const kubeletGetSchedulerTokenEndPoint = ResponseDecorator.handleErrors(KubeletController.kubeletGetSchedulerTokenEndPoint, successCode, errorCodes) + const kubeletGetSchedulerTokenEndPoint = ResponseDecorator + .handleErrors(KubeletController.kubeletGetSchedulerTokenEndPoint, successCode, errorCodes) const responseObject = await kubeletGetSchedulerTokenEndPoint() res - .status(responseObject.code) - .send(responseObject.body); + .status(responseObject.code) + .send(responseObject.body) logger.apiRes({req: req, res: responseObject}) - } - } + }, + }, ] \ No newline at end of file diff --git a/src/sequelize/managers/kubelet-access-token-manager.js b/src/sequelize/managers/kubelet-access-token-manager.js index 290ae703f..cbe2e32af 100644 --- a/src/sequelize/managers/kubelet-access-token-manager.js +++ b/src/sequelize/managers/kubelet-access-token-manager.js @@ -11,9 +11,9 @@ * */ -const BaseManager = require('./base-manager'); -const models = require('./../models'); -const KubeletAccessToken = models.KubeletAccessToken; +const BaseManager = require('./base-manager') +const models = require('./../models') +const KubeletAccessToken = models.KubeletAccessToken class KubeletAccessTokenManager extends BaseManager { getEntity() { @@ -21,5 +21,5 @@ class KubeletAccessTokenManager extends BaseManager { } } -const instance = new KubeletAccessTokenManager(); -module.exports = instance; \ No newline at end of file +const instance = new KubeletAccessTokenManager() +module.exports = instance diff --git a/src/sequelize/migrations/20190222135632-create-kubelet-access-token.js b/src/sequelize/migrations/20190222135632-create-kubelet-access-token.js index 746151ed6..898a9898d 100644 --- a/src/sequelize/migrations/20190222135632-create-kubelet-access-token.js +++ b/src/sequelize/migrations/20190222135632-create-kubelet-access-token.js @@ -1,4 +1,4 @@ -'use strict'; +'use strict' module.exports = { up: (queryInterface, Sequelize) => { return queryInterface.createTable('KubeletAccessTokens', { @@ -7,31 +7,25 @@ module.exports = { primaryKey: true, autoIncrement: true, allowNull: false, - field: 'id' + field: 'id', }, expirationTime: { type: Sequelize.BIGINT, - field: 'expiration_time' + field: 'expiration_time', }, token: { type: Sequelize.TEXT, - field: 'token' - }, - iofogUuid: { - type: Sequelize.TEXT, - field: 'iofog_uuid', - references: { model: 'Fogs', key: 'uuid' }, - onDelete: 'cascade' + field: 'token', }, userId: { type: Sequelize.INTEGER, field: 'user_id', - references: { model: 'Users', key: 'id' }, - onDelete: 'cascade' + references: {model: 'Users', key: 'id'}, + onDelete: 'cascade', } - }); + }) }, down: (queryInterface, Sequelize) => { - return queryInterface.dropTable('KubeletAccessTokens'); + return queryInterface.dropTable('KubeletAccessTokens') } -}; \ No newline at end of file +}; diff --git a/src/sequelize/models/kubeletaccesstoken.js b/src/sequelize/models/kubeletaccesstoken.js index 2ecb32fc3..2ee528262 100644 --- a/src/sequelize/models/kubeletaccesstoken.js +++ b/src/sequelize/models/kubeletaccesstoken.js @@ -1,4 +1,4 @@ -'use strict'; +'use strict' module.exports = (sequelize, DataTypes) => { const KubeletAccessToken = sequelize.define('KubeletAccessToken', { id: { @@ -6,39 +6,29 @@ module.exports = (sequelize, DataTypes) => { primaryKey: true, autoIncrement: true, allowNull: false, - field: 'id' + field: 'id', }, expirationTime: { type: DataTypes.BIGINT, - field: 'expiration_time' + field: 'expiration_time', }, token: { type: DataTypes.TEXT, - field: 'token' - } + field: 'token', + }, }, { timestamps: false, - underscored: true - }); - KubeletAccessToken.associate = function (models) { - + underscored: true, + }) + KubeletAccessToken.associate = function(models) { KubeletAccessToken.belongsTo(models.User, { foreignKey: { name: 'userId', - field: 'user_id' + field: 'user_id', }, as: 'user', - onDelete: 'cascade' - }); - - KubeletAccessToken.belongsTo(models.Fog, { - foreignKey: { - name: 'iofogUuid', - field: 'iofog_uuid' - }, - as: 'iofog', - onDelete: 'cascade' - }); - }; - return KubeletAccessToken; -}; \ No newline at end of file + onDelete: 'cascade', + }) + } + return KubeletAccessToken +} diff --git a/src/services/kubelet-access-token-service.js b/src/services/kubelet-access-token-service.js index 66fdec0d2..6f007012f 100644 --- a/src/services/kubelet-access-token-service.js +++ b/src/services/kubelet-access-token-service.js @@ -11,39 +11,38 @@ * */ -const AppHelper = require('../helpers/app-helper'); -const KubeletAccessTokenManager = require('../sequelize/managers/kubelet-access-token-manager'); +const AppHelper = require('../helpers/app-helper') +const KubeletAccessTokenManager = require('../sequelize/managers/kubelet-access-token-manager') -const Config = require('../config'); +const Config = require('../config') -const generateAccessToken = async function (transaction) { +const generateAccessToken = async function(transaction) { while (true) { - const newAccessToken = AppHelper.generateAccessToken(); + const newAccessToken = AppHelper.generateAccessToken() const exists = await KubeletAccessTokenManager.findOne({ - token: newAccessToken - }, transaction); + token: newAccessToken, + }, transaction) if (!exists) { - const accessTokenExpiryTime = Date.now() + Config.get('Settings:KubeletTokenExpirationIntervalSeconds') * 1000; + const accessTokenExpiryTime = Date.now() + Config.get('Settings:KubeletTokenExpirationIntervalSeconds') * 1000 return { token: newAccessToken, - expirationTime: accessTokenExpiryTime + expirationTime: accessTokenExpiryTime, } } } -}; +} -async function updateAccessToken(fogUuid, newAccessToken, transaction) { +async function updateAccessToken(userId, newAccessToken, transaction) { return KubeletAccessTokenManager.updateOrCreate({ - iofogUuid: fogUuid + userId: userId, }, { - iofogUuid: fogUuid, + userId: userId, token: newAccessToken.token, - expirationTime: newAccessToken.expirationTime - }, transaction); + expirationTime: newAccessToken.expirationTime, + }, transaction) } - module.exports = { generateAccessToken, updateAccessToken, -}; \ No newline at end of file +} diff --git a/src/services/kubelet-service.js b/src/services/kubelet-service.js index 50a6c3638..130345eb4 100644 --- a/src/services/kubelet-service.js +++ b/src/services/kubelet-service.js @@ -14,47 +14,47 @@ const KubeletAccessTokenService = require('./kubelet-access-token-service') const TransactionDecorator = require('../decorators/transaction-decorator') -const kubeletCreatePod = async function (createPodData, fogNodeUuid, transaction) { - //TODO: to implement +const kubeletCreatePod = async function(createPodData, fogNodeUuid, transaction) { + // TODO: to implement } -const kubeletUploadPod = async function (uploadPodData, fogNodeUuid, transaction) { - //TODO: to implement +const kubeletUploadPod = async function(uploadPodData, fogNodeUuid, transaction) { + // TODO: to implement } -const kubeletDeletePod = async function (fogNodeUuid, transaction) { - //TODO: to implement +const kubeletDeletePod = async function(fogNodeUuid, transaction) { + // TODO: to implement } -const kubeletGetPod = async function (namespace, name, fogNodeUuid, transaction) { - //TODO: to implement +const kubeletGetPod = async function(namespace, name, fogNodeUuid, transaction) { + // TODO: to implement } -const kubeletGetContainerLogs = async function (namespace, podName, containerName, tail, fogNodeUuid, transaction) { - //TODO: to implement +const kubeletGetContainerLogs = async function(namespace, podName, containerName, tail, fogNodeUuid, transaction) { + // TODO: to implement } -const kubeletGetPodStatus = async function (namespace, name, fogNodeUuid, transaction) { - //TODO: to implement +const kubeletGetPodStatus = async function(namespace, name, fogNodeUuid, transaction) { + // TODO: to implement } -const kubeletGetPods = async function (fogNodeUuid, transaction) { - //TODO: to implement +const kubeletGetPods = async function(fogNodeUuid, transaction) { + // TODO: to implement } -const kubeletGetCapacity = async function (fogNodeUuid, transaction) { - //TODO: to implement +const kubeletGetCapacity = async function(fogNodeUuid, transaction) { + // TODO: to implement } -const kubeletGetNodeConditions = async function (fogNodeUuid, transaction) { - //TODO: to implement +const kubeletGetNodeConditions = async function(fogNodeUuid, transaction) { + // TODO: to implement } const kubeletGetNodeAddresses = async function (fogNodeUuid, transaction) { - //TODO: to implement + // TODO: to implement } -const kubeletGetVkToken = async function (fogNodeUuid, transaction) { +const kubeletGetVkToken = async function(userId, transaction) { const newAccessToken = await KubeletAccessTokenService.generateAccessToken(transaction) - await KubeletAccessTokenService.updateAccessToken(fogNodeUuid, newAccessToken, transaction) + await KubeletAccessTokenService.updateAccessToken(userId, newAccessToken, transaction) return { uuid: fogNodeUuid, - token: newAccessToken.token + token: newAccessToken.token, } } -const kubeletGetSchedulerToken = async function (transaction) { - //TODO: to implement +const kubeletGetSchedulerToken = async function(transaction) { + // TODO: to implement } module.exports = { @@ -70,4 +70,4 @@ module.exports = { kubeletGetNodeAddresses: TransactionDecorator.generateFakeTransaction(kubeletGetNodeAddresses), kubeletGetVkToken: TransactionDecorator.generateFakeTransaction(kubeletGetVkToken), kubeletGetSchedulerToken: TransactionDecorator.generateFakeTransaction(kubeletGetSchedulerToken), -} \ No newline at end of file +} From f2ae22a8b1766f672caeed85c9c05a7a28dbcccd Mon Sep 17 00:00:00 2001 From: alexandershpak Date: Mon, 25 Feb 2019 16:55:07 +0300 Subject: [PATCH 08/11] feat(core): fix code style (part 2) ENG-700 --- src/routes/kubelet.js | 54 +++++++++---------- ...90222135632-create-kubelet-access-token.js | 6 +-- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/src/routes/kubelet.js b/src/routes/kubelet.js index 80bab2b19..83455d7a6 100644 --- a/src/routes/kubelet.js +++ b/src/routes/kubelet.js @@ -60,7 +60,7 @@ module.exports = [ { code: constants.HTTP_CODE_NOT_FOUND, errors: [Errors.AuthenticationError], - } + }, ] const kubeletUploadPodEndPoint = ResponseDecorator @@ -72,7 +72,7 @@ module.exports = [ .send(responseObject.body) logger.apiRes({req: req, res: responseObject}) - } + }, }, { method: 'delete', @@ -87,7 +87,7 @@ module.exports = [ { code: constants.HTTP_CODE_NOT_FOUND, errors: [Errors.AuthenticationError], - } + }, ] const kubeletDeletePodEndPoint = ResponseDecorator @@ -96,10 +96,10 @@ module.exports = [ res .status(responseObject.code) - .send(responseObject.body); + .send(responseObject.body) logger.apiRes({req: req, res: responseObject}) - } + }, }, { method: 'get', @@ -114,7 +114,7 @@ module.exports = [ { code: constants.HTTP_CODE_NOT_FOUND, errors: [Errors.AuthenticationError], - } + }, ] const kubeletGetPodEndPoint = ResponseDecorator @@ -133,24 +133,24 @@ module.exports = [ path: '/api/v3/k8s/getContainerLogs', middleware: async (req, res) => { res - .status(constants.HTTP_CODE_SUCCESS) - .send(req.body) + .status(constants.HTTP_CODE_SUCCESS) + .send(req.body) const successCode = constants.HTTP_CODE_SUCCESS const errorCodes = [ { code: constants.HTTP_CODE_NOT_FOUND, errors: [Errors.AuthenticationError], - } + }, ] const kubeletGetContainerLogsEndPoint = ResponseDecorator - .handleErrors(KubeletController.kubeletGetContainerLogsEndPoint, successCode, errorCodes) + .handleErrors(KubeletController.kubeletGetContainerLogsEndPoint, successCode, errorCodes) const responseObject = await kubeletGetContainerLogsEndPoint(req) res - .status(responseObject.code) - .send(responseObject.body) + .status(responseObject.code) + .send(responseObject.body) logger.apiRes({req: req, res: responseObject}) }, @@ -168,7 +168,7 @@ module.exports = [ { code: constants.HTTP_CODE_NOT_FOUND, errors: [Errors.AuthenticationError], - } + }, ] const kubeletGetPodStatusEndPoint = ResponseDecorator @@ -187,15 +187,15 @@ module.exports = [ path: '/api/v3/k8s/getPods', middleware: async (req, res) => { res - .status(constants.HTTP_CODE_SUCCESS) - .send(req.body) + .status(constants.HTTP_CODE_SUCCESS) + .send(req.body) const successCode = constants.HTTP_CODE_SUCCESS const errorCodes = [ { code: constants.HTTP_CODE_NOT_FOUND, errors: [Errors.AuthenticationError], - } + }, ] const kubeletGetPodsEndPoint = ResponseDecorator @@ -204,7 +204,7 @@ module.exports = [ res .status(responseObject.code) - .send(responseObject.body); + .send(responseObject.body) logger.apiRes({req: req, res: responseObject}) }, @@ -222,7 +222,7 @@ module.exports = [ { code: constants.HTTP_CODE_NOT_FOUND, errors: [Errors.AuthenticationError], - } + }, ] const kubeletGetCapacityEndPoint = ResponseDecorator .handleErrors(KubeletController.kubeletGetCapacityEndPoint, successCode, errorCodes) @@ -248,7 +248,7 @@ module.exports = [ { code: constants.HTTP_CODE_NOT_FOUND, errors: [Errors.AuthenticationError], - } + }, ] const kubeletGetNodeConditionsEndPoint = ResponseDecorator @@ -267,15 +267,15 @@ module.exports = [ path: '/api/v3/k8s/nodeAddresses', middleware: async (req, res) => { res - .status(constants.HTTP_CODE_SUCCESS) - .send(req.body) + .status(constants.HTTP_CODE_SUCCESS) + .send(req.body) const successCode = constants.HTTP_CODE_SUCCESS const errorCodes = [ { code: constants.HTTP_CODE_NOT_FOUND, errors: [Errors.AuthenticationError], - } + }, ] const kubeletGetNodeAddressesEndPoint = ResponseDecorator @@ -302,7 +302,7 @@ module.exports = [ { code: constants.HTTP_CODE_NOT_FOUND, errors: [Errors.AuthenticationError], - } + }, ] const kubeletGetVkTokenEndPoint = ResponseDecorator @@ -310,8 +310,8 @@ module.exports = [ const responseObject = await kubeletGetVkTokenEndPoint() res - .status(responseObject.code) - .send(responseObject.body) + .status(responseObject.code) + .send(responseObject.body) logger.apiRes({req: req, res: responseObject}) }, @@ -329,7 +329,7 @@ module.exports = [ { code: constants.HTTP_CODE_NOT_FOUND, errors: [Errors.AuthenticationError], - } + }, ] const kubeletGetSchedulerTokenEndPoint = ResponseDecorator @@ -343,4 +343,4 @@ module.exports = [ logger.apiRes({req: req, res: responseObject}) }, }, -] \ No newline at end of file +] diff --git a/src/sequelize/migrations/20190222135632-create-kubelet-access-token.js b/src/sequelize/migrations/20190222135632-create-kubelet-access-token.js index 898a9898d..aeefca1cd 100644 --- a/src/sequelize/migrations/20190222135632-create-kubelet-access-token.js +++ b/src/sequelize/migrations/20190222135632-create-kubelet-access-token.js @@ -22,10 +22,10 @@ module.exports = { field: 'user_id', references: {model: 'Users', key: 'id'}, onDelete: 'cascade', - } + }, }) }, down: (queryInterface, Sequelize) => { return queryInterface.dropTable('KubeletAccessTokens') - } -}; + }, +} From fd81090ee91184370b1b723abffd473433c2a664 Mon Sep 17 00:00:00 2001 From: alexandershpak Date: Mon, 25 Feb 2019 16:58:50 +0300 Subject: [PATCH 09/11] feat(core): fix code style (part 3) ENG-700 --- src/services/kubelet-service.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/kubelet-service.js b/src/services/kubelet-service.js index 130345eb4..6a54a3150 100644 --- a/src/services/kubelet-service.js +++ b/src/services/kubelet-service.js @@ -41,7 +41,7 @@ const kubeletGetCapacity = async function(fogNodeUuid, transaction) { const kubeletGetNodeConditions = async function(fogNodeUuid, transaction) { // TODO: to implement } -const kubeletGetNodeAddresses = async function (fogNodeUuid, transaction) { +const kubeletGetNodeAddresses = async function(fogNodeUuid, transaction) { // TODO: to implement } const kubeletGetVkToken = async function(userId, transaction) { From 8206916bb39035379e3a3fe8afcf9cbe41672ee4 Mon Sep 17 00:00:00 2001 From: alexandershpak Date: Mon, 25 Feb 2019 18:42:53 +0300 Subject: [PATCH 10/11] feat(core): increase expiration time ENG-717 --- src/controllers/kubelet-controller.js | 7 ++++--- src/services/kubelet-access-token-service.js | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/controllers/kubelet-controller.js b/src/controllers/kubelet-controller.js index 2affbbb4f..63a0ab7bf 100644 --- a/src/controllers/kubelet-controller.js +++ b/src/controllers/kubelet-controller.js @@ -89,8 +89,9 @@ const kubeletGetVkTokenEndPoint = async function(req, user) { return await KubeletService.kubeletGetVkToken(userId) } -const kubeletGetSchedulerTokenEndPoint = async function() { - return await KubeletService.kubeletGetSchedulerToken() +const kubeletGetSchedulerTokenEndPoint = async function(req, user) { + const userId = user.id + return await KubeletService.kubeletGetSchedulerToken(userId) } module.exports = { @@ -105,5 +106,5 @@ module.exports = { kubeletGetNodeConditionsEndPoint: kubeletGetNodeConditionsEndPoint, kubeletGetNodeAddressesEndPoint: kubeletGetNodeAddressesEndPoint, kubeletGetVkTokenEndPoint: AuthDecorator.checkAuthToken(kubeletGetVkTokenEndPoint), - kubeletGetSchedulerTokenEndPoint: kubeletGetSchedulerTokenEndPoint, + kubeletGetSchedulerTokenEndPoint: AuthDecorator.checkAuthToken(kubeletGetSchedulerTokenEndPoint), } diff --git a/src/services/kubelet-access-token-service.js b/src/services/kubelet-access-token-service.js index 6f007012f..532811d7f 100644 --- a/src/services/kubelet-access-token-service.js +++ b/src/services/kubelet-access-token-service.js @@ -23,7 +23,7 @@ const generateAccessToken = async function(transaction) { token: newAccessToken, }, transaction) if (!exists) { - const accessTokenExpiryTime = Date.now() + Config.get('Settings:KubeletTokenExpirationIntervalSeconds') * 1000 + const accessTokenExpiryTime = Date.now() + Config.get('Settings:KubeletTokenExpirationIntervalSeconds') * 9999999 return { token: newAccessToken, expirationTime: accessTokenExpiryTime, From c043e0b36ecd8dbc9bd48889133b0f92bf6d389f Mon Sep 17 00:00:00 2001 From: alexandershpak Date: Mon, 25 Feb 2019 18:49:07 +0300 Subject: [PATCH 11/11] feat(core): return correct response ENG-717 --- src/services/kubelet-service.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/kubelet-service.js b/src/services/kubelet-service.js index 6a54a3150..8c2623754 100644 --- a/src/services/kubelet-service.js +++ b/src/services/kubelet-service.js @@ -49,7 +49,7 @@ const kubeletGetVkToken = async function(userId, transaction) { await KubeletAccessTokenService.updateAccessToken(userId, newAccessToken, transaction) return { - uuid: fogNodeUuid, + userId: userId, token: newAccessToken.token, } }