@friggframework/devtools 2.0.0-next.4 → 2.0.0-next.41
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/frigg-cli/.eslintrc.js +141 -0
- package/frigg-cli/__tests__/jest.config.js +102 -0
- package/frigg-cli/__tests__/unit/commands/build.test.js +483 -0
- package/frigg-cli/__tests__/unit/commands/install.test.js +418 -0
- package/frigg-cli/__tests__/unit/commands/ui.test.js +592 -0
- package/frigg-cli/__tests__/utils/command-tester.js +170 -0
- package/frigg-cli/__tests__/utils/mock-factory.js +270 -0
- package/frigg-cli/__tests__/utils/test-fixtures.js +463 -0
- package/frigg-cli/__tests__/utils/test-setup.js +286 -0
- package/frigg-cli/build-command/index.js +54 -0
- package/frigg-cli/deploy-command/index.js +175 -0
- package/frigg-cli/generate-command/__tests__/generate-command.test.js +312 -0
- package/frigg-cli/generate-command/azure-generator.js +43 -0
- package/frigg-cli/generate-command/gcp-generator.js +47 -0
- package/frigg-cli/generate-command/index.js +332 -0
- package/frigg-cli/generate-command/terraform-generator.js +555 -0
- package/frigg-cli/generate-iam-command.js +115 -0
- package/frigg-cli/index.js +47 -1
- package/frigg-cli/index.test.js +1 -4
- package/frigg-cli/init-command/backend-first-handler.js +756 -0
- package/frigg-cli/init-command/index.js +93 -0
- package/frigg-cli/init-command/template-handler.js +143 -0
- package/frigg-cli/install-command/index.js +1 -4
- package/frigg-cli/package.json +51 -0
- package/frigg-cli/start-command/index.js +30 -4
- package/frigg-cli/start-command/start-command.test.js +155 -0
- package/frigg-cli/test/init-command.test.js +180 -0
- package/frigg-cli/test/npm-registry.test.js +319 -0
- package/frigg-cli/ui-command/index.js +154 -0
- package/frigg-cli/utils/app-resolver.js +319 -0
- package/frigg-cli/utils/backend-path.js +16 -17
- package/frigg-cli/utils/npm-registry.js +167 -0
- package/frigg-cli/utils/process-manager.js +199 -0
- package/frigg-cli/utils/repo-detection.js +405 -0
- package/infrastructure/DEPLOYMENT-INSTRUCTIONS.md +268 -0
- package/infrastructure/GENERATE-IAM-DOCS.md +278 -0
- package/infrastructure/IAM-POLICY-TEMPLATES.md +176 -0
- package/infrastructure/README.md +443 -0
- package/infrastructure/WEBSOCKET-CONFIGURATION.md +105 -0
- package/infrastructure/__tests__/fixtures/mock-aws-resources.js +391 -0
- package/infrastructure/__tests__/helpers/test-utils.js +277 -0
- package/infrastructure/aws-discovery.js +1176 -0
- package/infrastructure/aws-discovery.test.js +1220 -0
- package/infrastructure/build-time-discovery.js +206 -0
- package/infrastructure/build-time-discovery.test.js +378 -0
- package/infrastructure/create-frigg-infrastructure.js +3 -5
- package/infrastructure/env-validator.js +77 -0
- package/infrastructure/frigg-deployment-iam-stack.yaml +401 -0
- package/infrastructure/iam-generator.js +836 -0
- package/infrastructure/iam-generator.test.js +172 -0
- package/infrastructure/iam-policy-basic.json +218 -0
- package/infrastructure/iam-policy-full.json +288 -0
- package/infrastructure/integration.test.js +383 -0
- package/infrastructure/run-discovery.js +110 -0
- package/infrastructure/serverless-template.js +1493 -138
- package/infrastructure/serverless-template.test.js +1804 -0
- package/management-ui/.eslintrc.js +22 -0
- package/management-ui/README.md +203 -0
- package/management-ui/components.json +21 -0
- package/management-ui/docs/phase2-integration-guide.md +320 -0
- package/management-ui/index.html +13 -0
- package/management-ui/package-lock.json +16517 -0
- package/management-ui/package.json +76 -0
- package/management-ui/packages/devtools/frigg-cli/ui-command/index.js +302 -0
- package/management-ui/postcss.config.js +6 -0
- package/management-ui/server/api/backend.js +256 -0
- package/management-ui/server/api/cli.js +315 -0
- package/management-ui/server/api/codegen.js +663 -0
- package/management-ui/server/api/connections.js +857 -0
- package/management-ui/server/api/discovery.js +185 -0
- package/management-ui/server/api/environment/index.js +1 -0
- package/management-ui/server/api/environment/router.js +378 -0
- package/management-ui/server/api/environment.js +328 -0
- package/management-ui/server/api/integrations.js +876 -0
- package/management-ui/server/api/logs.js +248 -0
- package/management-ui/server/api/monitoring.js +282 -0
- package/management-ui/server/api/open-ide.js +31 -0
- package/management-ui/server/api/project.js +1029 -0
- package/management-ui/server/api/users/sessions.js +371 -0
- package/management-ui/server/api/users/simulation.js +254 -0
- package/management-ui/server/api/users.js +362 -0
- package/management-ui/server/api-contract.md +275 -0
- package/management-ui/server/index.js +873 -0
- package/management-ui/server/middleware/errorHandler.js +93 -0
- package/management-ui/server/middleware/security.js +32 -0
- package/management-ui/server/processManager.js +296 -0
- package/management-ui/server/server.js +346 -0
- package/management-ui/server/services/aws-monitor.js +413 -0
- package/management-ui/server/services/npm-registry.js +347 -0
- package/management-ui/server/services/template-engine.js +538 -0
- package/management-ui/server/utils/cliIntegration.js +220 -0
- package/management-ui/server/utils/environment/auditLogger.js +471 -0
- package/management-ui/server/utils/environment/awsParameterStore.js +264 -0
- package/management-ui/server/utils/environment/encryption.js +278 -0
- package/management-ui/server/utils/environment/envFileManager.js +286 -0
- package/management-ui/server/utils/import-commonjs.js +28 -0
- package/management-ui/server/utils/response.js +83 -0
- package/management-ui/server/websocket/handler.js +325 -0
- package/management-ui/src/App.jsx +109 -0
- package/management-ui/src/assets/FriggLogo.svg +1 -0
- package/management-ui/src/components/AppRouter.jsx +65 -0
- package/management-ui/src/components/Button.jsx +70 -0
- package/management-ui/src/components/Card.jsx +97 -0
- package/management-ui/src/components/EnvironmentCompare.jsx +400 -0
- package/management-ui/src/components/EnvironmentEditor.jsx +372 -0
- package/management-ui/src/components/EnvironmentImportExport.jsx +469 -0
- package/management-ui/src/components/EnvironmentSchema.jsx +491 -0
- package/management-ui/src/components/EnvironmentSecurity.jsx +463 -0
- package/management-ui/src/components/ErrorBoundary.jsx +73 -0
- package/management-ui/src/components/IntegrationCard.jsx +481 -0
- package/management-ui/src/components/IntegrationCardEnhanced.jsx +770 -0
- package/management-ui/src/components/IntegrationExplorer.jsx +379 -0
- package/management-ui/src/components/IntegrationStatus.jsx +336 -0
- package/management-ui/src/components/Layout.jsx +716 -0
- package/management-ui/src/components/LoadingSpinner.jsx +113 -0
- package/management-ui/src/components/RepositoryPicker.jsx +248 -0
- package/management-ui/src/components/SessionMonitor.jsx +350 -0
- package/management-ui/src/components/StatusBadge.jsx +208 -0
- package/management-ui/src/components/UserContextSwitcher.jsx +212 -0
- package/management-ui/src/components/UserSimulation.jsx +327 -0
- package/management-ui/src/components/Welcome.jsx +434 -0
- package/management-ui/src/components/codegen/APIEndpointGenerator.jsx +637 -0
- package/management-ui/src/components/codegen/APIModuleSelector.jsx +227 -0
- package/management-ui/src/components/codegen/CodeGenerationWizard.jsx +247 -0
- package/management-ui/src/components/codegen/CodePreviewEditor.jsx +316 -0
- package/management-ui/src/components/codegen/DynamicModuleForm.jsx +271 -0
- package/management-ui/src/components/codegen/FormBuilder.jsx +737 -0
- package/management-ui/src/components/codegen/IntegrationGenerator.jsx +855 -0
- package/management-ui/src/components/codegen/ProjectScaffoldWizard.jsx +797 -0
- package/management-ui/src/components/codegen/SchemaBuilder.jsx +303 -0
- package/management-ui/src/components/codegen/TemplateSelector.jsx +586 -0
- package/management-ui/src/components/codegen/index.js +10 -0
- package/management-ui/src/components/connections/ConnectionConfigForm.jsx +362 -0
- package/management-ui/src/components/connections/ConnectionHealthMonitor.jsx +182 -0
- package/management-ui/src/components/connections/ConnectionTester.jsx +200 -0
- package/management-ui/src/components/connections/EntityRelationshipMapper.jsx +292 -0
- package/management-ui/src/components/connections/OAuthFlow.jsx +204 -0
- package/management-ui/src/components/connections/index.js +5 -0
- package/management-ui/src/components/index.js +21 -0
- package/management-ui/src/components/monitoring/APIGatewayMetrics.jsx +222 -0
- package/management-ui/src/components/monitoring/LambdaMetrics.jsx +169 -0
- package/management-ui/src/components/monitoring/MetricsChart.jsx +197 -0
- package/management-ui/src/components/monitoring/MonitoringDashboard.jsx +393 -0
- package/management-ui/src/components/monitoring/SQSMetrics.jsx +246 -0
- package/management-ui/src/components/monitoring/index.js +6 -0
- package/management-ui/src/components/monitoring/monitoring.css +218 -0
- package/management-ui/src/components/theme-provider.jsx +52 -0
- package/management-ui/src/components/theme-toggle.jsx +39 -0
- package/management-ui/src/components/ui/badge.tsx +36 -0
- package/management-ui/src/components/ui/button.test.jsx +56 -0
- package/management-ui/src/components/ui/button.tsx +57 -0
- package/management-ui/src/components/ui/card.tsx +76 -0
- package/management-ui/src/components/ui/dropdown-menu.tsx +199 -0
- package/management-ui/src/components/ui/select.tsx +157 -0
- package/management-ui/src/components/ui/skeleton.jsx +15 -0
- package/management-ui/src/hooks/useFrigg.jsx +601 -0
- package/management-ui/src/hooks/useSocket.jsx +58 -0
- package/management-ui/src/index.css +193 -0
- package/management-ui/src/lib/utils.ts +6 -0
- package/management-ui/src/main.jsx +10 -0
- package/management-ui/src/pages/CodeGeneration.jsx +14 -0
- package/management-ui/src/pages/Connections.jsx +252 -0
- package/management-ui/src/pages/ConnectionsEnhanced.jsx +633 -0
- package/management-ui/src/pages/Dashboard.jsx +311 -0
- package/management-ui/src/pages/Environment.jsx +314 -0
- package/management-ui/src/pages/IntegrationConfigure.jsx +669 -0
- package/management-ui/src/pages/IntegrationDiscovery.jsx +567 -0
- package/management-ui/src/pages/IntegrationTest.jsx +742 -0
- package/management-ui/src/pages/Integrations.jsx +253 -0
- package/management-ui/src/pages/Monitoring.jsx +17 -0
- package/management-ui/src/pages/Simulation.jsx +155 -0
- package/management-ui/src/pages/Users.jsx +492 -0
- package/management-ui/src/services/api.js +41 -0
- package/management-ui/src/services/apiModuleService.js +193 -0
- package/management-ui/src/services/websocket-handlers.js +120 -0
- package/management-ui/src/test/api/project.test.js +273 -0
- package/management-ui/src/test/components/Welcome.test.jsx +378 -0
- package/management-ui/src/test/mocks/server.js +178 -0
- package/management-ui/src/test/setup.js +61 -0
- package/management-ui/src/test/utils/test-utils.jsx +134 -0
- package/management-ui/src/utils/repository.js +98 -0
- package/management-ui/src/utils/repository.test.js +118 -0
- package/management-ui/src/workflows/phase2-integration-workflows.js +884 -0
- package/management-ui/tailwind.config.js +63 -0
- package/management-ui/tsconfig.json +37 -0
- package/management-ui/tsconfig.node.json +10 -0
- package/management-ui/vite.config.js +26 -0
- package/management-ui/vitest.config.js +38 -0
- package/package.json +20 -9
- package/infrastructure/app-handler-helpers.js +0 -57
- package/infrastructure/backend-utils.js +0 -90
- package/infrastructure/routers/auth.js +0 -26
- package/infrastructure/routers/integration-defined-routers.js +0 -37
- package/infrastructure/routers/middleware/loadUser.js +0 -15
- package/infrastructure/routers/middleware/requireLoggedInUser.js +0 -12
- package/infrastructure/routers/user.js +0 -41
- package/infrastructure/routers/websocket.js +0 -55
- package/infrastructure/workers/integration-defined-workers.js +0 -24
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# WebSocket Configuration for Frigg Applications
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
WebSockets in Frigg applications are now **disabled by default** and can be enabled through the AppDefinition configuration. This allows applications that don't need real-time communication to avoid deploying unnecessary WebSocket infrastructure.
|
|
6
|
+
|
|
7
|
+
## Enabling WebSockets
|
|
8
|
+
|
|
9
|
+
To enable WebSocket support in your Frigg application, add the `websockets` configuration to your AppDefinition:
|
|
10
|
+
|
|
11
|
+
```javascript
|
|
12
|
+
// backend/index.js
|
|
13
|
+
const appDefinition = {
|
|
14
|
+
integrations: [YourIntegration],
|
|
15
|
+
websockets: {
|
|
16
|
+
enable: true // Enable WebSocket support
|
|
17
|
+
},
|
|
18
|
+
// ... other configuration
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
module.exports = {
|
|
22
|
+
Definition: appDefinition,
|
|
23
|
+
};
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## What Happens When WebSockets Are Enabled
|
|
27
|
+
|
|
28
|
+
When you set `websockets.enable: true`, the following resources are deployed:
|
|
29
|
+
|
|
30
|
+
1. **WebSocket API Gateway** - AWS API Gateway WebSocket endpoint
|
|
31
|
+
2. **Lambda Functions** - Handlers for `$connect`, `$disconnect`, and `$default` routes
|
|
32
|
+
3. **Database Collection** - MongoDB collection to store active WebSocket connections
|
|
33
|
+
4. **Environment Variable** - `WEBSOCKET_API_ENDPOINT` is automatically configured
|
|
34
|
+
|
|
35
|
+
## Using WebSockets in Your Application
|
|
36
|
+
|
|
37
|
+
Once enabled, you can use the `WebsocketConnection` model to send messages to connected clients:
|
|
38
|
+
|
|
39
|
+
```javascript
|
|
40
|
+
const { WebsocketConnection } = require('@friggframework/core');
|
|
41
|
+
|
|
42
|
+
// Get all active connections and send a message
|
|
43
|
+
const connections = await WebsocketConnection.getActiveConnections();
|
|
44
|
+
for (const connection of connections) {
|
|
45
|
+
await connection.send({
|
|
46
|
+
type: 'update',
|
|
47
|
+
data: { message: 'Hello from server!' }
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Default Behavior (WebSockets Disabled)
|
|
53
|
+
|
|
54
|
+
When websockets are disabled (the default):
|
|
55
|
+
- No WebSocket infrastructure is deployed
|
|
56
|
+
- `WebsocketConnection.getActiveConnections()` returns an empty array
|
|
57
|
+
- No `WEBSOCKET_API_ENDPOINT` environment variable is set
|
|
58
|
+
- No additional Lambda functions or API Gateway resources are created
|
|
59
|
+
|
|
60
|
+
## Use Cases for WebSockets
|
|
61
|
+
|
|
62
|
+
Enable WebSockets when you need:
|
|
63
|
+
- Real-time updates for integration sync status
|
|
64
|
+
- Live streaming of data processing progress
|
|
65
|
+
- Push notifications to connected clients
|
|
66
|
+
- Real-time collaboration features
|
|
67
|
+
|
|
68
|
+
## Cost Considerations
|
|
69
|
+
|
|
70
|
+
Disabling WebSockets by default helps reduce costs by:
|
|
71
|
+
- Avoiding API Gateway WebSocket charges when not needed
|
|
72
|
+
- Reducing Lambda function invocations
|
|
73
|
+
- Eliminating unnecessary database operations for connection management
|
|
74
|
+
|
|
75
|
+
## Migration Guide
|
|
76
|
+
|
|
77
|
+
If you have an existing Frigg application that uses WebSockets:
|
|
78
|
+
|
|
79
|
+
1. Add the websockets configuration to your AppDefinition:
|
|
80
|
+
```javascript
|
|
81
|
+
websockets: {
|
|
82
|
+
enable: true
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
2. Redeploy your application:
|
|
87
|
+
```bash
|
|
88
|
+
npx frigg deploy
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Your WebSocket functionality will continue to work as before.
|
|
92
|
+
|
|
93
|
+
## Troubleshooting
|
|
94
|
+
|
|
95
|
+
### WebSocket Connection Errors
|
|
96
|
+
If you see errors related to WebSocket connections, ensure:
|
|
97
|
+
1. WebSockets are enabled in your AppDefinition
|
|
98
|
+
2. The application has been redeployed after enabling WebSockets
|
|
99
|
+
3. The `WEBSOCKET_API_ENDPOINT` environment variable is set (automatically done during deployment)
|
|
100
|
+
|
|
101
|
+
### WebsocketConnection.getActiveConnections() Returns Empty Array
|
|
102
|
+
This is expected behavior when:
|
|
103
|
+
- WebSockets are disabled (default)
|
|
104
|
+
- No clients are currently connected
|
|
105
|
+
- The `WEBSOCKET_API_ENDPOINT` environment variable is not set
|
|
@@ -0,0 +1,391 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mock AWS resources for consistent testing across all VPC/KMS/SSM tests
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
const mockVpc = {
|
|
6
|
+
VpcId: 'vpc-12345678',
|
|
7
|
+
IsDefault: true,
|
|
8
|
+
State: 'available',
|
|
9
|
+
CidrBlock: '10.0.0.0/16',
|
|
10
|
+
DhcpOptionsId: 'dopt-12345678',
|
|
11
|
+
InstanceTenancy: 'default'
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
const mockSubnets = [
|
|
15
|
+
{
|
|
16
|
+
SubnetId: 'subnet-private-1',
|
|
17
|
+
VpcId: 'vpc-12345678',
|
|
18
|
+
CidrBlock: '10.0.1.0/24',
|
|
19
|
+
AvailabilityZone: 'us-east-1a',
|
|
20
|
+
State: 'available',
|
|
21
|
+
MapPublicIpOnLaunch: false
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
SubnetId: 'subnet-private-2',
|
|
25
|
+
VpcId: 'vpc-12345678',
|
|
26
|
+
CidrBlock: '10.0.2.0/24',
|
|
27
|
+
AvailabilityZone: 'us-east-1b',
|
|
28
|
+
State: 'available',
|
|
29
|
+
MapPublicIpOnLaunch: false
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
SubnetId: 'subnet-public-1',
|
|
33
|
+
VpcId: 'vpc-12345678',
|
|
34
|
+
CidrBlock: '10.0.3.0/24',
|
|
35
|
+
AvailabilityZone: 'us-east-1a',
|
|
36
|
+
State: 'available',
|
|
37
|
+
MapPublicIpOnLaunch: true
|
|
38
|
+
}
|
|
39
|
+
];
|
|
40
|
+
|
|
41
|
+
const mockSecurityGroups = [
|
|
42
|
+
{
|
|
43
|
+
GroupId: 'sg-frigg-12345678',
|
|
44
|
+
GroupName: 'frigg-lambda-sg',
|
|
45
|
+
Description: 'Security group for Frigg Lambda functions',
|
|
46
|
+
VpcId: 'vpc-12345678'
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
GroupId: 'sg-default-12345678',
|
|
50
|
+
GroupName: 'default',
|
|
51
|
+
Description: 'Default security group',
|
|
52
|
+
VpcId: 'vpc-12345678'
|
|
53
|
+
}
|
|
54
|
+
];
|
|
55
|
+
|
|
56
|
+
const mockRouteTables = [
|
|
57
|
+
{
|
|
58
|
+
RouteTableId: 'rtb-private-12345678',
|
|
59
|
+
VpcId: 'vpc-12345678',
|
|
60
|
+
Routes: [
|
|
61
|
+
{
|
|
62
|
+
DestinationCidrBlock: '10.0.0.0/16',
|
|
63
|
+
GatewayId: 'local',
|
|
64
|
+
State: 'active'
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
DestinationCidrBlock: '0.0.0.0/0',
|
|
68
|
+
NatGatewayId: 'nat-12345678',
|
|
69
|
+
State: 'active'
|
|
70
|
+
}
|
|
71
|
+
],
|
|
72
|
+
Associations: [
|
|
73
|
+
{
|
|
74
|
+
RouteTableAssociationId: 'rtbassoc-12345678',
|
|
75
|
+
RouteTableId: 'rtb-private-12345678',
|
|
76
|
+
SubnetId: 'subnet-private-1'
|
|
77
|
+
}
|
|
78
|
+
]
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
RouteTableId: 'rtb-public-12345678',
|
|
82
|
+
VpcId: 'vpc-12345678',
|
|
83
|
+
Routes: [
|
|
84
|
+
{
|
|
85
|
+
DestinationCidrBlock: '10.0.0.0/16',
|
|
86
|
+
GatewayId: 'local',
|
|
87
|
+
State: 'active'
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
DestinationCidrBlock: '0.0.0.0/0',
|
|
91
|
+
GatewayId: 'igw-12345678',
|
|
92
|
+
State: 'active'
|
|
93
|
+
}
|
|
94
|
+
],
|
|
95
|
+
Associations: [
|
|
96
|
+
{
|
|
97
|
+
RouteTableAssociationId: 'rtbassoc-87654321',
|
|
98
|
+
RouteTableId: 'rtb-public-12345678',
|
|
99
|
+
SubnetId: 'subnet-public-1'
|
|
100
|
+
}
|
|
101
|
+
]
|
|
102
|
+
}
|
|
103
|
+
];
|
|
104
|
+
|
|
105
|
+
const mockKmsKeys = [
|
|
106
|
+
{
|
|
107
|
+
KeyId: '12345678-1234-1234-1234-123456789012',
|
|
108
|
+
Arn: 'arn:aws:kms:us-east-1:123456789012:key/12345678-1234-1234-1234-123456789012'
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
KeyId: '87654321-8765-4321-8765-876543218765',
|
|
112
|
+
Arn: 'arn:aws:kms:us-east-1:123456789012:key/87654321-8765-4321-8765-876543218765'
|
|
113
|
+
}
|
|
114
|
+
];
|
|
115
|
+
|
|
116
|
+
const mockKmsKeyMetadata = {
|
|
117
|
+
KeyId: '12345678-1234-1234-1234-123456789012',
|
|
118
|
+
Arn: 'arn:aws:kms:us-east-1:123456789012:key/12345678-1234-1234-1234-123456789012',
|
|
119
|
+
CreationDate: new Date('2023-01-01'),
|
|
120
|
+
Enabled: true,
|
|
121
|
+
Description: 'Default KMS key for Frigg encryption',
|
|
122
|
+
KeyUsage: 'ENCRYPT_DECRYPT',
|
|
123
|
+
KeyState: 'Enabled',
|
|
124
|
+
Origin: 'AWS_KMS',
|
|
125
|
+
KeyManager: 'CUSTOMER',
|
|
126
|
+
CustomerMasterKeySpec: 'SYMMETRIC_DEFAULT'
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
const mockStsCallerIdentity = {
|
|
130
|
+
UserId: 'AIDACKCEVSQ6C2EXAMPLE',
|
|
131
|
+
Account: '123456789012',
|
|
132
|
+
Arn: 'arn:aws:iam::123456789012:user/test-user'
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
const mockDiscoveredResources = {
|
|
136
|
+
defaultVpcId: mockVpc.VpcId,
|
|
137
|
+
defaultSecurityGroupId: mockSecurityGroups[0].GroupId,
|
|
138
|
+
privateSubnetId1: mockSubnets[0].SubnetId,
|
|
139
|
+
privateSubnetId2: mockSubnets[1].SubnetId,
|
|
140
|
+
privateRouteTableId: mockRouteTables[0].RouteTableId,
|
|
141
|
+
defaultKmsKeyId: mockKmsKeyMetadata.Arn
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
// App definitions for testing different scenarios
|
|
145
|
+
const mockAppDefinitions = {
|
|
146
|
+
vpcOnly: {
|
|
147
|
+
name: 'vpc-test-app',
|
|
148
|
+
vpc: { enable: true },
|
|
149
|
+
integrations: []
|
|
150
|
+
},
|
|
151
|
+
|
|
152
|
+
kmsOnly: {
|
|
153
|
+
name: 'kms-test-app',
|
|
154
|
+
encryption: { fieldLevelEncryptionMethod: 'kms' },
|
|
155
|
+
integrations: []
|
|
156
|
+
},
|
|
157
|
+
|
|
158
|
+
ssmOnly: {
|
|
159
|
+
name: 'ssm-test-app',
|
|
160
|
+
ssm: { enable: true },
|
|
161
|
+
integrations: []
|
|
162
|
+
},
|
|
163
|
+
|
|
164
|
+
allFeatures: {
|
|
165
|
+
name: 'full-feature-app',
|
|
166
|
+
vpc: { enable: true },
|
|
167
|
+
encryption: { fieldLevelEncryptionMethod: 'kms' },
|
|
168
|
+
ssm: { enable: true },
|
|
169
|
+
integrations: [{
|
|
170
|
+
Definition: {
|
|
171
|
+
name: 'testIntegration'
|
|
172
|
+
}
|
|
173
|
+
}]
|
|
174
|
+
},
|
|
175
|
+
|
|
176
|
+
noFeatures: {
|
|
177
|
+
name: 'minimal-app',
|
|
178
|
+
integrations: []
|
|
179
|
+
},
|
|
180
|
+
|
|
181
|
+
multipleIntegrations: {
|
|
182
|
+
name: 'multi-integration-app',
|
|
183
|
+
vpc: { enable: true },
|
|
184
|
+
integrations: [
|
|
185
|
+
{
|
|
186
|
+
Definition: {
|
|
187
|
+
name: 'hubspot'
|
|
188
|
+
}
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
Definition: {
|
|
192
|
+
name: 'salesforce'
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
]
|
|
196
|
+
}
|
|
197
|
+
};
|
|
198
|
+
|
|
199
|
+
// Mock serverless service configurations
|
|
200
|
+
const mockServerlessServices = {
|
|
201
|
+
withVpc: {
|
|
202
|
+
provider: {
|
|
203
|
+
name: 'aws',
|
|
204
|
+
region: 'us-east-1',
|
|
205
|
+
vpc: '${self:custom.vpc.${self:provider.stage}}'
|
|
206
|
+
},
|
|
207
|
+
plugins: [],
|
|
208
|
+
custom: {
|
|
209
|
+
vpc: {
|
|
210
|
+
'${self:provider.stage}': {
|
|
211
|
+
securityGroupIds: ['${env:AWS_DISCOVERY_SECURITY_GROUP_ID}'],
|
|
212
|
+
subnetIds: [
|
|
213
|
+
'${env:AWS_DISCOVERY_SUBNET_ID_1}',
|
|
214
|
+
'${env:AWS_DISCOVERY_SUBNET_ID_2}'
|
|
215
|
+
]
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
},
|
|
219
|
+
functions: {}
|
|
220
|
+
},
|
|
221
|
+
|
|
222
|
+
withKms: {
|
|
223
|
+
provider: {
|
|
224
|
+
name: 'aws',
|
|
225
|
+
region: 'us-east-1'
|
|
226
|
+
},
|
|
227
|
+
plugins: ['serverless-kms-grants'],
|
|
228
|
+
custom: {
|
|
229
|
+
kmsGrants: {
|
|
230
|
+
kmsKeyId: '${env:AWS_DISCOVERY_KMS_KEY_ID}'
|
|
231
|
+
}
|
|
232
|
+
},
|
|
233
|
+
functions: {}
|
|
234
|
+
},
|
|
235
|
+
|
|
236
|
+
withSsm: {
|
|
237
|
+
provider: {
|
|
238
|
+
name: 'aws',
|
|
239
|
+
region: 'us-east-1',
|
|
240
|
+
layers: [
|
|
241
|
+
'arn:aws:lambda:us-east-1:177933569100:layer:AWS-Parameters-and-Secrets-Lambda-Extension:11'
|
|
242
|
+
]
|
|
243
|
+
},
|
|
244
|
+
plugins: [],
|
|
245
|
+
custom: {},
|
|
246
|
+
functions: {}
|
|
247
|
+
},
|
|
248
|
+
|
|
249
|
+
withAll: {
|
|
250
|
+
provider: {
|
|
251
|
+
name: 'aws',
|
|
252
|
+
region: 'us-east-1',
|
|
253
|
+
vpc: '${self:custom.vpc.${self:provider.stage}}',
|
|
254
|
+
layers: [
|
|
255
|
+
'arn:aws:lambda:us-east-1:177933569100:layer:AWS-Parameters-and-Secrets-Lambda-Extension:11'
|
|
256
|
+
]
|
|
257
|
+
},
|
|
258
|
+
plugins: ['serverless-kms-grants'],
|
|
259
|
+
custom: {
|
|
260
|
+
vpc: {
|
|
261
|
+
'${self:provider.stage}': {
|
|
262
|
+
securityGroupIds: ['${env:AWS_DISCOVERY_SECURITY_GROUP_ID}'],
|
|
263
|
+
subnetIds: [
|
|
264
|
+
'${env:AWS_DISCOVERY_SUBNET_ID_1}',
|
|
265
|
+
'${env:AWS_DISCOVERY_SUBNET_ID_2}'
|
|
266
|
+
]
|
|
267
|
+
}
|
|
268
|
+
},
|
|
269
|
+
kmsGrants: {
|
|
270
|
+
kmsKeyId: '${env:AWS_DISCOVERY_KMS_KEY_ID}'
|
|
271
|
+
}
|
|
272
|
+
},
|
|
273
|
+
functions: {}
|
|
274
|
+
}
|
|
275
|
+
};
|
|
276
|
+
|
|
277
|
+
// Environment variables for testing
|
|
278
|
+
const mockEnvironmentVariables = {
|
|
279
|
+
AWS_DISCOVERY_VPC_ID: mockVpc.VpcId,
|
|
280
|
+
AWS_DISCOVERY_SECURITY_GROUP_ID: mockSecurityGroups[0].GroupId,
|
|
281
|
+
AWS_DISCOVERY_SUBNET_ID_1: mockSubnets[0].SubnetId,
|
|
282
|
+
AWS_DISCOVERY_SUBNET_ID_2: mockSubnets[1].SubnetId,
|
|
283
|
+
AWS_DISCOVERY_ROUTE_TABLE_ID: mockRouteTables[0].RouteTableId,
|
|
284
|
+
AWS_DISCOVERY_KMS_KEY_ID:mockKmsKeyMetadata.Arn
|
|
285
|
+
};
|
|
286
|
+
|
|
287
|
+
// Fallback environment variables for error scenarios
|
|
288
|
+
const mockFallbackEnvironmentVariables = {
|
|
289
|
+
AWS_DISCOVERY_VPC_ID: 'vpc-fallback',
|
|
290
|
+
AWS_DISCOVERY_SECURITY_GROUP_ID: 'sg-fallback',
|
|
291
|
+
AWS_DISCOVERY_SUBNET_ID_1: 'subnet-fallback-1',
|
|
292
|
+
AWS_DISCOVERY_SUBNET_ID_2: 'subnet-fallback-2',
|
|
293
|
+
AWS_DISCOVERY_ROUTE_TABLE_ID: 'rtb-fallback',
|
|
294
|
+
AWS_DISCOVERY_KMS_KEY_ID:'arn:aws:kms:*:*:key/*'
|
|
295
|
+
};
|
|
296
|
+
|
|
297
|
+
// Mock AWS SDK responses
|
|
298
|
+
const mockAwsSdkResponses = {
|
|
299
|
+
ec2: {
|
|
300
|
+
describeVpcs: {
|
|
301
|
+
default: {
|
|
302
|
+
Vpcs: [mockVpc]
|
|
303
|
+
},
|
|
304
|
+
empty: {
|
|
305
|
+
Vpcs: []
|
|
306
|
+
},
|
|
307
|
+
multiple: {
|
|
308
|
+
Vpcs: [mockVpc, { ...mockVpc, VpcId: 'vpc-87654321', IsDefault: false }]
|
|
309
|
+
}
|
|
310
|
+
},
|
|
311
|
+
|
|
312
|
+
describeSubnets: {
|
|
313
|
+
private: {
|
|
314
|
+
Subnets: mockSubnets.slice(0, 2) // Only private subnets
|
|
315
|
+
},
|
|
316
|
+
mixed: {
|
|
317
|
+
Subnets: mockSubnets // All subnets
|
|
318
|
+
},
|
|
319
|
+
empty: {
|
|
320
|
+
Subnets: []
|
|
321
|
+
}
|
|
322
|
+
},
|
|
323
|
+
|
|
324
|
+
describeSecurityGroups: {
|
|
325
|
+
frigg: {
|
|
326
|
+
SecurityGroups: [mockSecurityGroups[0]]
|
|
327
|
+
},
|
|
328
|
+
default: {
|
|
329
|
+
SecurityGroups: [mockSecurityGroups[1]]
|
|
330
|
+
},
|
|
331
|
+
empty: {
|
|
332
|
+
SecurityGroups: []
|
|
333
|
+
}
|
|
334
|
+
},
|
|
335
|
+
|
|
336
|
+
describeRouteTables: {
|
|
337
|
+
private: {
|
|
338
|
+
RouteTables: [mockRouteTables[0]]
|
|
339
|
+
},
|
|
340
|
+
public: {
|
|
341
|
+
RouteTables: [mockRouteTables[1]]
|
|
342
|
+
},
|
|
343
|
+
mixed: {
|
|
344
|
+
RouteTables: mockRouteTables
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
},
|
|
348
|
+
|
|
349
|
+
kms: {
|
|
350
|
+
listKeys: {
|
|
351
|
+
withKeys: {
|
|
352
|
+
Keys: mockKmsKeys
|
|
353
|
+
},
|
|
354
|
+
empty: {
|
|
355
|
+
Keys: []
|
|
356
|
+
}
|
|
357
|
+
},
|
|
358
|
+
|
|
359
|
+
describeKey: {
|
|
360
|
+
customer: {
|
|
361
|
+
KeyMetadata: mockKmsKeyMetadata
|
|
362
|
+
},
|
|
363
|
+
aws: {
|
|
364
|
+
KeyMetadata: {
|
|
365
|
+
...mockKmsKeyMetadata,
|
|
366
|
+
KeyManager: 'AWS'
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
},
|
|
371
|
+
|
|
372
|
+
sts: {
|
|
373
|
+
getCallerIdentity: mockStsCallerIdentity
|
|
374
|
+
}
|
|
375
|
+
};
|
|
376
|
+
|
|
377
|
+
module.exports = {
|
|
378
|
+
mockVpc,
|
|
379
|
+
mockSubnets,
|
|
380
|
+
mockSecurityGroups,
|
|
381
|
+
mockRouteTables,
|
|
382
|
+
mockKmsKeys,
|
|
383
|
+
mockKmsKeyMetadata,
|
|
384
|
+
mockStsCallerIdentity,
|
|
385
|
+
mockDiscoveredResources,
|
|
386
|
+
mockAppDefinitions,
|
|
387
|
+
mockServerlessServices,
|
|
388
|
+
mockEnvironmentVariables,
|
|
389
|
+
mockFallbackEnvironmentVariables,
|
|
390
|
+
mockAwsSdkResponses
|
|
391
|
+
};
|