diff --git a/__tests__/e2e/session/run b/__tests__/e2e/session/run index 65775b75..c0916626 100755 --- a/__tests__/e2e/session/run +++ b/__tests__/e2e/session/run @@ -3,6 +3,8 @@ set -e set -v +REGION=${REGION:-cn-hangzhou} + echo "test session operations..." # Deploy function first @@ -11,16 +13,25 @@ s deploy -y # Test create session echo "Testing create session..." -sessionId=$(s cli fc3 session create -a quanxi --region cn-hangzhou --function-name fc3-session-${fc_component_function_name:-test} --qualifier LATEST --session-ttl-in-seconds 3600 --session-idle-timeout-in-seconds 1800 -o json | jq -r '.sessionId') +sessionId=$(s cli fc3 session create --region $REGION --function-name fc3-session-${fc_component_function_name:-test} --qualifier LATEST --session-ttl-in-seconds 3600 --session-idle-timeout-in-seconds 1800 -o json | jq -r '.sessionId') if [ -z "$sessionId" ]; then echo "Failed to create session" exit 1 fi echo "Created session: $sessionId" +# Test create session with disable-session-id-reuse +echo "Testing create session with disable-session-id-reuse..." +sessionIdDisableReuse=$(s cli fc3 session create --region $REGION --function-name fc3-session-${fc_component_function_name:-test} --qualifier LATEST --disable-session-id-reuse -o json | jq -r '.sessionId') +if [ -z "$sessionIdDisableReuse" ]; then + echo "Failed to create session with disable-session-id-reuse" + exit 1 +fi +echo "Created session with disable-session-id-reuse: $sessionIdDisableReuse" + # Test get session echo "Testing get session..." -getSessionResult=$(s cli fc3 session get -a quanxi --region cn-hangzhou --function-name fc3-session-${fc_component_function_name:-test} --session-id $sessionId --qualifier LATEST -o json) +getSessionResult=$(s cli fc3 session get --region $REGION --function-name fc3-session-${fc_component_function_name:-test} --session-id $sessionId --qualifier LATEST -o json) if [ -z "$getSessionResult" ]; then echo "Failed to get session" exit 1 @@ -29,25 +40,25 @@ echo "Get session result: $getSessionResult" # Test update session (update sessionTTLInSeconds) echo "Testing update session with session-ttl-in-seconds..." -updateResult=$(s cli fc3 session update -a quanxi --region cn-hangzhou --function-name fc3-session-${fc_component_function_name:-test} --session-id $sessionId --qualifier LATEST --session-ttl-in-seconds 7200 -o json) +updateResult=$(s cli fc3 session update --region $REGION --function-name fc3-session-${fc_component_function_name:-test} --session-id $sessionId --qualifier LATEST --session-ttl-in-seconds 7200 -o json) if [ -z "$updateResult" ]; then echo "Failed to update session with session-ttl-in-seconds" exit 1 fi echo "Update session result: $updateResult" -# Test update session (update sessionIdleTimeoutInSeconds) -echo "Testing update session with session-idle-timeout-in-seconds..." -updateResult2=$(s cli fc3 session update -a quanxi --region cn-hangzhou --function-name fc3-session-${fc_component_function_name:-test} --session-id $sessionId --qualifier LATEST --session-idle-timeout-in-seconds 3600 -o json) -if [ -z "$updateResult2" ]; then - echo "Failed to update session with session-idle-timeout-in-seconds" +# Test update session with disable-session-id-reuse +echo "Testing update session with disable-session-id-reuse..." +updateDisableReuseResult=$(s cli fc3 session update --region $REGION --function-name fc3-session-${fc_component_function_name:-test} --session-id $sessionId --qualifier LATEST --disable-session-id-reuse -o json) +if [ -z "$updateDisableReuseResult" ]; then + echo "Failed to update session with disable-session-id-reuse" exit 1 fi -echo "Update session result: $updateResult2" +echo "Update session with disable-session-id-reuse result: $updateDisableReuseResult" # Test list sessions echo "Testing list sessions..." -listResult=$(s cli fc3 session list -a quanxi --region cn-hangzhou --function-name fc3-session-${fc_component_function_name:-test} -o json) +listResult=$(s cli fc3 session list --region $REGION --function-name fc3-session-${fc_component_function_name:-test} -o json) if [ -z "$listResult" ]; then echo "Failed to list sessions" exit 1 @@ -56,77 +67,26 @@ echo "List sessions result: $listResult" # Test list sessions with filters echo "Testing list sessions with filters..." -listFilteredResult=$(s cli fc3 session list -a quanxi --region cn-hangzhou --function-name fc3-session-${fc_component_function_name:-test} --session-id $sessionId --qualifier LATEST -o json) +listFilteredResult=$(s cli fc3 session list --region $REGION --function-name fc3-session-${fc_component_function_name:-test} --session-id $sessionId --qualifier LATEST -o json) if [ -z "$listFilteredResult" ]; then echo "Failed to list sessions with filters" exit 1 fi echo "List sessions with filters result: $listFilteredResult" -# Test list sessions with session-status filter -echo "Testing list sessions with session-status filter..." -listStatusResult=$(s cli fc3 session list -a quanxi --region cn-hangzhou --function-name fc3-session-${fc_component_function_name:-test} --session-status Active -o json) +# Test list sessions with session-status filter (correct case) +echo "Testing list sessions with session-status filter (Active)..." +listStatusResult=$(s cli fc3 session list --region $REGION --function-name fc3-session-${fc_component_function_name:-test} --session-status Active -o json) if [ -z "$listStatusResult" ]; then echo "Failed to list sessions with session-status filter" exit 1 fi echo "List sessions with session-status filter result: $listStatusResult" -# Test list sessions with limit parameter -echo "Testing list sessions with limit parameter..." -listLimitResult=$(s cli fc3 session list -a quanxi --region cn-hangzhou --function-name fc3-session-${fc_component_function_name:-test} --limit 5 -o json) -if [ -z "$listLimitResult" ]; then - echo "Failed to list sessions with limit parameter" - exit 1 -fi -echo "List sessions with limit parameter result: $listLimitResult" - -# Test remove session -echo "Testing remove session..." -removeResult=$(s cli fc3 session remove -a quanxi --region cn-hangzhou --function-name fc3-session-${fc_component_function_name:-test} --session-id $sessionId --qualifier LATEST -y -o json) -echo "Remove session result: $removeResult" - -# Verify session is removed by trying to get it (should fail) -echo "Verifying session is removed..." -getRemovedSessionResult=$(s cli fc3 session get -a quanxi --region cn-hangzhou --function-name fc3-session-${fc_component_function_name:-test} --session-id $sessionId --qualifier LATEST -o json 2>&1 || true) -if [[ $getRemovedSessionResult == *"not found"* ]] || [[ $getRemovedSessionResult == *"not exist"* ]]; then - echo "Session successfully removed" -else - echo "Session removal verification failed: $getRemovedSessionResult" - # Don't exit here as this might be a timing issue -fi - -# Test create session without optional parameters (should use defaults) -echo "Testing create session with default parameters..." -sessionId2=$(s cli fc3 session create -a quanxi --region cn-hangzhou --function-name fc3-session-${fc_component_function_name:-test} --qualifier LATEST -o json | jq -r '.sessionId') -if [ -z "$sessionId2" ]; then - echo "Failed to create session with default parameters" - exit 1 -fi -echo "Created session with defaults: $sessionId2" - -# Test create session with only sessionTTLInSeconds -echo "Testing create session with only session-ttl-in-seconds..." -sessionId3=$(s cli fc3 session create -a quanxi --region cn-hangzhou --function-name fc3-session-${fc_component_function_name:-test} --qualifier LATEST --session-ttl-in-seconds 1800 -o json | jq -r '.sessionId') -if [ -z "$sessionId3" ]; then - echo "Failed to create session with only session-ttl-in-seconds" - exit 1 -fi -echo "Created session with only session-ttl-in-seconds: $sessionId3" - -# Test create session with only sessionIdleTimeoutInSeconds -echo "Testing create session with only session-idle-timeout-in-seconds..." -sessionId4=$(s cli fc3 session create -a quanxi --region cn-hangzhou --function-name fc3-session-${fc_component_function_name:-test} --qualifier LATEST --session-idle-timeout-in-seconds 900 -o json | jq -r '.sessionId') -if [ -z "$sessionId4" ]; then - echo "Failed to create session with only session-idle-timeout-in-seconds" - exit 1 -fi -echo "Created session with only session-idle-timeout-in-seconds: $sessionId4" - -# Clean up additional sessions -s cli fc3 session remove -a quanxi --region cn-hangzhou --function-name fc3-session-${fc_component_function_name:-test} --session-id $sessionId2 --qualifier LATEST -y || true -s cli fc3 session remove -a quanxi --region cn-hangzhou --function-name fc3-session-${fc_component_function_name:-test} --session-id $sessionId3 --qualifier LATEST -y || true -s cli fc3 session remove -a quanxi --region cn-hangzhou --function-name fc3-session-${fc_component_function_name:-test} --session-id $sessionId4 --qualifier LATEST -y || true +# Test remove sessions +echo "Testing remove sessions..." +s cli fc3 session remove --region $REGION --function-name fc3-session-${fc_component_function_name:-test} --session-id $sessionId --qualifier LATEST -y || true +s cli fc3 session remove --region $REGION --function-name fc3-session-${fc_component_function_name:-test} --session-id $sessionIdDisableReuse --qualifier LATEST -y || true # Clean up function echo "Cleaning up..." diff --git a/__tests__/e2e/session/s.yaml b/__tests__/e2e/session/s.yaml index 0f936db6..5e00812a 100644 --- a/__tests__/e2e/session/s.yaml +++ b/__tests__/e2e/session/s.yaml @@ -1,9 +1,9 @@ edition: 3.0.0 name: session-test -access: quanxi +access: default vars: - region: ${env('REGION', 'cn-hongkong')} + region: ${env('REGION', 'cn-hangzhou')} resources: sessionTest: diff --git a/__tests__/ut/commands/session_test.ts b/__tests__/ut/commands/session_test.ts index 5af0243b..c4d777b7 100644 --- a/__tests__/ut/commands/session_test.ts +++ b/__tests__/ut/commands/session_test.ts @@ -187,6 +187,153 @@ describe('Session', () => { }, }); }); + + it('should create session with disableSessionIdReuse when provided', async () => { + const mockResult = { + sessionId: 'session-123', + qualifier: 'LATEST', + sessionTTLInSeconds: 3600, + sessionIdleTimeoutInSeconds: 1800, + disableSessionIdReuse: true, + }; + + mockFcSdk.createFunctionSession = jest.fn().mockResolvedValue(mockResult); + mockInputs.args = [ + 'create', + '--qualifier', + 'LATEST', + '--session-ttl-in-seconds', + '3600', + '--session-idle-timeout-in-seconds', + '1800', + '--disable-session-id-reuse', + ]; + session = new Session(mockInputs); + + const result = await session.create(); + expect(result).toEqual(mockResult); + expect(mockFcSdk.createFunctionSession).toHaveBeenCalledWith('test-function', { + qualifier: 'LATEST', + sessionTTLInSeconds: 3600, + sessionIdleTimeoutInSeconds: 1800, + disableSessionIdReuse: true, + }); + }); + + it('should create session with custom sessionId when provided', async () => { + const mockResult = { + sessionId: 'custom-session-id', + qualifier: 'LATEST', + sessionTTLInSeconds: 3600, + sessionIdleTimeoutInSeconds: 1800, + }; + + mockFcSdk.createFunctionSession = jest.fn().mockResolvedValue(mockResult); + mockInputs.args = [ + 'create', + '--qualifier', + 'LATEST', + '--session-ttl-in-seconds', + '3600', + '--session-idle-timeout-in-seconds', + '1800', + '--session-id', + 'custom-session-id', + ]; + session = new Session(mockInputs); + + const result = await session.create(); + expect(result).toEqual(mockResult); + expect(mockFcSdk.createFunctionSession).toHaveBeenCalledWith('test-function', { + qualifier: 'LATEST', + sessionTTLInSeconds: 3600, + sessionIdleTimeoutInSeconds: 1800, + sessionId: 'custom-session-id', + }); + }); + + it('should create session with ossMountConfig when provided', async () => { + const mockResult = { + sessionId: 'session-123', + qualifier: 'LATEST', + sessionTTLInSeconds: 3600, + sessionIdleTimeoutInSeconds: 1800, + }; + + mockFcSdk.createFunctionSession = jest.fn().mockResolvedValue(mockResult); + mockInputs.args = [ + 'create', + '--qualifier', + 'LATEST', + '--session-ttl-in-seconds', + '3600', + '--session-idle-timeout-in-seconds', + '1800', + '--oss-mount-config', + '{"mountPoints":[{"bucketName":"test-bucket","bucketPath":"cn-hangzhou","mountDir":"/mnt/oss","readOnly":false}]}', + ]; + session = new Session(mockInputs); + + const result = await session.create(); + expect(result).toEqual(mockResult); + expect(mockFcSdk.createFunctionSession).toHaveBeenCalledWith('test-function', { + qualifier: 'LATEST', + sessionTTLInSeconds: 3600, + sessionIdleTimeoutInSeconds: 1800, + ossMountConfig: { + mountPoints: [ + { + bucketName: 'test-bucket', + bucketPath: 'cn-hangzhou', + mountDir: '/mnt/oss', + readOnly: false, + }, + ], + }, + }); + }); + + it('should create session with polarFsConfig when provided', async () => { + const mockResult = { + sessionId: 'session-123', + qualifier: 'LATEST', + sessionTTLInSeconds: 3600, + sessionIdleTimeoutInSeconds: 1800, + }; + + mockFcSdk.createFunctionSession = jest.fn().mockResolvedValue(mockResult); + mockInputs.args = [ + 'create', + '--qualifier', + 'LATEST', + '--session-ttl-in-seconds', + '3600', + '--session-idle-timeout-in-seconds', + '1800', + '--polar-fs-config', + '{"userId":1000,"groupId":1000,"mountPoints":[{"polarDbClusterId":"pc-test","instanceId":"pfs-test","mountDir":"/mnt/polar"}]}', + ]; + session = new Session(mockInputs); + + const result = await session.create(); + expect(result).toEqual(mockResult); + expect(mockFcSdk.createFunctionSession).toHaveBeenCalledWith('test-function', { + qualifier: 'LATEST', + sessionTTLInSeconds: 3600, + sessionIdleTimeoutInSeconds: 1800, + polarFsConfig: { + userId: 1000, + groupId: 1000, + mountPoints: [ + { + polarDbClusterId: 'pc-test', + instanceId: 'pfs-test', + mountDir: '/mnt/polar', + }, + ], + }, + }); + }); }); describe('get', () => { @@ -267,6 +414,18 @@ describe('Session', () => { }; mockFcSdk.updateFunctionSession = jest.fn().mockResolvedValue(mockResult); + mockInputs.args = [ + 'update', + '--session-id', + 'session-123', + '--qualifier', + 'LATEST', + '--session-ttl-in-seconds', + '7200', + '--session-idle-timeout-in-seconds', + '3600', + ]; + session = new Session(mockInputs); const result = await session.update(); expect(result).toEqual(mockResult); @@ -321,6 +480,40 @@ describe('Session', () => { 'timeout must be a number between 0 and 21600', ); }); + + it('should update session with disableSessionIdReuse when provided', async () => { + const mockResult = { + sessionId: 'session-123', + qualifier: 'LATEST', + sessionTTLInSeconds: 7200, + sessionIdleTimeoutInSeconds: 3600, + disableSessionIdReuse: true, + }; + + mockFcSdk.updateFunctionSession = jest.fn().mockResolvedValue(mockResult); + mockInputs.args = [ + 'update', + '--session-id', + 'session-123', + '--qualifier', + 'LATEST', + '--session-ttl-in-seconds', + '7200', + '--session-idle-timeout-in-seconds', + '3600', + '--disable-session-id-reuse', + ]; + session = new Session(mockInputs); + + const result = await session.update(); + expect(result).toEqual(mockResult); + expect(mockFcSdk.updateFunctionSession).toHaveBeenCalledWith('test-function', 'session-123', { + qualifier: 'LATEST', + sessionTTLInSeconds: 7200, + sessionIdleTimeoutInSeconds: 3600, + disableSessionIdReuse: true, + }); + }); }); describe('list', () => { diff --git a/package-lock.json b/package-lock.json index 19fb68eb..569bea99 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "dependencies": { "@alicloud/devs20230714": "^2.5.0", "@alicloud/fc2": "^2.6.6", - "@alicloud/fc20230330": "4.6.7", + "@alicloud/fc20230330": "4.6.8", "@alicloud/pop-core": "^1.8.0", "@serverless-cd/srm-aliyun-oss": "^0.0.1-beta.8", "@serverless-cd/srm-aliyun-pop-core": "^0.0.8-beta.1", @@ -23,7 +23,7 @@ "@serverless-devs/load-component": "^0.0.9", "@serverless-devs/utils": "^0.0.17", "@serverless-devs/zip": "^0.0.3-beta.8", - "ajv": "^8.17.1", + "ajv": "^8.18.0", "ali-oss": "6.18.1", "aliyun-sdk": "^1.12.10", "chalk": "^4.1.0", @@ -37,7 +37,6 @@ "ip": "^1.1.8", "lodash": "^4.17.23", "portfinder": "^1.0.38", - "punycode": "^2.3.1", "rimraf": "^3.0.2", "string-random": "^0.1.3", "temp-dir": "^2.0.0", @@ -49,7 +48,7 @@ "@serverless-devs/component-interface": "^0.0.6", "@serverless-devs/logger": "^0.0.5", "@types/jest": "^29.5.14", - "@types/lodash": "^4.17.23", + "@types/lodash": "^4.17.24", "@types/node": "^20.12.11", "@vercel/ncc": "^0.38.4", "f2elint": "^2.2.1", @@ -214,10 +213,9 @@ } }, "node_modules/@alicloud/fc20230330": { - "version": "4.6.7", - "resolved": "https://registry.npmmirror.com/@alicloud/fc20230330/-/fc20230330-4.6.7.tgz", - "integrity": "sha512-VuAdk6aPvIchVBSzj8EDIye8srrgYpnfRP2BPqAFSqjOFYdrb5UbVWpjWWee+8N1WYfw0H/MshkCWC52pria4w==", - "license": "Apache-2.0", + "version": "4.6.8", + "resolved": "https://registry.npmjs.org/@alicloud/fc20230330/-/fc20230330-4.6.8.tgz", + "integrity": "sha512-RNgaPYr9SOCn3tjB5KxKnmawbc6IGjOhDmrWGyWSjGHRFoX/uCKS/eZJM2twyyqiC1XauAfNWSS6Ax9uhJB0kQ==", "dependencies": { "@alicloud/openapi-core": "^1.0.0", "@darabonba/typescript": "^1.0.0" @@ -3005,11 +3003,10 @@ "dev": true }, "node_modules/@types/lodash": { - "version": "4.17.23", - "resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.17.23.tgz", - "integrity": "sha512-RDvF6wTulMPjrNdCoYRC8gNR880JNGT8uB+REUpC2Ns4pRqQJhGz90wh7rgdXDPpCczF3VGktDuFGVnz8zP7HA==", - "dev": true, - "license": "MIT" + "version": "4.17.24", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.24.tgz", + "integrity": "sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==", + "dev": true }, "node_modules/@types/mdast": { "version": "3.0.15", @@ -3480,10 +3477,9 @@ } }, "node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://packages.aliyun.com/670e108663cd360abfe4be65/npm/npm-registry/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "license": "MIT", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -12269,6 +12265,7 @@ "version": "2.3.1", "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, "engines": { "node": ">=6" } @@ -15710,9 +15707,9 @@ } }, "@alicloud/fc20230330": { - "version": "4.6.7", - "resolved": "https://registry.npmmirror.com/@alicloud/fc20230330/-/fc20230330-4.6.7.tgz", - "integrity": "sha512-VuAdk6aPvIchVBSzj8EDIye8srrgYpnfRP2BPqAFSqjOFYdrb5UbVWpjWWee+8N1WYfw0H/MshkCWC52pria4w==", + "version": "4.6.8", + "resolved": "https://registry.npmjs.org/@alicloud/fc20230330/-/fc20230330-4.6.8.tgz", + "integrity": "sha512-RNgaPYr9SOCn3tjB5KxKnmawbc6IGjOhDmrWGyWSjGHRFoX/uCKS/eZJM2twyyqiC1XauAfNWSS6Ax9uhJB0kQ==", "requires": { "@alicloud/openapi-core": "^1.0.0", "@darabonba/typescript": "^1.0.0" @@ -17909,9 +17906,9 @@ "dev": true }, "@types/lodash": { - "version": "4.17.23", - "resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.17.23.tgz", - "integrity": "sha512-RDvF6wTulMPjrNdCoYRC8gNR880JNGT8uB+REUpC2Ns4pRqQJhGz90wh7rgdXDPpCczF3VGktDuFGVnz8zP7HA==", + "version": "4.17.24", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.24.tgz", + "integrity": "sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==", "dev": true }, "@types/mdast": { @@ -18230,9 +18227,9 @@ } }, "ajv": { - "version": "8.17.1", - "resolved": "https://packages.aliyun.com/670e108663cd360abfe4be65/npm/npm-registry/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "requires": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -24525,7 +24522,8 @@ "punycode": { "version": "2.3.1", "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==" + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true }, "pure-rand": { "version": "6.1.0", diff --git a/src/commands-help/session.ts b/src/commands-help/session.ts index dd92f6bd..509f486c 100644 --- a/src/commands-help/session.ts +++ b/src/commands-help/session.ts @@ -49,7 +49,10 @@ Examples with CLI: Examples with CLI: $ s cli fc3 session create --region cn-hangzhou --function-name my-function --qualifier LATEST --session-ttl-in-seconds 600 -a default - $ s cli fc3 session create --region cn-hangzhou --function-name my-function --qualifier LATEST --nas-config '{"userId": 1000, "groupId": 1000, "mountPoints": [{"serverAddr": "example.nas.aliyuncs.com:/", "mountDir": "/mnt/nas", "enableTLS": true}]}' -a default`, + $ s cli fc3 session create --region cn-hangzhou --function-name my-function --qualifier LATEST --nas-config '{"userId": 1000, "groupId": 1000, "mountPoints": [{"serverAddr": "example.nas.aliyuncs.com:/", "mountDir": "/mnt/nas", "enableTLS": true}]}' -a default + $ s cli fc3 session create --region cn-hangzhou --function-name my-function --qualifier LATEST --oss-mount-config '{"mountPoints": [{"bucketName": "my-bucket", "bucketPath": "cn-hangzhou", "mountDir": "/mnt/oss", "readOnly": false}]}' -a default + $ s cli fc3 session create --region cn-hangzhou --function-name my-function --qualifier LATEST --polar-fs-config '{"userId": 1000, "groupId": 1000, "mountPoints": [{"instanceId": "pc-xxx", "mountDir": "/mnt/polar", "remoteDir": "/"}]}' -a default + $ s cli fc3 session create --region cn-hangzhou --function-name my-function --qualifier LATEST --session-id custom-session-id --disable-session-id-reuse -a default`, summary: 'Create a new session', option: [ @@ -59,6 +62,7 @@ Examples with CLI: ], ['--function-name ', '[C-Required] Specify function name'], ['--qualifier ', '[Required] Specify the qualifier parameter'], + ['--session-id ', '[Optional] Custom session ID'], [ '--st, --session-ttl-in-seconds ', '[Optional] Session TTL in seconds, between 0 and 21600, default 21600', @@ -67,7 +71,10 @@ Examples with CLI: '--si, --session-idle-timeout-in-seconds ', '[Optional] Session idle timeout in seconds, between 0 and 21600, default 1800', ], + ['--dsr, --disable-session-id-reuse', '[Optional] Disable session ID reuse'], ['--nas-config ', '[Optional] Set the nasConfig.'], + ['--oss-mount-config ', '[Optional] Set the ossMountConfig.'], + ['--polar-fs-config ', '[Optional] Set the polarFsConfig.'], ], }, }, @@ -96,7 +103,8 @@ Examples with CLI: description: `Update a session. Examples with CLI: - $ s cli fc3 session update --region cn-hangzhou --function-name my-function --session-id session-123 --qualifier LATEST --session-ttl-in-seconds 900 -a default`, + $ s cli fc3 session update --region cn-hangzhou --function-name my-function --session-id session-123 --qualifier LATEST --session-ttl-in-seconds 900 -a default + $ s cli fc3 session update --region cn-hangzhou --function-name my-function --session-id session-123 --qualifier LATEST --disable-session-id-reuse -a default`, summary: 'Update a session', option: [ [ @@ -108,12 +116,13 @@ Examples with CLI: ['--qualifier ', '[Required] Specify the qualifier parameter'], [ '--st, --session-ttl-in-seconds ', - '[Optional] Session TTL in seconds, between 0 and 21600', + '[Optional] Session TTL in seconds, between 0 and 2512917', ], [ '--si, --session-idle-timeout-in-seconds ', '[Optional] Session idle timeout in seconds, between 0 and 21600', ], + ['--dsr, --disable-session-id-reuse', '[Optional] Disable session ID reuse'], ], }, }, diff --git a/src/resources/fc/impl/utils.ts b/src/resources/fc/impl/utils.ts index e8039006..e4df8560 100644 --- a/src/resources/fc/impl/utils.ts +++ b/src/resources/fc/impl/utils.ts @@ -126,7 +126,7 @@ export const getCustomEndpoint = ( return { protocol: 'https', - host: endpoint, - endpoint: `https://${endpoint}`, + host: CUSTOM_ENDPOINT, + endpoint: `https://${CUSTOM_ENDPOINT}`, }; }; diff --git a/src/resources/fc/index.ts b/src/resources/fc/index.ts index 571f3fd7..22d5dcd4 100644 --- a/src/resources/fc/index.ts +++ b/src/resources/fc/index.ts @@ -19,6 +19,10 @@ import { CreateSessionInput, NASConfig, NASMountConfig, + OSSMountConfig, + OSSMountPoint, + PolarFsConfig, + PolarFsMountConfig, DeleteSessionRequest, GetSessionRequest, ListSessionsRequest, @@ -966,7 +970,7 @@ export default class FC extends FC_Client { } async createFunctionSession(functionName: string, config: any) { - let createSessionInput: CreateSessionInput; + let nasConfig: NASConfig | undefined; if (config.nasConfig && !_.isEmpty(config.nasConfig.mountPoints)) { const mountPoints = config.nasConfig.mountPoints.map( (mountPoint: any) => @@ -976,23 +980,57 @@ export default class FC extends FC_Client { serverAddr: mountPoint.serverAddr, }), ); - const nasConfig = new NASConfig({ + nasConfig = new NASConfig({ groupId: config.nasConfig.groupId, mountPoints, userId: config.nasConfig.userId, }); - createSessionInput = new CreateSessionInput({ - sessionTTLInSeconds: config.sessionTTLInSeconds, - sessionIdleTimeoutInSeconds: config.sessionIdleTimeoutInSeconds, - nasConfig, + } + + let ossMountConfig: OSSMountConfig | undefined; + if (config.ossMountConfig && !_.isEmpty(config.ossMountConfig.mountPoints)) { + const mountPoints = config.ossMountConfig.mountPoints.map( + (mountPoint: any) => + new OSSMountPoint({ + bucketName: mountPoint.bucketName, + bucketPath: mountPoint.bucketPath, + endpoint: mountPoint.endpoint, + mountDir: mountPoint.mountDir, + readOnly: mountPoint.readOnly, + }), + ); + ossMountConfig = new OSSMountConfig({ + mountPoints, }); - } else { - createSessionInput = new CreateSessionInput({ - sessionTTLInSeconds: config.sessionTTLInSeconds, - sessionIdleTimeoutInSeconds: config.sessionIdleTimeoutInSeconds, + } + + let polarFsConfig: PolarFsConfig | undefined; + if (config.polarFsConfig && !_.isEmpty(config.polarFsConfig.mountPoints)) { + const mountPoints = config.polarFsConfig.mountPoints.map( + (mountPoint: any) => + new PolarFsMountConfig({ + instanceId: mountPoint.instanceId, + mountDir: mountPoint.mountDir, + remoteDir: mountPoint.remoteDir, + }), + ); + polarFsConfig = new PolarFsConfig({ + groupId: config.polarFsConfig.groupId, + mountPoints, + userId: config.polarFsConfig.userId, }); } + const createSessionInput = new CreateSessionInput({ + disableSessionIdReuse: config.disableSessionIdReuse, + nasConfig, + ossMountConfig, + polarFsConfig, + sessionId: config.sessionId, + sessionTTLInSeconds: config.sessionTTLInSeconds, + sessionIdleTimeoutInSeconds: config.sessionIdleTimeoutInSeconds, + }); + const createSessionRequest = new CreateSessionRequest({ qualifier: config.qualifier, body: createSessionInput, @@ -1015,6 +1053,7 @@ export default class FC extends FC_Client { async updateFunctionSession(functionName: string, sessionId: string, config: any) { const updateSessionInput = new UpdateSessionInput({ + disableSessionIdReuse: config.disableSessionIdReuse, sessionTTLInSeconds: config.sessionTTLInSeconds, sessionIdleTimeoutInSeconds: config.sessionIdleTimeoutInSeconds, }); diff --git a/src/subCommands/session/index.ts b/src/subCommands/session/index.ts index 2e5a6845..d1128708 100644 --- a/src/subCommands/session/index.ts +++ b/src/subCommands/session/index.ts @@ -16,6 +16,8 @@ export default class Session { private opts: any; private yes: boolean; private nasConfig: any; + private ossMountConfig: any; + private polarFsConfig: any; constructor(readonly inputs: IInputs) { const opts = parseArgv(inputs.args, { @@ -24,8 +26,11 @@ export default class Session { 'assume-yes': 'y', 'session-ttl-in-seconds': 'st', 'session-idle-timeout-in-seconds': 'si', + 'disable-session-id-reuse': 'dsr', + 'oss-mount-config': 'omc', + 'polar-fs-config': 'pfc', }, - boolean: ['help', 'y'], + boolean: ['help', 'y', 'disable-session-id-reuse'], string: [ 'region', 'function-name', @@ -36,6 +41,8 @@ export default class Session { 'next-token', 'session-status', 'nas-config', + 'oss-mount-config', + 'polar-fs-config', ], }); logger.debug(`Session opts: ${JSON.stringify(opts)}`); @@ -72,10 +79,26 @@ export default class Session { this.nasConfig = opts['nas-config']; } } + if (opts['oss-mount-config']) { + try { + this.ossMountConfig = JSON.parse(opts['oss-mount-config']); + } catch (error) { + this.ossMountConfig = opts['oss-mount-config']; + } + } + if (opts['polar-fs-config']) { + try { + this.polarFsConfig = JSON.parse(opts['polar-fs-config']); + } catch (error) { + this.polarFsConfig = opts['polar-fs-config']; + } + } } async create() { const qualifier = this.opts.qualifier || 'LATEST'; + const sessionId = this.opts['session-id']; + const disableSessionIdReuse = this.opts['disable-session-id-reuse']; const sessionTTLInSeconds = this.opts['session-ttl-in-seconds'] ? parseInt(this.opts['session-ttl-in-seconds'], 10) : 21600; @@ -105,10 +128,14 @@ export default class Session { const config: any = {}; if (qualifier) config.qualifier = qualifier; + if (sessionId) config.sessionId = sessionId; + if (disableSessionIdReuse) config.disableSessionIdReuse = disableSessionIdReuse; if (sessionTTLInSeconds) config.sessionTTLInSeconds = sessionTTLInSeconds; if (sessionIdleTimeoutInSeconds) config.sessionIdleTimeoutInSeconds = sessionIdleTimeoutInSeconds; if (this.nasConfig) config.nasConfig = this.nasConfig; + if (this.ossMountConfig) config.ossMountConfig = this.ossMountConfig; + if (this.polarFsConfig) config.polarFsConfig = this.polarFsConfig; try { const result = await this.fcSdk.createFunctionSession(this.functionName, config); @@ -146,6 +173,7 @@ export default class Session { async update() { const sessionId = this.opts['session-id']; const { qualifier } = this.opts; + const disableSessionIdReuse = this.opts['disable-session-id-reuse']; const sessionTTLInSeconds = parseInt(this.opts['session-ttl-in-seconds'], 10); const sessionIdleTimeoutInSeconds = this.opts['session-idle-timeout-in-seconds'] ? parseInt(this.opts['session-idle-timeout-in-seconds'], 10) @@ -176,6 +204,7 @@ export default class Session { const config: any = {}; if (qualifier) config.qualifier = qualifier; + if (disableSessionIdReuse) config.disableSessionIdReuse = disableSessionIdReuse; if (sessionTTLInSeconds) config.sessionTTLInSeconds = sessionTTLInSeconds; if (sessionIdleTimeoutInSeconds) config.sessionIdleTimeoutInSeconds = sessionIdleTimeoutInSeconds;