diff --git a/.github/workflows/feature-list.yml b/.github/workflows/feature-list.yml new file mode 100644 index 000000000000..5432507af762 --- /dev/null +++ b/.github/workflows/feature-list.yml @@ -0,0 +1,87 @@ +name: Feature List + +on: + workflow_dispatch: + inputs: + spreadsheet_uri: + description: 'Link of the spreadsheet containing subscription details.' + type: string + required: true + schedule: + - cron: '0 0 * * *' + +permissions: + contents: write + actions: read + +jobs: + trigger-feature-list: + runs-on: ubuntu-latest + env: + FEATURES_FILE: 'feature_data.json' + + steps: + - name: Checkout current repository + uses: actions/checkout@v4 + + - name: Restore cache + id: cache-sha + uses: actions/cache@v3 + with: + path: .sha-cache + key: feature-data-sha + restore-keys: | + feature-data-sha + + - name: Check for updates in source repository + id: check-updates + uses: actions/github-script@v7 + with: + script: | + const { data: sourceFile } = await github.rest.repos.getContent({ + owner: 'layer5labs', + repo: 'meshery-extensions-packages', + path: 'feature_data.json', + ref: 'master' + }); + + // Store the latest commit SHA + const latestSHA = sourceFile.sha; + + const fs = require('fs'); + + // Check if we have a previous SHA + let hasUpdates = true; + const shaCachePath = '.sha-cache/latest-sha'; + if (fs.existsSync(shaCachePath)) { + const lastSHA = fs.readFileSync(shaCachePath, 'utf8'); + hasUpdates = lastSHA !== latestSHA; + } + + if (hasUpdates) { + // Save the new SHA + fs.mkdirSync('.sha-cache', { recursive: true }); + fs.writeFileSync(shaCachePath, latestSHA); + + // Decode and save the content + const content = Buffer.from(sourceFile.content, 'base64').toString('utf8'); + + // Write the new content + fs.writeFileSync(process.env.FEATURES_FILE, content); + + core.setOutput('has-updates', 'true'); + } else { + core.setOutput('has-updates', 'false'); + } + + - name: Commit changes + if: steps.check-updates.outputs.has-updates == 'true' + uses: stefanzweifel/git-auto-commit-action@v5 + with: + commit_message: "Updated feature data from source repository" + file_pattern: ${{ env.FEATURES_FILE }} + branch: master + commit_options: "--signoff" + commit_user_name: l5io + commit_user_email: ci@layer5.io + commit_author: 'l5io ' \ No newline at end of file diff --git a/feature_data.json b/feature_data.json new file mode 100644 index 000000000000..7f01ed823eb7 --- /dev/null +++ b/feature_data.json @@ -0,0 +1,1071 @@ +[ + { + "documentation": "https://docs.layer5.io/cloud/getting-started/getting-started-with-layer5-account/#7-viewing-your-layer5-profile", + "entire_row": { + "Category": "Profile", + "Documented?": "https://docs.layer5.io/cloud/getting-started/getting-started-with-layer5-account/#7-viewing-your-layer5-profile", + "Feature": "View your profile.", + "Function": "View Profile", + "Pricing page?": "", + "Subscription Tier": "Free", + "Tech": "Cloud", + "Theme (also: Keychain Name)": "Account Management" + } + }, + { + "documentation": "https://docs.layer5.io/cloud/catalog/", + "entire_row": { + "Category": "Catalog", + "Documented?": "https://docs.layer5.io/cloud/catalog/", + "Feature": "Export a copy of a design to your local system.", + "Function": "", + "Pricing page?": "", + "Subscription Tier": "Free", + "Tech": "Server", + "Theme (also: Keychain Name)": "Catalog Management" + } + }, + { + "documentation": "https://docs.layer5.io/kanvas/designer/share-resource/", + "entire_row": { + "Category": "Catalog", + "Documented?": "https://docs.layer5.io/kanvas/designer/share-resource/", + "Feature": "Share design with anyone within your organization, and make your design easily accessible to all relevant team members.", + "Function": "Share Design", + "Pricing page?": "", + "Subscription Tier": "Free", + "Tech": "Server", + "Theme (also: Keychain Name)": "Catalog Management" + } + }, + { + "documentation": "https://docs.layer5.io/kanvas/tasks/designs/cloning-a-design/", + "entire_row": { + "Category": "Catalog", + "Documented?": "https://docs.layer5.io/kanvas/tasks/designs/cloning-a-design/", + "Feature": "Clone any published design to customise it according to your use cases", + "Function": "Clone Design", + "Pricing page?": "", + "Subscription Tier": "Free", + "Tech": "Server", + "Theme (also: Keychain Name)": "Catalog Management" + } + }, + { + "documentation": "https://docs.meshery.io/guides/configuration-management/creating-a-meshery-design", + "entire_row": { + "Category": "Designs", + "Documented?": "https://docs.meshery.io/guides/configuration-management/creating-a-meshery-design", + "Feature": "Create new Meshery design", + "Function": "Create new design", + "Pricing page?": "", + "Subscription Tier": "Free", + "Tech": "Server", + "Theme (also: Keychain Name)": "Catalog Management" + } + }, + { + "documentation": "https://docs.meshery.io/extensions/importing-a-design", + "entire_row": { + "Category": "Designs", + "Documented?": "https://docs.meshery.io/extensions/importing-a-design", + "Feature": "Import a design", + "Function": "Import Design", + "Pricing page?": "", + "Subscription Tier": "Free", + "Tech": "Server", + "Theme (also: Keychain Name)": "Catalog Management" + } + }, + { + "documentation": "https://docs.meshery.io/guides/configuration-management/importing-designs#import-designs-using-meshery-cli", + "entire_row": { + "Category": "Designs", + "Documented?": "https://docs.meshery.io/guides/configuration-management/importing-designs#import-designs-using-meshery-cli", + "Feature": "Import a design from Kubernetes Manifest", + "Function": "Import Design", + "Pricing page?": "", + "Subscription Tier": "Free", + "Tech": "Server", + "Theme (also: Keychain Name)": "Catalog Management" + } + }, + { + "documentation": "https://docs.layer5.io/kanvas/getting-started/starting-helm/#importing-a-design", + "entire_row": { + "Category": "Designs", + "Documented?": "https://docs.layer5.io/kanvas/getting-started/starting-helm/#importing-a-design", + "Feature": "Import a design from Meshery Design (YAML)", + "Function": "Import Design", + "Pricing page?": "", + "Subscription Tier": "Free", + "Tech": "Server", + "Theme (also: Keychain Name)": "Catalog Management" + } + }, + { + "documentation": "https://docs.meshery.io/guides/configuration-management/importing-designs#import-designs-using-meshery-cli", + "entire_row": { + "Category": "Designs", + "Documented?": "https://docs.meshery.io/guides/configuration-management/importing-designs#import-designs-using-meshery-cli", + "Feature": "Import a design from Helm Chart", + "Function": "Import Design", + "Pricing page?": "", + "Subscription Tier": "Free", + "Tech": "Server", + "Theme (also: Keychain Name)": "Catalog Management" + } + }, + { + "documentation": "https://docs.meshery.io/guides/configuration-management/importing-designs#import-designs-using-meshery-cli", + "entire_row": { + "Category": "Designs", + "Documented?": "https://docs.meshery.io/guides/configuration-management/importing-designs#import-designs-using-meshery-cli", + "Feature": "Import a design from Docker Compose", + "Function": "Import Design", + "Pricing page?": "", + "Subscription Tier": "Free", + "Tech": "Server", + "Theme (also: Keychain Name)": "Catalog Management" + } + }, + { + "pricing_page": "true", + "entire_row": { + "Category": "Designs", + "Documented?": "", + "Feature": "Import a design from Kubernetes Manifest, Meshery Design (YAML), Helm Chart, Docker Compose or Meshery Design (OCI Image)", + "Function": "Standard Import Design", + "Pricing page?": "X", + "Subscription Tier": "Free", + "Tech": "Server", + "Theme (also: Keychain Name)": "Catalog Management" + } + }, + { + "documentation": "https://docs.layer5.io/cloud/getting-started/github-integration/#connect-github-and-import-designs", + "entire_row": { + "Category": "Designs", + "Documented?": "https://docs.layer5.io/cloud/getting-started/github-integration/#connect-github-and-import-designs", + "Feature": "Import a design from GitHub", + "Function": "Import Design", + "Pricing page?": "", + "Subscription Tier": "Enterprise", + "Tech": "Cloud", + "Theme (also: Keychain Name)": "Catalog Management" + } + }, + { + "pricing_page": "true", + "entire_row": { + "Category": "Designs", + "Documented?": "", + "Feature": "Import a design from GitHub, GitLab, BitBucket", + "Function": "Premium Design Import Features", + "Pricing page?": "X", + "Subscription Tier": "Enterprise", + "Tech": "Server", + "Theme (also: Keychain Name)": "Catalog Management" + } + }, + { + "documentation": "https://docs.layer5.io/kanvas/designer/export-designs/#exporting-as-a-design-file", + "entire_row": { + "Category": "Designs", + "Documented?": "https://docs.layer5.io/kanvas/designer/export-designs/#exporting-as-a-design-file", + "Feature": "Export a latest version of design in Meshery Design (YAML format)", + "Function": "Export Design", + "Pricing page?": "", + "Subscription Tier": "Free", + "Tech": "Server", + "Theme (also: Keychain Name)": "Catalog Management" + } + }, + { + "documentation": "https://docs.layer5.io/kanvas/designer/export-designs/#exporting-as-an-oci-image", + "entire_row": { + "Category": "Designs", + "Documented?": "https://docs.layer5.io/kanvas/designer/export-designs/#exporting-as-an-oci-image", + "Feature": "Export a latest version of design in Meshery Design (OCI format)", + "Function": "Export Design", + "Pricing page?": "", + "Subscription Tier": "Free", + "Tech": "Server", + "Theme (also: Keychain Name)": "Catalog Management" + } + }, + { + "pricing_page": "true", + "entire_row": { + "Category": "Designs", + "Documented?": "", + "Feature": "Export a latest version of design in Meshery Design (OCI format, YAML format) Export a design in source type format (Kubernetes Manifest, Helm Chart, Docker Compose)", + "Function": "Standard Export Design", + "Pricing page?": "X", + "Subscription Tier": "Free", + "Tech": "Server", + "Theme (also: Keychain Name)": "Catalog Management" + } + }, + { + "pricing_page": "true", + "entire_row": { + "Category": "Designs", + "Documented?": "", + "Feature": "Export a design to GitHub, GitLab, BitBucket", + "Function": "Premium Export Design Features", + "Pricing page?": "X", + "Subscription Tier": "Enterprise", + "Tech": "Server", + "Theme (also: Keychain Name)": "Catalog Management" + } + }, + { + "pricing_page": "true", + "entire_row": { + "Category": "Designs", + "Documented?": "", + "Feature": "Import and export your designs using your local filesystem or remote URL.", + "Function": "Cloud Native Design Patterns", + "Pricing page?": "X", + "Subscription Tier": "Free", + "Tech": "", + "Theme (also: Keychain Name)": "Catalog Management" + } + }, + { + "documentation": "https://docs.meshery.io/extensions/publishing-a-design", + "entire_row": { + "Category": "Designs", + "Documented?": "https://docs.meshery.io/extensions/publishing-a-design", + "Feature": "Publish a design", + "Function": "Publish Design", + "Pricing page?": "", + "Subscription Tier": "Free", + "Tech": "Server", + "Theme (also: Keychain Name)": "Catalog Management" + } + }, + { + "documentation": "https://docs.layer5.io/kanvas/tasks/designs/validating-designs/", + "entire_row": { + "Category": "Designs", + "Documented?": "https://docs.layer5.io/kanvas/tasks/designs/validating-designs/", + "Feature": "Validate a design", + "Function": "Validate Design", + "Pricing page?": "", + "Subscription Tier": "Free", + "Tech": "Server", + "Theme (also: Keychain Name)": "Catalog Management" + } + }, + { + "documentation": "https://docs.layer5.io/kanvas/tasks/designs/deploying-designs/", + "entire_row": { + "Category": "Designs", + "Documented?": "https://docs.layer5.io/kanvas/tasks/designs/deploying-designs/", + "Feature": "Deploy a design", + "Function": "Deploy Design", + "Pricing page?": "", + "Subscription Tier": "Free", + "Tech": "Server", + "Theme (also: Keychain Name)": "Catalog Management" + } + }, + { + "documentation": "https://docs.layer5.io/kanvas/tasks/designs/undeploying-designs/", + "entire_row": { + "Category": "Designs", + "Documented?": "https://docs.layer5.io/kanvas/tasks/designs/undeploying-designs/", + "Feature": "Retract all resources used in a Meshery design from the cluster", + "Function": "Undeploy Design", + "Pricing page?": "", + "Subscription Tier": "Free", + "Tech": "Server", + "Theme (also: Keychain Name)": "Catalog Management" + } + }, + { + "documentation": "https://docs.meshery.io/guides/configuration-management/filter-management", + "entire_row": { + "Category": "Filters", + "Documented?": "https://docs.meshery.io/guides/configuration-management/filter-management", + "Feature": "Import a filter", + "Function": "Import Filter", + "Pricing page?": "", + "Subscription Tier": "Free", + "Tech": "Server", + "Theme (also: Keychain Name)": "Catalog Management" + } + }, + { + "documentation": "https://docs.meshery.io/guides/configuration-management/filter-management", + "entire_row": { + "Category": "Filters", + "Documented?": "https://docs.meshery.io/guides/configuration-management/filter-management", + "Feature": "Publish WASM Filter", + "Function": "Publish WASM Filter", + "Pricing page?": "", + "Subscription Tier": "Free", + "Tech": "Server", + "Theme (also: Keychain Name)": "Catalog Management" + } + }, + { + "documentation": "https://docs.meshery.io/guides/configuration-management/filter-management", + "entire_row": { + "Category": "Filters", + "Documented?": "https://docs.meshery.io/guides/configuration-management/filter-management", + "Feature": "Unpublish WASM Filter", + "Function": "Unpublish WASM Filter", + "Pricing page?": "", + "Subscription Tier": "Free", + "Tech": "Server", + "Theme (also: Keychain Name)": "Catalog Management" + } + }, + { + "documentation": "https://docs.meshery.io/guides/configuration-management/filter-management", + "entire_row": { + "Category": "Filters", + "Documented?": "https://docs.meshery.io/guides/configuration-management/filter-management", + "Feature": "Download a WASM filter", + "Function": "Download a WASM filter", + "Pricing page?": "", + "Subscription Tier": "Free", + "Tech": "Server", + "Theme (also: Keychain Name)": "Catalog Management" + } + }, + { + "documentation": "https://docs.meshery.io/guides/configuration-management/filter-management", + "entire_row": { + "Category": "Filters", + "Documented?": "https://docs.meshery.io/guides/configuration-management/filter-management", + "Feature": "Check information or details of a WASM filter", + "Function": "Details of WASM Filter", + "Pricing page?": "", + "Subscription Tier": "Free", + "Tech": "Server", + "Theme (also: Keychain Name)": "Catalog Management" + } + }, + { + "documentation": "https://docs.meshery.io/guides/configuration-management/filter-management", + "entire_row": { + "Category": "Filters", + "Documented?": "https://docs.meshery.io/guides/configuration-management/filter-management", + "Feature": "Edit WASM filter", + "Function": "Edit WASM filter", + "Pricing page?": "", + "Subscription Tier": "Free", + "Tech": "Server", + "Theme (also: Keychain Name)": "Catalog Management" + } + }, + { + "documentation": "https://docs.meshery.io/guides/configuration-management/filter-management", + "entire_row": { + "Category": "Filters", + "Documented?": "https://docs.meshery.io/guides/configuration-management/filter-management", + "Feature": "Clone WASM filter from catalog, which allows customizing filter and use it in design", + "Function": "Clone WASM Filter", + "Pricing page?": "", + "Subscription Tier": "Free", + "Tech": "Server", + "Theme (also: Keychain Name)": "Catalog Management" + } + }, + { + "documentation": "https://docs.meshery.io/guides/configuration-management/filter-management", + "entire_row": { + "Category": "Filters", + "Documented?": "https://docs.meshery.io/guides/configuration-management/filter-management", + "Feature": "Delete WASM filter permanently from catalog.", + "Function": "Delete WASM Filter", + "Pricing page?": "", + "Subscription Tier": "Free", + "Tech": "Server", + "Theme (also: Keychain Name)": "Catalog Management" + } + }, + { + "pricing_page": "true", + "entire_row": { + "Category": "Filters", + "Documented?": "", + "Feature": "Import, Unpublish, Publish, Download, Edit, Clone, Delete, Details of WASM Filter", + "Function": "WASM Filter and filter", + "Pricing page?": "X", + "Subscription Tier": "Free", + "Tech": "Server", + "Theme (also: Keychain Name)": "Catalog Management" + } + }, + { + "pricing_page": "true", + "entire_row": { + "Category": "Team Chat", + "Documented?": "", + "Feature": "Message in real-time, unattached to a specific design. Control who can pariticpate in the discussion.", + "Function": "Message in real-time", + "Pricing page?": "X", + "Subscription Tier": "Enterprise", + "Tech": "Kanvas", + "Theme (also: Keychain Name)": "Collaboration" + } + }, + { + "pricing_page": "true", + "documentation": "https://docs.layer5.io/kanvas/designer/comments/", + "entire_row": { + "Category": "Design Reviews", + "Documented?": "https://docs.layer5.io/kanvas/designer/comments/", + "Feature": "Discuss any design by leaving review comments or notes on a specific design. Control who has access, notify discussion participants with updates, and link from anywhere.", + "Function": "Discuss any design by leaving review comments", + "Pricing page?": "X", + "Subscription Tier": "Team", + "Tech": "Kanvas", + "Theme (also: Keychain Name)": "Collaboration" + } + }, + { + "pricing_page": "true", + "entire_row": { + "Category": "Organization and Team Management", + "Documented?": "", + "Feature": "Manage access to designs on a team-by-team, or individual user, basis.", + "Function": "Manage access to designs", + "Pricing page?": "X", + "Subscription Tier": "Enterprise", + "Tech": "Kanvas", + "Theme (also: Keychain Name)": "Collaboration" + } + }, + { + "pricing_page": "true", + "entire_row": { + "Category": "Built-in Roles", + "Documented?": "", + "Feature": "Static - out of the box", + "Function": "Built-in Roles", + "Pricing page?": "X", + "Subscription Tier": "Enterprise", + "Tech": "Cloud", + "Theme (also: Keychain Name)": "Identity \u0026 Access Management" + } + }, + { + "pricing_page": "true", + "entire_row": { + "Category": "User-defined Roles", + "Documented?": "", + "Feature": "Customizable roles for specific permission assignments", + "Function": "User-defined Roles", + "Pricing page?": "X", + "Subscription Tier": "Enterprise", + "Tech": "Cloud", + "Theme (also: Keychain Name)": "Identity \u0026 Access Management" + } + }, + { + "pricing_page": "true", + "entire_row": { + "Category": "Authentication: LDAP", + "Documented?": "", + "Feature": "Access Meshery Server using your existing accounts and centrally manage repository access.", + "Function": "Authentication: LDAP", + "Pricing page?": "X", + "Subscription Tier": "Enterprise", + "Tech": "Cloud", + "Theme (also: Keychain Name)": "Identity \u0026 Access Management" + } + }, + { + "pricing_page": "true", + "entire_row": { + "Category": "Authentication: SAML", + "Documented?": "", + "Feature": "Use an identity provider to manage the identities of GitHub users and applications.", + "Function": "Authentication: SAML", + "Pricing page?": "X", + "Subscription Tier": "Enterprise", + "Tech": "Cloud", + "Theme (also: Keychain Name)": "Identity \u0026 Access Management" + } + }, + { + "documentation": "https://docs.layer5.io/cloud/identity/users/user-management/#add-user-remove-user", + "entire_row": { + "Category": "Users", + "Documented?": "https://docs.layer5.io/cloud/identity/users/user-management/#add-user-remove-user", + "Feature": "Delete a user account", + "Function": "Delete User", + "Pricing page?": "", + "Subscription Tier": "Team", + "Tech": "", + "Theme (also: Keychain Name)": "Identity \u0026 Access Management" + } + }, + { + "documentation": "https://docs.layer5.io/cloud/identity/users/user-management/#create-user", + "entire_row": { + "Category": "Users", + "Documented?": "https://docs.layer5.io/cloud/identity/users/user-management/#create-user", + "Feature": "Create a new user", + "Function": "Create User", + "Pricing page?": "", + "Subscription Tier": "", + "Tech": "", + "Theme (also: Keychain Name)": "Identity \u0026 Access Management" + } + }, + { + "documentation": "https://docs.layer5.io/cloud/identity/teams/", + "entire_row": { + "Category": "Teams", + "Documented?": "https://docs.layer5.io/cloud/identity/teams/", + "Feature": "Directly create a new user account within a team.", + "Function": "Add User to Team", + "Pricing page?": "", + "Subscription Tier": "Team", + "Tech": "Cloud", + "Theme (also: Keychain Name)": "Identity \u0026 Access Management" + } + }, + { + "documentation": "https://docs.layer5.io/cloud/identity/organizations/", + "entire_row": { + "Category": "Organizations", + "Documented?": "https://docs.layer5.io/cloud/identity/organizations/", + "Feature": "Establish new organization for organizing teams, users, and resource access.", + "Function": "Create Organization", + "Pricing page?": "", + "Subscription Tier": "Enterprise", + "Tech": "Cloud", + "Theme (also: Keychain Name)": "Identity \u0026 Access Management" + } + }, + { + "pricing_page": "true", + "entire_row": { + "Category": "Dry-run", + "Documented?": "", + "Feature": "Test and verify configuration changes in a separate environment.", + "Function": "Dry-run", + "Pricing page?": "X", + "Subscription Tier": "Team", + "Tech": "Server", + "Theme (also: Keychain Name)": "Lifecycle Management" + } + }, + { + "pricing_page": "true", + "entire_row": { + "Category": "Multiple Kubernetes Clusters", + "Documented?": "", + "Feature": "Ongoing synchronization of Kubernetes configuration, workloads and service mesh changes across any number of Kubernetes clusters.", + "Function": "Multiple Kubernetes Clusters", + "Pricing page?": "X", + "Subscription Tier": "Free", + "Tech": "Server", + "Theme (also: Keychain Name)": "Lifecycle Management" + } + }, + { + "pricing_page": "true", + "entire_row": { + "Category": "mesheryctl", + "Documented?": "", + "Feature": "Seamlessly manage your configurations, deployments, and interactions through our intuitive and powerful command-line interface", + "Function": "all mesheryctl commands", + "Pricing page?": "X", + "Subscription Tier": "Free", + "Tech": "Golang", + "Theme (also: Keychain Name)": "Meshery System" + } + }, + { + "documentation": "https://docs.layer5.io/cloud/catalog/metrics/", + "entire_row": { + "Category": "Settings", + "Documented?": "https://docs.layer5.io/cloud/catalog/metrics/", + "Feature": "View already configured metrics", + "Function": "View Metrics", + "Pricing page?": "", + "Subscription Tier": "Free", + "Tech": "Server", + "Theme (also: Keychain Name)": "Meshery System" + } + }, + { + "pricing_page": "true", + "entire_row": { + "Category": "Service Performance", + "Documented?": "", + "Feature": "Continuous visibility across all of your clusters and workloads.", + "Function": "Service Performance", + "Pricing page?": "X", + "Subscription Tier": "Free", + "Tech": "Kanvas", + "Theme (also: Keychain Name)": "Kanvas" + } + }, + { + "documentation": "https://docs.layer5.io/kanvas/concepts/relationships/#2-hierarchical-relationships", + "entire_row": { + "Category": "Design Patterns", + "Documented?": "https://docs.layer5.io/kanvas/concepts/relationships/#2-hierarchical-relationships", + "Feature": "", + "Function": "Use heirarchical relationships", + "Pricing page?": "", + "Subscription Tier": "Free", + "Tech": "Kanvas", + "Theme (also: Keychain Name)": "Kanvas" + } + }, + { + "pricing_page": "true", + "entire_row": { + "Category": "Design Patterns", + "Documented?": "", + "Feature": "This permission grants the user the ability to undo/redo any action in done in Kanvas", + "Function": "Undo or Redo", + "Pricing page?": "X", + "Subscription Tier": "Team", + "Tech": "Kanvas", + "Theme (also: Keychain Name)": "Kanvas" + } + }, + { + "pricing_page": "true", + "documentation": "https://docs.layer5.io/kanvas/designer/whiteboarding/", + "entire_row": { + "Category": "Design Patterns", + "Documented?": "https://docs.layer5.io/kanvas/designer/whiteboarding/", + "Feature": "Ability to freeform draw any shapes, draw edges", + "Function": "Whiteboarding", + "Pricing page?": "X", + "Subscription Tier": "Free", + "Tech": "Kanvas", + "Theme (also: Keychain Name)": "Kanvas" + } + }, + { + "pricing_page": "true", + "entire_row": { + "Category": "Visual Design", + "Documented?": "", + "Feature": "Drag-n-drop cloud native infrastructure designer to configure, model, and deploy your workloads", + "Function": "Visual Design", + "Pricing page?": "X", + "Subscription Tier": "Free", + "Tech": "Kanvas", + "Theme (also: Keychain Name)": "Kanvas" + } + }, + { + "documentation": "https://docs.layer5.io/kanvas/visualizer/visualizer-views/", + "entire_row": { + "Category": "Visualizer", + "Documented?": "https://docs.layer5.io/kanvas/visualizer/visualizer-views/", + "Feature": "See all views withing a workspace", + "Function": "View Views", + "Pricing page?": "", + "Subscription Tier": "Team", + "Tech": "Server", + "Theme (also: Keychain Name)": "MeshMap" + } + }, + { + "documentation": "https://docs.layer5.io/kanvas/visualizer/visualizer-views/#4-delete-a-view", + "entire_row": { + "Category": "Visualizer", + "Documented?": "https://docs.layer5.io/kanvas/visualizer/visualizer-views/#4-delete-a-view", + "Feature": "Dissolve environment and all connection memberships. Leave associated resources intact.", + "Function": "Delete View", + "Pricing page?": "", + "Subscription Tier": "Team", + "Tech": "Server", + "Theme (also: Keychain Name)": "MeshMap" + } + }, + { + "documentation": "https://docs.layer5.io/kanvas/visualizer/visualizer-views/#5-export-a-view", + "entire_row": { + "Category": "Visualizer", + "Documented?": "https://docs.layer5.io/kanvas/visualizer/visualizer-views/#5-export-a-view", + "Feature": "Export views to JSON format", + "Function": "Export views", + "Pricing page?": "", + "Subscription Tier": "Team", + "Tech": "Server", + "Theme (also: Keychain Name)": "MeshMap" + } + }, + { + "documentation": "https://docs.layer5.io/kanvas/visualizer/visualizer-views/#3-share-a-view", + "entire_row": { + "Category": "Visualizer", + "Documented?": "https://docs.layer5.io/kanvas/visualizer/visualizer-views/#3-share-a-view", + "Feature": "Share Views", + "Function": "Share Views", + "Pricing page?": "", + "Subscription Tier": "Team", + "Tech": "Kanvas", + "Theme (also: Keychain Name)": "Kanvas" + } + }, + { + "pricing_page": "true", + "entire_row": { + "Category": "Load Generation", + "Documented?": "", + "Feature": "Single Load Generator: Support testing multiple endpoints simultaneously.", + "Function": "Load Generation", + "Pricing page?": "X", + "Subscription Tier": "Free", + "Tech": "Server", + "Theme (also: Keychain Name)": "Performance Management" + } + }, + { + "pricing_page": "true", + "entire_row": { + "Category": "Load Generation", + "Documented?": "", + "Feature": "Multiple Meshery Servers or Meshery Adapters generating load, collecting and coalescing results into a single report.", + "Function": "Distributed Load Generator", + "Pricing page?": "X", + "Subscription Tier": "Team", + "Tech": "GetNighthawk", + "Theme (also: Keychain Name)": "Performance Management" + } + }, + { + "pricing_page": "true", + "entire_row": { + "Category": "Performance Profiles", + "Documented?": "", + "Feature": "Share performance profiles and test results with individual users or teams.", + "Function": "Performance Profiles", + "Pricing page?": "X", + "Subscription Tier": "Team", + "Tech": "Cloud", + "Theme (also: Keychain Name)": "Performance Management" + } + }, + { + "pricing_page": "true", + "entire_row": { + "Category": "Comparative Testing", + "Documented?": "", + "Feature": "Historical views: Infrastructure-centric", + "Function": "Comparative Testing", + "Pricing page?": "X", + "Subscription Tier": "Free", + "Tech": "Server", + "Theme (also: Keychain Name)": "Performance Management" + } + }, + { + "pricing_page": "true", + "entire_row": { + "Category": "Comparative Testing", + "Documented?": "", + "Feature": "Detect real-time anomalies.", + "Function": "Comparative Testing", + "Pricing page?": "X", + "Subscription Tier": "Team", + "Tech": "Cloud", + "Theme (also: Keychain Name)": "Performance Management" + } + }, + { + "pricing_page": "true", + "entire_row": { + "Category": "Continuous Quality of Service Monitoring", + "Documented?": "", + "Feature": "Experience uninterrupted oversight of your service quality with our Continuous Quality of Service Monitoring.", + "Function": "Continuous Quality of Service Monitoring", + "Pricing page?": "X", + "Subscription Tier": "Free", + "Tech": "Server", + "Theme (also: Keychain Name)": "Performance Management" + } + }, + { + "pricing_page": "true", + "entire_row": { + "Category": "MeshMark", + "Documented?": "", + "Feature": "Identify the cost of a specific network function.", + "Function": "MeshMark", + "Pricing page?": "X", + "Subscription Tier": "Free", + "Tech": "Server", + "Theme (also: Keychain Name)": "Performance Management" + } + }, + { + "documentation": "https://docs.layer5.io/cloud/security/sessions/#what-sessions-are", + "entire_row": { + "Category": "Sessions", + "Documented?": "https://docs.layer5.io/cloud/security/sessions/#what-sessions-are", + "Feature": "", + "Function": "View Sessions", + "Pricing page?": "", + "Subscription Tier": "", + "Tech": "", + "Theme (also: Keychain Name)": "Security Management" + } + }, + { + "documentation": "https://docs.layer5.io/cloud/security/tokens/#creating-tokens", + "entire_row": { + "Category": "Tokens", + "Documented?": "https://docs.layer5.io/cloud/security/tokens/#creating-tokens", + "Feature": "", + "Function": "Create Token", + "Pricing page?": "", + "Subscription Tier": "", + "Tech": "", + "Theme (also: Keychain Name)": "Security Management" + } + }, + { + "documentation": "https://docs.layer5.io/cloud/security/keys/", + "entire_row": { + "Category": "Keys", + "Documented?": "https://docs.layer5.io/cloud/security/keys/", + "Feature": "", + "Function": "View Keys", + "Pricing page?": "", + "Subscription Tier": "", + "Tech": "", + "Theme (also: Keychain Name)": "Security Management" + } + }, + { + "documentation": "https://docs.layer5.io/cloud/spaces/workspaces/", + "entire_row": { + "Category": "Workspace", + "Documented?": "https://docs.layer5.io/cloud/spaces/workspaces/", + "Feature": "See all workspaces within an organisation", + "Function": "View Workspace", + "Pricing page?": "", + "Subscription Tier": "Enterprise", + "Tech": "", + "Theme (also: Keychain Name)": "Workspace Management" + } + }, + { + "documentation": "https://docs.layer5.io/cloud/spaces/environments/#deleting-an-environment", + "entire_row": { + "Category": "Environments", + "Documented?": "https://docs.layer5.io/cloud/spaces/environments/#deleting-an-environment", + "Feature": "Dissolve environment and all connection memberships. Leave associated resources intact.", + "Function": "Delete Environment", + "Pricing page?": "", + "Subscription Tier": "Enterprise", + "Tech": "", + "Theme (also: Keychain Name)": "Workspace Management" + } + }, + { + "documentation": "https://docs.layer5.io/cloud/getting-started/creating-a-design-from-templete.md/", + "entire_row": { + "Category": "Catalog", + "Documented?": "https://docs.layer5.io/cloud/getting-started/creating-a-design-from-templete.md/", + "Feature": "Clone any item from catalog", + "Function": "Clone Catalog Item", + "Pricing page?": "", + "Subscription Tier": "", + "Tech": "", + "Theme (also: Keychain Name)": "Catalog Management" + } + }, + { + "pricing_page": "true", + "documentation": "https://docs.layer5.io/cloud/getting-started/support/#contacting-support", + "entire_row": { + "Category": "Community Support", + "Documented?": "https://docs.layer5.io/cloud/getting-started/support/#contacting-support", + "Feature": "Get help with most of your Meshery questions and issues in our Community Forum.", + "Function": "Community Support", + "Pricing page?": "X", + "Subscription Tier": "Free", + "Tech": "", + "Theme (also: Keychain Name)": "Support and Deployment" + } + }, + { + "pricing_page": "true", + "entire_row": { + "Category": "Standard Support", + "Documented?": "", + "Feature": "Layer5 Support can help you troubleshoot issues you run into while using Meshery. Get support via the web.", + "Function": "Standard Support", + "Pricing page?": "X", + "Subscription Tier": "Team", + "Tech": "", + "Theme (also: Keychain Name)": "Support and Deployment" + } + }, + { + "pricing_page": "true", + "entire_row": { + "Category": "Premium and Premium Plus Support", + "Documented?": "", + "Feature": "With Premium, get a 30-minute SLA and 24/7 web and phone support. With Premium Plus, get everything in Premium plus your own Support Account Manager and more.", + "Function": "Premium and Premium Plus Support", + "Pricing page?": "X", + "Subscription Tier": "Enterprise", + "Tech": "", + "Theme (also: Keychain Name)": "Support and Deployment" + } + }, + { + "pricing_page": "true", + "entire_row": { + "Category": "Self-hosted Deployment", + "Documented?": "", + "Feature": "Self-hosted Meshery Cloud for on-prem appliances or self-managed cloud tenants.", + "Function": "Self-hosted Deployment", + "Pricing page?": "X", + "Subscription Tier": "Enterprise", + "Tech": "", + "Theme (also: Keychain Name)": "Support and Deployment" + } + }, + { + "pricing_page": "true", + "entire_row": { + "Category": "Phone Support", + "Documented?": "", + "Feature": "Layer5 Support can help you troubleshoot issues you run into while using Meshery. Get support via phone.", + "Function": "Phone Support", + "Pricing page?": "X", + "Subscription Tier": "Enterprise", + "Tech": "", + "Theme (also: Keychain Name)": "Support and Deployment" + } + }, + { + "pricing_page": "true", + "entire_row": { + "Category": "Serverless Pricing", + "Documented?": "", + "Feature": "Subscription plan management. Transformation of workflow pricing model.", + "Function": "Serverless Pricing", + "Pricing page?": "X", + "Subscription Tier": "Enterprise", + "Tech": "WASM", + "Theme (also: Keychain Name)": "Business Performance" + } + }, + { + "pricing_page": "true", + "entire_row": { + "Category": "Screenshots", + "Documented?": "", + "Feature": "Capture and share visual snapshots of your work with ease using our Screenshots feature.", + "Function": "Screenshots", + "Pricing page?": "X", + "Subscription Tier": "Free", + "Tech": "WASM", + "Theme (also: Keychain Name)": "Digital Experience Management" + } + }, + { + "documentation": "https://docs.layer5.io/cloud/identity/users/notification-preferences/", + "entire_row": { + "Category": "Notification Center", + "Documented?": "https://docs.layer5.io/cloud/identity/users/notification-preferences/", + "Feature": "", + "Function": "Events: Reporting of asynchronous events.", + "Pricing page?": "", + "Subscription Tier": "Free", + "Tech": "Server", + "Theme (also: Keychain Name)": "Incident Management" + } + }, + { + "pricing_page": "true", + "entire_row": { + "Category": "Notification Center", + "Documented?": "", + "Feature": "Consolidate all important updates, alerts, and messages in one centralized hub, ensuring you never miss a critical communication or task.", + "Function": "Notification Center", + "Pricing page?": "X", + "Subscription Tier": "Free", + "Tech": "Server", + "Theme (also: Keychain Name)": "Incident Management" + } + }, + { + "pricing_page": "true", + "entire_row": { + "Category": "Audit Trail", + "Documented?": "", + "Feature": "Detailed accounting of user activity. Historical record or each action taken.", + "Function": "Audit Trail", + "Pricing page?": "X", + "Subscription Tier": "Free", + "Tech": "", + "Theme (also: Keychain Name)": "Incident Management" + } + }, + { + "pricing_page": "true", + "entire_row": { + "Category": "Alert Generation", + "Documented?": "", + "Feature": "Dismiss individual; Dismiss bulk.", + "Function": "Alert Generation", + "Pricing page?": "X", + "Subscription Tier": "Free", + "Tech": "Server UI", + "Theme (also: Keychain Name)": "Incident Management" + } + }, + { + "pricing_page": "true", + "entire_row": { + "Category": "Calendaring", + "Documented?": "", + "Feature": "Get integration with GSuite and integration with Microsoft Outlook.", + "Function": "Calendaring", + "Pricing page?": "X", + "Subscription Tier": "Team", + "Tech": "Golang", + "Theme (also: Keychain Name)": "Incident Management" + } + }, + { + "pricing_page": "true", + "entire_row": { + "Category": "Traffic Replay", + "Documented?": "", + "Feature": "Visual event replay in MeshMap", + "Function": "Traffic Replay", + "Pricing page?": "X", + "Subscription Tier": "Enterprise", + "Tech": "Postgres", + "Theme (also: Keychain Name)": "Incident Management" + } + }, + { + "pricing_page": "true", + "entire_row": { + "Category": "Notification Integrations", + "Documented?": "", + "Feature": "Access a variety of third-party applications, right from MeshMap. Send a message to Slack, identify an on-duty team to page, or raise an alarm in Datadog.", + "Function": "Notification Integrations", + "Pricing page?": "X", + "Subscription Tier": "Enterprise", + "Tech": "Cloud", + "Theme (also: Keychain Name)": "Incident Management" + } + } +] \ No newline at end of file diff --git a/src/components/PlanCard/collapsible-details.js b/src/components/PlanCard/collapsible-details.js index e1cf0d9e15e9..1276a6bd473a 100644 --- a/src/components/PlanCard/collapsible-details.js +++ b/src/components/PlanCard/collapsible-details.js @@ -4,77 +4,96 @@ import { MdExpandMore } from "@react-icons/all-files/md/MdExpandMore"; import { RiArrowRightSLine } from "@react-icons/all-files/ri/RiArrowRightSLine"; const FeatureDetailsWrapper = styled.div` -display: inline; -cursor: pointer; -.open{ + display: inline; + cursor: pointer; + + .open { margin: 0rem; list-style: none; - height:auto !important; - opacity:1 !important; + height: auto !important; + opacity: 1 !important; margin-bottom: 2rem; - transition:all .4s !important; - } - .toggle-icon{ - width: 1.2rem; - height: 1.2rem; - fill: ${props => props.theme.primaryColor}; + transition: all 0.4s !important; + } + + .toggle-icon { + width: 1.2rem; + height: 1.2rem; + fill: ${(props) => props.theme.primaryColor}; transition: 0.8s cubic-bezier(0.2, 0.8, 0.2, 1); } -p{ + + p { font-size: 0.9rem; - color: ${props => props.theme.greyC1C1C1ToGreyB3B3B3}; - transition: 0.8s cubic-bezier(0.2, 0.8, 0.2, 1); -} -.toggle-btn{ - display:inline-block; + color: ${(props) => props.theme.greyC1C1C1ToGreyB3B3B3}; + transition: 0.8s cubic-bezier(0.2, 0.8, 0.2, 1); + } + + .toggle-btn { + display: inline-block; float: left; - vertical-align: middle;; - } - .closed{ - opacity:1; - height:0; - transition:none; - visibility:hidden; - } - .open{ - visibility:visible; - } - h5{ - display: inline-block; - vertical-align: middle; - } + vertical-align: middle; + } + + .closed { + opacity: 1; + height: 0; + transition: none; + visibility: hidden; + } + + .open { + visibility: visible; + } + + h5 { + display: inline-block; + vertical-align: middle; + } + + .beta-tag { + display: inline-block; + background-color: #ffd700; + color: #000000; + font-size: 0.7rem; + padding: 2px 6px; + border-radius: 4px; + margin-left: 8px; + font-weight: bold; + vertical-align: middle; + } `; -const FeatureDetails = (props) => { +const FeatureDetails = ({ category, description, tier }) => { const [expand, setExpand] = React.useState(false); + const BetaTag = () => Coming Soon; + return ( -
- {props.description ? +
setExpand(!expand)}> + {description && (
{expand ? ( setExpand(!expand)} /> ) : ( setExpand(!expand)} /> )} -
: ""} -
{props.category}
+
+ )} +
+ {category} + {tier === "Team-Beta" && } +

