Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Migrate platform-sdk utils to serverless/utils tools #536

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
4 changes: 3 additions & 1 deletion lib/deployment/parse.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -1542,7 +1542,6 @@ describe('parseDeploymentData #2', () => {
getAccessKeyForTenant: () => 'access-key',
getApp: () => ({ appUid: 'appUid', tenantUid: 'orgUid' }),
getDeployProfile: () => ({}),
getLoggedInUser: () => ({}),
getMetadata: () => ({ supportedRegions: ['us-east-1'] }),
Deployment: class Deployment {
set() {}
Expand All @@ -1551,6 +1550,9 @@ describe('parseDeploymentData #2', () => {
save() {}
},
},
[require.resolve('@serverless/utils/config')]: {
getLoggedInUser: () => ({}),
},
[require.resolve('simple-git/promise')]: () => ({
checkIsRepo: async () => true,
getRemotes: async () => [{ name: 'origin' }],
Expand Down
8 changes: 4 additions & 4 deletions lib/interactiveCli/index.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
'use strict';

const chalk = require('chalk');
const { getLoggedInUser } = require('@serverless/platform-sdk');
const configUtils = require('@serverless/utils/config');

const { getMetadata } = require('@serverless/platform-sdk');
const { configureDeployProfile } = require('../deployProfile');
Expand Down Expand Up @@ -34,10 +34,10 @@ module.exports = (ctx) => {
}
},
'before:interactiveCli:setupAws': async () => {
const registerCheck = await register.check(ctx.sls);
const registerCheck = await register.check(ctx);
if (registerCheck) {
process.stdout.write('\n');
await register.run(ctx.sls, registerCheck);
await register.run(ctx, registerCheck);
}
const setAppCheck = await setApp.check(ctx.sls);
if (setAppCheck) {
Expand All @@ -50,7 +50,7 @@ ${chalk.green('Your project is setup for monitoring, troubleshooting and testing
`);
// setup deploy if user already logged in so that AWS creds check in SFO works right
// & temporarily add provider to ctx to fetch deploy profile
const user = getLoggedInUser();
const user = configUtils.getLoggedInUser();
if (user) await configureDeployProfile({ ...ctx, provider: ctx.sls.getProvider('aws') });
}
},
Expand Down
2 changes: 0 additions & 2 deletions lib/interactiveCli/index.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,10 @@
const { expect } = require('chai');
const sinon = require('sinon');
const runServerless = require('../../test/run-serverless');
const { getLoggedInUser } = require('@serverless/platform-sdk');
const setAppConfiguration = require('./set-app');

const platformSdkStub = {
configureFetchDefaults: () => {},
getLoggedInUser,
getMetadata: async () => ({
awsAccountId: '377024778620',
supportedRuntimes: ['nodejs8.10', 'nodejs10.x', 'python2.7', 'python3.6', 'python3.7'],
Expand Down
43 changes: 19 additions & 24 deletions lib/interactiveCli/register.js
Original file line number Diff line number Diff line change
@@ -1,17 +1,12 @@
'use strict';

const chalk = require('chalk');
const {
createApp,
getLoggedInUser,
getMetadata,
login,
register: sdkRegister,
writeConfigFile,
} = require('@serverless/platform-sdk');
const { createApp, getMetadata, register: sdkRegister } = require('@serverless/platform-sdk');
const sdkVersion = require('@serverless/platform-sdk/package').version;
const enableConfirm = require('./enableConfirm');
const writeOrgAndApp = require('./writeOrgAndApp');
const login = require('../login');
const configUtils = require('@serverless/utils/config');

const isValidEmail = RegExp.prototype.test.bind(
new RegExp(
Expand Down Expand Up @@ -158,19 +153,19 @@ const validadateRegistrationResponseValue = (name, value) => {
};

const steps = {
registerOrLogin: async (serverless) => {
const { inquirer } = serverless.interactiveCli;
registerOrLogin: async (ctx) => {
const { inquirer } = ctx.sls.interactiveCli;
const registerOrLogin = await registerQuestion(inquirer);
if (registerOrLogin === 'login') {
await login();
await login(ctx);
return;
}
const { ownerUserName, orgName, ownerAccessKey, ownerAuth0Id } = await signUp(inquirer);
validadateRegistrationResponseValue('ownerUserName', ownerUserName);
validadateRegistrationResponseValue('tenantName', orgName);
validadateRegistrationResponseValue('ownerAccessKey', ownerAccessKey);
validadateRegistrationResponseValue('ownerAuth0Id', ownerAuth0Id);
writeConfigFile({
configUtils.set({
userId: ownerAuth0Id,
users: {
[ownerAuth0Id]: {
Expand All @@ -194,36 +189,36 @@ const steps = {

const { appName } = await createApp({
tenant: orgName,
app: `${serverless.service.service}-app`,
app: `${ctx.sls.service.service}-app`,
token: ownerAccessKey,
});

await writeOrgAndApp(serverless, orgName, appName);
await writeOrgAndApp(ctx.sls, orgName, appName);
},
};

module.exports = {
async check(serverless) {
if (!serverless.config.servicePath) return false;
if (serverless.service.provider.name !== 'aws') {
async check(ctx) {
if (!ctx.sls.config.servicePath) return false;
if (ctx.sls.service.provider.name !== 'aws') {
return false;
}
const { supportedRegions, supportedRuntimes } = await getMetadata();
if (!supportedRuntimes.includes(serverless.service.provider.runtime || 'nodejs10.x')) {
if (!supportedRuntimes.includes(ctx.sls.service.provider.runtime || 'nodejs10.x')) {
return false;
}
if (!supportedRegions.includes(serverless.getProvider('aws').getRegion())) {
if (!supportedRegions.includes(ctx.sls.getProvider('aws').getRegion())) {
return false;
}
return !getLoggedInUser();
return !configUtils.getLoggedInUser();
},
async run(serverless) {
const { inquirer } = serverless.interactiveCli;
if (!(await enableConfirm(inquirer, serverless.processedInput.options))) {
async run(ctx) {
const { inquirer } = ctx.sls.interactiveCli;
if (!(await enableConfirm(inquirer, ctx.sls.processedInput.options))) {
return null;
}
process.stdout.write('You are not logged in or you do not have a Serverless account.\n\n');
return steps.registerOrLogin(serverless);
return steps.registerOrLogin(ctx);
},
steps,
};
11 changes: 5 additions & 6 deletions lib/interactiveCli/register.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ const yaml = require('yamljs');
const resolveSync = require('ncjsm/resolve/sync');
const runServerless = require('../../test/run-serverless');
const configureInquirerStub = require('@serverless/test/configure-inquirer-stub');
const { getLoggedInUser, writeConfigFile } = require('@serverless/platform-sdk');
const setAppConfiguration = require('./set-app');
const configUtils = require('@serverless/utils/config');

const setupServerless = require('../../test/setupServerless');

Expand All @@ -22,7 +22,6 @@ const lifecycleHookNamesBlacklist = [
const platformSdkStub = {
configureFetchDefaults: () => {},
createApp: async ({ app }) => ({ appName: app }),
getLoggedInUser,
getMetadata: async () => ({
awsAccountId: '377024778620',
supportedRuntimes: ['nodejs8.10', 'nodejs10.x', 'python2.7', 'python3.6', 'python3.7'],
Expand All @@ -38,7 +37,6 @@ const platformSdkStub = {
'ap-southeast-2',
],
}),
login: sinon.stub().resolves(),
register: async (email, password, userName, orgName) => {
return {
ownerUserName: userName,
Expand All @@ -47,7 +45,6 @@ const platformSdkStub = {
ownerAuth0Id: userName,
};
},
writeConfigFile,
};

describe('interactiveCli: register', function () {
Expand All @@ -56,6 +53,7 @@ describe('interactiveCli: register', function () {
let modulesCacheStub;
let inquirer;
let backupIsTTY;
const loginStub = sinon.stub().resolves();

before(async () => {
backupIsTTY = process.stdin.isTTY;
Expand All @@ -67,6 +65,7 @@ describe('interactiveCli: register', function () {
[require.resolve(inquirerPath)]: inquirer,
[require.resolve('../deployProfile')]: { configureDeployProfile: async () => {} },
[require.resolve('./set-app')]: setAppConfiguration,
[require.resolve('../login')]: loginStub,
[require.resolve('@serverless/platform-sdk')]: platformSdkStub,
};
sinon.stub(setAppConfiguration, 'check').resolves(false);
Expand Down Expand Up @@ -131,7 +130,7 @@ describe('interactiveCli: register', function () {
lifecycleHookNamesBlacklist,
modulesCacheStub,
});
expect(platformSdkStub.login.calledOnce).to.be.true;
expect(loginStub.calledOnce).to.be.true;
});

it('Should not accept invalid email at registration step', async () => {
Expand Down Expand Up @@ -198,7 +197,7 @@ describe('interactiveCli: register', function () {
modulesCacheStub,
hooks: {
after: () => {
registeredUser = getLoggedInUser();
registeredUser = configUtils.getLoggedInUser();
},
},
});
Expand Down
13 changes: 7 additions & 6 deletions lib/interactiveCli/set-app.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,16 @@

const _ = require('lodash');
const chalk = require('chalk');
const accountUtils = require('@serverless/utils/account');
const configUtils = require('@serverless/utils/config');
const { ServerlessSDK } = require('@serverless/platform-client');
const {
createApp,
createDeployProfile,
getApps,
getDeployProfiles,
getLoggedInUser,
getMetadata,
listTenants,
refreshToken,
setDefaultDeploymentProfile,
} = require('@serverless/platform-sdk');
const enableConfirm = require('./enableConfirm');
Expand Down Expand Up @@ -144,8 +145,8 @@ const steps = {
// make a valid representation
for (const org of Object.keys(user.accessKeys)) orgs.add(org);
} else {
await refreshToken();
user = getLoggedInUser();
await accountUtils.refreshToken(new ServerlessSDK());
user = configUtils.getLoggedInUser();
orgs = new Set(
(await listTenants({ username: user.username, idToken: user.idToken })).map(
(org) => org.tenantName
Expand Down Expand Up @@ -206,12 +207,12 @@ module.exports = {
}
if (!supportedRegions.includes(serverless.getProvider('aws').getRegion())) return false;

let user = getLoggedInUser();
let user = configUtils.getLoggedInUser();
if (!user) return false;

const orgNames = await steps.resolveOrgNames(user);
if (!orgNames.size) return false;
user = getLoggedInUser(); // Refreshed, as new token might have been generated
user = configUtils.getLoggedInUser(); // Refreshed, as new token might have been generated

const orgName = serverless.service.org;
const appName = serverless.service.app;
Expand Down
12 changes: 9 additions & 3 deletions lib/interactiveCli/set-app.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,14 @@ const yaml = require('yamljs');
const resolveSync = require('ncjsm/resolve/sync');
const runServerless = require('../..//test/run-serverless');
const configureInquirerStub = require('@serverless/test/configure-inquirer-stub');
const { getLoggedInUser } = require('@serverless/platform-sdk');
const registerConfiguration = require('./register');
const semver = require('semver');

const setupServerless = require('../../test/setupServerless');

const platformSdkPath = require.resolve('@serverless/platform-sdk');
const platformClientPath = require.resolve('@serverless/platform-client');

const lifecycleHookNamesBlacklist = [
'interactiveCli:initializeService',
'interactiveCli:setupAws',
Expand Down Expand Up @@ -53,7 +54,6 @@ describe('interactiveCli: set-app', function () {
{ appName: 'app-from-flag' },
],
getDeployProfiles: async () => [{ deploymentProfileUid: 'some-deploy-profile' }],
getLoggedInUser,
getMetadata: async () => ({
awsAccountId: '377024778620',
supportedRuntimes: ['nodejs10.x', 'nodejs12.x', 'python2.7', 'python3.6', 'python3.7'],
Expand All @@ -71,14 +71,20 @@ describe('interactiveCli: set-app', function () {
}),
listTenants: async () => [{ tenantName: 'testinteractivecli' }, { tenantName: 'otherorg' }],
login: sinon.stub().resolves(),
refreshToken: async () => {},
setDefaultDeploymentProfile: setDefaultDeploymentProfileStub,
};
modulesCacheStub = {
[require.resolve(inquirerPath)]: inquirer,
[require.resolve('./utils')]: { resolveAccessKey: async () => 'token' },
[require.resolve('.//register')]: registerConfiguration,
[require.resolve('../deployProfile')]: { configureDeployProfile: async () => {} },
[platformClientPath]: {
ServerlessSDK: class ServerlessSDK {
async refreshToken() {
return {};
}
},
},
[platformSdkPath]: platformSdkStub,
};
sinon.stub(registerConfiguration, 'check').resolves(false);
Expand Down
5 changes: 3 additions & 2 deletions lib/interactiveCli/utils.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
'use strict';

const { createAccessKeyForTenant, writeConfigFile } = require('@serverless/platform-sdk');
const { createAccessKeyForTenant } = require('@serverless/platform-sdk');
const configUtils = require('@serverless/utils/config');

module.exports = {
resolveAccessKey: async (user, orgName) => {
if (user.accessKeys && user.accessKeys[orgName]) return user.accessKeys[orgName];
const token = await createAccessKeyForTenant(orgName);
await writeConfigFile({
configUtils.set({
users: { [user.userId]: { dashboard: { accessKeys: { [orgName]: token } } } },
});
return token;
Expand Down
4 changes: 2 additions & 2 deletions lib/isAuthenticated.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
'use strict';

const { getLoggedInUser } = require('@serverless/platform-sdk');
const configUtils = require('@serverless/utils/config');

module.exports = () => Boolean(getLoggedInUser() || process.env.SERVERLESS_ACCESS_KEY);
module.exports = () => Boolean(configUtils.getLoggedInUser() || process.env.SERVERLESS_ACCESS_KEY);
35 changes: 18 additions & 17 deletions lib/login.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@

const open = require('open');
const { ServerlessSDK } = require('@serverless/platform-client');
const { urls, readConfigFile, writeConfigFile } = require('@serverless/platform-sdk');
const { urls } = require('@serverless/platform-sdk');
const configUtils = require('@serverless/utils/config');

module.exports = async function (ctx) {
ctx.sls.cli.log('Logging you in via your default browser...');
Expand All @@ -19,27 +20,27 @@ module.exports = async function (ctx) {

const loginData = await loginDataDeferred;

const configFile = readConfigFile();

// prepare login data to save it in the FS
configFile.userId = loginData.id;
configFile.users = configFile.users || {};
configFile.users[loginData.id] = {
const loginDataToSaveInConfig = {
userId: loginData.id,
name: loginData.name,
email: loginData.email,
username: loginData.username,
dashboard: {
refreshToken: loginData.refreshToken,
accessToken: loginData.accessToken,
idToken: loginData.idToken,
expiresAt: loginData.expiresAt,
username: loginData.username,
users: {
[loginData.id]: {
userId: loginData.id,
name: loginData.name,
email: loginData.email,
username: loginData.username,
dashboard: {
refreshToken: loginData.refreshToken,
accessToken: loginData.accessToken,
idToken: loginData.idToken,
expiresAt: loginData.expiresAt,
username: loginData.username,
},
},
},
};

// save the login data in the rc file
writeConfigFile(configFile);
configUtils.set(loginDataToSaveInConfig);

ctx.sls.cli.log('You sucessfully logged in to Serverless.');
if (!ctx.sls.service.org || !ctx.sls.service.app) {
Expand Down