- {props.description} + {description}

diff --git a/src/components/PlanCard/index.js b/src/components/PlanCard/index.js index 29726d2edd78..c3f3e2000209 100644 --- a/src/components/PlanCard/index.js +++ b/src/components/PlanCard/index.js @@ -4,33 +4,31 @@ import { Col, Row, Container } from "../../reusecore/Layout"; import PlanCardWrapper from "./planCard.style"; import FeatureDetails from "./collapsible-details"; -const PlanCard = (props) => { - return ( +const PlanCard = ({ planData }) => { + if (!planData || !Array.isArray(planData) || planData.length === 0) { + return
No plan data available
; + } + return ( - {props.planData.map((x) => ( + {planData.map((x) => ( -
- {x.featured ? ( -
Free Forever
- ) : ( - "" - )} +
+ {x.featured &&
Free Forever
}
{x.pricing_coming_soon}

{x.tier}

{x.byline}
- {x.summary.map((t) => ( + {x.summary && x.summary.map((t) => (
))} @@ -49,7 +47,6 @@ const PlanCard = (props) => {
))} - diff --git a/src/sections/Pricing/comparison.js b/src/sections/Pricing/comparison.js index 3d4e735ea0d6..9502dc790d19 100644 --- a/src/sections/Pricing/comparison.js +++ b/src/sections/Pricing/comparison.js @@ -1,6 +1,6 @@ import React from "react"; import styled from "styled-components"; -import { details } from "./data"; +import details from "./generateDetails"; import { Container } from "../../reusecore/Layout"; // import FeatureDetails from "./collapsible-details"; import FeatureDetails from "../../components/PlanCard/collapsible-details"; diff --git a/src/sections/Pricing/generateDetails.js b/src/sections/Pricing/generateDetails.js new file mode 100644 index 000000000000..7d7d358d6310 --- /dev/null +++ b/src/sections/Pricing/generateDetails.js @@ -0,0 +1,48 @@ +import React from "react"; +import { GiCheckMark } from "@react-icons/all-files/gi/GiCheckMark"; +import { MdClose } from "@react-icons/all-files/md/MdClose"; +import featureData from "../../../feature_data.json"; +import Configuration from "./icons/configuration.svg"; +import Lifecycle from "./icons/lifecycle.svg"; +import Kanvas from "./icons/kanvas-icon.svg"; +import Perforamance from "./icons/perf.svg"; +import Collab from "./icons/collaboration.svg"; +import Identity from "./icons/identity.svg"; +import Notification from "./icons/notification.svg"; +import Support from "./icons/support.svg"; + +function generateDetails(data) { + const categories = [ + { id: 0, name: "Configuration Management", icon: Configuration }, + { id: 1, name: "Lifecycle Management", icon: Lifecycle }, + { id: 2, name: "Kanvas", icon: Kanvas }, + { id: 3, name: "Performance Management", icon: Perforamance }, + { id: 4, name: "Collaboration", icon: Collab }, + { id: 5, name: "Identity & Access Management", icon: Identity }, + { id: 6, name: "Incident Management", icon: Notification }, + { id: 7, name: "Support and Deployment", icon: Support }, + ]; + + return categories.map(category => { + const features = data + .filter(item => item.entire_row["Theme (also: Keychain Name)"] === category.name) + .map(item => ({ + feature: item.entire_row.Function, + description: item.entire_row.Feature, + free: item.entire_row["Subscription Tier"] === "Free" ? : , + team: item.entire_row["Subscription Tier"] === "Team" || item.entire_row["Subscription Tier"] === "Free" ? : , + enterprise: , + })); + + return { + id: category.id, + category: category.name, + icon: category.icon, + features: features, + }; + }); +} + +const details = generateDetails(featureData); + +export default details; \ No newline at end of file diff --git a/src/sections/Pricing/generateOptions.js b/src/sections/Pricing/generateOptions.js new file mode 100644 index 000000000000..07825de1cb38 --- /dev/null +++ b/src/sections/Pricing/generateOptions.js @@ -0,0 +1,62 @@ +import featureData from "../../../feature_data.json"; +import comingSoon from "./icons/coming-soon.webp"; +import React from "react"; + +function generateOptions(data) { + const tiers = { + "Free": { + tier: "Personal", + featured: true, + monthlyprice: 0, + yearlyprice: 0, + byline: "Open Source features, plus:", + button: ["Join for Free", "https://meshery.layer5.io"] + }, + "Team": { + tier: "Team", + featured: false, + monthlyprice: 9.99, + yearlyprice: 100, + byline: "Everything in Free, plus:", + button: [ + "Contact Sales", + "https://us15.list-manage.com/contact-form?u=6b50be5aea3dfe1fd4c041d80&form_id=d0ffe17c92d8014ede6b721aa16096e8" + ] + }, + "Enterprise": { + tier: "Enterprise", + featured: false, + monthlyprice: 15.99, + yearlyprice: 180, + pricing_coming_soon: Coming Soon, + byline: "Everything in Team, plus:", + button: ["Coming Soon", ""] + } + }; + + const options = Object.entries(tiers).map(([tierName, tierInfo]) => { + const summary = data + .filter((item) => + (tierName === "Team" && + (item.entire_row["Subscription Tier"] === "Team" || item.entire_row["Subscription Tier"] === "Team-Beta")) || + (item.entire_row["Subscription Tier"] === tierName && item.pricing_page === "true") + ) + .map((item, index) => ({ + id: index, + category: item.entire_row.Function, + description: item.entire_row.Feature, + tier: item.entire_row["Subscription Tier"] + })); + + return { + ...tierInfo, + summary: summary.length > 0 ? summary : [] + }; + }); + + return options; +} + +const options = generateOptions(featureData); + +export default options; diff --git a/src/sections/Pricing/index.js b/src/sections/Pricing/index.js index c93cb0c8ff9e..56d8457d5d7e 100644 --- a/src/sections/Pricing/index.js +++ b/src/sections/Pricing/index.js @@ -3,11 +3,10 @@ import PricingWrapper from "./pricing.style"; import Comparison from "./comparison"; import FAQ from "../General/Faq"; import Reviews from "./review-slider"; -import { options } from "./data"; +import options from "./generateOptions"; import PlanCard from "../../components/PlanCard"; const Pricing = () => { - // const [monthly, setMonthly] = useState(false); return (