# Parallel Works Documentation > Parallel Works ACTIVATE is a hybrid, multi-cloud platform for running high-performance computing (HPC) and AI workloads across on-premises and cloud resources. This file indexes the documentation — the PW command-line interface (CLI), the REST API, and the user guides — for AI agents and tools. Append `.md` to any /docs URL to fetch that page as clean markdown. # About ACTIVATE > Source: https://parallelworks.com/docs/about-activate # About ACTIVATE ## What We Do The ACTIVATE control plane gives users the ability to create and manage elastic resource pools and high-performance computing (HPC) clusters on virtually any cloud service provider. ACTIVATE is designed to be accessible and universally useful: users can run scripts—called _workflows_—that are defined in a variety of programming languages across multiple pools and clusters. ACTIVATE customers use their own cloud accounts to deploy cloud HPC resources via the ACTIVATE control plane, meaning that HPC resources are our customer-deployed solution. While ACTIVATE can be deployed in different locations (i.e., in the cloud or on-premises), it is not deployed by customers directly. Our goal is to make high-performance simulation and modeling computation as simple as possible, and we're working towards that goal every day. ## Working With Cloud Resources The process for using cloud resources typically follows these steps: - Log in to ACTIVATE. - Create or start a cluster with the configuration that best suits your work. - Transfer your data to the cloud from an on-premises location or from an object storage, such as Amazon Web Services (AWS) S3 buckets, Google Cloud Storage (GCS) buckets, or Microsoft Azure Blob containers. - Complete your computations. - Transfer your data back to an on-premises location or to object storage. - Shut down the cluster. If you've never used ACTIVATE before, you can check out [our **Getting Start** tutorial](/docs/getting-started) to learn more about using clusters. ## Essential Cloud Concepts **Clusters** are standard HPC clusters well-suited for supporting the execution of a wide range of parallel applications, including MPI, OpenMP, and GPU-based applications as well as various hybrid combinations. Cloud-based clusters can run a variety of job schedulers, providing an environment that’s familiar to users of traditional HPC clusters. On ACTIVATE, a cluster has one controller node that sends jobs to the compute nodes, which are grouped into partitions. **Workflows** are scripts written in a variety of languages and programming models. Typically, workflows orchestrate the execution of applications relevant to your domain, whether that’s computational fluid dynamics for mechanical engineers or molecular modeling for biochemists. Workflows are run on either pools or clusters, depending on the need of the workflow. There are several demonstration and template workflows available in the ACTIVATE Marketplace (see [**Marketplace**](/docs/marketplace) for more information). ## About This Guide We constantly update the ACTIVATE control plane, adding features to make it easier to complete large-scale projects. Our documentation is a work in progress: the following instructions and information will be updated regularly as we work to improve ACTIVATE and our users’ experience. We would love to hear your feedback. Feel free to share your requests for additional features and thoughts about ACTIVATE at [feedback@parallelworks.com](mailto:feedback@parallelworks.com). # Account Settings > Source: https://parallelworks.com/docs/account-settings # Account Settings Manage your personal account preferences and settings in ACTIVATE. ## Settings Areas ### [Authentication](/docs/account-settings/authentication) Manage your authentication credentials: - SSH keys for cluster access - SSH private keys for connecting to remote resources - API keys for programmatic access - Token generation - Multi-factor authentication (2-Step Verification) ### [Cloud Snapshots](/docs/account-settings/cloud-snapshots) Create and manage snapshots of your cloud resources for backup and recovery. ### [Connections](/docs/account-settings/connections) Link your GitHub account to enable repository access on the platform. ### [Customizing Layouts](/docs/account-settings/customizing-layouts) Personalize your ACTIVATE workspace: - Customize your home dashboard widgets - Configure sidebar navigation preferences ### [Language](/docs/account-settings/language) Choose your preferred language for the ACTIVATE interface. ### [Managing Notifications](/docs/account-settings/managing-notifications) Control how and when you receive notifications about your resources and workflows. ### [Resetting Password](/docs/account-settings/resetting-password) Update your account password when needed. ### [Restarting Your Workspace](/docs/account-settings/restarting-your-workspace) Restart your user workspace if you encounter issues. ### [Workflow Variables](/docs/account-settings/workflow-variables) Define personal variables for use in workflow expressions. ## Quick Links - [Authentication](/docs/account-settings/authentication) - Manage SSH and API keys - [Customizing Layouts](/docs/account-settings/customizing-layouts) - Personalize your dashboard - [Managing Notifications](/docs/account-settings/managing-notifications) - Configure alerts # Authentication > Source: https://parallelworks.com/docs/account-settings/authentication # Authentication ## Managing API Keys You can use an API key to access Parallel Works via its REST API. :::info Note Please note that API keys act as an alternate means to access your account and should be treated with the same care as your login password. ::: ### Create an API Key Navigate to your account settings (**Username** > **Account**). ![Screenshot of the user clicking Account.](/content-images/docs/account-settings/authentication/click-account.png) On the next page, click **Authentication**. ![Screenshot of the user clicking the Authentication tab.](/content-images/docs/account-settings/authentication/click-auth.png) Click **API Keys**. ![Screenshot of the user clicking API Keys in the Authentication tab.](/content-images/docs/account-settings/authentication/click-api-keys.png) Click **Add Key**. ![Screenshot of the user clicking the Add API Key button.](/content-images/docs/account-settings/authentication/add-api-key.png) Enter a **Key Name** for the new API key. If your organization permits users to select their own expiration date for API keys, use the **Expiration** dropdown menu to select when your key will expire. You can choose no expiration or a date in 7, 30, 60, or 90 days. Shorter expiration periods are more secure. Click **Add Key**. ![Screenshot of the user clicking the Add Key button.](/content-images/docs/account-settings/authentication/click-add-key.png) Your new API key will be displayed on the next page. You can use the copy button to copy and save the key in a secure place. Once you refresh or navigate away from this page, you won’t be able to see the key again. ![Screenshot of the Authentication tab after clicking the Add Key button.](/content-images/docs/account-settings/authentication/new-api-key.png) ### Delete an API Key Navigate to **Account** > **Authentication** > **API Keys** and click the delete icon to remove an API key from your ACTIVATE account. ![Screenshot of the user clicking the delete icon for an API key. ](/content-images/docs/account-settings/authentication/delete-api-key.png) A dialog box will appear with more information about deleting your key. Click **Delete API Key** to confirm the deletion. The key will be removed from your account immediately. ## Managing Tokens You can create a short-term token and use it to authenticate our CLI after installing locally. These tokens last 24 hours, after which you will need to re-authenticate. ### Create a Token Navigate to your account settings (**Username** > **Account**). ![Screenshot of the user clicking Account.](/content-images/docs/account-settings/authentication/click-account.png) On the next page, click **Authentication**. ![Screenshot of the user clicking the Authentication tab.](/content-images/docs/account-settings/authentication/click-auth.png) Click **API Keys**. ![Screenshot of the user clicking API Keys in the Authentication tab.](/content-images/docs/account-settings/authentication/click-api-keys.png) Click **Generate Token**. ![Screenshot of the user clicking the Add API Key button.](/content-images/docs/account-settings/authentication/click-generate-token.png) If your organization permits users to select their own expiration date for tokens, use the **Expiration** dropdown menu to select when your key will expire. You can choose from 1 hour up to 24 hours in 1-hour increments. Shorter expiration periods are more secure. Click **Add Token**. ![Screenshot of the user clicking the Add Token button.](/content-images/docs/account-settings/authentication/click-add-token.png) Your new token will be displayed on the next page. You can use the copy button to copy and save the key in a secure place. Once you refresh or navigate away from this page, you won’t be able to see the key again. ![Screenshot of the Authentication tab after clicking the Add Key button.](/content-images/docs/account-settings/authentication/new-token-screen.png) ## Managing SSH Keys You can add an SSH key to your ACTIVATE account, which will allow you to log in to any active cluster from any device with that SSH key on it. ### Create an SSH Key Navigate to your account settings (**Username** > **Account**). ![Screenshot of the user clicking Account.](/content-images/docs/account-settings/authentication/click-account.png) On the next page, click **Authentication**. ![Screenshot of the user clicking the Authentication tab.](/content-images/docs/account-settings/authentication/click-auth.png) Click **SSH Keys**. ![Screenshot of user clicking SSH Keys in the Authentication tab.](/content-images/docs/account-settings/authentication/click-ssh-keys.png) Click **Add Key**. ![Screenshot of the user clicking the Add SSH Key button.](/content-images/docs/account-settings/authentication/add-ssh-key.png) Use the **Key Name** field to give the key a unique name. Paste your public SSH key in the **Key** field. Click **Add Key**. ![Screenshot of the Authentication tab after pasting an SSH key and naming it.](/content-images/docs/account-settings/authentication/click-add-ssh.png) You can now log in to any active cluster. Navigate to the terminal or command line on your device and enter `ssh -i /path/to/ssh/private/key username@IPaddress`: ```shell parallelworks@Parallels-Macbook-Air sshtest % ssh -i ./id_rsa demo@34.135.24.147 Last failed login: Thu Mar 2 09:48:20 UTC 2023 from 60.94.197.104.bc.googleusercontent.com on ssh:notty [demo@democluster-70 ~]$ ``` ### Copy an SSH Key In **Account** > **Authentication** > **SSH Keys**, click the clipboard icon to copy your SSH key to your computer's clipboard. ![Screenshot of the user clicking the clipboard icon.](/content-images/docs/account-settings/authentication/click-share-key.png) ## Managing SSH Private Keys You can store private SSH keys on your ACTIVATE account, which the platform uses on your behalf to connect to remote resources — for example, existing clusters that require an SSH credential you already hold. Unlike the public SSH keys described above (which let you log in *to* your clusters), private keys let ACTIVATE log in *from* the platform to a remote resource. ### Create an SSH Private Key Navigate to your account settings (**Username** > **Account**). On the next page, click **SSH Private Keys**. Click **New SSH Private Key**. Use the **Name** field to give the key a unique name, and optionally add a **Description**. Paste your private key in the **Remote Resource SSH Private Key** field. Click **Create SSH Private Key**. A dialog box with the message _SSH Private Key created successfully_ will appear, and the key will be listed with its account name, description, and creation date. ### Delete an SSH Private Key In **Account** > **SSH Private Keys**, click the delete icon in the key's row. A dialog box will appear; click **Delete credentials** to confirm. ## Managing Multi-Factor Authentication You can add a second verification step to your account. With 2-Step Verification turned on, signing in requires a code from an authenticator app in addition to your password. ### Turn On 2-Step Verification Navigate to your account settings (**Username** > **Account**). On the next page, click **Authentication**. Click the **2-Step Verification** row, which shows whether 2-Step Verification is currently on or off. On the **Manage MFA Settings** page, find the **Authenticator app** card and click **Use Authenticator**. On the **Setup Authenticator App** page, use a phone app like 1Password, Authy, Google Authenticator, or Microsoft Authenticator to scan the QR code. If you can't scan the QR code, click **Can't scan the QR code?** to reveal a secret key you can enter in your app manually. Enter the 6-digit code from your app in the **Verification code** field and click **Enable 2FA**. A dialog box with the message _MFA setup successful_ will appear. The next time you sign in, you'll be asked for a code from your authenticator app after entering your password. :::note Feature Preview Security keys (WebAuthn) are also available as an MFA method through a Feature Preview. Organizations can require them with the [**Enforce Security Key MFA**](/docs/organization-admin/settings/policies) policy. ::: ### Turn Off 2-Step Verification Navigate to **Account** > **Authentication** > **2-Step Verification**. To remove your authenticator app, click the delete icon on its card. A dialog box will appear; click **Remove Authenticator app** to confirm. Your authenticator will be removed immediately. To turn off 2-Step Verification entirely, click **Turn Off**. A dialog box will appear; click **Turn off 2-Step Verification** to confirm. # Working With Cloud Snapshots > Source: https://parallelworks.com/docs/account-settings/cloud-snapshots # Working With Cloud Snapshots Cloud snapshots let you make persistent changes to the operating system image running on your cluster nodes. By using an image provided by Parallel Works as a base, you can stage automations, install additional software, or enable additional services. ## Creating Cloud Snapshots Navigate to your account settings (**Username** > **Account**). ![Screenshot of user selecting Account from the User dropdown menu.](/content-images/docs/account-settings/cloud-snapshots/click-account.png) On the next page, click **Cloud Snapshots**. ![Screenshot of user selecting Cloud Snapshots in their Account settings.](/content-images/docs/account-settings/cloud-snapshots/click-snapshots.png) In **Cloud Snapshots**, click **New Snapshot**. ![Screenshot of user selecting New Snapshot in the Cloud Snapshots tab.](/content-images/docs/account-settings/cloud-snapshots/click-new-snapshot.png) ### Snapshot Configuration Settings There are several configurable parameters for cloud snapshots, which are outlined below. ![Screenshot of blank cloud snapshot settings.](/content-images/docs/account-settings/cloud-snapshots/blank-snapshot-page.png) #### Type Use this dropdown menu to select whether your snapshot will be built for AWS, Azure, or Google. #### Cloud Account Use this dropdown menu to select which cloud account will provision your snapshot. For most users, this menu should be left as the default option, unless you're a member of multiple organizations. #### Group Use this dropdown menu to select the group name that your organization uses to allocate costs. This menu is especially important if your organization uses multiple groups. If you’re not sure which group to select, you can contact us or your organization’s ACTIVATE administrator. #### Snapshot Region Use this dropdown menu to select the region your snapshot will be provisioned in. If you run in multiple regions, you will want to provision the snapshot wherever you run your clusters. #### Base Image Use this dropdown menu to select the ACTIVATE image that will be the base for your snapshot. Typically, this menu will be populated with the suggested version by default. #### Root Disk Size (GB) Use this field to enter the size of the snapshot's root disk. By default, this field is set to `100`. Typically, you won't have to change this value unless you run into capacity issues. #### Name Use this field to enter the name of your snapshot as it will be listed on the ACTIVATE control plane. #### Description Use this field to enter a description to provide additional details about your snapshot. ### Snapshot Build Script You can enter a script in **Snapshot Build Script**, which will run to make additions to the base ACTIVATE image. You can use this script to install additional packages from `yum` repositories, clone GitHub repositories, or download files from a URL. An example build script is provided below. ```bash #!/bin/bash # Get useful environment info echo "my username is $USER" echo "my home dir is $HOME" echo "my workdir is $PWD" # Clone a public GitHub repository git clone https://github.com/hpc/ior.git /usr/local/src/ior; # Install Anaconda and have it initialize on login wget https://repo.anaconda.com/archive/Anaconda3-2023.03-Linux-x86_64.sh; sh ./Anaconda3-2023.03-Linux-x86_64.sh -b -p /usr/local/anaconda3; # Symlink the Conda executable to the main /usr/local/bin directory ln -s /usr/local/anaconda3/bin/conda /usr/local/bin/conda; # Install Jupyter conda install -y jupyter; # Packages will be installed under the Anaconda root directory, so symlink what you need ln -s /usr/local/anaconda3/bin/jupyter-lab /usr/local/bin/jupyter-lab; ln -s /usr/local/anaconda3/bin/jupyter /usr/local/bin/jupyter; # Install R and R Studio Server # Specify the R version you want # Download and install R packages curl -O https://cdn.rstudio.com/r/centos-7/pkgs/R-${R_VERSION}-1-1.x86_64.rpm; yum -y install R-${R_VERSION}-1-1.x86_64.rpm; # NOTE: this package installs R to /opt/R/4.1.3/bin/R # Install R Studio packages wget https://download2.rstudio.org/server/centos7/x86_64/rstudio-server-rhel-2023.03.0-386-x86_64.rpm; yum -y install rstudio-server-rhel-2023.03.0-386-x86_64.rpm; ``` This build script will: - print some basic environment information. - clone the public [IOR](https://github.com/hpc/ior) repository from GitHub into `/usr/local/src/ior`. - download and run the `Conda` installer. - download and install R and R Studio Server. - link executables to a common `$PATH` location. Once you’ve provided your build script, click **Create Snapshot** to save the configuration. ## Provisioning Cloud Snapshots After clicking **Create Snapshot**, the page will update with a **Provisioning Log** and two new buttons: **Save Snapshot Config** and **Provision Snapshot**. ![Screenshot of cloud snapshot page after clicking Create New Snapshot.](/content-images/docs/account-settings/cloud-snapshots/blank-snapshot-deprovision.png) Click **Save Snapshot Config** when making configuration changes that you want to save, including changes to the main parameters. Click **Provision Snapshot** to start building the snapshot image. Doing so will replace the **Snapshot Build Script** with the **Provisioning Log**, where you can monitor the snapshot build. The snapshot build process works by creating a temporary virtual machine (VM) that runs the ACTIVATE base image. Then, the provided script runs to make additions to the image, which is saved as a separate snapshot. When the snapshot is done building, the **Provisioning Log** will show a message identifying the name of the image in the CSP account. If there were errors in the build that prevented it from completing, those will also be visible in the log. If your build is successful, the **Provisioning Log** will show a message such as: ```json Packer build completed successfully {"snapshot_id":"ami-0a5854d925e6e558b", "snapshot_name":"pw-Demo-hello", "csp":"aws", "region":"us-east-1" } https://parallel.works/api/v2/machineimages ``` If your build is unsuccessful, the **Provisioning Log** will show a message such as: ```json Build 'amazon-ebs.aws' errored after 1 minute 57 seconds: Script exited with non-zero exit status: 1. Allowed exit codes are: [0] ==> Wait completed after 1 minute 57 seconds ==> Some builds didn't complete successfully and had errors: --> amazon-ebs.aws: Script exited with non-zero exit status: 1. Allowed exit codes are: [0] ==> Builds finished but no artifacts were created. Packer build failed ``` :::info Note If you reprovision an existing snapshot and the new build has errors, your previously working snapshot will not be overwritten. ::: ## Using Cloud Snapshots Snapshots you have created for any CSP will automatically be added to your cluster configuration settings. You can see user-created snapshots on a cluster's configuration page by selecting the [**Image**](/docs/compute/configuring-cloud-clusters#image) in **Controller Settings** and the [**Elastic Image**](/docs/compute/configuring-cloud-clusters#elastic-image) in **Partition Settings**. You can also configure a different snapshot for your controller and each of your partitions. ## Deleting Cloud Snapshots To delete a custom snapshot, navigate to its configuration page and click **Deprovision Snapshot**. A dialog box will appear with the message _Are you sure you want to deprovision the snapshot test?_ Click **Deprovision snapshot**. The **Provisioning Log** will then display the deletion process: ```json Starting delete of custom image... CLOUD: aws REGION: us-east-1 PROJECT: ca-cloudmgmt IMAGE: pw-Demo-hello AMI: ami-023b3386461fdfad6 SnapshotId: snap-01d59ca427982c1d8 aws ec2 deregister-image --image-id ami-023b3386461fdfad6 aws ec2 delete-snapshot --snapshot-id snap-01d59ca427982c1d8 Delete completed... ```
If you use the method above, you will still have your snapshot listed in **Cloud Snapshots** (**Username** > **Account** > **Cloud Snapshots**), and you will be able to reconfigure and reprovision the snapshot at any time.
Alternatively, you can delete a snapshot from the list in **Cloud Snapshots**. If you click the delete icon, a dialog box will appear with the message _Are you sure you want to delete the snapshot [snapshot name]?_ Clicking **Delete snapshot** will permanently remove the snapshot from your account and from the list in **Cloud Snapshots**. :::info About Deletion If you want to delete a snapshot from the list in **Cloud Snapshots**, you first need to deprovision the snapshot on its configuration page. If you don't, the snapshot will still exist in your CSP account. ::: # Connections > Source: https://parallelworks.com/docs/account-settings/connections ## About Connections The **Connections** page links your GitHub account to ACTIVATE, enabling repository access on the platform. :::info Note GitHub connections are available once a platform administrator has configured the platform's GitHub integration. If the **Link GitHub** option isn't available, contact your administrator. ::: ## Link Your GitHub Account Navigate to your account settings (**Username** > **Account**). On the next page, click **Connections**. On the GitHub card, click **Link GitHub**. A GitHub authorization window will open; follow the prompts to authorize the connection. Once linked, the card shows **Connected as @username**, and a dialog box with the message _GitHub account linked successfully_ will appear. ## Install the GitHub App After linking your account, install the GitHub App wherever you want to grant repository access: - The **Connected organizations** section lists the GitHub organizations where the app is installed, along with each installation date. Click the plus icon to install the app on another organization. - The **Personal GitHub account** section shows whether the app is installed on your personal account. To manage an existing installation's repository access, open its **Connected** dropdown menu and click **Configure in GitHub**. ## Disconnect Your GitHub Account On the GitHub card, click the delete icon. A dialog box will appear with the message _Are you sure you want to disconnect your GitHub account? You will need to re-link to access repositories._ Click **Disconnect**. A dialog box with the message _GitHub account disconnected_ will appear. # Customizing Layouts > Source: https://parallelworks.com/docs/account-settings/customizing-layouts # Customizing Layouts You can customize both your Dashboard and your sidebar layouts by adding, removing, and reordering items. ## Customizing the Dashboard On the **Dashboard**, click ** Customize**. ![Screenshot of the user clicking the Customize button on the Dashboard.](/content-images/docs/account-settings/customizing-layouts/click-customize.png) ### Move Modules Move your cursor over a module until it becomes the directional arrows icon. Click to drag and drop a module anywhere in the grid. ### Resize Modules Move your cursor to the bottom-right corner of a module until it becomes the diagonal arrow icon. Click, drag, and drop the corner to resize the module. ### Rename Modules Click the edit icon. ![Screenshot of the user clicking the edit icon on a module.](/content-images/docs/account-settings/customizing-layouts/click-edit-module.png) Enter a new name for the module. Click the checkmark icon. ![Screenshot of the user clicking the checkmark icon on a module.](/content-images/docs/account-settings/customizing-layouts/click-check-module.png) ### Add Modules Click **+ Add Widget**. ![Screenshot of the user clicking the delete icon on a module.](/content-images/docs/account-settings/customizing-layouts/click-add-widget-module.png) A panel will appear with the available modules. Click, drag, and drop a module into the grid to add it. ### Delete Modules Click the delete icon. ![Screenshot of the user clicking the delete icon on a module.](/content-images/docs/account-settings/customizing-layouts/click-delete-module.png) ### Filter Data Some modules allow for further customization. Click the menu icon. ![Screenshot of the user clicking the three dots icon on a module.](/content-images/docs/account-settings/customizing-layouts/click-dots-module.png) The available options will depend on the module. For example, some modules allow filtering the data they display. After making your changes, click the menu icon again. ### Restore Defaults If you want to revert your changes, click ** Restore defaults**. ![Screenshot of the user clicking the Restore button.](/content-images/docs/account-settings/customizing-layouts/click-restore-defaults-module.png) ### Save Changes When you're done making changes, click ** Done**. ![Screenshot of the user clicking the Done button.](/content-images/docs/account-settings/customizing-layouts/click-restore-defaults-module.png) ## Customizing the Sidebar At the bottom of the sidebar, click the gear icon. Alternatively, navigate to **Account** > **Sidebar**. ![Screenshot of the user clicking the gear icon in the sidebar.](/content-images/docs/account-settings/customizing-layouts/click-sidebar-gear.png) In **Sidebar Settings**, you can uncheck boxes to remove items. Click **Reset to default** to undo your changes. ![Screenshot of the user clicking the gear icon in the sidebar.](/content-images/docs/account-settings/customizing-layouts/click-reset-default-sidebar.png) :::info Note Please note that your administrator can remove items from the default sidebar's options. You may not have access to all of the items in the screenshot above. ::: # Language > Source: https://parallelworks.com/docs/account-settings/language ## About Language Settings You can choose your preferred language for the ACTIVATE interface. The platform currently supports: - English - Español (Spanish) - 日本語 (Japanese) - 한국어 (Korean) - 中文 (Chinese) ## Changing Your Language Navigate to your account settings (**Username** > **Account**). On the next page, click **Language**. Under **Language Setting**, use the dropdown menu to choose your preferred language. The **Current Language** section shows which language is currently active. Click **Save Language**. A dialog box with the message _Language setting saved_ will appear, and the interface will switch to your selected language immediately. # Managing Notifications > Source: https://parallelworks.com/docs/account-settings/managing-notifications # Managing Notifications The ACTIVATE control plane includes a customizable notification system for both our web interface and your ACTIVATE-linked email address. Navigate to your account settings (**Username** > **Account**). ![Screenshot of the user selecting Account from the username menu.](/content-images/docs/account-settings/managing-notifications/click-account.png) In **Profile Settings**, click **Notifications**. ![Screenshot of the user selecting the Notification Hub.](/content-images/docs/account-settings/managing-notifications/click-notifications.png) Here, you can manage past notifications as well as configure your notification settings. ![Screenshot of the Notifications tab.](/content-images/docs/account-settings/managing-notifications/default-notifications-view.png) You can also reach the **Notification Hub** by clicking the bell icon in the navigation bar, then clicking **Show More**. ## Changing Notification Settings Scroll down to the **Manage notifications** section. ![Screenshot of the Manage notifications section.](/content-images/docs/account-settings/managing-notifications/manage-notifications-default.png) You can select how you would like to receive your notifications here. **Web** notifications appear under the bell icon and in the **Notification Hub** on the ACTIVATE control plane. **Email** notifications are sent directly to your ACTIVATE-linked email address. By default, all options for **Workflow**, **Scheduler**, and **Platform** notifications are enabled as **Web** notifications. Click the checkboxes for **Web** and **Email** to enable or disable notifications. For more customized settings, you can click a notification type and enable or disable its sub-types. ![Screenshot of the expanded notifcation options.](/content-images/docs/account-settings/managing-notifications/manage-notifications-expanded.png) When you’re done, click **Save notification settings**. ## About Notification Types Our notification system includes the types outlined below. - Workflows - **Job Fail**: If a workflow fails during start-up or run-time, this notification will be triggered. - **Ready Interactive Workflow**: Because interactive workflows can have longer start-up times, we’ve included this notification to send when an interactive session is ready to use. - Scheduler - **Job Start/Finish**: Job status notifications will be sent from the scheduler’s prolog and epilog scripts. This method requires no cluster side user action, and will send notifications about your jobs when selected. - **—mail-type**: This notification uses the Slurm flag `--mail-type`, which is set by the user on the cluster in order to send notifications when certain events occur. This method requires users to enter the `--mail-type` flag when calling `salloc`, `sbatch`, `srun`, or in their job scripts. For more information about these Slurm commands, please see [**Submitting Jobs via Slurm**](/docs/compute/submitting-jobs#notification-management). - Platform - **General Notification**: These notifications include cluster start-up messages and run-time errors. # Resetting Your Password > Source: https://parallelworks.com/docs/account-settings/resetting-password # Resetting Your Password Navigate to your account settings (**Username** > **Account**). ![Screenshot of the user selecting Account from the username menu.](/content-images/docs/account-settings/resetting-password/click-account.png) On the next page, click **Authentication**. ![Screenshot of the user clicking the Authentication tab.](/content-images/docs/account-settings/resetting-password/click-auth.png) Click **Password**. ![Screenshot of the user clicking the Password section.](/content-images/docs/account-settings/resetting-password/click-password.png) On the next page, enter your current password and your new password. Your new password must contain: - at least 15 characters - one lowercase character - one uppercase character - one number - one special character ![Screenshot of the blank password reset screen.](/content-images/docs/account-settings/resetting-password/reset-password.png) When you're done, click **Update Password**. # Restarting Your Workspace > Source: https://parallelworks.com/docs/account-settings/restarting-your-workspace # Restarting Your Workspace Your user workspace is your dedicated environment for starting clusters, running workflows, and accessing your data on the ACTIVATE control plane. Each user’s workspace is separate from each other, so the work you do on ACTIVATE will never affect another user’s work. This page explains how to restart your user workspace, which is useful if you’re experiencing issues like a cluster that won’t start or a workflow that won’t run. :::info Note All running clusters and jobs will be disrupted if you restart your workspace. ::: Navigate to your account settings (**Username** > **Account**). ![Screenshot of the user select Account from the User dropdown menu.](/content-images/docs/account-settings/restarting-your-workspace/click-account.png) In your profile settings, click **Restart Workspace**. ![Screenshot of the user clicking the Restart Workspace button.](/content-images/docs/account-settings/restarting-your-workspace/click-restart-workspace.png) A dialog box will appear with the message *Are you sure you want to restart your workspace?* Click **Restart**. After the workspace has restarted, you’ll see the message _User workspace killed_. :::info Troubleshooting If you restarted your workspace because you were experiencing errors and they aren’t resolved after restarting, please contact us or your ACTIVATE administrator. ::: # Workflow Variables > Source: https://parallelworks.com/docs/account-settings/workflow-variables ## About Workflow Variables You can define personal variables for use in workflow expressions. Variables you create here are available in your workflows through the `var` context — for example, `${{ var.MY_VARIABLE }}`. Personal variables are separate from your organization's variables, which use the `org` context and are managed by organization admins. For more information, please see [**Organization Workflow Variables**](/docs/organization-admin/settings/variables). ## Adding a Variable Navigate to your account settings (**Username** > **Account**). On the next page, click **Variables**. Click **Add variable**. In the dialog box that appears, enter a **Key** (letters, numbers, underscores, and hyphens only — for example, `MY_API_KEY`) and a **Value**. Click **Save**. A dialog box with the message _Variable created_ will appear. Variables are stored as secrets by default: their values are masked in the variables table and can't be viewed again after saving. ## Editing and Deleting Variables To change a variable's value, click the edit icon in its row, enter the new **Value**, and click **Save**. A variable's key can't be changed after creation; to rename a variable, delete it and create a new one. To delete a variable, click the delete icon in its row. A dialog box will appear; click **Delete** to confirm. ## Using Variables in Workflows Reference your variables in any workflow definition with the `var` context: ```yaml jobs: main: steps: - name: Run run: echo ${{ var.MY_VARIABLE }} ``` For more information about contexts and expressions, please see [**Inputs and Expressions**](/docs/run/workflows/building-workflows/inputs-and-expressions). # Navigating the Admin Panel > Source: https://parallelworks.com/docs/admin-panel ## About the Admin Panel This page explains the features in the **Admin Panel**, which you can access by clicking your username and selecting **Admin**. :::info Persona You’ll only be able to access these features if you’re an ACTIVATE platform administrator. ::: :::info About Containers In much of the user guide, we say “user workspaces” to talk about a user’s account on the ACTIVATE platform. Please note that this term is synonymous with “user container,” which we use on this page. ::: ## Platform Settings When you navigate to the **Admin Panel**, you’ll see **Platform Settings** by default. This tab displays essential information about your organization’s version of the platform. When making changes on this page, click **Save Platform Settings**. Your changes will be applied immediately. ![Screenshot of the Platform Settings tab in the Admin Panel.](/content-images/docs/admin-panel/blank-platform-settings.png) #### License Information The **Information** section at the top of the page displays details that cannot be configured from within the platform: the **Status URL**, **Platform version**, and **Platform License**. If a license expiration date or licensed features are set, they're displayed here as well. If a license has not been set, resources will not be able to be started until one is added. To upload a new license, click **Update Platform License**. In the dialog box that appears, paste the license in the **New License** field and click **Update License**. #### Platform Name This field sets the display name shown on the login page. If it's not set, _Parallel Works ACTIVATE_ is used. #### Maintenance Message If you set a maintenance message, it will show as an alert on all pages of the platform. You can use this field to warn users about an upcoming maintenance window before enabling **Maintenance Mode**. #### Maintenance Mode While **Maintenance Mode** is enabled, only admins will be able to start and stop resources. To enable **Maintenance Mode**, click the checkbox next to it. The platform will remain in maintenance mode until you deactivate it. #### Forgot Password Enabled While this option is enabled, the forgot password feature is available on the platform, and users can request a password reset from the login page. #### API Key Expiration By default, users can customize the expiration date for their created API keys with no expiration or a date in 7, 30, 60, or 90 days. You can change the maximum number of days for API keys to expire. For example, if you set this date to 30 days, users may not create a key that expires after 60 days. To make this change, check the box for **Enforce Maximum API Keys TTL** (Time to Live) and enter a number in the **Days** field that appears. #### Single Organization Platform If you check this box, other users will only see login options for the organization your account belong to. #### Enable Onboarding When this option is enabled, new users will be guided through an onboarding flow on first login. During onboarding, users can add the compute resources and workflows recommended by their organization. For more information, please see [**Onboarding**](/docs/organization-admin/customize/onboarding). #### Create k8s PVC This option creates a PersistentVolumeClaim (PVC) in users' home directories. For more information about PVCs, please see [this page](https://kubernetes.io/docs/concepts/storage/persistent-volumes/) of Kubernetes's documentation. #### Delete User Files on Deletion When this option is enabled, user files and SSH keys will be deleted from their workspace when their account is deleted. #### Minimum Agent Version Use this field to reject agent tunnel connections below a minimum version (e.g., `v7.45.2`). Already-connected agents below the minimum are disconnected on the next sweep. Leave the field empty to disable enforcement. #### Docker Workspace Settings Use this field to change Docker workspace settings, such as additional mounts, variables, and Domain Name System (DNS) settings. ### Workspace Defaults The **Workspace Defaults** section sets the default workspace configuration for the platform. These defaults are applied to user workspaces unless an organization or user has set their own. Leave a numeric field blank to use the built-in default. - **Workspace Type**: the container runtime new users will be provisioned on (**docker** or **k8s**) - **Workspace Image**: the container image for user workspaces; leave blank to use the upstream image - **Default User Host**: the host new Docker workspaces are provisioned on - **Default CPU Request** and **Default CPU Limit**: measured in cores - **Default Memory Request** and **Default Memory Limit**: measured in GB - **Default Ephemeral Storage Limit**: measured in GiB When making changes in this section, click **Save Workspace Defaults**. Your changes will be applied immediately. ## Users This tab displays all of your users’ information, including: - username - email address - enabled status - workspace image - account creation date ![Screenshot of the Users tab in the Admin Panel.](/content-images/docs/admin-panel/blank-users-admin-tab.png) Use the **Username** field to search for users. ![Screenshot of a circle around the Username search bar in the Users tab.](/content-images/docs/admin-panel/click-username-search.png) Use the **Enabled/Disabled** dropdown menu to display users that are enabled, disabled, or either. This option is set to **Enabled/Disabled** by default. ![Screenshot of a circle around the Active dropdown menu in the Users tab.](/content-images/docs/admin-panel/click-enabled-dropdown.png) Use the **Limit** dropdown menu to narrow the listed users to 10, 20, 50, 100, or All. This option is set to **50** by default. ![Screenshot of a circle around the Limit dropdown menu in the Users tab.](/content-images/docs/admin-panel/click-limit-dropdown.png) ### Editing User Information In the **Users** tab, click on the username you’d like to edit. ![Screenshot of the user clicking a username in the Users tab.](/content-images/docs/admin-panel/click-user-admin.png) On the next page, you can edit several of the user’s parameters. The first section contains information about the user’s account, container, and access to the platform. ![Screenshot of the first section of a user's account settings.](/content-images/docs/admin-panel/user-admin-settings.png) #### Identity Here, you can edit a user’s **Username** or **Email**. Altering either of these parameters will change the user’s login credentials. #### Settings Here, you can control a user’s access to the platform. #### User Host This field identifies the user host, which is the part of the platform where account resources are provisioned. We recommend contacting us before you make changes to this parameter. #### User Container This option identifies which service will be used to deploy a user’s container. Use the bubbles to select **Docker** or **k8s** (Kubernetes). We recommend contacting us before you make changes to this parameter. #### MFA Enabled Use the bubbles to select whether the user will use multi-factor authentication. Select **No** if a user doesn’t need multi-factor authentication. Select **Duo** if you work with a company or organization that is not affiliated with the government. Duo is a Cisco service that is more popular with other types of institutions. Select **MyProxy** if you work with a governmental agency, such as a public university or a research organization. Generally, MyProxy is preferred for these types of institutions. We recommend contacting us before you make changes to this parameter. #### User Workspace Image This field identifies which image version a user’s workspace is running. #### User Organization Use this dropdown menu to assign the user to an organization. #### Attributes Here, you can control whether a user is an **Admin** or **Active** by selecting their respective checkboxes. A user with **Admin** enabled will be able to access the **Admin Panel** and all of its settings. This option does not affect the group setting `org:admin`. For more information, please see [**About Roles**](/docs/organization-admin#about-group-roles). A user with **Active** enabled will be able to log in to the platform with their username and password. Unchecking **Active** will disable a user’s access to the platform. Users who are **Active** are marked as **Enabled** in **Admin** > **Users** and **Organization** > **Users**. ![Screenshot of Enabled users on Org and Admin pages.](/content-images/docs/admin-panel/enabled-view.png) #### Actions Click the **Update User container** button to migrate a user’s container to the latest image. Click the **Kill user container** button to restart a user’s container. Click the **Remove from teams** button to remove a user from all of their assigned groups. :::info Note If you change any of the parameters above, click **Save** before leaving the page. Your changes will be applied immediately. ::: #### Set Password ![Screenshot of the Set Password section.](/content-images/docs/admin-panel/admin-set-password.png) Here, you can reset a user's login credentials. If you change this parameter, click **Save** before leaving the page. Your change will be applied immediately. #### Contact Info ![Screenshot of the Contact Info section.](/content-images/docs/admin-panel/admin-contact-info.png) Here, you can change a user’s contact information, including their display name, platform URL, and geographical location. This information is only visible to platform admins and does not affect a user’s login credentials. If you change these parameters, click **Save** before leaving the page. Your changes will be applied immediately. ### Setting User Images In the **Users** tab, select users with their checkboxes. Click **Set Image**. ![Screenshot of the user selecting a username checkbox and clicking the Set Image button.](/content-images/docs/admin-panel/click-set-image.png) A dialog box will appear. Enter the **Image Name** and the image **Version**. Click **Update Image**. Your changes will be applied immediately. ![Screenshot of the Mass Update dialog box.](/content-images/docs/admin-panel/click-update-image.png) ### Updating User Images In the **Users** tab, select users with their checkboxes. Click **Update in-place**. ![Screenshot of the user selecting a username checkbox and clicking the Update in-place button.](/content-images/docs/admin-panel/click-update-in-place.png) A dialog box will appear. Confirm that you’ve selected the users you want to update. Click **Apply mass-update**. Your changes will be applied immediately. ![Screenshot of the Updating Filesystem dialog box.](/content-images/docs/admin-panel/click-apply-mass-update.png) ### Using Impersonate If you want to quickly access another user's account, you can use the impersonate feature to bypass the login/logout process. In the **Users** tab, click the impersonate icon for the account you want to access. ![Screenshot of the user selecting the Impersonate icon.](/content-images/docs/admin-panel/click-impersonate-icon.png) You'll be redirected to the user's **Home** page. You can navigate and control resources, storage resources, and workflows as if you were logged in to the user's account. When you're done, click the user's name, then **Return to [Your Account]**. ![Screenshot of the user selecting the Impersonate icon.](/content-images/docs/admin-panel/click-return-to-admin.png) ## Groups This tab displays information for all of your groups, including: - name - organization - number of members - allocation amount - percentage of allocation used - state - creation date - ID number ![Screenshot of the Groups tab in the Admin Panel.](/content-images/docs/admin-panel/blank-admin-groups-tab.png) All the functions in [**Managing Groups**](/docs/organization-admin/managing-groups) can be completed from this tab as well. ## Instances This tab displays information for both running instances and other instances, including: - CSP - organization that owns the key - region - instance ID - creation date - instance name, if any - instance type - private IP - public IP - cloud state - estimated cloud state time - ACTIVATE state ![Screenshot of the Instances tab in the Admin Panel.](/content-images/docs/admin-panel/blank-admin-instances-tab.png) Please note that the instance list is wider than most monitors, so the included screenshot does not show all of the fields listed above. To see more information about your instances, scroll to the bottom of the page and use the horizontal scroll bar to show more columns. You can configure your instance types on the platform by organization. For more information, please see [**Configuring Instance Types**](/docs/organization-admin/cloud/instance-types). ## Workspaces This tab displays information for all of your user containers, including: - container name - user - container image - creation date - type (Docker or Kubernetes) - safe to kill ![Screenshot of the Containers tab in the Admin Panel.](/content-images/docs/admin-panel/blank-admin-workspaces-tab.png) ### Killing User Containers In the **Containers** tab, select users with their checkboxes. Click **Kill containers**. ![Screenshot of the selecting a container checkbox and clicking the Kill containers button.](/content-images/docs/admin-panel/click-kill-containers-admin.png) A dialog box will appear. Confirm that you’ve selected the containers you want kill. Click **Apply mass-update**. Your changes will be applied immediately. ![Screenshot of the Kill Containers dialog box.](/content-images/docs/admin-panel/click-update-workspaces.png) ## Images This tab manages the compute images shown to users when they define clusters. The images listed here are references to images on your cloud service provider (CSP) — deleting an image from this tab will not delete it from the CSP account. The table groups images by CSP and displays each image's name, ID, region, architecture, and size, along with whether it's **Published** and whether it's the **Latest** image. The `latest` tag automatically points to the most recently added image. ### Adding an Image Click **Add Machine Image**. On the next page, you can configure the parameters listed below. - **Name**: the name of the image. - **CSP**: the cloud service provider the image lives on (**aws**, **google**, **azure**, **openstack**, or **oracle**). - **CSP ID**: the unique ID of the image in the CSP (e.g., `ami-1234567890` on AWS). - **Region**: the region the image is in. This field appears for AWS, Oracle, and OpenStack images. - **Size (GiB)**: the size of the image. - **Architecture**: **amd64** or **arm64**. - **OS Type**: the operating system family of the image (**platform**, **rhel**, **ubuntu**, or **windows**). - **Published**: makes the image available for use. When you're done, click **Save**. A dialog box with the message _Image added successfully_ will appear. ### Managing Images Each image's row has a menu with the following actions. Each action asks for confirmation before it's applied. - **Edit** opens the image's parameters. - **Set published** and **Set unpublished** control whether the image is available for use. If a published image is currently set as latest, unpublishing it will prevent it from being used as the latest image. - **Set latest** points the `latest` tag at the image. This action is available for published images only. - **Disable** and **Enable** control whether the image can be selected by users at all. - **Delete** permanently removes the image reference from the platform. ## Reports This tab displays information for your reports, including: - type of report - email address that receives reports - who the report monitors - frequency - creator - creation date ![Screenshot of the Reports tab in the Admin Panel.](/content-images/docs/admin-panel/blank-admin-reports-tab.png) ### Creating Reports In the **Reports** tab, click **+ Add New Report**. ![Screenshot of the user clicking the + Add New Report button.](/content-images/docs/admin-panel/click-add-new-report.png) On the next page, you can edit the parameters listed below. ![Screenshot of the report creation settings.](/content-images/docs/admin-panel/blank-new-report.png) Use the **Type** dropdown menu to select the type of report you want to generate: - summary - project - monthly - user - application Use the **Who** field to enter the username who the report will monitor. Use the **Email** field to enter the report recipient’s email address. Use the **Frequency** bubbles to select how frequently the report will be generated: - daily - weekly - monthly - event (once, at the time of creation) - test (once, at the time of creation) - disable (end reports for the time being) ## Webhooks Webhooks allow external services to be notified when certain events happen. When the specified events happen, we'll send a POST request to each of the URLs you provide. ### Adding a Webhook Click **+ Add Webhook**. ![Screenshot of the user clicking the Add Webhook button.](/content-images/docs/admin-panel/click-add-webhook.png) On the next page, select a **Type**. Currently, you can choose from these webhook types: - `USER_CREATED` flags when a new user logs in for the first time. - `USER_DISABLED` flags when a user has been disabled. - `USER_REMOVED_FROM_GROUP` flags when a user has been removed from a group in your organization. Add a **Webhook name** and paste the **URL** that your webhook will be sent to. **Description** is an optional field. Choose whether to **Enable** this webhook. Click **Create webhook**. ![Screenshot of the user clicking the Create Webhook button.](/content-images/docs/admin-panel/click-create-webhook.png) You'll be taken back to the **Webhooks** tab. A dialog box with the message _Webhook created successfully_ will appear in the bottom right corner of your screen. ![Screenshot of the user clicking the Create Webhook button.](/content-images/docs/admin-panel/webhooks-tab.png) ### Deleting a Webhook Select the webhook you'd like to delete, then click **Delete webhooks**. ![Screenshot of the user clicking the Delete Webhook button.](/content-images/docs/admin-panel/click-delete-webhooks.png) A pop-up module will appear. Click **Delete**. ![Screenshot of the user clicking the Delete button.](/content-images/docs/admin-panel/click-delete-webhook-for-real.png) You'll be taken back to the **Webhooks** tab. A dialog box with the message _Webhook(s) deleted successfully_ will appear in the bottom right corner of your screen. ### Responding to Events To see the shape of webhooks, please see [this section](/docs/organization-admin/settings/webhooks#responding-to-events). Admin-level webhooks take the same shape as organizaiton-level webhooks, with one exception: - You will not see `organization` inside the `webhook` object. ## Alerts This tab collects error messages from all users in your organization. These messages are shown for 7 days before they're automatically deleted. ![Screenshot of the Alerts tab in the Admin Panel.](/content-images/docs/admin-panel/blank-admin-alerts-tab.png) Use the **Title or message** field to search for alerts by keywords. ![Screenshot of a circle around the Title or message search bar in the Alerts tab.](/content-images/docs/admin-panel/click-alerts-filter.png) Use the **All Dates** dropdown menu to display alerts from a specific date. ![Screenshot of a circle around the All Dates dropdown menu in the Alerts tab.](/content-images/docs/admin-panel/click-alerts-dates.png) Use the **max item** dropdown menu to narrow the listed users to 10, 20, 50, 100, or max items. This option is set to **50** by default. ![Screenshot of a circle around the max items dropdown menu in the Alerts tab.](/content-images/docs/admin-panel/click-alerts-item-num.png) ## Errors This tab displays recent unknown errors from the platform API, including each error's method, path, message, user, request ID, and time. The oldest entries are automatically removed when the storage limit is reached. Use the search bar to filter errors by message, path, user, or request ID. Click **Refresh** to reload the list. You can also click **Trigger Test Error** to generate a sample error and confirm that error reporting is working. Use the **Previous** and **Next** buttons at the bottom of the page to move through the list. ## Notifications This tab lets you send notifications to individual users, organizations, or the entire platform. Recipients see them in their [**Inbox**](/docs/your-workspace/inbox). Use the **Target** dropdown menu to choose who receives the notification: - **User** sends the notification to a single user. Select the recipient in the **Username** dropdown menu that appears. - **Organization** sends the notification to every user in an organization. Select the recipient in the **Organization** dropdown menu that appears. - **All** sends the notification to every user on the platform. Use the **Level** dropdown menu to select **Info** or **Alert**. Enter a **Notification title**. You can optionally add a **Message** and a **Notification href**, which attaches a link to the notification. The **Preview** section shows what the notification will look like to recipients. When you're ready, click **Send notification**. A dialog box with the message _Notification sent successfully_ will appear. ## Previews This tab manages platform-wide feature previews. When a preview is enabled here, it's active for all users and cannot be individually disabled. Click a feature card to see its details, including which users have enabled it under **Enabled by Users**. Features marked **Admin only** aren't visible to regular users. If previews that no longer exist on the platform are still present in user accounts, an _Orphaned previews_ message will appear. Click **Clean up** to remove them. ## Integrations This tab connects third-party services to extend platform functionality. Each integration card shows whether the service is **Configured** or **Not configured**. #### Sentry The Sentry integration monitors errors, performance, and user sessions. Click **Configure** to set it up. Once configured, error tracking and session replays are active. #### Health Monitoring The Health Monitoring integration shares a small health snapshot with Parallel Works every 5 minutes so support can catch expiring certificates, failed certificate renewals, and outages before they cause downtime. Reporting is **on by default**; click **Edit** on its card to review exactly what is sent or to turn it off. Each snapshot contains only the following. It never includes usernames, email addresses, IP addresses, job or workflow data, or any other user content. | Field | Contents | | --- | --- | | Version | The deployment's installed platform version | | Domains | Per platform domain: domain name, certificate expiry date, certificate source, and renewal status | | License | License expiry date and whether it is in the grace period or expired | | Health | Whether the deployment can reach its own database, and the process start time | | Usage | Monthly active user count, assigned seat count, and total/free seat counts when seat allocations are configured | Snapshots are pushed over outbound HTTPS; nothing connects back into the deployment, and a failed send is simply retried at the next interval without affecting the deployment itself. The identity the deployment reports as (shown on the tile under **Reports as**) is derived from its platform license. To stop reporting, toggle **Enable reporting** off and save. The change takes effect within one interval, without a restart. You can also point **Custom endpoint** at your own receiver instead of the Parallel Works default. #### GitHub The GitHub integration connects a GitHub App to enable repository access on the platform. Click **Configure** to set it up. Once configured, users can link their GitHub accounts in their account settings. For more information, please see [**Connections**](/docs/account-settings/connections). To remove the GitHub App configuration, click the delete icon on its card. :::warning Irreversible Action Removing the GitHub App configuration will disconnect all linked users and delete all stored credentials. ::: ## PKI Validation This tab serves a configurable token file at `/.well-known/pki-validation/` for HTTP-based domain control validation, which some certificate issuers require when provisioning SSL/TLS certificates. :::info Note The file is served over plain HTTP without authentication. ::: Enter the **Filename**, including its extension (e.g., `1e2175b230684937b0093e71b3cc3404.txt`), and paste the verification token in the **File contents** field. The file body is preserved exactly, including whitespace. Once you enter a filename, the **Public URL** field displays the address where the file will be served. Click **Save** to start serving the file. The tab will display an **Active** badge while a file is being served. To stop serving the file, click **Remove**. A dialog box will appear; click **Remove** to confirm. The endpoint will return a 404 error afterward. ## Migrations This tab runs and manages database migrations for Postgres and MongoDB. It's primarily used when operating a [self-hosted ACTIVATE deployment](/docs/self-hosting/kubernetes-deployment). The **Mongo Migrations Registry** table lists each migration with its status (**Applied** or **Not Applied**), whether it runs automatically, when it was first applied, and who applied it. Click **Run** (or **Rerun**) in a migration's row to execute it individually, or click **Run Unapplied Auto Mongo Migrations** to run all pending automatic migrations. To run migrations in bulk, click **Run Migrations** and choose **Both (Postgres + Mongo)**, **Postgres Only**, or **Mongo Only**. :::warning Irreversible Action Running migrations will modify your database schema and data. Ensure you have backups before proceeding. ::: The **Migration Run History** section logs each run with its start time, duration, actor, and per-step results. Click **Delete All Logs** to clear the history. Deleting logs only removes the log entries; it does not affect the migrations or the data in your database. ## Maintenance This tab cleans up old or orphaned data to free database space and keep the platform running smoothly. Each operation shows a preview of what will be deleted before you confirm. :::warning Irreversible Action Deletions on this tab permanently remove data from the database and cannot be undone. ::: #### Old Workflow Runs Cleanup This section removes workflow runs created before a specified time period. Enter a number of months in the **Delete workflow runs older than** field and click **Preview** to see how many runs will be deleted. If the preview returns results, click **Delete Workflow Runs** and confirm. #### Orphaned Workflow Runs This section finds workflow runs that reference non-existent users or workflows — for example, runs where the user has been deleted, or where the workflow definition no longer exists. Click **Scan for Orphaned Runs** to preview them, then click **Delete Orphaned Runs** and confirm. #### Orphaned Infrastructures This section finds infrastructure that references non-existent users — resources whose owner's account has been deleted. Click **Scan for Orphaned Infra** to preview them, then click **Delete Orphaned Infra** and confirm. # Platform Policies > Source: https://parallelworks.com/docs/admin-panel/policies # Platform Policies ## Navigation In the **Admin Panel** sidebar, under **Configuration**, click **Policies**. ## Overview Platform policies are enforced across all organizations. When a platform policy is set, it takes precedence over the corresponding [organization policy](/docs/organization-admin/settings/policies) and cannot be overridden by organization admins. When **No policy** is selected, each organization can choose whether to apply the policy for itself. ## Policies ### No Root Access Disable root access to cloud compute resources for all users, including resource owners, across all organizations. Defaults to "Enable root access" if no policy is set. ### Nitro Instance Types Only Restrict compute resources to AWS Nitro instance types only, across all organizations. Defaults to "Allow all AWS instance types" if no policy is set. ### No Public IP Addresses Prevent users from provisioning standalone public IP addresses, across all organizations. Defaults to "Allow public IP addresses" if no policy is set. When enabled, requests to provision a standalone public IP address are rejected. ### Archive Cost Data Automatically summarize and then archive cost data after a specified number of months to optimize database performance. This will not delete any data, it will only summarize older data. Cost data can be archived after 1, 3, 6, or 12 months. ### Enforce Security Key MFA :::note Feature Preview This policy is feature-flagged and may not be visible on your platform. ::: Require all users to set up and use a hardware security key (such as a YubiKey) for multi-factor authentication when logging in with a password. Users without a registered security key will be prompted to register one before accessing the platform. Users signing in through an OpenID Connect provider with **Skip Platform MFA Verification** enabled are not affected by this policy; their identity provider is trusted to perform multi-factor authentication. # AI > Source: https://parallelworks.com/docs/ai # AI ACTIVATE AI brings your organization's AI usage under one governed gateway. Connect your own AI providers — hosted services or models running on your own infrastructure — and ACTIVATE manages access to them through a built-in chat workspace, API keys, and token-level usage tracking. ## Chat Chat is a full-featured chat interface for interacting with large language models directly within the platform. You can have conversations with AI models, attach files for context, branch conversations to explore different approaches, and share conversations with teammates. - [Chat Overview](/docs/ai/chat) — Get started with the chat interface, learn about available features ## pw code `pw code` is an AI coding agent that runs in your terminal. It reads and edits files, runs commands, and works through multi-step tasks, with sessions stored locally on your machine. See [pw code](/docs/ai/code) for install, quick start, and features. ## The AI Gateway The AI gateway is how ACTIVATE manages access to your providers. Every request — whether it comes from Chat, [the CLI](/docs/ai/code), or an external tool authenticating with an AI key — is proxied through the platform, where access is checked and token usage is metered against your organization's budget allocations. - [AI Providers](/docs/ai/ai-providers) — Connect the model backends that power the gateway - [AI Keys](/docs/ai/ai-keys) — Create API keys for programmatic access through the OpenAI-compatible API - [AI Usage](/docs/ai/ai-usage) — Track spend, tokens, and budget allocations - [Best Practices](/docs/ai/best-practices) — Tips for prompting, model selection, and security ## Related Documentation - [Machine Learning](/docs/ml) — ML workspace resources - [Getting Started](/docs/getting-started) — Tutorial for new users # AI Keys > Source: https://parallelworks.com/docs/ai/ai-keys # AI Keys AI keys let external tools and applications authenticate to your organization's [AI providers](/docs/ai/ai-providers/) through the ACTIVATE AI gateway. Requests made with a key are proxied through the platform, where token usage is metered and billed — so programmatic access carries the same governance as the rest of ACTIVATE. Each key is bound to a budget allocation when it is created. Usage made with the key draws from that allocation, and once the allocation's budget is exhausted, further requests are rejected with a payment-required error before they reach a model. Usage made with a key is tracked on the [AI Usage](/docs/ai/ai-usage) dashboard, where it can be broken down per key. ## Managing Keys {#ai-api-keys} AI keys belong to your user account — each user creates and manages their own keys. To manage your keys, navigate to **AI** > **AI Keys** in the sidebar. The page lists each key with its creation date, expiration date, when it was last used, and its allocation, if any. Use the **Filter keys** field to search the list. Click **Create key** to add a new key. :::info Note Keys are shown once at creation. Store them in a password manager — once you navigate away, you won't be able to see the key again. ::: To revoke a key, click the delete icon in its row. ## Using a Key with the OpenAI-Compatible API The gateway exposes an OpenAI-compatible API, so existing SDKs and tools work when pointed at ACTIVATE instead of directly at a vendor. Send requests to the chat completions endpoint at `/api/openai/v1/chat/completions`, authenticating with an AI key. Model IDs use the format `owner:provider-name/model-name`. For step-by-step setup guides for tools like Open WebUI, OpenCode, Kilo Code, and Cursor, see [Connect External Tools](/docs/ai/ai-providers/connect/). ## Related Documentation - [AI Providers](/docs/ai/ai-providers/) — Connect the model backends behind the gateway - [AI Usage](/docs/ai/ai-usage) — Track spend, tokens, and budget allocations - [Chat](/docs/ai/chat/) — Using the chat interface # AI Providers > Source: https://parallelworks.com/docs/ai/ai-providers # AI Providers AI providers are the model backends behind the ACTIVATE AI gateway. Each provider connects the platform to a large language model endpoint, powering both [Chat](/docs/ai/chat/) and programmatic access through [AI keys](/docs/ai/ai-keys/). ACTIVATE supports three types of providers: - **Azure OpenAI** — A managed provider provisioned through your organization's Azure infrastructure. ACTIVATE handles deployment and configuration automatically. - **Custom OpenAI-Compatible** — Any endpoint that implements the OpenAI chat completions API. Use this to connect services like vLLM, Ollama, or other compatible inference servers. - **Session Tunnels** — A secure tunnel from the platform to a model running inside an ACTIVATE compute session. Useful for private or fine-tuned models running on your own hardware. :::info Permissions Required Creating and managing AI providers requires appropriate platform permissions. In most organizations, providers are set up by administrators or team leads and then shared with other users. ::: ## Provider Permissions Each provider has its own access controls. The provider owner and organization administrators can share a provider with specific groups or the entire organization using the `aiprovider:use` permission. Users who have been granted access can select the shared provider in Chat. See [Managing Permissions](/docs/ai/ai-providers/managing-permissions) for details on sharing and revoking access. ## AI Keys Users can create **AI keys**, which let external tools and applications authenticate to the organization's AI providers through the gateway. Each key belongs to the user who created it and draws from a budget allocation. See [AI Keys](/docs/ai/ai-keys/) for creating keys and using the OpenAI-compatible API. ## Next Steps - [Azure OpenAI](/docs/ai/ai-providers/azure-openai) — Set up a managed Azure OpenAI provider - [Custom OpenAI-Compatible](/docs/ai/ai-providers/custom-openai-compatible) — Connect any OpenAI-compatible endpoint - [Session Tunnels](/docs/ai/ai-providers/session-tunnels) — Route chat through a model in a compute session - [Managing Permissions](/docs/ai/ai-providers/managing-permissions) — Control who can use your providers - [Connect External Tools](/docs/ai/ai-providers/connect) — Use your models from editors and other OpenAI-compatible tools - [Tool Calling & Emulation](/docs/ai/ai-providers/tool-calling) — How agentic tool calling works, including on endpoints without a tools API ## Related Documentation - [Chat](/docs/ai/chat/) — Using the chat interface - [AI Keys](/docs/ai/ai-keys/) — Programmatic access through the gateway - [Adding an ML Resource](/docs/ml/adding-ml-resources/) — Provisioning ML workspaces # Azure OpenAI Provider > Source: https://parallelworks.com/docs/ai/ai-providers/azure-openai # Azure OpenAI Provider The Azure OpenAI provider is a managed integration that provisions an Azure OpenAI deployment through your organization's cloud infrastructure. ACTIVATE handles the deployment lifecycle, so you do not need to manually configure Azure resources. ## Prerequisites Before creating an Azure OpenAI provider, ensure that: - Your organization has at least one **provisioned network** in ACTIVATE - You have a **billing group** associated with your account - Your organization's Azure subscription supports Azure OpenAI deployments in your target region ## Creating a Provider 1. Navigate to **AI** > **Providers** in the ACTIVATE sidebar. 2. Click **Add Provider**. 3. Select **Azure** as the cloud service provider. 4. Fill in the required fields: - **Name** — A descriptive name for the provider (for example, "Azure GPT-4o"). - **Network** — Select the provisioned network to deploy with. - **Group** — Select the billing group to associate with this provider. - **Region** — The Azure region for the deployment (for example, "eastus2"). - **Model** — The model to deploy (for example, "gpt-4o"). 5. Optionally add a **Description** and **Tags**. 6. Click **Create**. The provider will enter a **provisioning** status while ACTIVATE configures the Azure resources. Once provisioning completes, the status changes to **provisioned** and the provider is ready to use in Chat. ## Verifying the Provider After provisioning completes: 1. Open **Chat**. 2. Select your new Azure provider from the provider dropdown. 3. Send a test message to confirm the model responds. If the provider does not appear in the dropdown, verify that your user account has access. See [Managing Permissions](/docs/ai/ai-providers/managing-permissions) for details. ## Updating a Provider Azure providers are managed by the platform. The model and deployment configuration are set during provisioning. To change the model or region, delete the existing provider and create a new one. ## Deleting a Provider 1. Navigate to **AI** > **Providers**. 2. Find the provider you want to remove. 3. Click the delete action for that provider. 4. Confirm the deletion. Deleting an Azure provider tears down the associated Azure resources. This action cannot be undone. ## Related Documentation - [AI Providers Overview](/docs/ai/ai-providers) — Overview of all provider types - [Managing Permissions](/docs/ai/ai-providers/managing-permissions) — Sharing providers with your team - [Custom OpenAI-Compatible](/docs/ai/ai-providers/custom-openai-compatible) — Connecting non-Azure endpoints # Connect External Tools > Source: https://parallelworks.com/docs/ai/ai-providers/connect # Connect External Tools Use your platform AI models with external tools and editors. Any tool that supports an OpenAI-compatible provider can send requests through the ACTIVATE AI gateway, authenticated with an [AI key](/docs/ai/ai-keys/) and governed by the same budgets and usage tracking as the rest of the platform. To open the page, navigate to **AI** > **Providers** in the sidebar and click **Connect Tools**. ## Base URL and API Key External tools need two values, both available at the top of the page: - **Base URL** — your organization's gateway endpoint, `https:///api/openai/v1`. Click the URL on the page to copy it with your actual domain filled in. - **AI API Key** — click **Create Key** to generate a key without leaving the page. Keys are shown once at creation; see [AI Keys](/docs/ai/ai-keys/) for managing them. ## Available Models The **Your models** list shows every model you can access across your providers — click a model to copy its ID. Model IDs use the format `owner:provider-name/model-name`. If the list is empty, add or get access to a provider first; see [AI Providers](/docs/ai/ai-providers/). ## Setup Guides The page includes step-by-step guides for popular tools. Each guide inserts your Base URL, API key, and model IDs in place. ### Open WebUI A self-hosted, feature-rich web interface for AI chat. 1. Open your Open WebUI instance, click your avatar in the bottom-left corner, and select "Admin Panel". 2. Go to the Settings tab, then navigate to Connections > OpenAI. 3. Click the "+" button to add a new connection. 4. Enter your Base URL. 5. Paste your API key into the Auth field (leave the type set to "Bearer"). 6. Click "Save" to add the connection. ### OpenCode An AI coding assistant with OpenAI-compatible provider support. **Desktop** 1. Open OpenCode and go to Settings > Providers. 2. Scroll down to "Custom provider" and click "+ Connect". 3. Enter a Provider ID (e.g. "pw") and a Display name (e.g. "Parallel Works"). 4. Set the Base URL to your gateway Base URL. 5. Paste your API key into the API key field. 6. Under Models, enter one of your model IDs and a display name, then click "Submit". Repeat to add more. **CLI** 1. Launch OpenCode in your terminal and run the `/connect` command to register a new provider credential. 2. Enter a Provider ID (e.g. "pw") and select "Other" when prompted for a provider. 3. Paste your API key when OpenCode prompts for it. 4. Open (or create) `opencode.json` in your project root or at `~/.config/opencode/opencode.json`, then add this provider entry: ```json { "$schema": "https://opencode.ai/config.json", "provider": { "pw": { "npm": "@ai-sdk/openai-compatible", "name": "Parallel Works", "options": { "baseURL": "https:///api/openai/v1" }, "models": { "model-id-here": { "name": "Model Display Name" } } } } } ``` 5. Replace `model-id-here` with one of your model IDs. Add more entries under `models` for every model you want available. 6. Restart OpenCode. Your custom provider and models will appear in the model picker. :::info Tip OpenCode Desktop and CLI share the same `opencode.json`. If you already set up the desktop variant above, the CLI will pick up the same provider. The quickest path is often to configure in the desktop and then just run `opencode` in your terminal. ::: ### Kilo Code An open-source AI coding assistant for VS Code with OpenAI-compatible provider support. 1. Open VS Code and install the Kilo Code extension. 2. Open the Kilo Code panel, open Settings, and choose Providers. 3. Click "Connect" next to "Custom provider". 4. Enter a Provider ID (e.g. "pw") and a Display name (e.g. "Parallel Works"). 5. Set the Base URL to your gateway Base URL. 6. Paste your API key into the API key field. 7. Kilo Code fetches your available models automatically. Select the ones you want and click "Add N model(s)". ### Cursor An AI-powered code editor built on VS Code with integrated chat and code generation. 1. Open Cursor and go to Settings > Models. 2. Expand the "API Keys" section and enable the "OpenAI API Key" toggle. 3. Paste your API key into the OpenAI API Key field. 4. Enable the "Override OpenAI Base URL" toggle and set it to your gateway Base URL. 5. Scroll down and click "+ Add Custom Model", enter one of your model IDs, and click "Add". Repeat for every model you want available. 6. Turn off "Auto" mode in the model picker. Otherwise Cursor ignores your custom models and routes to its own. ## Related Documentation - [AI Keys](/docs/ai/ai-keys/) — Creating and managing keys - [AI Providers](/docs/ai/ai-providers/) — Connecting model backends - [AI Usage](/docs/ai/ai-usage/) — Tracking spend from external tools # Custom OpenAI-Compatible Provider > Source: https://parallelworks.com/docs/ai/ai-providers/custom-openai-compatible A custom provider connects ACTIVATE to any endpoint that implements the OpenAI chat completions API. This gives you flexibility to use self-hosted models, third-party inference services, or any other compatible backend. ## Endpoint Requirements Your endpoint must support the following: - **POST `/v1/chat/completions`** — The standard OpenAI chat completions endpoint. ACTIVATE sends all chat messages to this route. - **GET `/v1/models`** (optional) — If your endpoint exposes this route, ACTIVATE can list available models dynamically so users can switch models without reconfiguring the provider. The endpoint must accept an API key via the `Authorization: Bearer ` header. ## Prerequisites Before creating a custom provider, ensure that: - Your inference endpoint is running and reachable from the ACTIVATE platform - You have the endpoint URL and a valid API key ## Creating a Provider 1. Navigate to **AI** > **Providers** in the ACTIVATE sidebar. 2. Click **Add Provider**. 3. Select **Custom** as the cloud service provider. 4. Fill in the required fields: - **Name** — A descriptive name for the provider (for example, "vLLM Llama 3"). - **Endpoint** — The full URL to your chat completions endpoint (for example, `https://my-server.example.com/v1/chat/completions`). - **API Key** — The authentication key for your endpoint. 5. Optionally add a **Description** and **Tags**. 6. Click **Create**. Custom providers are available immediately after creation — no provisioning step is required. ## Verifying the Provider 1. Open **Chat**. 2. Select your new custom provider from the provider dropdown. 3. Send a test message to confirm the endpoint responds correctly. ACTIVATE automatically discovers available models by querying your endpoint's `/v1/models` route. If the model list dropdown is populated, your endpoint supports this route and ACTIVATE has successfully queried it. ## Updating a Provider You can update the endpoint and API key for a custom provider at any time: 1. Navigate to **AI** > **Providers**. 2. Select the provider you want to update. 3. Modify the fields as needed. 4. Save your changes. This is useful for rotating API keys or pointing the provider at a different endpoint without creating a new provider. ## Notes for Common Inference Servers **vLLM** — Start vLLM with the `--api-key` flag to enable API key authentication. The default port is 8000. Your endpoint URL will be `http://:8000/v1/chat/completions`. **Ollama** — Ollama exposes an OpenAI-compatible API on port 11434. Set the endpoint to `http://:11434/v1/chat/completions`. The model name should match the Ollama model tag (for example, "llama3"). **Text Generation Inference (TGI)** — TGI provides an OpenAI-compatible Messages API. Set the endpoint to `http://:8080/v1/chat/completions`. ## Exposing a Local Server Through an Endpoint To expose a server on a machine you control, use an [endpoint session](/docs/run/sessions/endpoints/#expose-a-local-ai-model): `pw endpoints http --openai ` registers it as a model automatically, or drop `--openai` and use the endpoint's public URL as the **Endpoint** above. A server that rejects the forwarded `Host` (such as Ollama) also needs [`--rewrite-host`](/docs/run/sessions/endpoints/#a-local-app-rejects-the-tunneled-request). ## Deleting a Provider 1. Navigate to **AI** > **Providers**. 2. Find the provider you want to remove. 3. Click the delete action for that provider. 4. Confirm the deletion. Deleting a custom provider only removes it from ACTIVATE. It does not affect the external inference endpoint. ## Related Documentation - [AI Providers Overview](/docs/ai/ai-providers) — Overview of all provider types - [Managing Permissions](/docs/ai/ai-providers/managing-permissions) — Sharing providers with your team - [Session Tunnels](/docs/ai/ai-providers/session-tunnels) — Tunneling to a model running in a compute session # Managing Provider Permissions > Source: https://parallelworks.com/docs/ai/ai-providers/managing-permissions # Managing Provider Permissions AI providers support a permission system that lets you control who can use your providers. By default, a provider is private to its owner. You can share it with specific groups or your entire organization. ## Permission Model ACTIVATE uses the `aiprovider:use` permission to control access to AI providers. This is the only permission level for providers — granting it allows the recipient to select the provider in Chat and send messages through it. Access to a provider is determined by the following rules, evaluated in order: 1. **Owner** — The user who created the provider always has full access, including the ability to manage permissions. 2. **Organization administrators** — Org admins can access and manage permissions for any provider in the organization. 3. **Granted permissions** — Users who belong to a group that has been granted `aiprovider:use` on the provider, or users in an organization where the provider is shared organization-wide. ## Who Can Manage Permissions Only the provider **owner** and **organization administrators** can view or modify provider permissions. Other users with `aiprovider:use` access can use the provider but cannot change its sharing settings. ## Sharing a Provider with a Group 1. Navigate to **AI** > **Providers**. 2. Select the provider you want to share. 3. Open the **Permissions** settings for the provider. 4. Under **Groups**, find the group you want to share with. 5. Enable the `aiprovider:use` permission for that group. 6. Save your changes. All members of the selected group will now see the provider in their provider list in Chat. ## Sharing a Provider with the Entire Organization 1. Navigate to **AI** > **Providers**. 2. Select the provider you want to share. 3. Open the **Permissions** settings for the provider. 4. Under **Organization**, enable the `aiprovider:use` permission. 5. Save your changes. Every user in your organization will now have access to this provider. ## Revoking Access To remove access for a group or the organization: 1. Open the **Permissions** settings for the provider. 2. Disable the `aiprovider:use` permission for the group or organization. 3. Save your changes. Users who lose access will no longer see the provider in their provider list in Chat. Existing conversations that used the provider will remain, but users will not be able to send new messages through it. ## Best Practices - **Start with group-level sharing.** Share providers with specific teams that need them rather than the entire organization. This limits unnecessary usage and cost. - **Use descriptive provider names.** When sharing across groups, a clear name like "Azure GPT-4o (East US)" helps users identify the right provider. - **Audit permissions periodically.** Review which groups have access to each provider, especially for providers connected to paid endpoints. - **Rotate API keys regularly.** For custom providers, update the API key in the provider settings when you rotate credentials on the backend. :::info Session Tunnels Session tunnel providers do not support the permissions system. They are private to the user who created the tunnel. ::: ## Related Documentation - [AI Providers Overview](/docs/ai/ai-providers) — Overview of all provider types - [Azure OpenAI](/docs/ai/ai-providers/azure-openai) — Setting up managed Azure providers - [Custom OpenAI-Compatible](/docs/ai/ai-providers/custom-openai-compatible) — Connecting external endpoints # Session Tunnel Providers > Source: https://parallelworks.com/docs/ai/ai-providers/session-tunnels # Session Tunnel Providers A session tunnel provider routes Chat traffic through a secure tunnel to a model running inside an ACTIVATE compute session. This allows you to use models hosted on your own cluster hardware without exposing them to the public internet. ## How Session Tunnels Work When you start a session in ACTIVATE with an OpenAI-compatible model server running on it, you can create a tunnel that makes the model available to Chat. The tunnel establishes a secure connection between the ACTIVATE platform and the model endpoint inside your session. Session tunnel providers appear in the provider list in Chat with the type `openai-tunnel`. They are automatically discovered when a tunnel with the OpenAI flag enabled is active for your user account. ## Prerequisites Before using a session tunnel provider: - You have an active ACTIVATE session running on a cluster - An OpenAI-compatible model server is running inside the session (for example, vLLM, Ollama, or TGI) - A tunnel has been created from the session with the **OpenAI** option enabled ## Setting Up a Session Tunnel 1. Start a **session** on your cluster with enough resources to run your model (GPU, memory). 2. Inside the session, start an OpenAI-compatible inference server on a known port. 3. Create a **tunnel** for that session and enable the **OpenAI** toggle. 4. Once the tunnel status shows as **running**, the provider appears automatically in your provider list in Chat. You do not need to manually create a provider entry. ACTIVATE detects tunnels with the OpenAI flag and includes them in your available providers. ## Using a Session Tunnel Provider 1. Open **Chat**. 2. In the provider dropdown, look for your tunnel. It will show with the status of the tunnel (for example, "running" or "stopped"). 3. Select the tunnel provider and send a message. If the tunnel is in a "stopped" state, you must restart the session and tunnel before it can serve requests. ## Use Cases - **Air-gapped environments** — Run models on infrastructure that has no direct internet access. The tunnel provides a secure path from ACTIVATE to the model. - **Sensitive data** — Keep model inference on your own hardware to ensure data does not leave your environment. - **Custom fine-tuned models** — Serve models you have fine-tuned on proprietary data without uploading them to a cloud provider. - **Experimentation** — Quickly test different models by starting sessions with different configurations. ## Limitations - **Session dependency** — The tunnel provider is only available while the session and tunnel are active. If the session stops, the provider becomes unavailable. - **No sharing** — Session tunnel providers are tied to the user who created the tunnel. They cannot be shared with other users via the permissions system. - **Single user** — Each tunnel is associated with one user account. ## Related Documentation - [AI Providers Overview](/docs/ai/ai-providers) — Overview of all provider types - [Custom OpenAI-Compatible](/docs/ai/ai-providers/custom-openai-compatible) — Connecting a persistent external endpoint - [Sessions](/docs/run/sessions) — Managing compute sessions # Tool Calling & Emulation > Source: https://parallelworks.com/docs/ai/ai-providers/tool-calling # Tool Calling & Emulation Agentic clients such as [`pw code`](/docs/ai/code/) work by calling tools: the model asks to read a file, run a command, or search the workspace, and the client executes the request and returns the result. Many model endpoints implement tool calling directly, but some do not. Every model reachable through the ACTIVATE AI gateway is advertised with one of three tool-calling modes. Models whose endpoint has no tool-calling API can still be used for agentic work through **emulated tool calling**, which the gateway handles on their behalf. ## The Three Modes | Mode | Meaning | | --- | --- | | `native` | The provider's endpoint implements tool calling. The gateway passes tool definitions and tool calls straight through. | | `emulated` | The provider's endpoint has no tool-calling API. The gateway carries the tool contract in the prompt and reconstructs tool calls from the model's text. | | `none` | Tool calling is unavailable for this provider. Requests that carry tool definitions are rejected. | The mode is a property of the provider integration, not of the individual model. Platform administrators set it when creating or editing a provider, and it is required when registering a custom OpenAI-compatible integration. Built-in integrations ship with the correct mode already set; GenAI.mil, for example, is registered as `emulated`. ### Seeing the Mode The mode is reported wherever models are listed: ```bash # The "Tool calling" column shows yes, emulated, or no pw ai models ls ``` The models endpoint returns it as `tool_calling_mode` on each entry: ```bash GET /api/openai/v1/models ``` Inside an interactive `pw code` session, the status line below the composer shows `emulated tools` when the active model is running in emulated mode, and `tools unavailable` when the model's mode is `none`. ## Why Emulation Exists Some endpoints, including agent-wrapper services and a number of self-hosted inference servers, accept OpenAI-compatible chat requests but do not support the `tools` parameter. Without emulation, those models would be limited to chat and could not be used with `pw code`. Emulation makes tool calling a property of the gateway rather than of the provider. Clients send the same OpenAI-shaped request with a `tools` array and receive the same `tool_calls` in the response, so no client-side configuration changes. ## Architecture All three modes follow one path from the client to the model. The gateway resolves the provider, reads its tool-calling mode, and applies the matching translation layer. Only the emulation layer rewrites the request; native passes it through and `none` rejects it. or any OpenAI-compatible client"] subgraph gateway["ACTIVATE AI gateway"] resolve["Reads the provider's
tool calling mode"] native["Native
pass tools through"] emulate["Emulated
tool contract in the prompt"] none["None
tool calls rejected"] end subgraph providers["Model endpoints"] withtools["Endpoint with a tools API"] notools["Endpoint without a tools API"] end client -->|"request with tools"| resolve resolve --> native resolve --> emulate resolve --> none native <--> withtools emulate <-->|"plain chat"| notools emulate -.->|"tool calls"| client native -.->|"tool calls"| client classDef gatewayNode fill:#dbeafe,stroke:#3b82f6,stroke-width:2px,color:#1e3a5f classDef emulateNode fill:#fef3c7,stroke:#f59e0b,stroke-width:2px,color:#78350f classDef providerNode fill:#d1fae5,stroke:#10b981,stroke-width:2px,color:#064e3b classDef clientNode fill:#ede9fe,stroke:#8b5cf6,stroke-width:2px,color:#4c1d95 class resolve,native,none gatewayNode class emulate emulateNode class withtools,notools providerNode class client clientNode style gateway stroke:#3b82f6,stroke-width:2px style providers stroke:#10b981,stroke-width:2px `} /> The client uses the same contract in every mode. It sends `tools`, receives `tool_calls`, and runs them locally in your workspace. The model does not execute anything itself in either mode. ## How Emulation Works When a request with tool definitions is routed to an emulated provider, the gateway translates in both directions. A single tool round trip looks like this. >G: request with tool definitions Note over G: Move the tool contract into the prompt
Add a per-request nonce G->>M: plain chat request M-->>G: JSON envelope as text Note over G: Check the framing values
Validate the arguments G-->>C: standard tool calls Note over C: Run the tool in the workspace C->>G: tool result Note over G: Fence the result as untrusted data G->>M: chat request with the result M-->>G: plain text answer G-->>C: assistant message `} /> ### 1. The Tool Contract Moves Into the Prompt The gateway strips `tools`, `tool_choice`, and `parallel_tool_calls` from the upstream request and appends an instruction block to the conversation describing: - The full JSON Schema of every tool the client defined. - The exact shape of a tool-call **envelope** the model must emit. - The tool policy for this request, derived from `tool_choice` (optional, required, or one named function) and from whether parallel calls are allowed. The block is appended to the **user turn** rather than sent as a system message. Some agent-wrapper endpoints apply their own system prompt and discard the one supplied by the caller, while still honoring user content, so instructions sent as a system message would not reach the model on those providers. ### 2. The Model Replies With an Envelope To call a tool, the model responds with a single JSON object and nothing else: ```json { "protocol": "parallelworks.tool-call.v1", "toolset": "sha256:9f2c…", "nonce": "4b81f0c39ad2", "calls": [ { "name": "Bash", "arguments": { "command": "ls -la", "description": "list files" } } ] } ``` The gateway checks three framing values before it honors an envelope: - **`protocol`** identifies the envelope format. - **`toolset`** is a digest of the tool definitions sent with this request, so an envelope written against a different set of tools is not accepted. - **`nonce`** is generated for each request and must be echoed back. Content that existed before the request cannot contain the current nonce, so an envelope taken from earlier conversation content or from tool output is not accepted as a live call. ### 3. The Gateway Validates and Converts The gateway locates the envelope in the model's output, allowing for code fences and surrounding prose, then checks it: - Protocol, toolset, and nonce must match this request. - The named tool must be one the client defined. - The arguments must validate against that tool's JSON Schema. - The call count must match the request's parallel-call policy. A valid envelope becomes ordinary OpenAI `tool_calls` with generated call IDs and a `tool_calls` finish reason, so the client receives a standard tool-calling response. Output that is not an envelope attempt is returned unchanged as a plain text answer. Ordinary replies, including replies that contain JSON, are not affected. ### 4. Near Misses Are Repaired, Then Retried Once Models trained on other tool formats produce a small set of predictable variations. The gateway repairs these locally rather than making another upstream call: - Alternate field names for the call list (`tool_calls`, `toolCalls`) and for arguments (`parameters`, `args`, `input`). - A call wrapped in a `function` / `function_call` object. - A single call emitted bare, or a call list emitted as one object instead of an array. - Arguments emitted as a JSON string instead of an object. - Extra top-level fields, duplicate keys, and reordered or reserialized JSON. Repairs are re-validated against the same rules, and a repaired envelope that still fails validation is not accepted. Nonce repair is declined when the envelope appears to have been copied out of tool output. If validation still fails, the gateway makes one corrective retry. It replays the rejected output, states the reason it was rejected, and supplies a skeleton envelope with the correct protocol, toolset, and nonce already filled in, leaving the model only the call to write. If the retry also fails, the request returns an error rather than passing malformed text back as an answer. ### 5. Tool Results Go Back as Fenced, Untrusted Data On the next turn, the client's `tool` messages are rendered as text the model can read. Each result is wrapped in `[TOOL_OUTPUT ]` markers carrying the same per-request nonce and labeled as untrusted data that must not be followed as instructions. Since the nonce is new for each request, earlier output cannot reproduce the markers to close the fence early or imitate gateway framing. Images in tool results are passed through as images. ## Behavior to Expect **Streaming.** A streaming request to an emulated model is still streamed from the provider, but the gateway needs the complete response before it can tell whether the output is an envelope or an answer. The response is buffered and then sent to the client as a stream, so tokens do not appear incrementally as they do with a native provider. **Prompt caching.** The tool contract sits in the user turn and carries a per-request nonce, so the prompt prefix differs on every request. Emulated requests do not benefit from provider-side prompt-prefix caching. **Token cost.** Each request repeats the JSON Schema of every tool in the prompt, which accounts for a noticeable share of input tokens when the toolset is large. A corrective retry adds the cost of a second call for that turn. Usage from both calls is metered. **The Responses API.** Emulation is available over Chat Completions only. A request to `/api/openai/v1/responses` for an emulated provider is rejected with `tool_call_emulation_requires_chat_completions`, and the models list advertises emulated integrations as Chat Completions. **Reliability.** Emulation depends on the model following instructions and copying the framing values accurately. Models that follow instructions well use tools consistently; smaller models, and models behind an agent wrapper, call tools less consistently than they would through a native API. ## Limits Requests that exceed these bounds are rejected before they are sent upstream. | Limit | Value | | --- | --- | | Tools per request | 128 | | Calls per envelope | 32 | | Encoded tool definitions | 2 MB | | Envelope size | 2 MB | | JSON nesting depth (tools and envelope) | 64 | | Buffered response size | 16 MB | Tool names must be 1 to 64 characters of letters, numbers, underscores, or hyphens, and must be unique within a request. Only function tools are supported. Parameter schemas that expand to a very large number of branches through `$ref` and `anyOf` are rejected before compilation. ## Troubleshooting **The status line says `emulated tools` unexpectedly.** The active model's provider is registered as `emulated`. Switch to a model from a `native` provider with `/model`, or ask an administrator whether the provider's mode is correct for its endpoint. **The model answers in prose instead of using a tool.** This is the most common emulation failure. Stating the action directly ("read `main.go` and tell me what it does") usually helps, as does selecting a larger model from the same provider. **"This model does not support tool calling."** The provider is registered as `none`. Run `pw code --no-tools` for a chat-only session, or choose a different model. **Calls fail repeatedly on one specific tool.** Emulated arguments are validated against the tool's JSON Schema as written. A large or deeply nested schema is harder for a model to satisfy from a prompt than through a native API, so simplifying the schema usually resolves it. ## Related Documentation - [Custom OpenAI-Compatible](/docs/ai/ai-providers/tool-calling/custom-openai-compatible) — Register an endpoint and set its tool-calling mode - [pw code](/docs/ai/code/) — The AI coding agent that uses tool calling - [Models & Allocations](/docs/ai/code/models) — Discovering and switching models - [AI Keys](/docs/ai/ai-keys/) — Programmatic access through the gateway # AI Usage > Source: https://parallelworks.com/docs/ai/ai-usage # AI Usage The **AI Usage** dashboard tracks spend, tokens, and budget allocations across your AI providers. Every request through the AI gateway is metered, so you can see how much your Chat conversations and [AI keys](/docs/ai/ai-keys) are costing, and where that usage is going. To open the dashboard, navigate to **AI** > **AI Usage** in the sidebar. ## Your Usage The dashboard summarizes your own usage over a selectable time range of the last **7**, **30**, or **90** days: - **Total Spend** — your AI spend over the selected period - **Tokens Used** — total tokens, split into input and output tokens - **Allocations** — the budget allocations you're permitted to draw from The **Usage over time** chart shows your daily usage across the period, and the breakdown chart splits your usage by **Model** or **API key** — use the grouping toggle to switch between the two. ## Organization Usage Organization admins see an additional **Organization** tab that aggregates AI usage across the whole organization. Along with total spend, it summarizes: - **Active Users** — users with AI activity in the selected period - **Total Tokens** — organization-wide input and output tokens The organization breakdown can be grouped by **model**, **user**, or **allocation**, and lists each group's cost, tokens, and share of total usage. ## Related Documentation - [Chat](/docs/ai/chat/) — Using the chat interface - [AI Providers](/docs/ai/ai-providers/) — Connecting model backends - [AI Keys](/docs/ai/ai-keys/) — Programmatic access through the gateway # Best Practices > Source: https://parallelworks.com/docs/ai/best-practices # Best Practices This page covers recommended practices for getting the most out of Chat on the ACTIVATE platform. ## Writing Effective Prompts The quality of AI responses depends heavily on how you frame your requests. ### Be Specific Vague prompts produce vague answers. Include relevant details, constraints, and the desired format in your prompt. | Instead of | Try | |---|---| | "Explain Kubernetes" | "Explain how Kubernetes pod scheduling works, including the role of the scheduler and node affinity rules, in about 200 words." | | "Write a script" | "Write a Bash script that finds all CSV files in a directory and combines them into a single file with one header row." | ### Provide Context Give the model the background it needs to produce a useful response: - Describe the environment or system you are working with. - Mention relevant constraints (language, framework, version). - Reference earlier parts of the conversation if building on previous responses. ### Use System Messages If your provider supports system messages, use them to set the model's behavior for the entire conversation. For example, you can instruct the model to respond as a domain expert, use a particular coding style, or avoid certain topics. ### Iterate and Refine If the first response is not quite right, refine your prompt rather than starting from scratch. Add clarifications, ask for a different format, or request that the model focus on a specific aspect. ## Choosing the Right Model Different models have different strengths. Selecting the right model for your task improves both response quality and efficiency. ### Standard Models Standard models (such as GPT-4o, GPT-4o-mini) are best for: - General-purpose questions and conversation - Text summarization and generation - Code generation for straightforward tasks - Tasks where speed matters more than deep analysis ### Reasoning Models Reasoning models (such as o1, o3) are best for: - Complex math, logic, and multi-step problem-solving - Detailed code review and debugging - Architectural decisions that require evaluating tradeoffs - Tasks where accuracy is more important than speed See [Using Reasoning Models](/docs/ai/chat/using-reasoning-models) for details on reasoning effort configuration. ### Cost Considerations Larger and more capable models consume more tokens and may have higher usage costs. When working on routine tasks, consider using a smaller or faster model to conserve resources. Reserve more powerful models for tasks that genuinely benefit from their capabilities. ## Working with File Attachments File attachments allow you to provide the model with additional context beyond what fits in a text prompt. ### Keep Documents Focused Rather than uploading a large document and asking a broad question, extract the relevant section or upload a smaller, targeted file. This helps the model focus on the content that matters and reduces token usage. ### Use the Right File Type - **Code files** -- Attach source code files directly for code review, debugging, or analysis tasks. - **Text and Markdown** -- Use plain text or Markdown for structured information, notes, or specifications. - **PDFs and documents** -- Upload reports, papers, or documentation that the model can reference when answering your questions. ### Be Aware of Size Limits Regular files have a maximum size of 25 MB, and documents have a maximum size of 100 MB. If a file exceeds these limits, split it into smaller parts or extract the relevant sections. See [Attaching Files](/docs/ai/chat/attaching-files) for supported formats and detailed usage instructions. ## Collaboration Tips Chat's sharing and branching features support team workflows. ### Share with Appropriate Permissions - Use **View** permission for stakeholders who need to review the conversation without modifying it. - Use **Collaborate** permission for team members who need to actively contribute messages. - Share at the group level rather than managing individual access, so permissions stay current as team membership changes. See [Sharing Conversations](/docs/ai/chat/sharing-conversations) for detailed instructions. ### Use Branching for Exploration When evaluating different approaches, create branches from the same message rather than cluttering a single thread. Each branch maintains its own context, allowing you to compare model responses to different prompts or explore alternative solutions side by side. See [Branching Conversations](/docs/ai/chat/branching-conversations) for details. ### Document Decisions Use the conversation itself as a record of your analysis. When you reach a conclusion, summarize the decision in a follow-up message so that anyone reviewing the shared conversation can quickly understand the outcome. ## Security Considerations ### Sensitive Data Be mindful of the data you include in prompts and file attachments. Messages are sent to the configured AI provider endpoint, which may be hosted externally. - For sensitive or proprietary data, use a **session tunnel** provider that routes requests to a model running on your own compute infrastructure. See [Session Tunnels](/docs/ai/ai-providers/session-tunnels). - Avoid including credentials, API keys, or personally identifiable information in prompts. ### API Key Management If you manage AI providers, follow these practices for API key security: - **Rotate keys regularly** -- Update API keys in the provider configuration on a regular schedule. - **Use the minimum required permissions** -- Configure provider API keys with only the permissions needed for chat completions. - **Monitor usage** -- Review token usage and access patterns through your provider's dashboard to detect unexpected activity. ### Provider Permissions Limit provider access to the groups and users who need it. Review and audit provider permissions periodically to ensure that only authorized teams have access. See [Managing Provider Permissions](/docs/ai/ai-providers/managing-permissions) for details. ## Related Documentation - [Chat Overview](/docs/ai/chat) - Feature summary and capabilities - [Getting Started with Chat](/docs/ai/chat/getting-started) - First-time setup walkthrough - [AI Providers](/docs/ai/ai-providers) - Provider configuration and management - [Troubleshooting](/docs/ai/chat/troubleshooting) - Common issues and solutions # Chat > Source: https://parallelworks.com/docs/ai/chat # Chat Chat provides a full-featured chat interface for interacting with large language models directly within ACTIVATE. You can have conversations with AI models from multiple providers, attach files for context, branch conversations to explore different approaches, and share conversations with your team. :::info Feature may not be available on all platforms Chat requires at least one AI provider to be configured. If you do not see the **Chat** option in your ACTIVATE account, contact your administrator. ::: ## Access Methods You can interact with Chat in three ways: - **Web UI** -- Open **Chat** from the sidebar navigation to use the full-featured chat interface with file attachments, conversation branching, and message history. - **CLI** -- Run `pw code` for an AI coding agent in your terminal. Unlike Chat, its sessions are stored locally on your machine, not in your account. See [pw code](/docs/ai/code). - **API** -- Send requests to the OpenAI-compatible API endpoint at `/api/openai/v1/chat/completions` for programmatic access through the AI gateway. See [AI Keys](/docs/ai/ai-keys) for authentication and model ID format. ## Capabilities - **Multi-provider support** -- Connect to Azure OpenAI, custom OpenAI-compatible endpoints, or models running on your compute clusters via session tunnels. - **File attachments** -- Attach documents, images, and other files to your messages for additional context. Regular files up to 25 MB and documents (PDF, text, CSV, Office files) up to 100 MB are supported. - **Conversation branching** -- Edit previous messages or regenerate responses to create conversation branches. Navigate between branches to compare different approaches. - **Sharing and collaboration** -- Share conversations with your team for read-only viewing or collaborative editing. - **Reasoning models** -- Use reasoning models (such as o1 and o3) that show their thinking process and support configurable reasoning effort. - **Streaming responses** -- Responses stream in real time as the model generates them, so you can read output as it arrives. ## Related Documentation - [Getting Started](/docs/ai/chat/getting-started) -- Send your first message - [Attaching Files](/docs/ai/chat/attaching-files) -- Add files to your conversations - [Branching Conversations](/docs/ai/chat/branching-conversations) -- Explore alternative conversation paths - [Sharing Conversations](/docs/ai/chat/sharing-conversations) -- Collaborate with your team - [Using Reasoning Models](/docs/ai/chat/using-reasoning-models) -- Work with reasoning models - [pw code](/docs/ai/code) -- The AI coding agent in your terminal - [AI Providers](/docs/ai/ai-providers) -- Configure AI providers - [AI Keys](/docs/ai/ai-keys) -- Programmatic access through the gateway - [Troubleshooting](/docs/ai/chat/troubleshooting) -- Resolve common issues # Attaching Files > Source: https://parallelworks.com/docs/ai/chat/attaching-files # Attaching Files Chat supports file attachments, allowing you to include documents, images, and other files as context for your conversations. Attached files are sent alongside your messages so the AI model can reference their content when generating responses. ## Supported File Types You can attach the following file types: | Category | Formats | |----------|---------| | Documents | PDF, TXT, CSV, DOC, DOCX, XLS, XLSX, PPT, PPTX | | Images | PNG, JPG, JPEG, GIF, WebP, and other common image formats | ## Size Limits File size limits depend on the file type: - **Documents** (PDF, TXT, CSV, XLSX, DOCX, PPTX) -- up to **100 MB** per file - **All other files** (images, etc.) -- up to **25 MB** per file - **Maximum files per message** -- up to **10 files** If a file exceeds the size limit for its type, the upload is rejected with an error message indicating the maximum allowed size. ## How to Attach Files There are two ways to attach files to a message: ### Drag and Drop Drag one or more files from your file manager directly into the chat area. A drop zone overlay appears to confirm the drop target. Release the files to begin uploading. ### File Picker Click the attachment button in the chat input area to open a file picker. Select one or more files and confirm. The selected files are uploaded immediately. ## Upload Process When you add files, each file shows an upload progress indicator. Once uploaded, the file appears as a chip showing the filename and file size. You can remove an attachment before sending your message by clicking the remove button on the file chip. Files can be uploaded before a conversation exists. These standalone attachments are associated with the conversation when you send your first message. ## Viewing Attachments in Messages Attachments appear below the message content: - **Images** are displayed as inline thumbnails that you can view directly in the chat. - **Documents and other files** appear as downloadable file chips showing the filename and size. Click on a file chip to download the attachment. ## Managing Attachments - You can view all attachments associated with a conversation. - Attachments can be downloaded at any time by clicking on them in the message history. - When a conversation is deleted, all of its attachments are also deleted. - Only the attachment owner can delete individual attachments. ## Limitations - File content processing depends on the capabilities of the selected AI model. Not all models support all file types. - Very large files may increase response times as the model processes the additional context. - Image support requires a model that accepts multimodal input (text and images). ## Related Documentation - [Getting Started](/docs/ai/chat/getting-started) -- Send your first message - [Chat Overview](/docs/ai/chat) -- Feature overview - [Troubleshooting](/docs/ai/chat/troubleshooting) -- Resolve file upload issues # Branching Conversations > Source: https://parallelworks.com/docs/ai/chat/branching-conversations # Branching Conversations Chat uses a tree-based message structure rather than a simple linear history. This means you can create branches at any point in a conversation to explore alternative responses, compare different approaches, or refine your prompts without losing previous work. ## How Branching Works Every message in a conversation has a parent message (except the first message, which is the root). When you edit a previous message or regenerate an AI response, a new branch is created from that point. The original branch is preserved, and you can switch between branches at any time. This tree structure means a single conversation can contain multiple parallel threads of discussion, all sharing the same earlier context. ## Creating a Branch There are two ways to create a new branch: ### Editing a Message 1. Hover over one of your messages to reveal the action buttons. 2. Click the **Edit** button. 3. Modify the message content in the editor that appears. 4. Click **Send** to submit the edited message. A new branch is created starting from the edited message. The AI generates a fresh response based on your updated input. The original message and its response remain available on the previous branch. ### Regenerating a Response 1. Hover over an AI response to reveal the action buttons. 2. Click the **Regenerate** button. The model generates a new response to the same prompt. This creates a sibling branch from the same parent message. You can regenerate multiple times to get different responses and compare them. ## Navigating Between Branches When a message has sibling branches (multiple responses to the same parent), a branch navigator appears below the message. The navigator shows the current branch position (for example, "2/3") and provides arrow buttons to switch between siblings. Clicking the left or right arrow loads the sibling message and its entire downstream conversation thread. The branch navigator only appears at messages where the conversation actually diverges. ## Active Branch Each conversation tracks an **active branch**, which determines which path through the message tree is displayed by default when you open the conversation. The active branch updates automatically as you send messages or navigate to different branches. ## Use Cases Branching is useful in several scenarios: - **Comparing approaches** -- Ask the same question with different phrasings to see how the model responds differently, without starting a new conversation. - **Exploring alternatives** -- Regenerate a response multiple times and keep all versions for comparison. - **Iterating on prompts** -- Edit an earlier message to refine your prompt while preserving the original conversation path. - **A/B testing** -- Test different instructions or system configurations within the same conversation context. ## Related Documentation - [Getting Started](/docs/ai/chat/getting-started) -- Send your first message - [Chat Overview](/docs/ai/chat) -- Feature overview - [Sharing Conversations](/docs/ai/chat/sharing-conversations) -- Collaborate with your team # Getting Started with Chat > Source: https://parallelworks.com/docs/ai/chat/getting-started # Getting Started with Chat This guide walks you through sending your first message in Chat, selecting a model, and managing your conversation history. ## Prerequisites Before you can use Chat, at least one AI provider must be configured and accessible to you. Providers can be added by you or shared with you by an administrator or team member. See [AI Providers](/docs/ai/ai-providers) for setup instructions. ## Opening the Chat Interface Click **Chat** in the sidebar navigation to open the Chat interface. If no providers are configured, you will see a prompt to add one. When providers are available, the chat page displays a greeting and a set of suggested prompts to help you get started. ## Selecting a Provider and Model Use the model selector in the toolbar at the top of the chat interface to choose which AI model to use. Models are grouped by provider and listed with human-friendly names (for example, **my-azure-provider / gpt-4o**). If a provider offers multiple models, each one appears as a separate option. Session tunnel models (models running on your compute clusters) also appear in this list when an active tunnel is available. ## Sending a Message 1. Type your message in the input field at the bottom of the chat interface, or click one of the suggested prompts. 2. Optionally attach files by clicking the attachment button or dragging files into the chat area. 3. Press **Enter** or click the send button. Your message is sent to the selected model, and a new conversation is created automatically if one does not already exist. ## Understanding Streaming Responses Chat streams responses in real time. As the model generates its reply, text appears incrementally in the chat interface. A green indicator is shown while the response is streaming. For reasoning models, a "Thought for..." indicator appears after the response completes, showing how long the model spent in its thinking phase. You can click this indicator to view the model's reasoning process. ## Managing Conversation History Your conversations are saved automatically and listed in the sidebar. Conversations are sorted by most recently updated. ### Viewing Past Conversations Click any conversation in the sidebar to reopen it. The full message history, including any branches, is restored. ### Renaming a Conversation Conversations can be renamed by updating the title. This helps you organize and find past conversations. ### Deleting a Conversation Only the conversation owner can delete a conversation. Deleting a conversation also removes all associated attachments and sharing permissions. ## Next Steps - [Attaching Files](/docs/ai/chat/attaching-files) -- Learn how to include files in your messages - [Branching Conversations](/docs/ai/chat/branching-conversations) -- Explore alternative responses - [Sharing Conversations](/docs/ai/chat/sharing-conversations) -- Share with your team - [Using Reasoning Models](/docs/ai/chat/using-reasoning-models) -- Use models with extended thinking - [pw code](/docs/ai/code) -- Work with AI from the command line ## Related Documentation - [Chat Overview](/docs/ai/chat) -- Feature overview and access methods - [AI Providers](/docs/ai/ai-providers) -- Configure AI providers - [Troubleshooting](/docs/ai/chat/troubleshooting) -- Resolve common issues # Sharing Conversations > Source: https://parallelworks.com/docs/ai/chat/sharing-conversations # Sharing Conversations Chat allows you to share conversations with other members of your organization. You can grant read-only access for review purposes or full collaboration access that lets others contribute messages to the conversation. ## Permission Levels Chat supports two permission levels for shared conversations: - **View** -- Recipients can read the entire conversation, including all messages and branches, but cannot add new messages or modify existing content. - **Collaborate** -- Recipients can read the conversation and add their own messages. This is useful for team problem-solving or collaborative analysis sessions. :::info Owner Only Only the conversation owner can manage sharing settings. If you need access to a conversation, ask the owner to share it with you. ::: ## How to Share a Conversation 1. Open the conversation you want to share. 2. Click the **Share** icon in the conversation header. 3. In the **Share Conversation** dialog, configure access at the organization or group level. ### Organization-Wide Access To share with everyone in your organization: 1. Check **Anyone in the organization can view** to grant view access to all organization members. 2. Optionally check **Allow collaboration (edit messages)** to upgrade the permission from view-only to collaborate. ### Group Access To share with specific groups: 1. In the **Group Access** section, use the **Add groups** dropdown to select one or more groups. 2. For each group, choose the permission level using the dropdown next to the group name: - **View only** -- Members of the group can read the conversation. - **Can collaborate** -- Members of the group can read and add messages. 3. To remove a group's access, click the trash icon next to the group entry. After configuring the desired permissions, click **Save** to apply the changes. ## Accessing Shared Conversations Conversations that have been shared with you appear in your conversation list. You can identify shared conversations by the presence of the share indicator. Depending on your permission level: - **View access** -- You can open and read the conversation but cannot send messages. - **Collaborate access** -- You can open the conversation and send messages as if it were your own. ## Managing and Revoking Access To modify or remove access for a shared conversation: 1. Open the conversation and click the **Share** icon. 2. Change permission levels using the dropdown next to each group. 3. Remove a group by clicking the trash icon. 4. Uncheck the organization-wide access checkbox to revoke access for the entire organization. 5. Click **Save** to apply changes. Changes take effect immediately. Users who lose access will no longer see the conversation in their list. ## Collaboration Tips - **Use branches for parallel exploration** -- When collaborating, each team member can create branches from the same message to explore different approaches without interfering with each other's work. - **Set clear permissions** -- Use view-only access for stakeholders who need to review progress and collaborate access for team members who need to actively contribute. - **Share with groups, not individuals** -- Sharing at the group level makes it easier to manage access as team membership changes. ## Related Documentation - [Branching Conversations](/docs/ai/chat/branching-conversations) - Create parallel conversation threads - [Getting Started with Chat](/docs/ai/chat/getting-started) - First-time setup walkthrough - [Best Practices](/docs/ai/best-practices) - Tips for effective AI collaboration # Troubleshooting > Source: https://parallelworks.com/docs/ai/chat/troubleshooting # Troubleshooting This page covers common issues you may encounter when using Chat and how to resolve them. ## No Providers Available **Symptom:** The provider or model dropdown is empty, or you see a message indicating no providers are configured. **Cause:** No AI providers have been set up for your organization, or you do not have permission to use the available providers. **Solution:** - Contact your organization administrator and ask them to configure an AI provider. See [AI Providers](/docs/ai/ai-providers) for setup instructions. - If providers exist but you cannot see them, ask the administrator to grant your group access to the provider. See [Managing Provider Permissions](/docs/ai/ai-providers/managing-permissions). ## Connection Errors **Symptom:** You receive an error when sending a message, such as "Failed to connect" or "Provider endpoint unreachable." **Cause:** The underlying AI provider endpoint may be unavailable, misconfigured, or experiencing an outage. **Solution:** - Verify that the provider endpoint is correct and accessible. For custom OpenAI-compatible providers, confirm that the endpoint URL is reachable from the ACTIVATE platform. - For session tunnel providers, ensure the tunnel is active and the compute session is running. Tunnels are only available while the associated session is active. See [Session Tunnels](/docs/ai/ai-providers/session-tunnels). - For Azure OpenAI providers, verify the API key and endpoint in the provider configuration. Check the [Azure status page](https://status.azure.com/) for any ongoing outages. - Try sending another message after a few moments. Transient network issues may resolve on their own. ## Slow or Stalled Responses **Symptom:** The AI response takes a long time to appear or the loading indicator runs indefinitely. **Cause:** This can happen for several reasons: - **Reasoning models** use an extended thinking phase before generating a response. This is expected behavior and can take significantly longer than standard models. See [Using Reasoning Models](/docs/ai/chat/using-reasoning-models). - **High model load** on the provider side can cause delays, especially with shared or rate-limited endpoints. - **Large conversation context** can increase processing time as the model processes more tokens. **Solution:** - If using a reasoning model, wait for the response to complete. The thinking phase may take 30 seconds or longer for complex prompts. - For standard models, try starting a new conversation to reduce context size. - If the issue persists, check with your administrator whether the provider endpoint is under heavy load. ## File Upload Failures **Symptom:** A file upload fails or you see an error when attaching a file to a message. **Cause:** The file may exceed size limits or be in an unsupported format. **Solution:** - Check the file size. Regular files have a maximum size of 25 MB, while documents have a maximum size of 100 MB. - Verify that the file type is supported. Common supported types include text files, code files, PDFs, images, and office documents. - Try uploading a smaller file or splitting large files into smaller parts. - See [Attaching Files](/docs/ai/chat/attaching-files) for detailed information on supported formats and size limits. ## Model Not Listed **Symptom:** A specific model you expect to see is not available in the model dropdown. **Cause:** The model may not be deployed on the provider, or the provider configuration may not include it. **Solution:** - Verify with your administrator that the desired model is deployed and available on the provider endpoint. - For Azure OpenAI providers, confirm that the model deployment name is correctly configured. - For custom providers, ensure the endpoint's `/v1/models` response includes the model you are looking for. - Check that you have permission to use the provider that hosts the model. ## CLI Chat Issues **Symptom:** The `pw code` command fails or cannot connect. **Cause:** Authentication, network, or model identifier issues. **Solution:** - Verify you are authenticated: run `pw auth` and paste your credential when prompted. - Confirm the model identifier is correct. It must use the format `owner:provider-name/model-name` (for example, `jane.doe:my-provider/gpt-4o`). Run `pw ai models ls` to see available models. - Check your network connection to the ACTIVATE platform. - See [pw code](/docs/ai/code) for detailed setup instructions, and [pw code troubleshooting](/docs/ai/code/troubleshooting) for agent-specific issues. ## Getting Help If the solutions above do not resolve your issue: 1. Check the [Chat overview](/docs/ai/chat) for general guidance on available features. 2. Review the [AI Providers](/docs/ai/ai-providers) documentation to verify your provider configuration. 3. Contact your organization administrator for platform-specific assistance. 4. Reach out to Parallel Works support for further troubleshooting. ## Related Documentation - [Getting Started with Chat](/docs/ai/chat/getting-started) - First-time setup walkthrough - [Attaching Files](/docs/ai/chat/attaching-files) - File upload details and limits - [Using Reasoning Models](/docs/ai/chat/using-reasoning-models) - Understanding reasoning model behavior - [AI Providers](/docs/ai/ai-providers) - Provider configuration and management # Using Reasoning Models > Source: https://parallelworks.com/docs/ai/chat/using-reasoning-models # Using Reasoning Models Reasoning models such as OpenAI's o1 and o3 series use an extended thinking process before generating a response. Chat supports these models and surfaces their reasoning output so you can follow the model's chain of thought. ## What Are Reasoning Models? Standard chat models generate responses token by token in a single pass. Reasoning models add a **thinking phase** before the final response. During this phase, the model works through the problem step by step, considering different approaches and verifying its logic before producing an answer. This thinking process is especially beneficial for: - Complex math and logic problems - Multi-step analysis and planning - Code debugging and architectural decisions - Tasks that require careful evaluation of tradeoffs ## How Reasoning Models Differ When you use a reasoning model in Chat, the experience differs from standard models in several ways: - **Longer response times** -- The thinking phase adds processing time before the response begins streaming. This is normal and expected. - **Reasoning content** -- The model's internal reasoning may be displayed alongside the final response, allowing you to follow how it arrived at its answer. - **Reasoning tokens** -- Reasoning models consume additional tokens for the thinking phase. These reasoning tokens count toward the model's context window and usage. ## Reasoning Effort Some reasoning models support a **reasoning effort** parameter that controls how much time the model spends thinking before responding. Chat supports three effort levels: - **Low** -- Minimal reasoning. The model spends less time thinking, resulting in faster responses. Best for straightforward questions where deep analysis is not needed. - **Medium** -- Balanced reasoning. A good default for most tasks. - **High** -- Maximum reasoning. The model takes more time to think through the problem thoroughly. Best for complex problems where accuracy is critical. :::info Model Support Reasoning effort is only available for models that support it. If the selected model does not support reasoning effort, the setting has no effect. ::: ## When to Use Reasoning Models **Use reasoning models when:** - The task involves complex logic, math, or multi-step problem-solving. - You need the model to carefully evaluate multiple options before answering. - Accuracy matters more than response speed. - You are debugging intricate code or analyzing system architectures. **Use standard models when:** - You need quick, conversational responses. - The task is straightforward (summarization, simple Q&A, text generation). - Low latency is important. - You want to minimize token usage. ## Working with Reasoning Output When a reasoning model is used, Chat may display the model's reasoning process alongside the final response. This reasoning content shows the steps the model took to arrive at its answer. Reviewing this output can help you: - Verify the model's logic and catch errors in its reasoning. - Understand why the model chose a particular approach. - Refine your prompt based on how the model interpreted your request. ## Related Documentation - [Getting Started with Chat](/docs/ai/chat/getting-started) - First-time setup walkthrough - [Best Practices](/docs/ai/best-practices) - Tips for model selection and effective prompting - [AI Providers](/docs/ai/ai-providers) - Configure providers that offer reasoning models # pw code > Source: https://parallelworks.com/docs/ai/code # pw code `pw code` is an AI coding agent that runs in your terminal. It can read, write, and edit the files in your workspace (the directory you start it in), run shell commands, and carry out multi-step tasks autonomously using tool calling. Responses stream in real time and are rendered as formatted markdown directly in your terminal. :::info Feature may not be available on all platforms `pw code` requires at least one AI provider to be configured. If no models are available in your account, contact your administrator. ::: ## Prerequisites - **PW CLI installed**: See the [CLI documentation](/docs/cli) for installation instructions. - **Authenticated**: Run `pw auth` and paste your credential when prompted. On ACTIVATE user workspaces and clusters the CLI is pre-authenticated. See [Authentication](/docs/cli#authentication). - **An AI provider**: At least one AI provider must be configured by you or shared with you. See [AI Providers](/docs/ai/ai-providers). ## Quick Start Start the agent from the directory you want to work in: ```bash pw code ``` If you do not specify a model, `pw code` opens an interactive picker so you can choose one; there is nothing to look up first. Inside a session, run `/model` to reopen the picker and switch at any time. You can also start with a specific model by passing its ID: ```bash pw code owner:provider-name/model-name ``` Model IDs have the form `owner:provider-name/model-name`. For a personal provider, the owner is the username of the person who owns the provider (for example `Jake.Thayne:openai/gpt-5.2`). Organization provider models use the `org:` prefix and require a [budget allocation](/docs/ai/code/models#allocations), a named spending budget your organization grants you. When you need an ID outside a session, such as for [non-interactive runs](/docs/ai/code/non-interactive), list them with `pw ai models ls`. ### What to expect on first launch If the directory contains configuration files (a `.mcp.json` file or a `.agents/` folder), `pw code` lists them at first launch and asks whether to apply them. See [Workspace Trust](/docs/ai/code/settings#workspace-trust). By default, the agent edits workspace files freely but asks before each shell command. See [Permissions](/docs/ai/code/permissions). A short session looks like this: fix the failing test in parser_test.go I'll look at the failing test and fix the parser. 214 lines return cfg return cfg, nil ok ## Capabilities - **[Sessions & Resume](/docs/ai/code/sessions)**: Every run is saved as a local session on your machine that you can resume later, from the command line or an interactive picker. - **[Permissions](/docs/ai/code/permissions)**: Control what the agent may do without asking, from read-only exploration to fully autonomous edits. - **[Interface & Shortcuts](/docs/ai/code/interface)**: The full-screen terminal interface, keyboard shortcuts, `@` file references, and `!` shell mode. - **[Models & Allocations](/docs/ai/code/models)**: Pick from the models your providers offer, and browse budget allocations interactively when using organization providers. - **[Settings](/docs/ai/code/settings)**: Global and per-workspace configuration, and the in-session `/settings` menu. - **[Slash Commands](/docs/ai/code/slash-commands)**: Type `/` in a session to run built-in commands, plus custom commands defined in your project. - **[Project Instructions](/docs/ai/code/project-instructions)**: Guide the agent with an `AGENTS.md` file checked into your project. - **[MCP Servers](/docs/ai/code/mcp)**: Connect Model Context Protocol servers to give the agent additional tools. - **[Subagents](/docs/ai/code/subagents)**: Delegate work to subagents that run in parallel alongside your session. - **[Custom Agents](/docs/ai/code/custom-agents)**: Define specialized agents with their own instructions, tool access, and model. - **[Non-Interactive Mode](/docs/ai/code/non-interactive)**: Run one-shot prompts with text or JSON output for scripting and automation. ## Command-Line Flags | Flag | Description | | --- | --- | | `-m`, `--model` | Model ID (can also be passed as a positional argument). | | `--allocation` | Budget allocation name. Required for `org:` provider models. | | `-p`, `--prompt` | Send a single prompt and exit. See [Non-Interactive Mode](/docs/ai/code/non-interactive). | | `-w`, `--workspace` | Workspace root directory. Defaults to the current directory. | | `--permission-mode` | `read-only`, `accept-edits` (default), `bypass-permissions`, or `plan`. See [Permissions](/docs/ai/code/permissions). | | `--allowedTools` | Tools pre-approved without prompting, for example `ReadFile` or `'Bash(git status:*)'`. | | `--add-dir` | Directories outside the workspace the agent may read without prompting (repeatable). | | `-o`, `--output` | Output format for one-shot runs: `text` (default) or `json`. | | `-r`, `--resume` | Resume a local session by ID or `latest`; used alone, opens an interactive session picker. | | `--no-tools` | Disable tool calling (chat-only mode). | | `--agent` | Run a [custom agent](/docs/ai/code/custom-agents) definition as the main session. | For the complete command reference, see [pw code](/docs/cli/pw/code). ## pw code and Your Account Chats `pw code` sessions are local to your machine: they are not uploaded to your account and do not appear in the [Chat](/docs/ai/chat) list in the web interface. See [Sessions & Resume](/docs/ai/code/sessions) for how local sessions are stored. Chats saved to your account, such as conversations from the web Chat interface, are managed separately with the `pw ai chats` commands: ```bash # List chats saved to your account pw ai chats ls # View a chat's messages pw ai chats get # Delete a chat pw ai chats delete ``` ## Related Documentation - [Usage & Costs](/docs/ai/code/usage-and-costs): Token usage and cost estimates - [Troubleshooting](/docs/ai/code/troubleshooting): Resolve common issues - [Chat](/docs/ai/chat): The web chat interface - [AI Providers](/docs/ai/ai-providers): Configure AI providers - [pw code command reference](/docs/cli/pw/code): Full CLI reference # Custom Agents > Source: https://parallelworks.com/docs/ai/code/custom-agents # Custom Agents A custom agent is a reusable, named agent definition: a markdown file that gives an agent a description, a specialization prompt, and optional limits on its tools, permissions, and model. Once defined, a custom agent can be used two ways: - **As a subagent type**: when the agent [delegates work](/docs/ai/code/subagents), it can pick your custom agent by name and the subagent runs with that definition's prompt and limits. - **As the main session**: launch `pw code --agent ` to run a definition as the agent you talk to directly. ## Where Definitions Live `pw code` looks for `.md` definition files in these directories, in order (when the same agent name appears in more than one place, the earlier directory wins): 1. `/.agents/agents/`: project definitions, checked in with your code 2. `~/.config/agents/agents/`: your personal definitions (respects `XDG_CONFIG_HOME`) Directories are scanned recursively, so you can organize definitions into subfolders. An agent's identity comes from its `name` field (or its filename), never its path. The name `fork` is reserved for [conversation forks](/docs/ai/code/subagents#forking-the-conversation); a definition named `fork` is ignored with a warning. :::note Project definitions require approval Definition files in the workspace are part of the configuration `pw code` asks you to approve at launch. See [Workspace Trust](/docs/ai/code/settings#workspace-trust). ::: ## File Format A definition is YAML frontmatter followed by a markdown body. The body is the agent's **specialization prompt**. It is appended to the standard system prompt, so the agent keeps all its normal abilities and gains your specialization on top. | Field | Meaning | | --- | --- | | `name` | The agent's name. Defaults to the filename without `.md`. | | `description` | What this agent is for. This is how the main agent decides when to delegate to it. Write it like a job description. | | `tools` | Comma-separated allowlist of tool names the agent may use (for example `ReadFile, GrepSearch, GlobSearch, Bash`). Empty means all tools. | | `disallowedTools` | Comma-separated denylist. Deny always wins over `tools`. | | `model` | Model this agent runs on (`owner:provider-name/model-name`). Empty inherits; see [model resolution](/docs/ai/code/subagents#models-for-subagents). | | `permissionMode` | Requested permission mode: `read-only`, `plan`, `accept-edits`, or `bypass-permissions`. Can narrow the session's mode, never widen it (see [Permission Clamping](#permission-clamping-for-definition-authors)). | | `isolation` | `worktree` runs the agent's delegated tasks in a temporary git worktree, keeping its changes out of your working tree. | | `maxTurns` | Cap on agentic iterations per delegated task. Unset means unlimited. | | `background` | `true` forces this agent's tasks to always run detached, even when an inline result was requested. | | `color` | Display color for the agent's switcher dot and task blocks: `blue`, `green`, `yellow`, `purple`, `cyan`, `orange`, `pink`, or `red`. | | `initialPrompt` | Auto-submitted as the first message when the definition runs as the main session via `--agent`. | Frontmatter values are single-line. `isolation`, `background`, and `color` shape how the agent behaves and displays when it runs as a subagent; they do not apply to a `--agent` main session. ## Example Definition `.agents/agents/reviewer.md`: ```markdown --- name: reviewer description: Reviews code changes for correctness, style, and missed edge cases. Use for read-only review passes over a diff or a set of files. tools: ReadFile, GrepSearch, GlobSearch, Bash permissionMode: read-only model: owner:provider-name/model-name color: purple maxTurns: 30 --- You are a meticulous code reviewer. Review the changes you are pointed at for: - Correctness bugs and unhandled edge cases - Consistency with the surrounding code's style and conventions - Missing or misleading tests Report findings as a prioritized list. Cite file paths and line numbers. Do not modify any files. ``` ## Using a Custom Agent for Delegated Work You do not invoke a custom agent directly. The main agent sees every definition's name and description and picks the right type when it delegates. You can also steer it explicitly: "use the reviewer agent to check this diff." In the [agent switcher](/docs/ai/code/subagents#the-agent-switcher), a custom agent's row shows its type name next to its task description, and its task block in the transcript is titled with the type name instead of `Task`. The definition's `color` (or an automatically assigned one) marks its dot in both places. ### Worktree Isolation An agent defined with `isolation: worktree` runs its delegated tasks in a temporary git worktree (a separate checkout of your repository) so its changes never touch your working tree while you and other agents keep working. This requires the workspace to be a git repository with at least one commit; when a worktree cannot be created, the task falls back to sharing the workspace and says so in its task block. The subagent's report names the worktree path so you (and the main agent) know where its changes live. A worktree with no changes is cleaned up automatically; a worktree holding uncommitted changes or new commits is **kept**, and resuming the session later puts the revived subagent back inside it. ## Running a Definition as the Main Session Launch a definition as the agent you talk to: ```bash pw code --agent reviewer ``` - The definition's `model` and `permissionMode` are used unless you override them on the command line. - Its `tools`, `disallowedTools`, and `maxTurns` limits apply exactly as they would to a subagent. - Its body is appended to the system prompt as the session's specialization. - Its `initialPrompt`, if set, is submitted automatically as the first message; in a one-shot run (`-p`), it is prepended to your prompt instead. Naming an agent that does not exist fails with the list of available names. ### Ad-Hoc Definitions with --agents `--agents` takes JSON definitions keyed by name: the same fields as frontmatter, with `tools` and `disallowedTools` as arrays and the specialization body in a `prompt` field. They merge over the definition files (an ad-hoc definition with the same name wins) and are available both for delegation and for `--agent`: ```bash pw code --agents '{ "changelog": { "description": "Drafts changelog entries from recent commits", "tools": ["ReadFile", "Bash"], "permissionMode": "read-only", "prompt": "You draft concise changelog entries. Read git log and summarize user-facing changes." } }' ``` ## Permission Clamping for Definition Authors A custom agent can restrict what a subagent may do, but it can never grant more than the session it runs in: - **Modes only narrow.** Modes rank `read-only` < `plan` < `accept-edits` < `bypass-permissions`. If a definition requests a mode above the session's, it is clamped down to the session's mode, and the clamp is noted in the subagent's task block. A `read-only` definition stays read-only in any session. The requested mode also acts as a live ceiling: if the session's mode changes while the subagent is running, the subagent follows the change, up to the definition's requested mode and never past the session. - **Tool scope only narrows.** Allowlists intersect with what the spawning agent may use, and denylists accumulate across every generation, so even with nesting enabled a restricted agent can never spawn a subagent with tools it lacks itself. A definition whose `tools` list has nothing in common with the spawning agent's tools is unusable from that agent, and delegation to it fails with an explanation. - **Approvals stay per-agent.** When a subagent's command needs approval, the prompt names that agent, and your approval applies to that subagent only. Write definitions assuming the narrowest session they might run in, and treat `permissionMode` and `tools` as guardrails for the agent's role: a reviewer that cannot write files, a researcher that cannot run shell commands. See [Permissions](/docs/ai/code/permissions) for how modes and approvals work. ## Related Documentation - [pw code Overview](/docs/ai/code): Feature overview and quick start - [Subagents](/docs/ai/code/subagents): Delegation, the agent switcher, follow-ups, and limits - [Permissions](/docs/ai/code/permissions): Permission modes and approvals - [Models & Allocations](/docs/ai/code/models): Model IDs and choosing models - [Settings](/docs/ai/code/settings): Subagent-related settings - [Project Instructions](/docs/ai/code/project-instructions): Per-project guidance for the agent - [Non-Interactive Mode](/docs/ai/code/non-interactive): One-shot runs with -p # Interface & Shortcuts > Source: https://parallelworks.com/docs/ai/code/interface # Interface & Shortcuts Interactive `pw code` runs in a full-screen terminal interface: a scrollable transcript on top, the message composer at the bottom, and a status line showing the current model, allocation, and token usage. This page covers the interface elements and every keyboard shortcut. At rest, the bottom of the screen looks like this: ## The Transcript - **Streaming markdown**: Responses stream in as the model generates them and are rendered as formatted markdown, including highlighted code blocks. - **Syntax-highlighted diffs**: File edits are shown as diffs with syntax highlighting on the changed lines. - **Repo banner**: The startup banner includes the repository name and current branch when the workspace is a git repository. - **Collapsible blocks**: Long tool outputs collapse to a summary line; press Ctrl+O to expand or collapse the most recent one. - **Jump to bottom**: When you scroll up, a centered **Jump to bottom (ctrl+end) ↓** pill appears; new output stops following until you return to the tail (or press Ctrl+R to re-enable following). - **Search**: Press Ctrl+F and type to search the transcript; matches are highlighted, Enter/ and step between them, and Esc closes the search. The mouse wheel always scrolls the transcript. Clicking on interface elements is off by default; enable the **Mouse clicks** option in `/settings` if you want clicks to select picker rows and toggle blocks. ## Keyboard Shortcuts Press ? at an empty prompt to toggle the shortcuts overlay in the session itself. | Key | Action | | --- | --- | | Enter | Send the message. While the agent is working, the message is queued and sent automatically when the turn ends. | | Shift+Enter | Insert a newline (Alt+Enter or Ctrl+J on terminals that cannot distinguish it). | | / | Recall earlier prompts, including from previous sessions in the same workspace. While the agent is working, at an empty prompt pulls back your newest queued message for editing. | | (past the newest entry) | Move the cursor into the agent switcher when subagents are running. See [Subagents](/docs/ai/code/subagents) for the switcher's own keys. | | Esc | Close an open overlay; interrupt the running turn or `!` command. At the prompt, press once to arm and again to clear the typed text. | | Ctrl+C | Interrupt the running turn; with text typed, clear the composer. At an empty prompt, press twice to quit. | | Ctrl+D | Quit (at an empty prompt). | | Shift+Tab | Cycle the [permission mode](/docs/ai/code/permissions): `read-only` → `accept-edits` → `bypass-permissions` → `plan`. | | ? | Toggle the shortcuts overlay (at an empty prompt). | | / | Open the [slash command](/docs/ai/code/slash-commands) palette. | | @ | Open the file picker to reference a file. | | ! | Enter shell mode (see below). | | Ctrl+O | Expand or collapse the most recent collapsible block. | | Ctrl+R | Toggle whether the transcript follows new output. In the model picker: refresh the model list. | | Ctrl+F | Search the transcript. | | Ctrl+V | Paste: attaches a clipboard image when one is present, otherwise pastes text. | | Ctrl+L | Clear and redraw the screen. | | PgUp / PgDn | Scroll the transcript half a screen. | | Ctrl+Home / Ctrl+End | Jump to the top / bottom of the transcript while scrolled. | Interrupting a turn restores your last message to the composer so you can edit and resend it. If you had messages queued, they are discarded instead, with a notice. ## Shell Mode Start a message with ! to run a shell command yourself, without involving the model. The composer's prompt glyph switches to `!` and a hint appears: **enter runs it locally; output is added to the conversation**. git log --oneline -5 The command runs in your login shell in the workspace directory. Because you typed it yourself, it bypasses the agent's [permission system](/docs/ai/code/permissions) entirely. The command and its output are recorded into the conversation as context, so the agent can refer to them on its next turn, but running a `!` command does **not** start a model turn; the agent only sees the output the next time you send it a message. Press Esc to interrupt a running command. Commands are limited to two minutes; a hung command is killed rather than freezing the session. ## File References Type @ followed by part of a file name to open the file picker, which fuzzy-matches against the workspace's files as you type. Use / to move, and Tab or Enter to insert the highlighted path. Selecting a directory keeps the picker open on that directory's contents so you can browse inward. Path-like queries such as `@~/Downloads/` or `@../` browse the filesystem directly, including outside the workspace. When your message is sent: - **Text files** referenced with `@` have their contents included with your message (workspace files only). The transcript shows just the `@` reference you typed. - **Image paths** (`.png`, `.jpg`, `.jpeg`, `.gif`, `.webp`) are attached as images the model can see. These may point outside the workspace, e.g. `@~/Downloads/screenshot.png`. ## Pasting Images Press Ctrl+V to paste an image from the clipboard. The image is attached and an `[Image #1]` placeholder is inserted into your message; deleting the placeholder before sending drops the attachment. If the model rejects image input, `pw code` tells you so you can remove the image or switch to a vision-capable model with `/model`. :::note Over SSH Inside an SSH session your local clipboard is unreachable, and `pw code` will say so. Copy the file to the remote machine (e.g. with `scp`) and attach it with `@path` instead. ::: ## Related Documentation - [pw code Overview](/docs/ai/code): Feature overview and quick start - [Slash Commands](/docs/ai/code/slash-commands): The `/` command palette - [Permissions](/docs/ai/code/permissions): What the permission modes mean - [Subagents](/docs/ai/code/subagents): The agent switcher and delegated tasks - [Sessions & Resume](/docs/ai/code/sessions): The session picker - [Settings](/docs/ai/code/settings): Auto-scroll, mouse clicks, and other preferences - [Models & Allocations](/docs/ai/code/models): The model picker # MCP Servers > Source: https://parallelworks.com/docs/ai/code/mcp # MCP Servers MCP ([Model Context Protocol](https://modelcontextprotocol.io)) servers give the agent tools beyond the built-ins, such as querying your issue tracker or searching internal documentation. `pw code` connects to configured servers at startup, local processes or remote endpoints, and offers their tools to the agent alongside the built-in ones. Servers can also expose reusable prompts, which appear as slash commands. ## Managing Servers from the CLI The `pw code mcp` command group manages server configuration: ```bash # Add a stdio server (the command goes after --) pw code mcp add -e API_KEY=secret everything -- npx -y @modelcontextprotocol/server-everything # Add a remote HTTP server to the shared /.mcp.json pw code mcp add --transport http -H "Authorization: Bearer token" --scope project context7 https://mcp.context7.com/mcp # Fill in every value interactively pw code mcp add # Inspect configuration pw code mcp list pw code mcp get # Remove a server pw code mcp remove ``` `add` takes the server name, then a URL for `http`/`sse` servers or a command after `--` for `stdio` servers. Run it with no arguments to be prompted for each value. | Flag | Meaning | | --- | --- | | `--transport` | Server transport: `stdio`, `http`, or `sse` | | `-e/--env KEY=VALUE` | Environment variable for the server process (repeatable, stdio only) | | `-H/--header "Key: Value"` | Header sent on every request (repeatable, http/sse only) | | `--timeout` | Connection timeout for this server | | `--scope` | Config file the entry is written to (`local`, `agents`, `project`, or `user`) | | `--force` | Overwrite an existing entry with the same name | The other subcommands: - `list` (alias `ls`) shows every configured server across all config files, marking which file is active and which are shadowed. Use `-o json` for machine-readable output. - `get ` prints one server's configuration (JSON by default, `-o text` for a summary). - `remove ` (alias `rm`) deletes a server; if the name is defined in more than one file, you choose which one (or pass `--scope`). See the [CLI reference](/docs/cli/pw/code/mcp) for the full flag list. ## Where Servers Are Configured Servers live in an `mcpServers` map, the same shape as Claude Desktop and Claude Code, so existing server configs paste in unchanged. Four files can hold the map, from highest to lowest precedence: | Scope | File | Typical use | | --- | --- | --- | | `local` | `/.agents/settings.local.json` | Personal, git-ignored (default for `add`) | | `agents` | `/.agents/settings.json` | Project settings, shared via version control | | `project` | `/.mcp.json` | The cross-tool standard MCP file | | `user` | `~/.config/pw/code.json` | Global, every workspace | :::warning Files replace, not merge The runtime server set comes from **one file only**: the highest-precedence file with a non-empty `mcpServers` map supplies the entire set. A higher-precedence file replaces the whole map below it rather than adding to it, so servers defined in a shadowed file are inactive. `pw code mcp add` warns when a write lands in (or creates) a shadowing situation, and `pw code mcp list` shows which file is active. ::: The three workspace files are part of the configuration `pw code` asks you to approve at launch; until you approve, their servers do not load. See [Workspace Trust](/docs/ai/code/settings#workspace-trust). ## Configuration Format All four files use the same top-level shape. The `type` field (`"stdio"`, `"http"`, or `"sse"`) is optional. When omitted, the transport is inferred: stdio if `command` is set, HTTP if `url` is set. ```json { "mcpServers": { "local-tools": { "command": "uvx", "args": ["some-mcp-server"], "env": { "API_KEY": "${MY_KEY}" } }, "remote": { "type": "http", "url": "https://mcp.example.com/mcp", "headers": { "Authorization": "Bearer ${TOKEN}" } } } } ``` - **stdio** servers are spawned as a local process from `command` + `args` and speak MCP over stdin/stdout. Optional `env` adds environment variables. The server must keep stdout clean for the protocol and log to stderr only. - **http** and **sse** servers are remote endpoints reached via `url`. Optional `headers` are sent on every request (the place for auth tokens). `${VAR}` in `env` values and `headers` is expanded from your environment, so secrets can stay out of config files. ### Connection Timeout Each connect attempt is bounded so a dead server cannot hang the session. The timeout is resolved in this order: a per-server `timeout` in the server's config, then the `MCP_TIMEOUT` environment variable, then a 30-second default. Both accept a bare number of milliseconds (`60000`) or a duration string (`"60s"`, `"2m"`). ## Tools and Permissions Each discovered tool is exposed to the model as `mcp____`: a server named `github` with a `list_prs` tool becomes `mcp__github__list_prs`. MCP tools ask for confirmation before each call, like shell commands. To pre-approve a tool and skip the prompt, add it to your allow rules: ```text /permissions add mcp__github__list_prs ``` or start the session with `--allowedTools mcp__github__list_prs`. MCP tools are not available in plan mode; in read-only mode only pre-approved tools can run, and in bypass-permissions mode they run without prompting. See [Permissions](/docs/ai/code/permissions). ## Connection Behavior In interactive sessions, servers connect in the background so startup is never blocked. Each server is announced in the transcript as it comes online, and a server that fails its first attempt is retried with backoff, useful for servers that download packages on first run. Run `/mcp` at any time to see each server's status (connected, connecting, or failed) and the tools it exposes. In non-interactive mode (`--prompt`), there is only a single turn, so servers connect synchronously before it runs. ## Prompts as Slash Commands Servers can also expose prompts: reusable prompt templates. Each discovered prompt becomes a slash command named `/mcp____`, shown in the command palette (type `/`) with a usage hint built from the prompt's declared arguments. Arguments are space-separated and map positionally onto the prompt's declared arguments; quote a value to keep multiple words together, and extra trailing words fold into the last argument: ```text /mcp__github__pr_review 456 /mcp__jira__create_issue "Bug in login flow" high ``` Running the command renders the prompt on the server and sends the result as a normal agent turn. A missing required argument, an unknown prompt, or a server-side failure is reported in the transcript instead. ## Related Documentation - [pw code Overview](/docs/ai/code): Feature overview and quick start - [pw code mcp CLI reference](/docs/cli/pw/code/mcp): Full command and flag reference - [Permissions](/docs/ai/code/permissions): Permission modes and allow rules - [Slash Commands](/docs/ai/code/slash-commands): Built-in and custom commands - [Settings](/docs/ai/code/settings): Other `pw code` configuration - [Non-Interactive Mode](/docs/ai/code/non-interactive): Running with `--prompt` # Models & Allocations > Source: https://parallelworks.com/docs/ai/code/models # Models & Allocations `pw code` can run on any chat model your AI providers offer. This page covers how models are identified, how to discover and switch between them, and how budget allocations work for organization providers. ## Model IDs Model IDs have the form `owner:provider-name/model-name`: - **Personal providers** are addressed by their owner's username, for example `Jake.Thayne:openai/gpt-5.2`. - **Your own connected subscriptions** (such as a ChatGPT/Codex subscription connected with `pw ai codex connect`) appear under the `me:` owner, for example `me:personal/gpt-5.2-codex`. - **Organization providers** use the `org:` owner (for example `org:openai/gpt-5.2`) and require a [budget allocation](#allocations). An ID passed to `pw code` must contain a `/`; anything else is rejected as an invalid model format. ## Discovering Models List every model available to you across all configured providers: ```bash pw ai models ls # As JSON, for scripting pw ai models ls -o json ``` ### The Interactive Model Picker If you start `pw code` without specifying a model, the model picker opens automatically. You can also open it any time in a session by running `/model` with no arguments, or from the **Model** row in `/settings`. In the picker: - **Grouped by provider**: each row shows the friendly name and the full model ID. - **Type to filter**: the list narrows as you type, matching against both the model ID and its display name. - **Select or dismiss**: Enter selects the highlighted model; Esc first clears an active filter, then closes the picker. - **Refresh**: Ctrl+R refreshes the list from the platform; the fetched list is cached for the rest of the session. ## Switching Models In-Session Use the `/model` slash command: ```text # Open the interactive picker /model # Switch directly to a specific model /model Jake.Thayne:openai/gpt-5.2 ``` The new model applies to all subsequent turns in the conversation. ### Which Choices Persist - A model chosen **from the picker** is saved as your default and is used the next time you start `pw code` without specifying a model. - A model set by typing `/model ` applies to the **current session only**. - Allocation choices persist either way, whether picked from the allocation picker or set with `/allocation `. - The permission mode cycled with Shift+Tab persists the same way; see [Permissions](/docs/ai/code/permissions). Defaults are stored in your `pw code` settings and can also be set per project. See [Settings](/docs/ai/code/settings). ## Allocations Models from organization providers (`org:` IDs) draw their spend from a **budget allocation**. Personal provider models do not use allocations. On the command line, pass the allocation name with the `--allocation` flag: ```bash pw code --allocation PW-QA-TEST org:openai/gpt-5.2 ``` ### Choosing an Allocation Interactively In an interactive session, you never have to know the allocation name up front. When you select an organization model (or send a message with one active) and no allocation is set, `pw code` fetches the allocations you are permitted to use and prompts you to pick one. Each row shows the allocation's spend so far against its total budget. You can also open the picker at any time with `/allocation`, or change it directly with `/allocation `. If no allocations are available to you, `pw code` reports it and asks you to contact your organization admin for access. ### Allocations in One-Shot Runs A [one-shot (non-interactive) run](/docs/ai/code/non-interactive) cannot open a picker, so an organization model without `--allocation` fails immediately: ```text an allocation is required for org provider models. Use --allocation to specify one. Run 'pw code' without --prompt to browse available allocations interactively. ``` ## Using a Personal ChatGPT/Codex Subscription You can connect a personal ChatGPT/Codex subscription as an AI provider and use its models in `pw code`: ```bash pw ai codex connect --name personal ``` This starts a device-code sign-in: open the printed URL, enter the code, and authorize. Once connected, the subscription's models become available as `me:personal/`, and usage draws on the subscription's own quota rather than a platform budget. - **Reconnect**: `--reconnect` re-authorizes an existing provider without changing its identity. - **Quota**: check the subscription's usage windows from inside a session with [`/usage`](/docs/ai/code/usage-and-costs). For other provider types and sharing options, see [AI Providers](/docs/ai/ai-providers). ## Tool Calling Support Not every model endpoint implements a tool-calling API, and `pw code` needs tool calling to read files, run commands, and edit your workspace. The gateway advertises each model as `native`, `emulated`, or `none`, shown in the "Tool calling" column of `pw ai models ls`: - **native**: the provider's own tool-calling API is used. - **emulated**: the provider has no tools API, so the gateway carries the tool contract in the prompt and reconstructs tool calls from the model's reply. The status line shows `emulated tools`. Tools work normally; responses are not streamed incrementally and cost more input tokens per turn. - **none**: tool calling is unavailable. The status line shows `tools unavailable` and the session is chat-only. See [Tool Calling & Emulation](/docs/ai/ai-providers/tool-calling) for the full mechanism and its limits. ## Default Model for Subagents Delegated subagent tasks can run on a different default model than your session, which is useful for pointing mechanical background work at a cheaper or faster model. Set it via the **Subagent model** row in `/settings` (the `subagentModel` setting); leave it empty to have subagents inherit the session's model. See [Subagents](/docs/ai/code/subagents) for the full model resolution rules. ## Related Documentation - [pw code Overview](/docs/ai/code): Feature overview and quick start - [Settings](/docs/ai/code/settings): Where defaults are stored - [Slash Commands](/docs/ai/code/slash-commands): `/model`, `/allocation`, and more - [Non-Interactive Mode](/docs/ai/code/non-interactive): Model and allocation flags in scripts - [Subagents](/docs/ai/code/subagents): Subagent model resolution - [Usage & Costs](/docs/ai/code/usage-and-costs): Cost estimates and provider quotas - [AI Providers](/docs/ai/ai-providers): Configure AI providers - [Tool Calling & Emulation](/docs/ai/ai-providers/tool-calling): What `emulated tools` in the status line means # Non-Interactive Mode > Source: https://parallelworks.com/docs/ai/code/non-interactive # Non-Interactive Mode With the `-p` (`--prompt`) flag, `pw code` runs a single prompt to completion and exits (these docs also call this a one-shot run): no full-screen interface, no follow-up questions. This is the mode to use in scripts, CI jobs, and anywhere you want the agent's answer as program output. ```bash pw code -p "find all TODO comments" owner:provider-name/model-name ``` A model is required in one-shot mode. Pass it as the positional argument or with `-m`. Organization provider models also require [`--allocation`](/docs/ai/code/models#allocations) (there is no picker to fall back to). List available model IDs with `pw ai models ls`. Press Ctrl+C to cancel a run in flight. ## What Goes to stdout vs. stderr In the default text output, the streams are separated so the result stays clean: - **stdout** carries only the model's answer, streamed as it is generated. - **stderr** carries everything else: tool activity as it happens (a `● ToolName(...)` line per call with a condensed result line beneath it), the final usage summary, and the session/resume hint. That means command substitution and pipes capture just the answer: ```bash RESULT=$(pw code -p "summarize the changes in HEAD in one sentence" owner:provider-name/model-name) echo "$RESULT" ``` Add `2>/dev/null` to silence the progress output entirely, or `2>progress.log` to keep it. Progress lines are colorized only when stderr is a terminal, so redirected logs never contain escape codes. ## JSON Output Pass `-o json` to get a single structured result object on stdout instead of streamed text (no progress is printed for the answer itself in this mode): ```bash pw code -p "list the Go files in this repo" -o json owner:provider-name/model-name ``` ```json { "message": "The repository contains ...", "model": "owner:provider-name/model-name", "session_id": "20260719-153045-a1b2c3d4", "iterations": 4, "usage": { "input_tokens": 18000, "output_tokens": 1200, "total_tokens": 19200 }, "estimated_cost": "$0.0480" } ``` | Field | Description | | --- | --- | | `message` | The model's final answer. | | `model` | The model ID the run used. | | `session_id` | The local session ID, usable with `pw code -r`. | | `iterations` | How many model requests the agent loop made to finish the prompt. | | `usage.input_tokens` | Total input (prompt) tokens across the run. | | `usage.output_tokens` | Total output (completion) tokens across the run. | | `usage.total_tokens` | Input plus output tokens. | | `estimated_cost` | Estimated cost as a dollar string, e.g. `"$0.0480"`, based on platform-configured model rates. | Extract fields with `jq`: ```bash pw code -p "how many source files are in src/?" -o json owner:provider-name/model-name \ | jq -r '.message, .estimated_cost' ``` ## Permissions in One-Shot Runs One-shot runs use the same [permission modes](/docs/ai/code/permissions) as interactive sessions, but there is no one to answer a prompt: any action that would normally ask for approval is **denied automatically** (it fails closed). The agent sees the denial and continues, working around the restriction or reporting it in its answer. The same applies to workspace configuration: a one-shot run never prompts to approve a workspace's settings, MCP servers, commands, or agent definitions, so unapproved files are ignored with a notice on stderr. Launch `pw code` interactively once to approve them. See [Workspace Trust](/docs/ai/code/settings#workspace-trust). For scripting, that means: - `--permission-mode read-only` is the safe choice for analysis and question-answering runs. - The default `accept-edits` mode auto-approves file edits inside the workspace, but shell commands that would normally prompt are denied unless pre-approved. - `--allowedTools` pre-approves specific tools or commands, e.g. `--allowedTools 'Bash(git status:*)',ReadFile`. - `--permission-mode bypass-permissions` runs every tool without prompting. :::warning bypass-permissions runs everything `bypass-permissions` gives the agent unrestricted tool access, including arbitrary shell commands. Use it only in environments where that is acceptable, such as a disposable CI container. ::: ## Subagents in One-Shot Runs The agent may delegate parts of the prompt to [subagents](/docs/ai/code/subagents). In non-interactive mode, subagents always run **inline**: requests to run a task in the background are forced to block until the task finishes, so no work is lost when the process exits. - Progress on stderr is coarse: one `● Task(...)`-style start line naming the subagent and its task, and one condensed result line when it completes. The subagent's individual tool calls are not streamed. - Permission-gated commands a subagent runs fail closed, just like the main agent's. - The JSON output contains only aggregate usage: subagent tokens and cost roll up into the run's `usage` and `estimated_cost` totals, and there is no per-subagent breakdown field. ## Resuming a One-Shot Session Every one-shot run is saved as a local session. In text mode, stderr ends with the session ID and a ready-to-run resume command: ```text Session: 20260719-153045-a1b2c3d4 Resume: pw code -r 20260719-153045-a1b2c3d4 -m owner:provider-name/model-name ``` Run that command to reopen the conversation interactively, with the one-shot exchange as history. The reverse also works: combine `-r` with `-p` to continue a saved session with another non-interactive prompt, or use `-r latest` for the most recent session. See [Sessions & Resume](/docs/ai/code/sessions). ## Related Documentation - [pw code Overview](/docs/ai/code): Feature overview and quick start - [Permissions](/docs/ai/code/permissions): Permission modes and allow rules - [Models & Allocations](/docs/ai/code/models): Model IDs and the `--allocation` flag - [Sessions & Resume](/docs/ai/code/sessions): Resuming one-shot sessions - [Subagents](/docs/ai/code/subagents): How delegated tasks behave - [Usage & Costs](/docs/ai/code/usage-and-costs): What the usage and cost figures mean - [pw code command reference](/docs/cli/pw/code): Full CLI reference # Permissions > Source: https://parallelworks.com/docs/ai/code/permissions # Permissions `pw code` decides what it may do on its own and what needs your approval through three layers: a **permission mode** that sets the overall level of autonomy, **allow rules** that pre-approve specific tools and commands, and a **workspace boundary** that keeps file access inside the directory you started in. ## Permission Modes A session runs in one of four modes. The default is `accept-edits`. Each mode sets what the agent may do across reads, file edits, shell commands, and MCP tools (tools from connected [MCP servers](/docs/ai/code/mcp)). | Mode | Reads & searches | File edits | Shell commands | MCP tools | | --- | --- | --- | --- | --- | | `read-only` | Allowed | Denied | Denied | Denied | | `accept-edits` (default) | Allowed | Allowed | Prompt each time | Prompt each time | | `plan` | Allowed | Plan files only | Denied | Denied | | `bypass-permissions` | Allowed | Allowed | Allowed | Allowed | [Allow rules](#allow-rules) skip the prompt in every mode except `plan`: an allowlisted command runs without asking even in `read-only` mode. :::warning bypass-permissions runs everything In `bypass-permissions` mode every tool call executes without prompting, including shell commands and file access outside the workspace. Use it only where that is acceptable, such as disposable environments or automation. ::: ### Plan Mode Plan mode lets the agent work out an approach before touching anything. Reads, searches, and web fetches are allowed, but file edits are restricted to plan documents (`PLAN.md`, `plan.md`, or Markdown files inside a `plans/` directory), and shell commands are always denied, even when an allow rule matches them. ## Setting the Mode - **At startup**: pass the `--permission-mode` flag: ```bash pw code --permission-mode read-only ``` - **During a session**: press Shift+Tab to cycle `read-only` → `accept-edits` → `bypass-permissions` → `plan`. The status line below the composer shows the current mode, and you can cycle it even while the agent is working. The new mode applies to its next tool call. - **In the settings menu**: run `/settings` and activate the **Permission mode** row, which cycles through the same order. - **In your settings file**: set the `permissionMode` key. See [Settings](/docs/ai/code/settings). Mode changes made with Shift+Tab or `/settings` are saved as your default for future sessions. The `--permission-mode` flag overrides the saved setting for that run. ## Approval Prompts In the default `accept-edits` mode the agent reads and edits workspace files freely but stops before every shell command and MCP tool call that no allow rule covers. The prompt shows the exact command and why it needs approval, with four choices: - **Yes, allow this command**: run it once. The next command prompts again. - **Yes, and allow this directory for the session**: run it and remember the directories it touches, so later operations on those locations (such as access outside the workspace) do not prompt again this session. - **No, deny this command**: skip it. The agent is told the command was denied. - **No, and provide feedback to the agent**: deny it and type an explanation the agent can act on. Pressing Esc also denies the command. Approval is per command: approving one shell command does not approve the next one. To stop a recurring prompt, add an allow rule instead. Commands the CLI classifies as destructive (for example `rm -rf`, `git reset --hard`, or a force push) prompt for confirmation in every mode except `bypass-permissions`. In [non-interactive mode](/docs/ai/code/non-interactive) there is no way to prompt, so actions that would require confirmation fail instead. Pre-approve them with allow rules, `--add-dir`, or `--permission-mode bypass-permissions`. ## Allow Rules Allow rules pre-approve specific tool calls so they never prompt. Manage them from inside a session with `/permissions`: ```text /permissions # list the rules in effect /permissions add Bash(git status:*) # add a rule /permissions remove Bash(git status:*) /permissions remove 2 # or remove by its number from the list ``` Rules added with `/permissions add` take effect immediately and are saved to your user-level settings, so they persist across sessions. Rules that came from project settings or the command line can only be removed for the current session. You can also pass rules at startup with the repeatable `--allowedTools` flag, or store them under the `allowedTools` key in [settings](/docs/ai/code/settings). Rules from settings files and the flag are combined: ```bash pw code --allowedTools 'ReadFile' --allowedTools 'Bash(git status:*)' ``` ### Rule Syntax | Rule | Effect | | --- | --- | | `ReadFile` | A bare tool name allows every call of that tool. | | `Bash(git status:*)` | The `:*` suffix allows a command prefix with any arguments: here `git status` alone or followed by anything. | | `ReadFile(/data/**)` | The `/**` suffix matches a directory and everything under it. Path-scoped rules on file tools also grant access outside the workspace. | For shell commands, every part of a compound command must match a rule: `git status && curl example.com` only runs unprompted if both `git status` and `curl example.com` are allowlisted. Commands containing command substitution (`$(...)` or backticks) are never auto-approved. A bare tool rule such as `ReadFile` suppresses prompts for normal calls but does not widen the tool's reach: reads outside the workspace still require a path-scoped rule, `--add-dir`, or your approval. ## Workspace Boundary The agent works within your workspace: the directory you start `pw code` in, or the one passed with `--workspace`. Paths are fully resolved before they are checked, so symlinks cannot escape the boundary. When the agent tries to read or write a file outside the workspace, it asks first. Choosing **Yes, and allow this directory for the session** whitelists that file's directory, so further access there does not prompt again. To grant access up front: - `--add-dir ` (repeatable) approves directories for outside-workspace reads for the whole session. - Path-scoped allow rules such as `ReadFile(/data/**)` or `WriteFile(/tmp/**)` grant persistent access. ```bash pw code --add-dir /data --add-dir /shared/results ``` In `bypass-permissions` mode, outside-workspace access is allowed without prompting. Commands you type yourself in [shell mode](/docs/ai/code/interface#shell-mode) (the `!` prefix) run outside the agent's permission system entirely. ## Subagents and Permissions - **Inherited at spawn**: subagents get the session's permission mode, allow rules, and `--add-dir` directories. - **Live changes reach them**: changing the session's mode (for example with Shift+Tab) applies to running subagents immediately, in both directions. - **Definitions only narrow**: a [custom agent](/docs/ai/code/custom-agents) definition can restrict a subagent's mode or tools but never widen them past the session; see [Permission Clamping](/docs/ai/code/custom-agents#permission-clamping-for-definition-authors) for the exact rules. - **Approvals stay per-subagent**: an approval prompt names the agent asking, and what you approve applies to that subagent only. Cycling the mode inside a subagent's window adjusts that subagent alone, still capped by the session. ## Related Documentation - [pw code Overview](/docs/ai/code): Feature overview and quick start - [Settings](/docs/ai/code/settings): The `permissionMode` and `allowedTools` keys - [Slash Commands](/docs/ai/code/slash-commands): `/permissions` and other in-session commands - [Non-Interactive Mode](/docs/ai/code/non-interactive): How approvals behave in one-shot runs - [Subagents](/docs/ai/code/subagents): Delegated tasks and inherited permissions - [Custom Agents](/docs/ai/code/custom-agents): Narrowing permissions per agent - [MCP Servers](/docs/ai/code/mcp): How MCP tools are configured and approved - [Interface & Shortcuts](/docs/ai/code/interface): Keyboard shortcuts including Shift+Tab # Project Instructions > Source: https://parallelworks.com/docs/ai/code/project-instructions # Project Instructions Project instruction files give the agent standing guidance about your codebase: how to build it, what conventions to follow, and what to avoid. `pw code` reads them automatically at the start of every session, so you do not have to repeat the same context in each conversation. ## How Files Are Discovered `pw code` looks for a file named `AGENTS.md` in each directory from the root of your git repository down to the directory you launched the session in, and includes every file it finds. This means: - Repository-wide guidance lives in an `AGENTS.md` at the repo root. - A subproject (for example, a package in a monorepo) can add its own `AGENTS.md` with more specific instructions; both files are included when you work inside it. - Outside a git repository, only the launch directory is checked. For example, starting `pw code` in `packages/api/` of a repository laid out like this: ```text repo/ AGENTS.md <- included (repository root) packages/ api/ AGENTS.md <- included (launch directory) web/ AGENTS.md <- not included (outside the path) ``` includes the root file and the `packages/api` file, in that order. Only directories on the path from the repo root to where you launched are checked, and at most one instruction file is read per directory. ### Overriding a Shared File If a directory contains both `AGENTS.md` and `AGENTS.override.md`, only `AGENTS.override.md` is used: it replaces, rather than adds to, the `AGENTS.md` beside it. This is useful for keeping personal, machine-specific instructions out of a file your team shares: add `AGENTS.override.md` to your `.gitignore` and put your local variant there. :::note Size limit The combined instruction content is capped at 32 KB. Anything beyond the cap is truncated, so keep instruction files short and high-signal. ::: ## What to Put in Them Instruction files are plain markdown. The most useful content is what the agent cannot discover quickly on its own: - **Build and test commands**: the exact commands to compile, lint, and run tests - **Conventions**: naming, formatting, and structural rules the codebase follows - **Warnings**: generated files that must not be hand-edited, fragile areas, and required workflows A short, specific file beats a long general one. For example: ```markdown # Project Notes ## Commands - Build: `make build` - Test: `make test` (unit) or `make test-integration` (needs Docker) - Lint: `make lint` -- run before every commit ## Conventions - Go code follows the standard library style; wrap errors with `fmt.Errorf("...: %w", err)`. - API handlers live in `internal/api/`; one file per resource. ## Warnings - Files under `gen/` are generated -- edit the `.proto` sources instead. - The base branch is `develop`, not `main`. ``` ## Compatibility with Other Tools `AGENTS.md` is a cross-tool convention, and `pw code` reads it as plain markdown with no special frontmatter, markers, or required sections. If your repository already carries an `AGENTS.md` for another coding agent, `pw code` picks it up as-is. There is nothing extra to add. ## Related Documentation - [pw code Overview](/docs/ai/code): Feature overview and quick start - [Slash Commands](/docs/ai/code/slash-commands): Built-in and custom commands, including reusable prompt files - [Settings](/docs/ai/code/settings): Configure pw code per workspace or globally - [Permissions](/docs/ai/code/permissions): Control what the agent can do # Sessions & Resume > Source: https://parallelworks.com/docs/ai/code/sessions # Sessions & Resume Every `pw code` run creates a local session (a transcript of your conversation, the model used, and the workspace it ran in) stored on your machine. You can leave a session at any time and pick the conversation back up later, with the full history restored. ## How Sessions Are Saved Sessions are saved as one file per session under `~/.local/state/pw/code-sessions` (the location respects `XDG_STATE_HOME` if set). Session IDs encode the start time plus a random suffix, for example `20260719-153045-a1b2c3d4`. A session in which you never sent a message is not listed and cannot be resumed, so launching `pw code` and quitting immediately leaves nothing behind. ## Resuming a Session ```bash # Resume the most recent session pw code -r latest # Resume a specific session by ID pw code -r 20260719-153045-a1b2c3d4 # Pick a session from an interactive list pw code --resume ``` If you do not specify a model when resuming, the session's original model is used. When you exit an interactive session, `pw code` prints the exact command to resume that conversation. ### The Session Picker Running `pw code --resume` with no session ID opens an interactive picker listing your saved sessions, newest first. You can also open it from inside a running session with the `/resume` slash command. In the picker you can: - **Filter as you type**: The search box matches against a session's name, its first message, and its workspace path. - **Toggle scope**: By default only sessions from the current directory are shown; switch **Scope** to **All** to see every saved session. - **Change sort order**: Sort by last-updated (default) or creation time. - **Preview a session**: Press Ctrl+T to view the selected session's full history, rendered as it would appear on resume, before committing to it. Scroll with the arrow keys; press Enter to resume or Esc to go back to the list. - **Expand details**: Press Ctrl+E to show the selected session's workspace, model, timestamps, and message count. - **Toggle density**: Press Ctrl+O to switch between compact and comfortable row spacing. Press Enter to resume the highlighted session, or Esc to leave the picker without resuming. ### Naming Sessions Inside a session, use `/rename ` to give it a label. Named sessions show their name in the picker, which makes long-running work easier to find than a first-message preview. ## Resuming After a One-Shot Run One-shot (non-interactive) runs are saved as sessions too, and print a ready-to-run resume command when they finish. The reverse also works: combine `-r` with `-p` to continue any saved session non-interactively. See [Resuming a One-Shot Session](/docs/ai/code/non-interactive#resuming-a-one-shot-session). ## Session Retention Sessions are kept forever by default. Sweeping is opt-in: set the `sessionRetentionDays` setting to a positive number, and each time `pw code` starts, session transcripts that have not been touched within that many days are deleted. | Value | Behavior | | --- | --- | | `0` (or unset, or any negative value) | Sessions are kept forever (the default) | | A positive number | Sessions untouched for that many days are deleted at startup | The session you are currently resuming is never swept, and resuming a session restarts its retention clock. The window can also be changed from the **Session retention** row in `/settings`. See [Settings](/docs/ai/code/settings) for where to configure `sessionRetentionDays`. :::note Subagent transcripts Transcripts of [subagents](/docs/ai/code/subagents) are stored alongside their parent session and share its lifetime: they are cleaned up with the parent and revived together with it when you resume. ::: ## Local Sessions vs Account Chats `pw code` sessions live only on your machine. They are not saved to your account and do not appear in the web [Chat](/docs/ai/chat) list. Chats saved to your account are managed separately; the [pw code overview](/docs/ai/code) lists the `pw ai chats` commands. ## Related Documentation - [pw code Overview](/docs/ai/code): Feature overview and quick start - [Non-Interactive Mode](/docs/ai/code/non-interactive): One-shot prompts and JSON output - [Slash Commands](/docs/ai/code/slash-commands): In-session commands like `/resume` and `/rename` - [Settings](/docs/ai/code/settings): Configure `sessionRetentionDays` and other options - [Subagents](/docs/ai/code/subagents): Parallel task delegation - [Interface & Shortcuts](/docs/ai/code/interface): The terminal interface - [pw code command reference](/docs/cli/pw/code): Full CLI reference # Settings > Source: https://parallelworks.com/docs/ai/code/settings # Settings `pw code` reads its configuration from a global settings file in your home directory, with optional per-workspace files you can check into a project. Common settings can also be changed from inside a session with the interactive `/settings` menu. ## Settings Files Settings are merged from four places, in order, with later files overriding earlier ones key by key: 1. `~/.config/pw/code.json`: your global settings. 2. `/.mcp.json`: MCP servers in the cross-tool standard format. 3. `/.agents/settings.json`: project settings, typically checked in. 4. `/.agents/settings.local.json`: personal overrides for one workspace, not meant to be checked in. All four files accept the same JSON keys. The global path honors `XDG_CONFIG_HOME` and is the same on macOS and Linux. A `mcpServers` map is replaced wholesale, not merged: the highest-precedence file that defines it supplies the entire server set. See [MCP Servers](/docs/ai/code/mcp). ## Workspace Trust Workspace configuration only applies after you approve it. The first time `pw code` starts in a workspace whose configuration files it has not seen before, it lists them and asks whether to apply them. The gate covers everything a workspace can contribute: settings files, `.mcp.json` [MCP servers](/docs/ai/code/mcp), and the `.agents` [agent definitions](/docs/ai/code/custom-agents) and [custom commands](/docs/ai/code/slash-commands). Your answer is remembered for that exact content: if any of the files change, you are asked again at the next launch. Until you approve, none of the workspace files apply and the session runs on your global settings alone. [Non-interactive runs](/docs/ai/code/non-interactive) never prompt. Unapproved workspace configuration is ignored with a notice on stderr, so launch `pw code` interactively once in a workspace you want scripts to use. Approvals are stored in your global settings file under the `workspaceSettingsTrust` key, which is managed automatically. ## Key Reference All keys are optional. | Key | Type | Default | Description | | --- | --- | --- | --- | | `model` | string | none | Model ID to start with (e.g. `Jake.Thayne:openai/gpt-5.2`). Updated automatically to the model you last used. | | `allocation` | string | none | Budget allocation for `org:` provider models. Updated to the one you last used. | | `permissionMode` | string | `accept-edits` | Startup [permission mode](/docs/ai/code/permissions): `read-only`, `accept-edits`, `bypass-permissions`, or `plan`. | | `allowedTools` | string[] | `[]` | [Allow rules](/docs/ai/code/permissions) that pre-approve tool calls, e.g. `"Bash(git status:*)"`. | | `maxTurnTokens` | number | `0` | Per-turn token budget; the turn stops when it is exceeded. `0` = unlimited. See [Usage & Costs](/docs/ai/code/usage-and-costs). | | `compactAt` | number | `0` | Live context size, in tokens, at which the conversation is automatically compacted. `0` = default (100,000). See [Usage & Costs](/docs/ai/code/usage-and-costs). | | `includeCoAuthoredBy` | boolean | `true` | Attribution on commits and pull requests the agent creates. See [below](#commit-and-pr-attribution). | | `mcpServers` | object | `{}` | [MCP server](/docs/ai/code/mcp) definitions. | | `autoScroll` | boolean | `true` | Keep the transcript pinned to the bottom as output streams. | | `reduceMotion` | boolean | `false` | Disable the working-spinner animation. | | `mouseClicks` | boolean | `false` | Let mouse clicks act on the interface (select picker rows, toggle blocks, drag-select). Wheel scrolling always works. | | `sessionRetentionDays` | number | `0` | A positive number sweeps sessions untouched for that many days at startup; resuming a session resets its clock. `0` (the default) or a negative value keeps sessions forever. See [Sessions & Resume](/docs/ai/code/sessions). | | `disableSubagents` | boolean | `false` | Withhold the delegation tool entirely, so the agent cannot spawn [subagents](/docs/ai/code/subagents). | | `subagentConcurrency` | number | `0` | How many subagent tasks may run at once. `0` = default (10). | | `subagentDepth` | number | `0` | How deep subagents may nest. `0` or `1` = subagents cannot spawn their own subagents. | | `subagentModel` | string | none | Default model for delegated tasks. Empty = inherit the session's model. | For what the subagent keys control in practice, see [Subagents](/docs/ai/code/subagents). ## Example ```json { "model": "Jake.Thayne:openai/gpt-5.2", "permissionMode": "accept-edits", "allowedTools": ["Bash(git status:*)", "Bash(go test:*)"], "compactAt": 80000, "includeCoAuthoredBy": false, "sessionRetentionDays": 90, "subagentConcurrency": 4, "subagentModel": "Jake.Thayne:openai/gpt-5.2-mini", "mcpServers": { "docs": { "command": "npx", "args": ["-y", "docs-mcp-server"] } } } ``` ## The /settings Menu Run `/settings` in an interactive session to change the most common settings without editing files. Type to filter the rows, move with the arrow keys, and press Enter to change the highlighted row; Esc closes the menu. Changes are saved to your global settings immediately. | Row | What it does | | --- | --- | | **Permission mode** | Cycles `read-only` → `accept-edits` → `bypass-permissions` → `plan`. See [Permissions](/docs/ai/code/permissions). | | **Co-authored-by trailer** | Toggles commit and pull request attribution on or off. | | **Auto-scroll** | Toggles following the transcript as output streams. | | **Reduce motion** | Toggles the working-spinner animation. | | **Mouse clicks** | Toggles click interaction with the interface; scrolling and text selection always work. | | **Subagents** | Enables or disables delegating tasks to subagents. | | **Subagent concurrency** | Opens a number box for the parallel-task limit. Enter applies, Esc cancels; leaving it empty keeps the current value. | | **Subagent nesting depth** | Opens a number box; `1` means subagents cannot spawn their own subagents. | | **Subagent model** | Opens a model picker for the default delegated-task model. Shows `(inherit session)` when unset. | | **Session retention** | Opens a number box for the sweep window in days; `0` keeps sessions forever. See [Sessions & Resume](/docs/ai/code/sessions). | | **Model** | Opens the model picker to change the session's model. | | **Allocation** | Opens the allocation picker (org providers). See [Models & Allocations](/docs/ai/code/models). | ## Commit and PR Attribution When `includeCoAuthoredBy` is enabled (the default), the agent ends every commit message it creates with an attribution line and a `Co-Authored-By: pw code ` trailer, and ends the pull requests it opens with the same attribution line. Turning it off with the **Co-authored-by trailer** row in `/settings` applies to the current session's future commits, not just the next launch. ## Related Documentation - [pw code Overview](/docs/ai/code): Feature overview and quick start - [Permissions](/docs/ai/code/permissions): Permission modes and allow rules - [MCP Servers](/docs/ai/code/mcp): The `mcpServers` key and `.mcp.json` - [Subagents](/docs/ai/code/subagents): Behavior behind the subagent keys - [Models & Allocations](/docs/ai/code/models): Model IDs and budget allocations - [Sessions & Resume](/docs/ai/code/sessions): Session storage and retention - [Slash Commands](/docs/ai/code/slash-commands): `/settings` and other in-session commands # Slash Commands > Source: https://parallelworks.com/docs/ai/code/slash-commands # Slash Commands Slash commands let you control a `pw code` session without leaving the conversation. Type `/` in the composer to open the command palette, which filters as you type, or run `/help` in a session to print the same list. Press Enter to run the highlighted command. ## Built-In Commands | Command | Description | | --- | --- | | [`/allocation [allocation-name]`](/docs/ai/code/models#allocations) | Show or change the budget allocation (org providers only) | | [`/auth`](/docs/ai/code/troubleshooting#authentication-expired-mid-session) | Re-authenticate when your token or API key has expired | | `/clear` | Clear conversation and start fresh | | [`/compact`](/docs/ai/code/usage-and-costs#context-compaction) | Manually compact conversation history | | [`/cost`](/docs/ai/code/usage-and-costs) | Show token usage and estimated cost | | `/diff` | Show git diff for workspace | | [`/fork `](/docs/ai/code/subagents#forking-the-conversation) | Fork this conversation into a subagent with its full history | | `/help` | Show available commands | | [`/mcp`](/docs/ai/code/mcp) | Show MCP server connection status and tools | | [`/model [model-name]`](/docs/ai/code/models) | Show or change the current model | | [`/permissions [add\|remove ]`](/docs/ai/code/permissions#allow-rules) | View and manage allowed tool rules | | [`/rename `](/docs/ai/code/sessions) | Rename the current session | | [`/resume`](/docs/ai/code/sessions) | Resume a previous session from a picker | | [`/settings`](/docs/ai/code/settings#the-settings-menu) | Change pw code settings | | `/status` | Show session status | | [`/usage`](/docs/ai/code/usage-and-costs#provider-quotas-usage) | Show provider usage and reset times | | `/version` | Show CLI version | :::note /usage availability `/usage` only appears in the palette and in `/help` when the selected model's provider reports usage information. If your provider does not expose usage windows, the command is hidden. ::: `/fork` hands a task to a subagent that starts with a full copy of the conversation so far. See [Subagents](/docs/ai/code/subagents) for details. The composer has two other prefixes: `@` references files and `!` runs a shell command yourself. See [Interface & Shortcuts](/docs/ai/code/interface). ## Custom Slash Commands You can define your own slash commands as markdown files. A file named `.md` becomes the command `/name`, and its body is the prompt sent to the agent when you run it. `pw code` looks for command files in these locations, in order of precedence: 1. `/.agents/commands/`: project commands, shared with your team through version control 2. `~/.config/agents/commands/`: personal commands, available in every workspace (respects `XDG_CONFIG_HOME`) When the same command name exists in both locations, the project file wins. :::note Project commands require approval Command files in the workspace are part of the configuration `pw code` asks you to approve at launch. See [Workspace Trust](/docs/ai/code/settings#workspace-trust). ::: ### File Format An optional frontmatter block sets how the command appears in the palette: - `description`: the one-line description shown next to the command - `argument-hint`: appended to the command name in the palette to show what arguments it expects The body is a prompt template. These placeholders are substituted when the command runs: - `$ARGUMENTS` (or `$ARGS`): everything typed after the command name - `$1` through `$9`: individual space-separated arguments; a position with no argument expands to nothing ### Example Save this as `.agents/commands/fix-issue.md` in your workspace: ```markdown --- description: Investigate and fix a GitHub issue argument-hint: --- Look up GitHub issue #$1 with `gh issue view $1`. Reproduce the problem, implement a fix, and run the relevant tests. Summarize the root cause when you are done. ``` Then run it from the composer: ```text /fix-issue 123 ``` The agent receives the body with `$1` replaced by `123` and works through it as a normal turn. :::info MCP prompts are slash commands too Connected MCP servers can expose prompt templates, which appear in the palette as `/mcp____`. See [MCP Servers](/docs/ai/code/mcp) for how arguments are passed. ::: ## Related Documentation - [pw code Overview](/docs/ai/code): Feature overview and quick start - [Subagents](/docs/ai/code/subagents): Fork conversations and delegate tasks - [MCP Servers](/docs/ai/code/mcp): Connect external tools and prompts - [Permissions](/docs/ai/code/permissions): Permission modes and allow rules - [Sessions & Resume](/docs/ai/code/sessions): Save, rename, and resume sessions - [Usage & Costs](/docs/ai/code/usage-and-costs): Track token usage and spend - [Settings](/docs/ai/code/settings): Configure `pw code` - [Interface & Shortcuts](/docs/ai/code/interface): Keyboard shortcuts and the composer # Subagents > Source: https://parallelworks.com/docs/ai/code/subagents # Subagents `pw code` can split work across subagents: helper agents that each run their own agent loop and report back. When a request contains independent pieces (a broad search, a refactor across many files, a research question), the agent can delegate each piece to a subagent instead of doing everything itself, and independent pieces run at the same time. Each subagent: - **Starts with a fresh context**: it sees none of your conversation, so the agent hands it a self-contained brief. - **Works in the same directory**: it shares your working tree and your MCP tools, so its edits land in the same files you are looking at. (Custom agent types can opt into an isolated worktree instead; see [Custom Agents](/docs/ai/code/custom-agents).) - **Reports back a summary**: when it finishes, its report is delivered into the main conversation. The agent decides when delegating is worthwhile, and you can also ask for it directly: "delegate these three fixes to subagents" or "research this in the background while we keep working." This page covers how delegation behaves, the agent switcher, follow-ups, forks, models, persistence, and limits. ## Background and Inline Delegation - **Background by default**: when the agent delegates, the main conversation continues immediately; the subagent works on its own. When it finishes, its report arrives in the main conversation as a completion notice. If the session is sitting idle, the arrival wakes it so the agent can act on the result without you typing anything. - **Inline when a step depends on it**: when a later step in the same turn depends on the result, the agent waits for the subagent and receives the report directly. - **Concurrent**: several subagents launched in one turn run in parallel, up to the concurrency limit (10 by default; more wait for a free slot). - **Interim messages**: if a running subagent hits a load-bearing finding or a blocker mid-task, it can surface an interim message to the main conversation and keep working. The main agent can answer with direction the same way you would (see [Following Up](#following-up) below). - **Stopping is never silent**: if you stop a subagent yourself, the main agent is told it was interrupted and returned no result; it can still be resumed later by its ID. Whether it runs in the background or inline, every subagent has an ID like `task-2` that appears with its report and is used for follow-up work. ## The Agent Switcher Once the session has at least one subagent, the agent switcher appears below the composer (one row per agent, starting with **main**). Each row shows a colored status dot, the agent's name, its custom agent type (when it has one), and a live activity line such as the file it is reading or `Done (...)`. The footer hints `↓ for agents`. Press at the composer (past any input history; on a multi-line draft, with the cursor on the last line) to move the selection into the switcher. Your draft is preserved. | Key | Action | | --- | --- | | / | Move the selection; moving up past the top row returns to the composer | | Enter | View the selected agent's window (arrows keep working, so you can step through agents) | | Esc | Leave the switcher and return to the composer | | x | Stop the selected running agent, or dismiss a finished agent's row | | Ctrl+X | Stop every agent and clear the switcher | Typing any other key returns you to the composer and is handled normally. ### Viewing and Prompting a Subagent Selecting an agent with Enter switches you into its window: its full transcript, with its own composer. Each window keeps its own half-typed draft, so switching around never loses what you were writing. You can prompt a subagent directly from its window, including after it has finished its task, which resumes it with its conversation intact. Press Esc while viewing a running subagent to stop it. ### Task Blocks in the Transcript In the main transcript, each delegation renders as a task block titled `Task(description)` (or the agent type's name for custom agents) with a colored dot matching the agent's switcher row. Collapsed (the default), a block shows a spinner and the latest action while running, then a one-line `Done (...)` summary: Done (12 tool uses · 38.2K tokens) Press Ctrl+O to expand it into the full step-by-step activity feed, and again to collapse it (clicking the block also works when mouse clicks are enabled in `/settings`). The moment a background subagent's report reaches the conversation is also marked in the transcript, so you can see exactly when the main agent learned the result. ### Permission Prompts from Subagents When a subagent needs approval for a permission-gated command, the prompt appears in your session and names which agent is asking. Approvals you grant this way apply to that subagent only. Changing the session's permission mode while subagents are running applies to them immediately, in both directions. A custom agent definition can narrow a subagent's permissions but never widen them; see [Permission Clamping](/docs/ai/code/custom-agents#permission-clamping-for-definition-authors). ## Following Up Every subagent report includes the subagent's ID (for example `task-3`). The main agent can send follow-up work to that ID, and the subagent picks it up with its full context retained, so there is no need to re-explain the task. Just ask: "have the same agent also update the tests." If the subagent is still working, the follow-up is delivered mid-task as a course correction instead, and the original task continues with the new direction applied. Follow-ups do not count against the per-session subagent budget, and they survive restarts: see [Persistence and Resume](#persistence-and-resume). ## Forking the Conversation `/fork ` spawns a background subagent seeded with your conversation's **full history** (everything discussed so far) and sets it to work on the task. Use it for side-work that needs all the context you have built up, without derailing the main thread: ```text /fork write up the migration plan we just discussed as a design doc ``` - The current conversation is unaffected; the fork runs in the background in the same working tree. - Check on it with like any other subagent; its result lands back in the main conversation, and you can follow up by its ID. - `/fork` works from the main session only, and a fork cannot fork again. - A fork always stays on the session's model, even when a subagent default model is set. ## Models for Subagents By default a subagent inherits the session's model. You can point delegated work at a different model (for example a cheaper, faster model for mechanical tasks) at several levels, where later ones win: 1. **The session's model**: the baseline every subagent inherits. 2. **The subagent default**: set via `/settings` → **Subagent model** (it shows `(inherit session)` when unset) or the `subagentModel` key in `settings.json`. Applies to all delegated tasks. 3. **The agent definition's `model:` key**: a [custom agent type](/docs/ai/code/custom-agents) can name its own model. 4. **A per-delegation choice**: the agent can pick a model for one specific delegation ("use the small model for this"); that choice sticks for follow-ups to the same subagent. Two exceptions: forks always keep the session's model, and changing the subagent default never changes the session's own model. See [Models & Allocations](/docs/ai/code/models). ## Persistence and Resume Subagents persist with their session: - **Stored beside the parent session**: subagent transcripts live under their parent session's storage, never as standalone sessions, so they do not appear in the session picker. - **Revived on resume**: `pw code -r ` brings every persisted subagent back as an idle agent in the switcher, with its conversation intact. You can view it, prompt it, and the main agent can send it follow-up work by its old ID. - **Hibernated when finished**: a finished background subagent releases its conversation from memory until you view or prompt it, so sessions with many subagents stay light. - **Swept with the session**: if you have enabled the session retention sweep (`sessionRetentionDays`), it deletes a session's subagent transcripts along with the session. See [Sessions & Resume](/docs/ai/code/sessions). - **Dirty worktrees survive**: an isolated worktree holding uncommitted changes or new commits is kept, and resuming the session re-adopts the subagent inside it; see [Worktree Isolation](/docs/ai/code/custom-agents#worktree-isolation). :::note /clear starts fresh `/clear` stops every subagent, forgets them all, and resets the per-session subagent budget. A cleared conversation never receives a stale completion from a subagent it no longer knows about. ::: ## Non-Interactive Mode In a one-shot run (`pw code -p`), there is no later turn to deliver a background result into, so every delegation runs inline: the agent waits for each subagent, and no work is lost when the process exits. For the stderr progress format and the usage roll-up, see [Subagents in One-Shot Runs](/docs/ai/code/non-interactive#subagents-in-one-shot-runs). ## Limits and Controls | Control | Default | Where | | --- | --- | --- | | Subagents on/off | on | `/settings` → **Subagents**, or `disableSubagents` in `settings.json`. Turning them off removes the delegation capability entirely | | Concurrency | 10 at a time | `/settings` → **Subagent concurrency**, or `subagentConcurrency` (0 = default). Extra delegations wait for a free slot; changes apply live | | Per-session budget | 200 subagents | Fixed. Once reached, the agent is told to finish the remaining work itself; `/clear` resets the budget | | Nesting | off | `/settings` → **Subagent nesting depth**, or `subagentDepth`. `0`/`1` = subagents cannot spawn their own subagents; higher values allow deeper delegation, and nested subagents still appear in the same switcher | Example `settings.json` excerpt: ```json { "subagentModel": "owner:provider-name/small-model", "subagentConcurrency": 6, "subagentDepth": 1, "disableSubagents": false } ``` See [Settings](/docs/ai/code/settings) for where settings files live. ## Related Documentation - [pw code Overview](/docs/ai/code): Feature overview and quick start - [Custom Agents](/docs/ai/code/custom-agents): Define reusable agent types with their own tools, model, and prompt - [Permissions](/docs/ai/code/permissions): Permission modes and approvals - [Sessions & Resume](/docs/ai/code/sessions): Session storage, the picker, and retention - [Settings](/docs/ai/code/settings): The `/settings` menu and `settings.json` - [Non-Interactive Mode](/docs/ai/code/non-interactive): One-shot runs with -p # Troubleshooting > Source: https://parallelworks.com/docs/ai/code/troubleshooting # Troubleshooting Solutions to common issues when working with `pw code`. For problems with the web chat interface, see [Chat troubleshooting](/docs/ai/chat/troubleshooting). ## pw code Is Not Recognized or Lacks a Feature **Symptom:** The `pw code` command is missing, or a feature described in these docs does not exist in your install. **Cause:** The CLI is not installed or is outdated. **Solution:** Check your version with `pw --version` (or `/version` inside a session) and update to the latest release. See the [CLI documentation](/docs/cli). ## No Models Available **Symptom:** The model picker is empty, or `pw code` reports that no models are available. **Cause:** No AI provider is configured for your account, or none is shared with you. **Solution:** - Run `pw ai models ls` to see the models you can use, and `pw ai providers ls` to see your providers. - If both are empty, configure a provider or ask your administrator for access. See [AI Providers](/docs/ai/ai-providers). - Verify you are authenticated: run `pw auth` and paste your credential when prompted. ## "An allocation is required for org provider models" **Symptom:** Starting with an `org:` model fails with an allocation error, or a one-shot run exits immediately with this message. **Cause:** Organization provider models draw from a budget allocation, and none is set. **Solution:** - In an interactive session, `pw code` prompts you to pick from the allocations you may use; you can also run `/allocation` at any time. - In [non-interactive runs](/docs/ai/code/non-interactive) there is no picker: pass `--allocation `. - If no allocations are listed, ask your organization admin for access. See [Models & Allocations](/docs/ai/code/models). ## Invalid Model Format **Symptom:** `pw code ` rejects the model ID. **Cause:** Model IDs must have the form `owner:provider-name/model-name` and always contain a `/`. **Solution:** Run `pw ai models ls` and copy the ID exactly, for example `Jake.Thayne:openai/gpt-5.2` or `org:openai/gpt-5.2`. See [Models & Allocations](/docs/ai/code/models). ## Authentication Expired Mid-Session **Symptom:** Requests start failing with authentication errors partway through a session. **Cause:** Your token or API key expired while the session was open. **Solution:** Run `/auth` inside the session to re-authenticate without losing your conversation. Credentials are entered at a secure prompt. Never paste them into the chat itself. ## The Agent Will Not Edit Files **Symptom:** Every edit is denied, or the agent only reads and plans. **Cause:** The session is in a restrictive [permission mode](/docs/ai/code/permissions): `read-only` denies edits, and `plan` allows edits only to plan documents. **Solution:** Check the mode in the status line and press Shift+Tab to cycle to `accept-edits`, or restart with `--permission-mode accept-edits`. Mode changes made with Shift+Tab persist as your default. ## Shell Commands Prompt Every Time **Symptom:** The agent stops for approval on the same command over and over. **Cause:** Approvals are per command; nothing is remembered unless you add an allow rule. **Solution:** - Add a rule from inside the session: `/permissions add Bash(git status:*)`. Rules added this way persist across sessions. - Note that every part of a compound command must be covered by a rule, and commands containing `$(...)` or backticks are never auto-approved. See [Permissions](/docs/ai/code/permissions). ## Scripted Runs Fail on Approvals **Symptom:** A `-p` run reports that commands were denied, or does less than expected. **Cause:** One-shot runs cannot prompt, so any action that would need approval fails closed. **Solution:** Pre-approve what the run needs with `--allowedTools` or `--add-dir`, or choose a mode that fits the job: `read-only` for analysis, `bypass-permissions` only in disposable environments. See [Non-Interactive Mode](/docs/ai/code/non-interactive). ## "Turn stopped: per-turn token budget reached" **Symptom:** A turn ends with this message in the transcript. **Cause:** The `maxTurnTokens` setting caps how many tokens a single turn may consume. **Solution:** The session continues: send the next message to pick up where the turn stopped, or raise or unset `maxTurnTokens`. See [Usage & Costs](/docs/ai/code/usage-and-costs). ## The Agent Seems to Forget Earlier Context **Symptom:** The agent stops referencing details from earlier in a long session. **Cause:** When the live context reaches the compaction threshold, older messages are replaced with a summary. **Solution:** This is expected in long sessions. Re-state the constraints that matter, keep them in [project instructions](/docs/ai/code/project-instructions) so they survive compaction, or raise the threshold with the `compactAt` setting. See [Usage & Costs](/docs/ai/code/usage-and-costs). ## A Session Is Missing from the Picker **Symptom:** `pw code --resume` does not list a session you expect. **Cause:** The picker defaults to sessions from the current directory; sessions in which you never sent a message are not saved; and sessions may have been swept if you enabled retention. **Solution:** - Switch **Scope** to **All** in the picker to see every saved session. - Sessions are kept forever unless you set `sessionRetentionDays` to a positive number, in which case sessions untouched for that many days are deleted at startup. See [Sessions & Resume](/docs/ai/code/sessions). ## Sessions Do Not Appear in the Web Chat List **Symptom:** Sessions from `pw code` are not visible in the Chat interface. **Cause:** This is expected: `pw code` sessions are stored locally on your machine and are never uploaded to your account. **Solution:** Resume local sessions with `pw code -r`. Chats saved to your account are separate; manage them with `pw ai chats`. See the [pw code overview](/docs/ai/code). ## The Agent Never Delegates to Subagents **Symptom:** Asking the agent to parallelize or delegate does nothing, and the agent switcher never appears. **Cause:** Subagents are disabled, or the session hit its per-session subagent budget. **Solution:** - Check that the **Subagents** row in `/settings` is enabled (the `disableSubagents` setting). - A session may spawn at most 200 subagents; once reached, the agent finishes work itself. `/clear` resets the budget along with the conversation. See [Subagents](/docs/ai/code/subagents). ## A Subagent's Changes Are Not in My Files **Symptom:** A subagent reports completed edits, but your working tree is unchanged. **Cause:** Custom agents with worktree isolation run in a temporary git worktree, a separate checkout of the repository. **Solution:** The subagent's report names the worktree path; fetch or merge its work from there. See [Worktree Isolation](/docs/ai/code/custom-agents#worktree-isolation). ## An MCP Server's Tools Are Missing **Symptom:** A configured MCP server never connects, or its tools are not offered to the agent. **Cause:** The server failed to start or connect, or its configuration is shadowed by a higher-precedence file. **Solution:** - Run `/mcp` to see each server's status and `pw code mcp list` to see which config file is active. An `mcpServers` map in a higher-precedence file replaces the whole map below it. - Slow servers (for example, ones that download packages on first run) may need a longer timeout: set a per-server `timeout` or the `MCP_TIMEOUT` environment variable. - A stdio server must keep stdout clean for the protocol and log to stderr only. See [MCP Servers](/docs/ai/code/mcp). ## Workspace Settings or Commands Are Not Applying **Symptom:** A workspace's `.agents` settings, MCP servers, custom commands, or agent definitions have no effect. **Cause:** Workspace configuration only applies after you approve it, and unapproved files are ignored. Non-interactive runs never prompt for approval. **Solution:** Launch `pw code` interactively in that workspace and answer the approval prompt; the approval is remembered until the files change. See [Workspace Trust](/docs/ai/code/settings#workspace-trust). ## Images Will Not Paste **Symptom:** Ctrl+V does not attach a clipboard image, especially over SSH. **Cause:** Inside an SSH session your local clipboard is not reachable by the remote `pw code` process. **Solution:** Copy the file to the remote machine (for example with `scp`) and attach it by path with `@~/screenshot.png` instead. See [Interface & Shortcuts](/docs/ai/code/interface). ## Getting Help If the solutions above do not resolve your issue: 1. Run `/status` in a session for a summary of the model, session, and configuration in effect. 2. Check the [pw code overview](/docs/ai/code) for prerequisites and setup. 3. Review [AI Providers](/docs/ai/ai-providers) to verify your provider configuration. ## Related Documentation - [pw code Overview](/docs/ai/code): Feature overview and quick start - [Permissions](/docs/ai/code/permissions): Permission modes and allow rules - [Models & Allocations](/docs/ai/code/models): Model IDs and budget allocations - [Sessions & Resume](/docs/ai/code/sessions): Session storage and retention - [Subagents](/docs/ai/code/subagents): Delegation, the switcher, and limits - [MCP Servers](/docs/ai/code/mcp): Server configuration and connection behavior - [Chat troubleshooting](/docs/ai/chat/troubleshooting): Issues with the web chat interface # Usage & Costs > Source: https://parallelworks.com/docs/ai/code/usage-and-costs # Usage & Costs `pw code` tracks token usage and estimated cost throughout a session, keeps long conversations within the model's context window through compaction (summarizing older messages to free context space), and lets you cap how much a single turn can consume. ## Session Usage: `/cost` and the Status Line The status line at the bottom of the interface always shows a compact summary: the **live context size** (the tokens the model currently reads each turn), the **cumulative total** for the session, and the estimated cost once it is non-trivial, for example `98.5K ctx · 1.2M total (~$1.8402)`. For the full breakdown, run `/cost`: ```text Token Usage: Input: 1.1M tokens Output: 85.3K tokens Turns: 42 Estimated cost: $1.8402 ``` Costs are estimated from the per-token rates configured on the platform for each model, priced per model, so a session that switched models is costed against the model that produced each turn. Usage from [subagents](/docs/ai/code/subagents) rolls up into the session totals as it happens, so `/cost` reflects everything the session spent, delegated work included. :::note Estimates depend on configured rates Models with no configured rate, such as custom or session-tunnel providers, contribute nothing to the estimate. A session that used such a model can show a lower cost than it actually incurred. ::: ## Provider Quotas: `/usage` Some providers report their own usage limits, most notably a connected ChatGPT/Codex subscription, which has rolling quota windows. For models from such a provider, `/usage` shows each window as a bar with its reset time: ```text Provider usage (plus plan) 5-hour limit [████████░░░░░░░░░░░░] 41.0% used Resets Jul 19, 2026 at 6:00 PM CDT Weekly limit [██░░░░░░░░░░░░░░░░░░] 12.5% used Resets Jul 23, 2026 at 9:00 AM CDT ``` `/usage` is only available when the selected model's provider reports usage information; otherwise the command is hidden from the palette and `/help`. This is the provider's own quota, separate from the platform cost estimate above. ## Context Compaction As a conversation grows, every turn sends more history to the model. When the live context reaches the compaction threshold (**100,000 input tokens** by default), `pw code` automatically compacts the conversation at the end of the turn: older messages are replaced with a model-written summary, while the system prompt and the most recent messages are kept verbatim. The conversation continues seamlessly, the `ctx` figure in the status line drops, and the compaction is recorded in the [session file](/docs/ai/code/sessions) so a later resume sees the compacted history. You can also compact manually at any time with `/compact`, which shows you the summary it produced. The threshold is configurable with the `compactAt` setting (a token count) in your [settings](/docs/ai/code/settings): ```json { "compactAt": 150000 } ``` ## Per-Turn Budget: `maxTurnTokens` The `maxTurnTokens` setting caps how many tokens (input plus output) a single turn may consume across all of its model requests. When a turn reaches the budget, it stops with a message in the transcript: ```text Turn stopped: per-turn token budget of 200000 reached. ``` The session itself continues, and you can send the next message as usual. Unset (or `0`) means no per-turn limit. This is a useful guardrail for autonomous multi-step work, where a single prompt can otherwise fan out into many tool-calling iterations. ```json { "maxTurnTokens": 200000 } ``` ## Usage in Non-Interactive Runs One-shot (non-interactive) runs report the same numbers. In text mode, the status-line summary is printed to stderr when the run completes; with `-o json`, the output object carries `usage.input_tokens`, `usage.output_tokens`, `usage.total_tokens`, and `estimated_cost`. See [Non-Interactive Mode](/docs/ai/code/non-interactive) for the full schema. Subagent usage is included in these totals; there is no per-subagent breakdown. ## Account-Level Usage The estimates above are per-session. For metered spend and token reporting across your account (including Chat, AI keys, and allocation budgets), use the [AI Usage](/docs/ai/ai-usage) dashboard under **AI** > **AI Usage** in ACTIVATE. Organization admins can also see organization-wide usage there, grouped by model, user, or allocation. ## Related Documentation - [pw code Overview](/docs/ai/code): Feature overview and quick start - [Non-Interactive Mode](/docs/ai/code/non-interactive): Usage and cost fields in JSON output - [Subagents](/docs/ai/code/subagents): How delegated work is counted - [Sessions & Resume](/docs/ai/code/sessions): Where compacted history is stored - [Settings](/docs/ai/code/settings): `compactAt`, `maxTurnTokens`, and other options - [Models & Allocations](/docs/ai/code/models): Budget allocations for organization providers - [AI Usage](/docs/ai/ai-usage): Account-level usage reporting # About the PW CLI > Source: https://parallelworks.com/docs/cli The Parallel Works command-line interface (PW CLI) offers a streamlined way to interract with your compute and storage resources from a terminal. ## Installation By default, the PW CLI is pre-installed on user workspaces, cloud clusters, and existing clusters. You can open a terminal on the ACTIVATE platform and immediately use any PW CLI command. For existing clusters, the PW CLI is installed in a folder named `pw` inside your home directory. ### Install Script (Recommended) The easiest way to install the PW CLI is with the install script, which automatically detects your operating system and architecture. This works on Linux and macOS: ```bash curl -fsSL https://activate.parallel.works/cli/install.sh | bash ``` By default, the CLI is installed to `~/.local/bin`. You can specify a custom install location with the `--to` flag: ```bash curl -fsSL https://activate.parallel.works/cli/install.sh | bash -s -- --to /usr/local/bin ``` :::info PATH Configuration If `~/.local/bin` is not already on your PATH, the installer will provide instructions for adding it. ::: ### Manual Installation If you prefer to download the binary manually, or are on Windows, follow the instructions below for your operating system and device's chip type. **Linux, AMD** ```bash mkdir -p ~/bin wget "https://activate.parallel.works/cli/pw-linux-amd64" -O ~/bin/pw ``` **Linux, ARM** ```bash mkdir -p ~/bin wget "https://activate.parallel.works/cli/pw-linux-arm64" -O ~/bin/pw ``` **macOS, Apple Silicon** ```bash mkdir -p ~/bin wget "https://activate.parallel.works/cli/pw-darwin-arm64" -O ~/bin/pw echo 'export PATH="$PATH:$HOME/bin"' >> ~/.zshrc # adjust if not using zsh ``` **macOS, Intel** ```bash mkdir -p ~/bin wget "https://activate.parallel.works/cli/pw-darwin-amd64" -O ~/bin/pw echo 'export PATH="$PATH:$HOME/bin"' >> ~/.zshrc # adjust if not using zsh ``` **Windows, AMD** ```powershell $dest = "$env:LOCALAPPDATA\Programs\pw" New-Item -ItemType Directory -Force -Path $dest curl.exe -L "https://activate.parallel.works/cli/pw-windows-amd64.exe" -o "$dest\pw.exe" [Environment]::SetEnvironmentVariable("Path", $env:Path + ";$dest", [EnvironmentVariableTarget]::User) ``` **Windows, ARM** ```powershell $dest = "$env:LOCALAPPDATA\Programs\pw" New-Item -ItemType Directory -Force -Path $dest curl.exe -L "https://activate.parallel.works/cli/pw-windows-arm64.exe" -o "$dest\pw.exe" [Environment]::SetEnvironmentVariable("Path", $env:Path + ";$dest", [EnvironmentVariableTarget]::User) ``` ## Authentication User workspaces and existing clusters are pre-authenticated. You can access the PW CLI and immediately interact with your compute and storage resources. For cloud clusters, you must first authenticate either with an API key or a token. #### API Key First, create an API key by following [these instructions](/docs/account-settings/authentication#managing-api-keys) in our user guide. Next, use the `pw auth` command by following [these instructions](/docs/cli/pw/auth), then paste your API key when prompted. #### Token First, create a token by following [these instructions](/docs/account-settings/authentication#managing-tokens) in our user guide. Next, use the `pw auth` command by following [these instructions](/docs/cli/pw/auth), then paste your token when prompted. ## Where the CLI stores files The PW CLI keeps your settings, credentials, and other per-user data in standard [XDG base directories](https://specifications.freedesktop.org/basedir-spec/latest/). The layout is identical on Linux, macOS, and Windows, so the same paths work whether you're on a laptop or a login node. | Location | Path | What's stored | | --- | --- | --- | | Config | `~/.config/pw/` | Settings and credentials | | Cache | `~/.cache/pw/` | Regenerable data such as pasted images | | State | `~/.local/state/pw/` | Session history and transcripts | ### Config directory `~/.config/pw/` holds the files you'd want to keep or back up. It is created with owner-only permissions because it contains your credentials. | File | What's stored | | --- | --- | | `settings.json` | CLI preferences, including your saved `pw code` model, allocation, and permission mode | | `credentials` | The API key or token used to authenticate. Never share or commit this file | | `code/commands/` | Your personal `pw code` slash-command definitions (one Markdown file per command) | ### Cache and state directories `~/.cache/pw/` holds regenerable data that is safe to delete, such as images you paste into `pw code`. `~/.local/state/pw/` holds your `pw code` conversation transcripts (`code-sessions/`) and per-directory prompt history (`code-history/`). ### Changing where files are stored Set the standard XDG environment variables to relocate any of the three directories: - `XDG_CONFIG_HOME` — moves the config directory (default `~/.config`) - `XDG_CACHE_HOME` — moves the cache directory (default `~/.cache`) - `XDG_STATE_HOME` — moves the state directory (default `~/.local/state`) To move only your credentials, set `PW_CREDENTIALS_DIR` to the directory that should hold the credentials file. This takes precedence over `XDG_CONFIG_HOME`. :::note Upgrading from an older CLI Earlier releases stored these files under `~/pw/` (for example `~/pw/settings.json` and `~/pw/.credentials`). The CLI moves them to the locations above automatically the first time you run it, so there's nothing you need to do. ::: ### Files written elsewhere A few commands add files to the conventional locations their tools expect, outside the `pw` directories: | Path | Written by | What's stored | | --- | --- | --- | | `~/.ssh/pwcli`, `~/.ssh/pwcli.pub` | `pw ssh`, `pw vscode` | The SSH key pair used to connect to your resources | | `~/.ssh/pw_config` (and an `Include pw_config` line in `~/.ssh/config`) | `pw vscode` | Per-resource SSH host entries | | `~/.kube/config` (or `$KUBECONFIG`) | `pw kube auth` | Cluster, credential, and context entries added through `kubectl` | When you run `pw code` inside a project, it also reads project-scoped configuration from that project's directory: `/.pw/code/settings.json`, `settings.local.json`, and any custom commands under `/.pw/code/commands/`. ## About URIs When using the CLI to interact with buckets, you will see them identified by a Uniform Resource Identifier (URI). URIs function similarly to URLs. In fact, URLs are a type of URI. URIs, however, do not have to point to a location on a network; they only serve to identify a resource. In the screenshot below, we used the PW CLI to list our buckets in a table format. Each bucket has a URI that's exclusive to the ACTIVATE platform, which takes the form of `pw://namespace/bucket`. There is also a URI that's exclusive to a bucket's CSP, such as: - `gs://google-bucket-name` - `s3://aws-bucket-name` - `https://azure-bucket-name.blob.core.windows.net/azure-bucket-name` Buckets will only display a CSP URI if they have already been provisioned. ![Screenshot of buckets listed in a terminal on the ACTIVATE platform.](/content-images/docs/cli/cli-buckets-running-table.png) _A screenshot of provisioned buckets, displayed in a terminal as a table_ # pw > Source: https://parallelworks.com/docs/cli/pw ## pw The Parallel Works ACTIVATE CLI ### Synopsis **pw** is the base for all other PW CLI commands. Run **pw** alone to check that the PW CLI is installed and to list compatible commands. ``` pw [flags] ``` ### Options ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. -h, --help help for pw --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging --version string[="release"] Print version information (release, json) ``` ### SEE ALSO * [pw ai](/docs/cli/pw/ai) - Manage AI providers, models, and chats * [pw api](/docs/cli/pw/api) - Make an authenticated request to the ACTIVATE API * [pw auth](/docs/cli/pw/auth) - Authenticate the CLI * [pw billing](/docs/cli/pw/billing) - Manage billing units, SKUs, allocations, and usage * [pw buckets](/docs/cli/pw/buckets) - Manage cloud buckets * [pw cluster](/docs/cli/pw/cluster) - Manage clusters * [pw code](/docs/cli/pw/code) - AI coding agent * [pw context](/docs/cli/pw/context) - Manage CLI contexts * [pw endpoints](/docs/cli/pw/endpoints) - Create and serve self-registering endpoint sessions * [pw environments](/docs/cli/pw/environments) - Manage compute environments * [pw forward](/docs/cli/pw/forward) - Forward remote ports to your local machine via SSH tunnels * [pw groups](/docs/cli/pw/groups) - Manage groups and their members * [pw kube](/docs/cli/pw/kube) - Kubernetes commands * [pw lustre](/docs/cli/pw/lustre) - Manage Lustre filesystems * [pw marketplace](/docs/cli/pw/marketplace) - Manage marketplace items * [pw nfs](/docs/cli/pw/nfs) - Manage NFS storages * [pw orgs](/docs/cli/pw/orgs) - Manage organizations * [pw sessions](/docs/cli/pw/sessions) - Manage sessions * [pw ssh](/docs/cli/pw/ssh) - Initiate an SSH connection to a resource * [pw ssh-public-keys](/docs/cli/pw/ssh-public-keys) - Get the SSH public keys for a user * [pw subdomains](/docs/cli/pw/subdomains) - Reserve session subdomains * [pw upgrade](/docs/cli/pw/upgrade) - Update the version of the CLI * [pw users](/docs/cli/pw/users) - Manage organization users * [pw variables](/docs/cli/pw/variables) - Manage your user variables * [pw version](/docs/cli/pw/version) - Show detailed CLI version information * [pw vscode](/docs/cli/pw/vscode) - Open VS Code connected to a remote resource * [pw workers](/docs/cli/pw/workers) - Manage compute workers * [pw workflows](/docs/cli/pw/workflows) - Manage workflows # pw ai > Source: https://parallelworks.com/docs/cli/pw/ai ## pw ai Manage AI providers, models, and chats ### Synopsis The **pw ai** command group has commands for managing AI providers, chatting with models, and viewing chats. ``` pw ai [flags] ``` ### Options ``` -h, --help help for ai ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw](/docs/cli/pw) - The Parallel Works ACTIVATE CLI * [pw ai chats](/docs/cli/pw/ai/chats) - Manage AI chats * [pw ai codex](/docs/cli/pw/ai/codex) - Manage ChatGPT/Codex subscription providers * [pw ai models](/docs/cli/pw/ai/models) - Manage AI models * [pw ai providers](/docs/cli/pw/ai/providers) - Manage AI providers # pw ai chats > Source: https://parallelworks.com/docs/cli/pw/ai/chats ## pw ai chats Manage AI chats ### Synopsis The **pw ai chats** command group has commands for listing, viewing, and deleting AI chats. ``` pw ai chats [flags] ``` ### Options ``` -h, --help help for chats ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw ai](/docs/cli/pw/ai) - Manage AI providers, models, and chats * [pw ai chats delete](/docs/cli/pw/ai/chats/delete) - Delete an AI chat * [pw ai chats get](/docs/cli/pw/ai/chats/get) - Get an AI chat * [pw ai chats ls](/docs/cli/pw/ai/chats/ls) - List AI chats # pw ai chats delete > Source: https://parallelworks.com/docs/cli/pw/ai/chats/delete ## pw ai chats delete Delete an AI chat ### Synopsis The **pw ai chats delete** command deletes a chat. ``` pw ai chats delete [flags] ``` ### Examples ``` # Delete a chat pw ai chats delete abc-123 ``` ### Options ``` -h, --help help for delete ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw ai chats](/docs/cli/pw/ai/chats) - Manage AI chats # pw ai chats get > Source: https://parallelworks.com/docs/cli/pw/ai/chats/get ## pw ai chats get Get an AI chat ### Synopsis The **pw ai chats get** command retrieves a chat and displays its messages. ``` pw ai chats get [flags] ``` ### Examples ``` # View a chat pw ai chats get abc-123 # View as JSON pw ai chats get -o json abc-123 ``` ### Options ``` -h, --help help for get -o, --output string Output format (text, json) (default "text") ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw ai chats](/docs/cli/pw/ai/chats) - Manage AI chats # pw ai chats ls > Source: https://parallelworks.com/docs/cli/pw/ai/chats/ls ## pw ai chats ls List AI chats ### Synopsis The **pw ai chats ls** command lists your AI chats. ``` pw ai chats ls [flags] ``` ### Examples ``` # List chats pw ai chats ls # List as JSON pw ai chats ls -o json # List with pagination pw ai chats ls --limit 10 --offset 20 ``` ### Options ``` -h, --help help for ls --limit int Maximum number of chats to return (default 20) --offset int Number of chats to skip -o, --output string Output format (table, json) (default "table") ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw ai chats](/docs/cli/pw/ai/chats) - Manage AI chats # pw ai codex > Source: https://parallelworks.com/docs/cli/pw/ai/codex ## pw ai codex Manage ChatGPT/Codex subscription providers ### Synopsis The **pw ai codex** command group connects one or more ChatGPT/Codex subscriptions as personal AI providers for pw code and AI chat. ``` pw ai codex [flags] ``` ### Options ``` -h, --help help for codex ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw ai](/docs/cli/pw/ai) - Manage AI providers, models, and chats * [pw ai codex connect](/docs/cli/pw/ai/codex/connect) - Connect a ChatGPT/Codex subscription as a personal AI provider # pw ai codex connect > Source: https://parallelworks.com/docs/cli/pw/ai/codex/connect ## pw ai codex connect Connect a ChatGPT/Codex subscription as a personal AI provider ### Synopsis The **pw ai codex connect** command starts a ChatGPT device-code sign-in and connects the subscription as a personal AI provider. Models become available as **me:/** and usage draws on the subscription's quota. ``` pw ai codex connect [flags] ``` ### Examples ``` # Connect a subscription as a new provider pw ai codex connect --name personal # Reconnect an existing provider without changing its identity pw ai codex connect --name personal --reconnect ``` ### Options ``` -h, --help help for connect --name string Name for the AI provider --reconnect Reconnect an existing Codex provider -y, --yes Skip the confirmation prompt ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw ai codex](/docs/cli/pw/ai/codex) - Manage ChatGPT/Codex subscription providers # pw ai models > Source: https://parallelworks.com/docs/cli/pw/ai/models ## pw ai models Manage AI models ### Synopsis The **pw ai models** command group has commands for listing available AI models. ``` pw ai models [flags] ``` ### Options ``` -h, --help help for models ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw ai](/docs/cli/pw/ai) - Manage AI providers, models, and chats * [pw ai models ls](/docs/cli/pw/ai/models/ls) - List available AI models # pw ai models ls > Source: https://parallelworks.com/docs/cli/pw/ai/models/ls ## pw ai models ls List available AI models ### Synopsis The **pw ai models ls** command lists all AI models available across all configured providers. ``` pw ai models ls [flags] ``` ### Examples ``` # List all models pw ai models ls # List as JSON pw ai models ls -o json ``` ### Options ``` -h, --help help for ls -o, --output string Output format (table, json) (default "table") ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw ai models](/docs/cli/pw/ai/models) - Manage AI models # pw ai providers > Source: https://parallelworks.com/docs/cli/pw/ai/providers ## pw ai providers Manage AI providers ### Synopsis The **pw ai providers** command group has commands for managing AI providers. ``` pw ai providers [flags] ``` ### Options ``` -h, --help help for providers ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw ai](/docs/cli/pw/ai) - Manage AI providers, models, and chats * [pw ai providers create](/docs/cli/pw/ai/providers/create) - Create an AI provider * [pw ai providers delete](/docs/cli/pw/ai/providers/delete) - Delete an AI provider * [pw ai providers get](/docs/cli/pw/ai/providers/get) - Get details of an AI provider * [pw ai providers ls](/docs/cli/pw/ai/providers/ls) - List AI providers * [pw ai providers models](/docs/cli/pw/ai/providers/models) - List models available for a provider # pw ai providers create > Source: https://parallelworks.com/docs/cli/pw/ai/providers/create ## pw ai providers create Create an AI provider ### Synopsis The **pw ai providers create** command creates a new AI provider from an enabled platform catalog entry. The platform defines the provider type, endpoint, and transport policy. For API-key providers (openai, anthropic, grok, groq, together, fireworks, mistral, deepseek, or an approved custom integration), --api-key is required. For **azure-managed** providers, --region, --group, and --network are required. ``` pw ai providers create [flags] ``` ### Examples ``` # Create a personal Grok provider pw ai providers create --name my-grok --provider grok --api-key xai-xxx # Provision a managed Azure provider pw ai providers create --name my-azure --provider azure-managed --region eastus --group my-group --network my-network ``` ### Options ``` --api-key string API key (required for API-key providers) --group string Billing group (required for azure-managed) -h, --help help for create --model string Initial model deployment (azure-managed) --name string Provider name (required) --network string Network (required for azure-managed) --provider string Catalog entry ID (required, e.g. openai, anthropic, grok, azure-managed) --region string Region (required for azure-managed) ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw ai providers](/docs/cli/pw/ai/providers) - Manage AI providers # pw ai providers delete > Source: https://parallelworks.com/docs/cli/pw/ai/providers/delete ## pw ai providers delete Delete an AI provider ### Synopsis The **pw ai providers delete** command deletes an AI provider. You can specify a provider by name (defaults to your user) or by full URI (pw://user/name). ``` pw ai providers delete [flags] ``` ### Examples ``` # Delete your own provider pw ai providers delete my-provider # Delete another user's provider pw ai providers delete pw://other-user/their-provider ``` ### Options ``` -h, --help help for delete ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw ai providers](/docs/cli/pw/ai/providers) - Manage AI providers # pw ai providers get > Source: https://parallelworks.com/docs/cli/pw/ai/providers/get ## pw ai providers get Get details of an AI provider ### Synopsis The **pw ai providers get** command retrieves details of a specific AI provider. You can specify a provider by name (defaults to your user) or by full URI (pw://user/name). ``` pw ai providers get [flags] ``` ### Examples ``` # Get your own provider pw ai providers get my-provider # Get another user's provider pw ai providers get pw://other-user/their-provider # Get as JSON pw ai providers get -o json my-provider ``` ### Options ``` -h, --help help for get -o, --output string Output format (table, json) (default "table") ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw ai providers](/docs/cli/pw/ai/providers) - Manage AI providers # pw ai providers ls > Source: https://parallelworks.com/docs/cli/pw/ai/providers/ls ## pw ai providers ls List AI providers ### Synopsis The **pw ai providers ls** command lists all AI providers configured for the current user. ``` pw ai providers ls [flags] ``` ### Examples ``` # List all providers pw ai providers ls # List as JSON pw ai providers ls -o json ``` ### Options ``` -h, --help help for ls -o, --output string Output format (table, json) (default "table") ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw ai providers](/docs/cli/pw/ai/providers) - Manage AI providers # pw ai providers models > Source: https://parallelworks.com/docs/cli/pw/ai/providers/models ## pw ai providers models List models available for a provider ### Synopsis The **pw ai providers models** command lists the models available for a specific AI provider. You can specify a provider by name (defaults to your user) or by full URI (pw://user/name). ``` pw ai providers models [flags] ``` ### Examples ``` # List models for your own provider pw ai providers models my-provider # List models for another user's provider pw ai providers models pw://other-user/their-provider ``` ### Options ``` -h, --help help for models ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw ai providers](/docs/cli/pw/ai/providers) - Manage AI providers # pw api > Source: https://parallelworks.com/docs/cli/pw/api ## pw api Make an authenticated request to the ACTIVATE API ### Synopsis Make an authenticated HTTP request to the ACTIVATE API and print the response. **pw api** is an escape hatch for endpoints the CLI doesn't wrap, for poking at new routes, or for scripting against the raw API. It uses your current context's credentials and platform host (honoring **--context**, **--platform-host**, and **PW_API_KEY**), so no manual auth is needed. Endpoints resolve under the API base, so **workflows** and **/api/workflows** are equivalent. The method defaults to GET, or POST when a body is supplied. Pass parameters with **-F**/**-f**: for GET they become query-string parameters, otherwise a JSON request body. Note: with **-i/--include**, response headers are shown for successful (2xx) responses; on an HTTP error the response body is still printed and the exit code is non-zero. ``` pw api [flags] ``` ### Examples ``` # GET a list endpoint (paths resolve under /api) pw api workflows # Filter the response with jq pw api -q '.[].name' workflows # Fetch all pages of a list endpoint pw api --paginate users # POST with a typed JSON body (method defaults to POST) pw api -X POST -F name=demo -F enabled=true -F count=3 some/route # Send a raw body from stdin echo '{"name":"demo"}' | pw api -X POST --input - some/route # Include response status and headers pw api -i workflows # Override or add a request header pw api -H "X-Custom: value" workflows ``` ### Options ``` -F, --field stringArray Add a typed parameter in key=value format (repeatable) -H, --header stringArray Add a request header in 'Key: Value' format (repeatable) -h, --help help for api -i, --include Include the HTTP response status line and headers in the output --input string File to read the request body from (use '-' for stdin) -q, --jq string Filter the JSON response using a jq expression -X, --method string HTTP method for the request (default "GET") --paginate Make additional requests to fetch all pages of results -f, --raw-field stringArray Add a string parameter in key=value format (repeatable) --silent Do not print the response body -v, --verbose Print the HTTP request and the response status and headers (to stderr) ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. ``` ### SEE ALSO * [pw](/docs/cli/pw) - The Parallel Works ACTIVATE CLI # pw auth > Source: https://parallelworks.com/docs/cli/pw/auth ## pw auth Authenticate the CLI ### Synopsis The **pw auth** command grants authorization to the PW CLI using either an API key or a short-term token. After you enter **pw auth**, the CLI will prompt you to paste your credential on a new line. On ACTIVATE, the PW CLI is pre-authenticated for user workspaces and existing clusters. You only have to authenticate if you're accessing a cloud cluster or running the PW CLI locally. Use **--context-name** to specify a custom name for the context. This is useful if you want multiple contexts for the same user/server combination. For more information about this process, please see [Authentication](/docs/cli#authentication). ``` pw auth [flags] ``` ### Options ``` --context-name string Name for the context (defaults to user@server) -h, --help help for auth ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw](/docs/cli/pw) - The Parallel Works ACTIVATE CLI * [pw auth identify-platform](/docs/cli/pw/auth/identify-platform) - Print effective platform host * [pw auth whoami](/docs/cli/pw/auth/whoami) - Print effective user # pw auth identify-platform > Source: https://parallelworks.com/docs/cli/pw/auth/identify-platform ## pw auth identify-platform Print effective platform host ### Synopsis Use **pw auth identify-platform** to verify which platform CLI commands will be executed against. Prints the currently targeted platform host. ``` pw auth identify-platform [flags] ``` ### Options ``` -h, --help help for identify-platform ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw auth](/docs/cli/pw/auth) - Authenticate the CLI # pw auth whoami > Source: https://parallelworks.com/docs/cli/pw/auth/whoami ## pw auth whoami Print effective user ### Synopsis Use **pw auth whoami** to verify your authentication. Prints the currently authenticated identity. Typically, this will be the username of the account used to authenticate. However, it can also be other values, such as `cluster-session:demo/democluster/1`. ``` pw auth whoami [flags] ``` ### Options ``` -h, --help help for whoami ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw auth](/docs/cli/pw/auth) - Authenticate the CLI # pw billing > Source: https://parallelworks.com/docs/cli/pw/billing ## pw billing Manage billing units, SKUs, allocations, and usage ``` pw billing [flags] ``` ### Options ``` -h, --help help for billing ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw](/docs/cli/pw) - The Parallel Works ACTIVATE CLI * [pw billing allocations](/docs/cli/pw/billing/allocations) - Manage allocations and their usage * [pw billing skus](/docs/cli/pw/billing/skus) - Manage SKUs and their rate multipliers within a unit * [pw billing units](/docs/cli/pw/billing/units) - Manage billing units and their pricing rules # pw billing allocations > Source: https://parallelworks.com/docs/cli/pw/billing/allocations ## pw billing allocations Manage allocations and their usage ``` pw billing allocations [flags] ``` ### Options ``` -h, --help help for allocations ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw billing](/docs/cli/pw/billing) - Manage billing units, SKUs, allocations, and usage * [pw billing allocations create](/docs/cli/pw/billing/allocations/create) - Create an allocation under a unit * [pw billing allocations get](/docs/cli/pw/billing/allocations/get) - Show a single allocation * [pw billing allocations ls](/docs/cli/pw/billing/allocations/ls) - List allocations in the org * [pw billing allocations permissions](/docs/cli/pw/billing/allocations/permissions) - Manage allocation access for groups and the organization * [pw billing allocations report](/docs/cli/pw/billing/allocations/report) - Daily usage summary for an allocation (returns JSON) * [pw billing allocations rm](/docs/cli/pw/billing/allocations/rm) - Delete an allocation * [pw billing allocations update](/docs/cli/pw/billing/allocations/update) - Update an allocation's total budget * [pw billing allocations usage](/docs/cli/pw/billing/allocations/usage) - Post and list usage events for an allocation # pw billing allocations create > Source: https://parallelworks.com/docs/cli/pw/billing/allocations/create ## pw billing allocations create Create an allocation under a unit ``` pw billing allocations create [flags] ``` ### Examples ``` # A $10k budget denominated in the core-hours unit pw billing allocations create --total 10000 --unit core-hours research-team # A child allocation under a parent pw billing allocations create --total 2000 --unit core-hours --parent research-team gpu-subteam ``` ### Options ``` -h, --help help for create --org string Target organization (defaults to current context) -o, --output string Output format (table, json) (default "table") --parent string Optional parent allocation name --total float Total budget for the allocation --unit string Unit this allocation is denominated in ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw billing allocations](/docs/cli/pw/billing/allocations) - Manage allocations and their usage # pw billing allocations get > Source: https://parallelworks.com/docs/cli/pw/billing/allocations/get ## pw billing allocations get Show a single allocation ``` pw billing allocations get [flags] ``` ### Examples ``` pw billing allocations get -o json research-team ``` ### Options ``` -h, --help help for get --org string Target organization (defaults to current context) -o, --output string Output format (table, json) (default "table") ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw billing allocations](/docs/cli/pw/billing/allocations) - Manage allocations and their usage # pw billing allocations ls > Source: https://parallelworks.com/docs/cli/pw/billing/allocations/ls ## pw billing allocations ls List allocations in the org ``` pw billing allocations ls [flags] ``` ### Examples ``` pw billing allocations ls pw billing allocations ls -o json ``` ### Options ``` -h, --help help for ls --org string Target organization (defaults to current context) -o, --output string Output format (table, json) (default "table") ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw billing allocations](/docs/cli/pw/billing/allocations) - Manage allocations and their usage # pw billing allocations permissions > Source: https://parallelworks.com/docs/cli/pw/billing/allocations/permissions ## pw billing allocations permissions Manage allocation access for groups and the organization ``` pw billing allocations permissions [flags] ``` ### Options ``` -h, --help help for permissions ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw billing allocations](/docs/cli/pw/billing/allocations) - Manage allocations and their usage * [pw billing allocations permissions grant](/docs/cli/pw/billing/allocations/permissions/grant) - Grant allocation access to a group or the whole organization * [pw billing allocations permissions ls](/docs/cli/pw/billing/allocations/permissions/ls) - Show who can access this allocation * [pw billing allocations permissions revoke](/docs/cli/pw/billing/allocations/permissions/revoke) - Revoke allocation access from a group or the whole organization # pw billing allocations permissions grant > Source: https://parallelworks.com/docs/cli/pw/billing/allocations/permissions/grant ## pw billing allocations permissions grant Grant allocation access to a group or the whole organization ``` pw billing allocations permissions grant [flags] ``` ### Examples ``` # Grant a group the admin permission pw ... permissions grant --group data-scientists --admin # Grant the entire organization read access pw ... permissions grant --org-wide --read ``` ### Options ``` --admin Target the allocation:admin permission --group string Apply to a specific group -h, --help help for grant --org string Target organization (defaults to current context) --org-wide Apply to the entire organization --read Target the allocation:read permission --use Target the allocation:use permission ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw billing allocations permissions](/docs/cli/pw/billing/allocations/permissions) - Manage allocation access for groups and the organization # pw billing allocations permissions ls > Source: https://parallelworks.com/docs/cli/pw/billing/allocations/permissions/ls ## pw billing allocations permissions ls Show who can access this allocation ``` pw billing allocations permissions ls [flags] ``` ### Examples ``` pw ... permissions ls pw ... permissions ls -o json ``` ### Options ``` -h, --help help for ls --org string Target organization (defaults to current context) -o, --output string Output format (table, json) (default "table") ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw billing allocations permissions](/docs/cli/pw/billing/allocations/permissions) - Manage allocation access for groups and the organization # pw billing allocations permissions revoke > Source: https://parallelworks.com/docs/cli/pw/billing/allocations/permissions/revoke ## pw billing allocations permissions revoke Revoke allocation access from a group or the whole organization ``` pw billing allocations permissions revoke [flags] ``` ### Examples ``` # Revoke a single permission from a group pw ... permissions revoke --group data-scientists --admin # Revoke all of a group's access pw ... permissions revoke --group data-scientists ``` ### Options ``` --admin Target the allocation:admin permission --group string Apply to a specific group -h, --help help for revoke --org string Target organization (defaults to current context) --org-wide Apply to the entire organization --read Target the allocation:read permission --use Target the allocation:use permission ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw billing allocations permissions](/docs/cli/pw/billing/allocations/permissions) - Manage allocation access for groups and the organization # pw billing allocations report > Source: https://parallelworks.com/docs/cli/pw/billing/allocations/report ## pw billing allocations report Daily usage summary for an allocation (returns JSON) ``` pw billing allocations report [flags] ``` ### Examples ``` # Daily usage in June, grouped by SKU subtype pw billing allocations report --start 2026-06-01 --end 2026-06-30 --group-by subtype research-team ``` ### Options ``` --end string End date (YYYY-MM-DD, defaults to today) --group-by string Group by (type, subtype, user, sku) -h, --help help for report --org string Target organization (defaults to current context) --start string Start date (YYYY-MM-DD) ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw billing allocations](/docs/cli/pw/billing/allocations) - Manage allocations and their usage # pw billing allocations rm > Source: https://parallelworks.com/docs/cli/pw/billing/allocations/rm ## pw billing allocations rm Delete an allocation ``` pw billing allocations rm [flags] ``` ### Examples ``` pw billing allocations rm research-team ``` ### Options ``` -h, --help help for rm --org string Target organization (defaults to current context) ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw billing allocations](/docs/cli/pw/billing/allocations) - Manage allocations and their usage # pw billing allocations update > Source: https://parallelworks.com/docs/cli/pw/billing/allocations/update ## pw billing allocations update Update an allocation's total budget ``` pw billing allocations update [flags] ``` ### Examples ``` pw billing allocations update --total 15000 research-team ``` ### Options ``` -h, --help help for update --org string Target organization (defaults to current context) -o, --output string Output format (table, json) (default "table") --total float New total budget ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw billing allocations](/docs/cli/pw/billing/allocations) - Manage allocations and their usage # pw billing allocations usage > Source: https://parallelworks.com/docs/cli/pw/billing/allocations/usage ## pw billing allocations usage Post and list usage events for an allocation ``` pw billing allocations usage [flags] ``` ### Options ``` -h, --help help for usage ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw billing allocations](/docs/cli/pw/billing/allocations) - Manage allocations and their usage * [pw billing allocations usage ls](/docs/cli/pw/billing/allocations/usage/ls) - List rated usage for an allocation * [pw billing allocations usage post](/docs/cli/pw/billing/allocations/usage/post) - Record a usage event against an allocation # pw billing allocations usage ls > Source: https://parallelworks.com/docs/cli/pw/billing/allocations/usage/ls ## pw billing allocations usage ls List rated usage for an allocation ``` pw billing allocations usage ls [flags] ``` ### Examples ``` pw billing allocations usage ls research-team pw billing allocations usage ls -o json research-team ``` ### Options ``` -h, --help help for ls --org string Target organization (defaults to current context) -o, --output string Output format (table, json) (default "table") --page-size int Maximum rows to return (default 50) ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw billing allocations usage](/docs/cli/pw/billing/allocations/usage) - Post and list usage events for an allocation # pw billing allocations usage post > Source: https://parallelworks.com/docs/cli/pw/billing/allocations/usage/post ## pw billing allocations usage post Record a usage event against an allocation ``` pw billing allocations usage post [flags] ``` ### Examples ``` # 64 core-hours of CPU usage in a time window pw billing allocations usage post --sku SLURM_CPU_HOUR --quantity 64 \ --start 2026-06-23T10:00:00Z --end 2026-06-23T14:00:00Z \ --metadata jobId=12345 --metadata cluster=hpc1 research-team ``` ### Options ``` --end string End time (RFC3339) -h, --help help for post --metadata stringArray Repeatable key=value metadata --org string Target organization (defaults to current context) -o, --output string Output format (table, json) (default "table") --quantity float Quantity of usage --sku string SKU code to attribute usage to --start string Start time (RFC3339, e.g. 2026-06-23T10:00:00Z) --user string Attribute usage to this user (org admins only) ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw billing allocations usage](/docs/cli/pw/billing/allocations/usage) - Post and list usage events for an allocation # pw billing skus > Source: https://parallelworks.com/docs/cli/pw/billing/skus ## pw billing skus Manage SKUs and their rate multipliers within a unit ``` pw billing skus [flags] ``` ### Options ``` -h, --help help for skus ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw billing](/docs/cli/pw/billing) - Manage billing units, SKUs, allocations, and usage * [pw billing skus create](/docs/cli/pw/billing/skus/create) - Create a SKU in a unit * [pw billing skus get](/docs/cli/pw/billing/skus/get) - Show a single SKU (including archived) * [pw billing skus ls](/docs/cli/pw/billing/skus/ls) - List SKUs in a unit * [pw billing skus restore](/docs/cli/pw/billing/skus/restore) - Restore an archived SKU * [pw billing skus rm](/docs/cli/pw/billing/skus/rm) - Archive a SKU (soft delete) * [pw billing skus rules](/docs/cli/pw/billing/skus/rules) - Manage a SKU's rate history * [pw billing skus update](/docs/cli/pw/billing/skus/update) - Update mutable fields of a SKU # pw billing skus create > Source: https://parallelworks.com/docs/cli/pw/billing/skus/create ## pw billing skus create Create a SKU in a unit ``` pw billing skus create [flags] ``` ### Examples ``` # A standard CPU core-hour SKU (rate 1) pw billing skus create --code SLURM_CPU_HOUR --name "CPU Hour" --type Compute --subtype NodeHour core-hours # A GPU SKU that bills 3x per core-hour pw billing skus create --code SLURM_GPU_HOUR --name "GPU Hour" --type Compute --subtype NodeHour --rate 3 core-hours ``` ### Options ``` --code string SKU code (e.g. SLURM_CPU_HOUR) --description string Optional description -h, --help help for create --name string Display name --org string Target organization (defaults to current context) -o, --output string Output format (table, json) (default "table") --rate float Initial SKU rate (units consumed per unit of usage quantity) (default 1) --subtype string SKU subtype (e.g. NodeHour) --type string SKU type (e.g. Compute) ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw billing skus](/docs/cli/pw/billing/skus) - Manage SKUs and their rate multipliers within a unit # pw billing skus get > Source: https://parallelworks.com/docs/cli/pw/billing/skus/get ## pw billing skus get Show a single SKU (including archived) ``` pw billing skus get [flags] ``` ### Examples ``` pw billing skus get -o json core-hours ``` ### Options ``` -h, --help help for get --org string Target organization (defaults to current context) -o, --output string Output format (table, json) (default "table") ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw billing skus](/docs/cli/pw/billing/skus) - Manage SKUs and their rate multipliers within a unit # pw billing skus ls > Source: https://parallelworks.com/docs/cli/pw/billing/skus/ls ## pw billing skus ls List SKUs in a unit ``` pw billing skus ls [flags] ``` ### Examples ``` # List live SKUs in a unit pw billing skus ls core-hours # Include archived SKUs pw billing skus ls --include-archived core-hours ``` ### Options ``` -h, --help help for ls --include-archived Include archived (soft-deleted) SKUs --org string Target organization (defaults to current context) -o, --output string Output format (table, json) (default "table") ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw billing skus](/docs/cli/pw/billing/skus) - Manage SKUs and their rate multipliers within a unit # pw billing skus restore > Source: https://parallelworks.com/docs/cli/pw/billing/skus/restore ## pw billing skus restore Restore an archived SKU ``` pw billing skus restore [flags] ``` ### Examples ``` pw billing skus restore core-hours ``` ### Options ``` -h, --help help for restore --org string Target organization (defaults to current context) -o, --output string Output format (table, json) (default "table") ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw billing skus](/docs/cli/pw/billing/skus) - Manage SKUs and their rate multipliers within a unit # pw billing skus rm > Source: https://parallelworks.com/docs/cli/pw/billing/skus/rm ## pw billing skus rm Archive a SKU (soft delete) ``` pw billing skus rm [flags] ``` ### Examples ``` pw billing skus rm core-hours ``` ### Options ``` -h, --help help for rm --org string Target organization (defaults to current context) ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw billing skus](/docs/cli/pw/billing/skus) - Manage SKUs and their rate multipliers within a unit # pw billing skus rules > Source: https://parallelworks.com/docs/cli/pw/billing/skus/rules ## pw billing skus rules Manage a SKU's rate history ``` pw billing skus rules [flags] ``` ### Options ``` -h, --help help for rules ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw billing skus](/docs/cli/pw/billing/skus) - Manage SKUs and their rate multipliers within a unit * [pw billing skus rules add](/docs/cli/pw/billing/skus/rules/add) - Add a new rate multiplier for a SKU, effective now * [pw billing skus rules ls](/docs/cli/pw/billing/skus/rules/ls) - List a SKU's rate history # pw billing skus rules add > Source: https://parallelworks.com/docs/cli/pw/billing/skus/rules/add ## pw billing skus rules add Add a new rate multiplier for a SKU, effective now ``` pw billing skus rules add [flags] ``` ### Examples ``` # Make this SKU bill 3 units per quantity going forward pw billing skus rules add --rate 3 core-hours ``` ### Options ``` -h, --help help for add --org string Target organization (defaults to current context) -o, --output string Output format (table, json) (default "table") --rate float Units consumed per unit of usage quantity ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw billing skus rules](/docs/cli/pw/billing/skus/rules) - Manage a SKU's rate history # pw billing skus rules ls > Source: https://parallelworks.com/docs/cli/pw/billing/skus/rules/ls ## pw billing skus rules ls List a SKU's rate history ``` pw billing skus rules ls [flags] ``` ### Examples ``` pw billing skus rules ls core-hours ``` ### Options ``` -h, --help help for ls --org string Target organization (defaults to current context) -o, --output string Output format (table, json) (default "table") ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw billing skus rules](/docs/cli/pw/billing/skus/rules) - Manage a SKU's rate history # pw billing skus update > Source: https://parallelworks.com/docs/cli/pw/billing/skus/update ## pw billing skus update Update mutable fields of a SKU ``` pw billing skus update [flags] ``` ### Examples ``` # Fix a typo'd code pw billing skus update --code SLURM_GPU_HOUR core-hours # Rename and recategorize (type/subtype changes affect only future billing) pw billing skus update --name "GPU Node Hour" --subtype GpuHour core-hours ``` ### Options ``` --code string New SKU code --description string New description -h, --help help for update --name string New display name --org string Target organization (defaults to current context) -o, --output string Output format (table, json) (default "table") --subtype string New SKU subtype --type string New SKU type ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw billing skus](/docs/cli/pw/billing/skus) - Manage SKUs and their rate multipliers within a unit # pw billing units > Source: https://parallelworks.com/docs/cli/pw/billing/units ## pw billing units Manage billing units and their pricing rules ``` pw billing units [flags] ``` ### Options ``` -h, --help help for units ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw billing](/docs/cli/pw/billing) - Manage billing units, SKUs, allocations, and usage * [pw billing units create](/docs/cli/pw/billing/units/create) - Create a billing unit * [pw billing units get](/docs/cli/pw/billing/units/get) - Show a unit and its pricing rule history * [pw billing units ls](/docs/cli/pw/billing/units/ls) - List billing units * [pw billing units rm](/docs/cli/pw/billing/units/rm) - Delete a billing unit and all its SKUs, rules, and history * [pw billing units rules](/docs/cli/pw/billing/units/rules) - Manage unit pricing rules # pw billing units create > Source: https://parallelworks.com/docs/cli/pw/billing/units/create ## pw billing units create Create a billing unit ``` pw billing units create [flags] ``` ### Examples ``` # A dollar-denominated unit at $0.01 per unit pw billing units create --cost-per-unit 0.01 core-hours # A non-dollar consumption unit (no USD rate; usage is measured in raw # SKU-weighted quantities, e.g. "premium requests") pw billing units create --rated-in-usd=false premium-requests ``` ### Options ``` --cost-per-unit float USD per unit (only used when --rated-in-usd) (default 1) -h, --help help for create --org string Target organization (defaults to current context) -o, --output string Output format (table, json) (default "table") --rated-in-usd Rate usage into USD via the unit's price; set false for a consumption unit measured in raw SKU-weighted quantities (default true) ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw billing units](/docs/cli/pw/billing/units) - Manage billing units and their pricing rules # pw billing units get > Source: https://parallelworks.com/docs/cli/pw/billing/units/get ## pw billing units get Show a unit and its pricing rule history ``` pw billing units get [flags] ``` ### Examples ``` # Show a unit pw billing units get core-hours # Output as JSON pw billing units get -o json core-hours ``` ### Options ``` -h, --help help for get --org string Target organization (defaults to current context) -o, --output string Output format (table, json) (default "table") ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw billing units](/docs/cli/pw/billing/units) - Manage billing units and their pricing rules # pw billing units ls > Source: https://parallelworks.com/docs/cli/pw/billing/units/ls ## pw billing units ls List billing units ``` pw billing units ls [flags] ``` ### Examples ``` # List units in the current org pw billing units ls # Output as JSON pw billing units ls -o json ``` ### Options ``` -h, --help help for ls --org string Target organization (defaults to current context) -o, --output string Output format (table, json) (default "table") ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw billing units](/docs/cli/pw/billing/units) - Manage billing units and their pricing rules # pw billing units rm > Source: https://parallelworks.com/docs/cli/pw/billing/units/rm ## pw billing units rm Delete a billing unit and all its SKUs, rules, and history ``` pw billing units rm [flags] ``` ### Examples ``` # Delete a unit pw billing units rm core-hours ``` ### Options ``` -h, --help help for rm --org string Target organization (defaults to current context) ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw billing units](/docs/cli/pw/billing/units) - Manage billing units and their pricing rules # pw billing units rules > Source: https://parallelworks.com/docs/cli/pw/billing/units/rules ## pw billing units rules Manage unit pricing rules ``` pw billing units rules [flags] ``` ### Options ``` -h, --help help for rules ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw billing units](/docs/cli/pw/billing/units) - Manage billing units and their pricing rules * [pw billing units rules add](/docs/cli/pw/billing/units/rules/add) - Add a new USD rate for a unit, effective now # pw billing units rules add > Source: https://parallelworks.com/docs/cli/pw/billing/units/rules/add ## pw billing units rules add Add a new USD rate for a unit, effective now ``` pw billing units rules add [flags] ``` ### Examples ``` # Set the core-hours rate to $0.02/unit going forward pw billing units rules add --rate 0.02 core-hours ``` ### Options ``` -h, --help help for add --org string Target organization (defaults to current context) -o, --output string Output format (table, json) (default "table") --rate float USD rate per unit ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw billing units rules](/docs/cli/pw/billing/units/rules) - Manage unit pricing rules # pw buckets > Source: https://parallelworks.com/docs/cli/pw/buckets ## pw buckets Manage cloud buckets ### Synopsis The **buckets** command group lets you list bucket contents and copy, print, or delete objects in your cloud buckets. ``` pw buckets [flags] ``` ### Options ``` -h, --help help for buckets ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw](/docs/cli/pw) - The Parallel Works ACTIVATE CLI * [pw buckets cat](/docs/cli/pw/buckets/cat) - Print a bucket object * [pw buckets cp](/docs/cli/pw/buckets/cp) - Copy files between local and buckets * [pw buckets get-token](/docs/cli/pw/buckets/get-token) - Print temporary access credentials for a cloud bucket * [pw buckets ls](/docs/cli/pw/buckets/ls) - List buckets or files * [pw buckets rm](/docs/cli/pw/buckets/rm) - Remove files from buckets # pw buckets cat > Source: https://parallelworks.com/docs/cli/pw/buckets/cat ## pw buckets cat Print a bucket object ### Synopsis The **pw buckets cat** command prints a bucket object's contents to standard output. Both PW URIs and CSP URIs are accepted. For more information about URIs, please see [this section](/docs/cli#about-uris). ``` pw buckets cat [bucket URI]/[file] [flags] ``` ### Examples ``` # Print a file from a bucket pw buckets cat pw://demo/demos3bucket/sample.txt # Pipe a file from an AWS bucket to another command pw buckets cat s3://demos3bucket/sample.json | jq . ``` ### Options ``` -h, --help help for cat ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw buckets](/docs/cli/pw/buckets) - Manage cloud buckets # pw buckets cp > Source: https://parallelworks.com/docs/cli/pw/buckets/cp ## pw buckets cp Copy files between local and buckets ### Synopsis The **pw buckets cp** command must be followed by a source and a destination. The source and destination can be either a local file or a bucket URI. Both PW URIs and CSP URIs are accepted. For more information about URIs, please see [this section](/docs/cli#about-uris). When copying to/from a bucket with a PW URI, you must specify at least the bucket name. However, paths can be longer, such as `pw://[namespace]/[bucket-name]/[folder]/[folder2]/[folder3]/[file-name]`. Recursive copies follow the same trailing slash rule as **cp** and **rsync**: a source without a trailing slash copies the directory itself, and a source with a trailing slash copies its contents. This holds in both directions. ``` pw buckets cp [source] [destination] [flags] ``` ### Examples ``` # Upload a local file named sample.txt to a bucket named demos3bucket in the demo namespace pw buckets cp sample.txt pw://demo/demos3bucket # Download a file named sample.txt to a local file pw buckets cp pw://demo/demos3bucket/sample.txt sample2.txt # Download a file from Azure Blob Storage to a local folder, using the Azure URI pw buckets cp https://azuredemo.blob.core.windows.net/azuredemo/sample.txt sample2.txt # Recursive download of a folder, keeping the folder # Result: ./downloads/sample-dir/a.txt, ./downloads/sample-dir/sub/b.txt, ... pw buckets cp -r pw://demo/demos3bucket/sample-dir ./downloads # Recursive download of a folder's contents, with a trailing slash # Result: ./downloads/a.txt, ./downloads/sub/b.txt, ... pw buckets cp -r pw://demo/demos3bucket/sample-dir/ ./downloads # Recursive download of the entire bucket root into a local folder # Result: ./downloads/ pw buckets cp -r pw://demo/demos3bucket ./downloads/ # Recursive upload of a folder, keeping the folder # Result: pw://demo/demos3bucket/uploads/sample-dir/a.txt, ... pw buckets cp -r ./sample-dir pw://demo/demos3bucket/uploads # Recursive upload of a folder's contents, with a trailing slash # Result: pw://demo/demos3bucket/uploads/a.txt, ... pw buckets cp -r ./sample-dir/ pw://demo/demos3bucket/uploads ``` ### Options ``` -h, --help help for cp -r, --recursive Copy directories/prefixes recursively ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw buckets](/docs/cli/pw/buckets) - Manage cloud buckets # pw buckets get-token > Source: https://parallelworks.com/docs/cli/pw/buckets/get-token ## pw buckets get-token Print temporary access credentials for a cloud bucket ### Synopsis The **pw buckets get-token** command must be followed by a bucket URI. Both PW URIs and CSP URIs are accepted. For more information about URIs, please see [this section](/docs/cli#about-uris). The short-term tokens that this command prints are the same tokens seen [here](/docs/storage/transferring-data/obtaining-credentials). ``` pw buckets get-token [bucketURI] [flags] ``` ### Options ``` -h, --help help for get-token ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw buckets](/docs/cli/pw/buckets) - Manage cloud buckets # pw buckets ls > Source: https://parallelworks.com/docs/cli/pw/buckets/ls ## pw buckets ls List buckets or files ### Synopsis The **pw buckets ls** command can be used with or without arguments. When no arguments are provided, all buckets are listed. If you provide a namespace, all buckets in that namespace will be listed. If you provide a namespace and bucket name, the files in the bucket will be listed. You can list individual directories in the bucket by providing the full path to the directory. This command also supports using the same CSP URI format accepted by CSP CLIs. For more information about URIs, please see [this section](/docs/cli#about-uris). Files are listed as a table of URI, size in bytes, and modified time. Use **-o list** for one URI per line, which is the form to pipe into other commands, or **-o json** for the same fields as structured output. ``` pw buckets ls [bucketURI] [flags] ``` ### Examples ``` # List all buckets pw buckets ls # List all buckets in a namespace pw buckets ls pw://[namespace] # List files in a bucket pw buckets ls pw://[namespace]/[bucket] # List files in a bucket, using the AWS URI format pw buckets ls s3://[aws-bucket-name] # List files in a bucket, using the Google URI format pw buckets ls gs://[google-bucket-name] # List files in a bucket, using the Azure URI format pw buckets ls https://[azure-bucket-name].blob.core.windows.net/[azure-bucket-name] # List the first 10 files in a bucket pw buckets ls --limit 10 s3://[aws-bucket-name] # List files as one URI per line, for piping pw buckets ls -o list s3://[aws-bucket-name] # List files with their size and modified time as JSON pw buckets ls -o json s3://[aws-bucket-name] # List all buckets you have access to, displayed as a table # Tables display URI, CSP, provisioning status, and CSP URI pw buckets ls -o table # List currently provisioned buckets with csp URIs pw buckets ls --csp-uris ``` ### Options ``` --csp-uris Show CSP URIs -h, --help help for ls --limit int Maximum number of results to list. Lists everything when unset -o, --output OUTPUT_FORMAT Output format. One of: list, json, table (default table) ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw buckets](/docs/cli/pw/buckets) - Manage cloud buckets # pw buckets rm > Source: https://parallelworks.com/docs/cli/pw/buckets/rm ## pw buckets rm Remove files from buckets ### Synopsis The **pw buckets rm** command must be followed by a bucket URI and file name. Both PW URIs and CSP URIs are accepted. For more information about URIs, please see [this section](/docs/cli#about-uris). Removing a folder needs **-r**, which deletes every object under the given prefix and asks first. **-f** skips the prompt, and reports success when the object is already gone. ``` pw buckets rm [bucket URI]/[file] [flags] ``` ### Examples ``` # Delete a file named sample.txt from a bucket named demos3bucket pw buckets rm pw://demo/demos3bucket/sample.txt # Delete every object under a folder, after confirming pw buckets rm -r pw://demo/demos3bucket/reports/ # Delete a folder without being asked pw buckets rm -rf pw://demo/demos3bucket/reports/ # Succeed even if the object is already gone pw buckets rm -f pw://demo/demos3bucket/sample.txt ``` ### Options ``` -f, --force Do not prompt, and do not fail when the object does not exist -h, --help help for rm -r, --recursive Delete every object under the given prefix ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw buckets](/docs/cli/pw/buckets) - Manage cloud buckets # pw cluster > Source: https://parallelworks.com/docs/cli/pw/cluster ## pw cluster Manage clusters ``` pw cluster [flags] ``` ### Options ``` -h, --help help for cluster ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw](/docs/cli/pw) - The Parallel Works ACTIVATE CLI * [pw cluster attach-storage](/docs/cli/pw/cluster/attach-storage) - Attach storage to a cluster * [pw cluster ls](/docs/cli/pw/cluster/ls) - List clusters # pw cluster attach-storage > Source: https://parallelworks.com/docs/cli/pw/cluster/attach-storage ## pw cluster attach-storage Attach storage to a cluster ### Synopsis The **attach-storage** command attaches storage to a cluster at the specified mount point. ``` pw cluster attach-storage [flags] ``` ### Examples ``` # Attach storage to a cluster pw cluster attach-storage --cluster-uri pw://namespace/cluster-name --storage-uri pw://namespace/storage-name --mount-point=/mnt-point ``` ### Options ``` --cluster-uri string URI of the cluster (required) -h, --help help for attach-storage --mount-point string Mount point for the storage (required) --storage-uri string URI of the storage to attach (required) ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw cluster](/docs/cli/pw/cluster) - Manage clusters # pw cluster ls > Source: https://parallelworks.com/docs/cli/pw/cluster/ls ## pw cluster ls List clusters ``` pw cluster ls [URI] [flags] ``` ### Examples ``` # List all clusters pw cluster ls # List clusters owned by the user "Jake.Thayne" pw cluster ls pw://Jake.Thayne # List a specific cluster by URI pw cluster ls pw://Jake.Thayne/my-cluster # List only clusters you own pw cluster ls --owned # List only provisioned clusters pw cluster ls --status=active # List all clusters, displayed as a table # Tables display URI, Provision status, and Type pw cluster ls -o table ``` ### Options ``` -h, --help help for ls -o, --output string Output format (json, table) --owned Show only clusters owned by the authenticated user --status string Filter clusters by status (e.g., active, off, failed). 'on' is accepted as an alias for 'active'. ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw cluster](/docs/cli/pw/cluster) - Manage clusters # pw code > Source: https://parallelworks.com/docs/cli/pw/code ## pw code AI coding agent ### Synopsis Start an AI coding agent that can read, write, and edit files in your workspace. The agent uses tool-calling to execute tasks autonomously. If no model is specified, you'll be prompted to choose one. Run 'pw ai models ls' to list the model IDs available to you. ``` pw code [model] [flags] ``` ### Examples ``` # Pick a model interactively pw code # Start with a specific model (see 'pw ai models ls') pw code Jake.Thayne:openai/gpt-5.2 # One-shot prompt pw code -p "find all TODO comments" Jake.Thayne:openai/gpt-5.2 # JSON output for automation pw code -p "list Go files" -o json Jake.Thayne:openai/gpt-5.2 # Resume a local session pw code -r latest Jake.Thayne:openai/gpt-5.2 # Read-only mode pw code --permission-mode read-only Jake.Thayne:openai/gpt-5.2 # Use an org provider with a budget allocation pw code --allocation PW-QA-TEST org:openai/gpt-5.2 ``` ### Options ``` --add-dir strings Directories outside the workspace the agent may read without prompting (repeatable) --agent string Run a custom agent definition as the main session (a name from .agents/agents) --agents string Ad-hoc agent definitions as JSON keyed by name, merged over the definition files --allocation string Budget allocation name (required for org provider models) --allowedTools strings Tools pre-approved without prompting, e.g. ReadFile, 'Bash(git status:*)', or 'ReadFile(/data/**)' to allow reads outside the workspace --effort string Reasoning effort: default, none, minimal, low, medium, high, xhigh, or max (support varies by model) -h, --help help for code -m, --model string Model ID, e.g. Jake.Thayne:openai/gpt-5.2 or org:openai/gpt-5.2 (run 'pw ai models ls' to list) --no-tools Disable tool calling (chat-only mode) -o, --output string Output format: text, json (default "text") --permission-mode string Permission mode: read-only, accept-edits, bypass-permissions, plan -p, --prompt string One-shot prompt (non-interactive) -r, --resume string[=" pick"]Resume a local session: pass a session ID or 'latest', or use --resume alone to pick from a list -w, --workspace string Workspace root directory (default: current directory) ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw](/docs/cli/pw) - The Parallel Works ACTIVATE CLI * [pw code mcp](/docs/cli/pw/code/mcp) - Manage MCP servers for pw code # pw code mcp > Source: https://parallelworks.com/docs/cli/pw/code/mcp ## pw code mcp Manage MCP servers for pw code ### Synopsis Manage the MCP servers pw code connects to. Servers are stored in config files at four scopes, from lowest to highest load precedence: user (~/.config/pw/code.json), project (/.mcp.json), agents (/.agents/settings.json), and local (/.agents/settings.local.json). At load time the highest-precedence file with any servers supplies the entire set. ``` pw code mcp [flags] ``` ### Options ``` -h, --help help for mcp ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw code](/docs/cli/pw/code) - AI coding agent * [pw code mcp add](/docs/cli/pw/code/mcp/add) - Add an MCP server * [pw code mcp get](/docs/cli/pw/code/mcp/get) - Show one MCP server's configuration * [pw code mcp list](/docs/cli/pw/code/mcp/list) - List configured MCP servers across config files * [pw code mcp remove](/docs/cli/pw/code/mcp/remove) - Remove an MCP server # pw code mcp add > Source: https://parallelworks.com/docs/cli/pw/code/mcp/add ## pw code mcp add Add an MCP server ### Synopsis Add an MCP server to a pw code config file. stdio servers take their command (and arguments) after "--"; http and sse servers take the endpoint URL as the second positional argument. Run with no arguments in a terminal to be prompted for each value. ``` pw code mcp add [flags] [url] [-- [args...]] ``` ### Examples ``` # Add a stdio server to /.agents/settings.local.json (default scope) pw code mcp add -e API_KEY=secret everything -- npx -y @modelcontextprotocol/server-everything # Add an HTTP server to the shared /.mcp.json pw code mcp add --transport http -H "Authorization: Bearer token" --scope project context7 https://mcp.context7.com/mcp # Fill in every value interactively pw code mcp add ``` ### Options ``` -e, --env stringArray Environment variable for a stdio server, KEY=VALUE (repeatable) --force Overwrite an existing server with the same name -H, --header stringArray HTTP header for an http/sse server, 'Key: Value' (repeatable) -h, --help help for add --scope string Config file to write: user, project, agents, or local (default: local) --timeout string Connection timeout: milliseconds (60000) or a duration (60s) -t, --transport string Transport: stdio, http, or sse (default: inferred from command/url) -w, --workspace string Workspace root directory (default: current directory) ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw code mcp](/docs/cli/pw/code/mcp) - Manage MCP servers for pw code # pw code mcp get > Source: https://parallelworks.com/docs/cli/pw/code/mcp/get ## pw code mcp get Show one MCP server's configuration ``` pw code mcp get [flags] ``` ### Options ``` -h, --help help for get -o, --output string Output format: text, json (default "json") --scope string Only search one config file: user, project, agents, or local -w, --workspace string Workspace root directory (default: current directory) ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw code mcp](/docs/cli/pw/code/mcp) - Manage MCP servers for pw code # pw code mcp list > Source: https://parallelworks.com/docs/cli/pw/code/mcp/list ## pw code mcp list List configured MCP servers across config files ``` pw code mcp list [flags] ``` ### Options ``` -h, --help help for list -o, --output string Output format: text, json (default "text") --scope string Only show one config file: user, project, agents, or local -w, --workspace string Workspace root directory (default: current directory) ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw code mcp](/docs/cli/pw/code/mcp) - Manage MCP servers for pw code # pw code mcp remove > Source: https://parallelworks.com/docs/cli/pw/code/mcp/remove ## pw code mcp remove Remove an MCP server ``` pw code mcp remove [flags] ``` ### Options ``` -h, --help help for remove --scope string Config file to remove from: user, project, agents, or local -w, --workspace string Workspace root directory (default: current directory) ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw code mcp](/docs/cli/pw/code/mcp) - Manage MCP servers for pw code # pw context > Source: https://parallelworks.com/docs/cli/pw/context ## pw context Manage CLI contexts ### Synopsis The **pw context** command group lets you manage multiple CLI identities and switch between them. Contexts allow you to authenticate with multiple Parallel Works platforms or user accounts and easily switch between them without re-authenticating. Each context stores the authentication credentials (API key or token), the platform server, and the associated organization. ``` pw context [flags] ``` ### Options ``` -h, --help help for context ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw](/docs/cli/pw) - The Parallel Works ACTIVATE CLI * [pw context current](/docs/cli/pw/context/current) - Show the current context * [pw context delete](/docs/cli/pw/context/delete) - Delete a context * [pw context list](/docs/cli/pw/context/list) - List all available contexts * [pw context rename](/docs/cli/pw/context/rename) - Rename a context * [pw context use](/docs/cli/pw/context/use) - Switch to a different context # pw context current > Source: https://parallelworks.com/docs/cli/pw/context/current ## pw context current Show the current context ### Synopsis The **pw context current** command displays the name of the current context. ``` pw context current [flags] ``` ### Examples ``` # Show the current context pw context current # Using alias pw ctx current ``` ### Options ``` -h, --help help for current ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw context](/docs/cli/pw/context) - Manage CLI contexts # pw context delete > Source: https://parallelworks.com/docs/cli/pw/context/delete ## pw context delete Delete a context ### Synopsis The **pw context delete** command removes a context from the credentials file. If the context being deleted is the current one, you must use the --force flag. When deleting the current context with --force, another available context will be selected as the new current context automatically. ``` pw context delete [flags] ``` ### Examples ``` # Delete a context pw context delete user@staging.parallel.works # Force delete the current context pw context delete --force user@activate.parallel.works # Using alias pw ctx delete old-context ``` ### Options ``` -f, --force Force delete even if this is the current context -h, --help help for delete ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw context](/docs/cli/pw/context) - Manage CLI contexts # pw context list > Source: https://parallelworks.com/docs/cli/pw/context/list ## pw context list List all available contexts ### Synopsis The **pw context list** command displays all available contexts. The current context is marked with an asterisk (*). ``` pw context list [flags] ``` ### Examples ``` # List all contexts (simple list) pw context list # List all contexts as a table pw context list -o table # List all contexts as JSON pw context list -o json # Using alias pw ctx list ``` ### Options ``` -h, --help help for list -o, --output OUTPUT_FORMAT Output format. One of: list, json, table (default table) ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw context](/docs/cli/pw/context) - Manage CLI contexts # pw context rename > Source: https://parallelworks.com/docs/cli/pw/context/rename ## pw context rename Rename a context ### Synopsis The **pw context rename** command renames an existing context. If the renamed context is the current one, the current context reference is updated automatically. ``` pw context rename [flags] ``` ### Examples ``` # Rename a context pw context rename user@activate.parallel.works production # Using alias pw ctx rename old-context new-context ``` ### Options ``` -h, --help help for rename ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw context](/docs/cli/pw/context) - Manage CLI contexts # pw context use > Source: https://parallelworks.com/docs/cli/pw/context/use ## pw context use Switch to a different context ### Synopsis The **pw context use** command switches the current context to the specified one. After switching, all subsequent commands will use the credentials from the selected context. ``` pw context use [flags] ``` ### Examples ``` # Switch to a different context pw context use user@activate.parallel.works # Using alias pw ctx use user@staging.parallel.works ``` ### Options ``` -h, --help help for use ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw context](/docs/cli/pw/context) - Manage CLI contexts # pw endpoints > Source: https://parallelworks.com/docs/cli/pw/endpoints ## pw endpoints Create and serve self-registering endpoint sessions ### Synopsis Endpoint sessions expose a locally-running web app through the platform by dialing out and registering a reverse tunnel — no inbound network access to your machine is required. Run **endpoints http PORT** next to an app listening on that port, or **endpoints http SOCKET_PATH** next to an app listening on a Unix socket. Use **endpoints https** instead when the local app speaks TLS. The platform forwards its session URL to your local server until you exit. ``` pw endpoints [flags] ``` ### Options ``` -h, --help help for endpoints ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw](/docs/cli/pw) - The Parallel Works ACTIVATE CLI * [pw endpoints delete](/docs/cli/pw/endpoints/delete) - Delete an endpoint session * [pw endpoints http](/docs/cli/pw/endpoints/http) - Serve a local HTTP app as an endpoint * [pw endpoints https](/docs/cli/pw/endpoints/https) - Serve a local HTTPS app as an endpoint * [pw endpoints list](/docs/cli/pw/endpoints/list) - List your endpoint sessions * [pw endpoints run](/docs/cli/pw/endpoints/run) - Run a command that serves HTTP and expose it as an endpoint * [pw endpoints serve](/docs/cli/pw/endpoints/serve) - Serve a static site directory as an endpoint # pw endpoints delete > Source: https://parallelworks.com/docs/cli/pw/endpoints/delete ## pw endpoints delete Delete an endpoint session ``` pw endpoints delete [flags] ``` ### Options ``` -h, --help help for delete ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw endpoints](/docs/cli/pw/endpoints) - Create and serve self-registering endpoint sessions # pw endpoints http > Source: https://parallelworks.com/docs/cli/pw/endpoints/http ## pw endpoints http Serve a local HTTP app as an endpoint ### Synopsis Serve a local app through the platform: the CLI dials out and registers a reverse tunnel, then forwards the session URL to your app until you exit. Local dev servers (Next.js, Vite, etc.) see requests arriving from the public endpoint host rather than localhost, so their Hot Module Reload socket and dev-only routes are treated as cross-origin and may be blocked — the page loads but never finishes updating and the browser console shows repeated HMR WebSocket failures. Allow the endpoint host in your dev server's config to fix it (Next.js **allowedDevOrigins**, Vite **server.allowedHosts**). Add **--openai** to expose a local OpenAI-compatible server (a /v1 endpoint such as vLLM or Ollama) as a model in the platform chat and AI providers. Use **--auth-file** if that server requires an API key. ``` pw endpoints http (PORT | SOCKET_PATH) [flags] ``` ### Examples ``` # Serve a local app on port 5173 as an endpoint pw endpoints http 5173 # Serve a local app listening on a Unix socket pw endpoints http /tmp/app.sock # Give it a name and open it in the browser pw endpoints http --name my_app --open 3000 # Serve it publicly so anyone with the link can reach it without logging in pw endpoints http --public 3000 # Expose a local OpenAI-compatible server (e.g. Ollama) as a chat model pw endpoints http --openai --name my_llm 11434 ``` ### Options ``` --auth-file string File containing an Authorization header value or token to forward to the local app --auth-scheme string Authorization scheme used when --auth-file contains only a raw token (default "Bearer") --description string Session description (defaults to "Endpoint on ") -h, --help help for http --keep Keep the endpoint session on exit instead of deleting it --link Stop the local server process listening on the target port when this command exits -n, --name string Name for the endpoint session (defaults to a server-generated name) --no-subdomain Skip subdomain assignment and use the path-based session URL --open Open the endpoint URL in the browser --openai Expose this endpoint as an OpenAI-compatible model in the platform chat and AI providers. Point it at a local /v1 server (vLLM, Ollama, etc.); pass --auth-file if that server needs an API key. -o, --output string Output format (interactive, text); interactive shows a live dashboard and downgrades to text when stdout is not a terminal (default "interactive") --public Make the endpoint publicly accessible: anyone with the link can reach it without logging in. Requires your organization to allow public sessions. --rewrite-host string[="localhost"] Rewrite the Host header sent to your local app to this value (defaults to "localhost" when the flag is given without one). Use for an app that rejects the public endpoint host, such as a DNS-rebinding guard or an allowed-hosts check. --slug string Session base-path slug (default "/") --strip-path Strip the session URL prefix before forwarding to your app (use only if your app serves at the root path and can't be configured with a base path; by default the full path is forwarded so set your app's base path to the endpoint URL) -s, --subdomain string Serve at this subdomain: a label (my-app), which lands on the platform's default sessions domain, or the full host under any registered sessions domain (my-app.); a random subdomain is used by default when the platform supports them ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw endpoints](/docs/cli/pw/endpoints) - Create and serve self-registering endpoint sessions # pw endpoints https > Source: https://parallelworks.com/docs/cli/pw/endpoints/https ## pw endpoints https Serve a local HTTPS app as an endpoint ### Synopsis Serve a local app through the platform: the CLI dials out and registers a reverse tunnel, then forwards the session URL to your app until you exit. Local dev servers (Next.js, Vite, etc.) see requests arriving from the public endpoint host rather than localhost, so their Hot Module Reload socket and dev-only routes are treated as cross-origin and may be blocked — the page loads but never finishes updating and the browser console shows repeated HMR WebSocket failures. Allow the endpoint host in your dev server's config to fix it (Next.js **allowedDevOrigins**, Vite **server.allowedHosts**). Add **--openai** to expose a local OpenAI-compatible server (a /v1 endpoint such as vLLM or Ollama) as a model in the platform chat and AI providers. Use **--auth-file** if that server requires an API key. ``` pw endpoints https (PORT | SOCKET_PATH) [flags] ``` ### Examples ``` # Serve a local app on port 5173 as an endpoint pw endpoints https 5173 # Serve a local app listening on a Unix socket pw endpoints https /tmp/app.sock # Give it a name and open it in the browser pw endpoints https --name my_app --open 3000 # Serve it publicly so anyone with the link can reach it without logging in pw endpoints https --public 3000 # Expose a local OpenAI-compatible server (e.g. Ollama) as a chat model pw endpoints https --openai --name my_llm 11434 ``` ### Options ``` --auth-file string File containing an Authorization header value or token to forward to the local app --auth-scheme string Authorization scheme used when --auth-file contains only a raw token (default "Bearer") --description string Session description (defaults to "Endpoint on ") -h, --help help for https --keep Keep the endpoint session on exit instead of deleting it --link Stop the local server process listening on the target port when this command exits -n, --name string Name for the endpoint session (defaults to a server-generated name) --no-subdomain Skip subdomain assignment and use the path-based session URL --open Open the endpoint URL in the browser --openai Expose this endpoint as an OpenAI-compatible model in the platform chat and AI providers. Point it at a local /v1 server (vLLM, Ollama, etc.); pass --auth-file if that server needs an API key. -o, --output string Output format (interactive, text); interactive shows a live dashboard and downgrades to text when stdout is not a terminal (default "interactive") --public Make the endpoint publicly accessible: anyone with the link can reach it without logging in. Requires your organization to allow public sessions. --rewrite-host string[="localhost"] Rewrite the Host header sent to your local app to this value (defaults to "localhost" when the flag is given without one). Use for an app that rejects the public endpoint host, such as a DNS-rebinding guard or an allowed-hosts check. --slug string Session base-path slug (default "/") --strip-path Strip the session URL prefix before forwarding to your app (use only if your app serves at the root path and can't be configured with a base path; by default the full path is forwarded so set your app's base path to the endpoint URL) -s, --subdomain string Serve at this subdomain: a label (my-app), which lands on the platform's default sessions domain, or the full host under any registered sessions domain (my-app.); a random subdomain is used by default when the platform supports them ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw endpoints](/docs/cli/pw/endpoints) - Create and serve self-registering endpoint sessions # pw endpoints list > Source: https://parallelworks.com/docs/cli/pw/endpoints/list ## pw endpoints list List your endpoint sessions ``` pw endpoints list [flags] ``` ### Options ``` -h, --help help for list ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw endpoints](/docs/cli/pw/endpoints) - Create and serve self-registering endpoint sessions # pw endpoints run > Source: https://parallelworks.com/docs/cli/pw/endpoints/run ## pw endpoints run Run a command that serves HTTP and expose it as an endpoint ### Synopsis Spawn a command that serves HTTP on a local port and forward it through an endpoint, tearing the whole process tree down when this command exits. The CLI assigns a free local port; reference it in your command with the {port} token, or read it from the PORT environment variable. Reference the endpoint's public hostname with the {host} token (also exported as `PW_ENDPOINT_HOST`) to give a dev server the public host it must allow-list. Reference the base path the endpoint is served under with the {path} token (also exported as `PW_ENDPOINT_PATH`): "/me/session///" for a path-based endpoint (--no-subdomain) or "/" for a subdomain one. Set an app's base path to it so its links resolve behind the prefix, such as Jupyter's --ServerApp.base_url. The full public URL is exported as `PW_ENDPOINT_URL`. ``` pw endpoints run -- COMMAND [ARGS...] [flags] ``` ### Examples ``` # Run a Jupyter server and expose it (port substituted into the command) pw endpoints run -- jupyter lab --port {port} --no-browser --ServerApp.allow_remote_access=True # Same, on a path-based endpoint: {path} sets Jupyter's base URL to the session prefix pw endpoints run --no-subdomain --name jupyter -- jupyter lab --port {port} --no-browser --ServerApp.allow_remote_access=True --ServerApp.base_url={path} # Run a node server that reads $PORT pw endpoints run --name api -- node server.js # Serve an Ollama model (--rewrite-host satisfies its host guard; sh -c sets its OLLAMA_HOST bind var) pw endpoints run --rewrite-host -- sh -c 'OLLAMA_HOST=127.0.0.1:{port} ollama serve' # Serve a model with llama.cpp (llama-server takes --port directly) pw endpoints run -- llama-server -hf ggml-org/gpt-oss-20b-GGUF --port {port} # Give an app its public host so it accepts requests through the endpoint pw endpoints run -- my-dev-server --allowed-host {host} # Pin the local port pw endpoints run --port 5173 -- npm run dev ``` ### Options ``` --description string Session description (defaults to "Endpoint on ") -h, --help help for run --keep Keep the endpoint session on exit instead of deleting it -n, --name string Name for the endpoint session (defaults to a server-generated name) --no-subdomain Skip subdomain assignment and use the path-based session URL --open Open the endpoint URL in the browser --openai Expose this endpoint as an OpenAI-compatible model in the platform chat and AI providers. Point it at a local /v1 server (vLLM, Ollama, etc.); pass --auth-file if that server needs an API key. -o, --output string Output format (interactive, text); interactive shows a live dashboard and downgrades to text when stdout is not a terminal (default "interactive") -p, --port int Local port to assign the command (default: a free port chosen automatically) --public Make the endpoint publicly accessible: anyone with the link can reach it without logging in. Requires your organization to allow public sessions. --rewrite-host string[="localhost"] Rewrite the Host header sent to your local app to this value (defaults to "localhost" when the flag is given without one). Use for an app that rejects the public endpoint host, such as a DNS-rebinding guard or an allowed-hosts check. --slug string Session base-path slug (default "/") --strip-path Strip the session URL prefix before forwarding to your app (use only if your app serves at the root path and can't be configured with a base path; by default the full path is forwarded so set your app's base path to the endpoint URL) -s, --subdomain string Serve at this subdomain: a label (my-app), which lands on the platform's default sessions domain, or the full host under any registered sessions domain (my-app.); a random subdomain is used by default when the platform supports them ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw endpoints](/docs/cli/pw/endpoints) - Create and serve self-registering endpoint sessions # pw endpoints serve > Source: https://parallelworks.com/docs/cli/pw/endpoints/serve ## pw endpoints serve Serve a static site directory as an endpoint ### Synopsis Serve a built single-page-app directory (e.g. a Vite "dist") through an endpoint. The CLI runs a static file server with SPA history fallback on a local port and forwards it — no separate web server needed. Use a subdomain (the default) so the app is served at the domain root and a standard base:'/' build works unchanged. ``` pw endpoints serve DIR [flags] ``` ### Examples ``` # Serve a built SPA pw endpoints serve ./dist # Named and opened in the browser pw endpoints serve --name my_app --open ./dist ``` ### Options ``` --description string Session description (defaults to "Endpoint on ") -h, --help help for serve --keep Keep the endpoint session on exit instead of deleting it -n, --name string Name for the endpoint session (defaults to a server-generated name) --no-subdomain Skip subdomain assignment and use the path-based session URL --open Open the endpoint URL in the browser -o, --output string Output format (interactive, text); interactive shows a live dashboard and downgrades to text when stdout is not a terminal (default "interactive") --public Make the endpoint publicly accessible: anyone with the link can reach it without logging in. Requires your organization to allow public sessions. --rewrite-host string[="localhost"] Rewrite the Host header sent to your local app to this value (defaults to "localhost" when the flag is given without one). Use for an app that rejects the public endpoint host, such as a DNS-rebinding guard or an allowed-hosts check. --slug string Session base-path slug (default "/") --strip-path Strip the session URL prefix before forwarding to your app (use only if your app serves at the root path and can't be configured with a base path; by default the full path is forwarded so set your app's base path to the endpoint URL) -s, --subdomain string Serve at this subdomain: a label (my-app), which lands on the platform's default sessions domain, or the full host under any registered sessions domain (my-app.); a random subdomain is used by default when the platform supports them ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw endpoints](/docs/cli/pw/endpoints) - Create and serve self-registering endpoint sessions # pw environments > Source: https://parallelworks.com/docs/cli/pw/environments ## pw environments Manage compute environments ### Synopsis The **pw environments** command group has commands for managing the compute environments on a cluster. An environment describes a scheduler partition that sessions can be scheduled onto, along with the parameters users may set when scheduling. Environments the cluster detects for itself have a source of **auto-detected** and cannot be deleted. Environments you create have a source of **custom**. Every command takes the cluster with **--cluster**, given as **pw://user/cluster** for a cluster owned by another user or as **cluster** for one of your own. Environment names are unique only within their cluster, so they are named by name or ID alongside **--cluster** rather than by URI. ``` pw environments [flags] ``` ### Options ``` -h, --help help for environments ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw](/docs/cli/pw) - The Parallel Works ACTIVATE CLI * [pw environments create](/docs/cli/pw/environments/create) - Create a custom environment on a cluster * [pw environments delete](/docs/cli/pw/environments/delete) - Delete a custom environment * [pw environments get](/docs/cli/pw/environments/get) - Get details of an environment * [pw environments ls](/docs/cli/pw/environments/ls) - List compute environments * [pw environments update](/docs/cli/pw/environments/update) - Update an environment # pw environments create > Source: https://parallelworks.com/docs/cli/pw/environments/create ## pw environments create Create a custom environment on a cluster ### Synopsis The **pw environments create** command creates a custom compute environment on a cluster, mapping a scheduler partition to an environment that sessions can be scheduled onto. The cluster can be given as **pw://user/cluster** for a cluster owned by another user, or as **cluster** for one of your own. Wall times are given in the scheduler's own format, for example **24:00:00**. ``` pw environments create [flags] ``` ### Examples ``` # Create a Slurm environment for the gpu partition pw environments create --cluster my-hpc --name gpu-large --partition gpu --scheduler slurm # Create an environment with a display name and wall time limits pw environments create --cluster my-hpc --name gpu-large --partition gpu --scheduler slurm \ --display-name "GPU (large)" --max-time 24:00:00 --default-time 01:00:00 # Create a PBS environment on another user's cluster pw environments create --cluster pw://Jake.Thayne/my-hpc --name debug --partition debug --scheduler pbs ``` ### Options ``` --cluster string Cluster to create the environment on (required) --default-time string Default wall time, for example 01:00:00 --description string Description of the environment --display-name string Human-readable name shown in the UI -h, --help help for create --max-time string Maximum wall time, for example 24:00:00 --name string Environment name, unique within the cluster (required) --partition string Scheduler partition to map to (required) --scheduler string Scheduler type: slurm or pbs (required) ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw environments](/docs/cli/pw/environments) - Manage compute environments # pw environments delete > Source: https://parallelworks.com/docs/cli/pw/environments/delete ## pw environments delete Delete a custom environment ### Synopsis The **pw environments delete** command deletes a custom environment. Environments the cluster detected for itself have a source of **auto-detected** and cannot be deleted. To stop sessions being scheduled onto one, run **pw environments update --status inactive** instead. ``` pw environments delete [flags] ``` ### Examples ``` # Delete a custom environment pw environments delete --cluster my-hpc gpu-large # Delete an environment on another user's cluster pw environments delete --cluster pw://Jake.Thayne/my-hpc gpu-large ``` ### Options ``` --cluster string Cluster the environment belongs to (required) -h, --help help for delete ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw environments](/docs/cli/pw/environments) - Manage compute environments # pw environments get > Source: https://parallelworks.com/docs/cli/pw/environments/get ## pw environments get Get details of an environment ### Synopsis The **pw environments get** command shows an environment's configuration and the parameters that can be set when scheduling a session onto it. The environment can be given by name or by ID. The cluster can be given as **pw://user/cluster** for a cluster owned by another user, or as **cluster** for one of your own. ``` pw environments get [flags] ``` ### Examples ``` # Get an environment on one of your clusters pw environments get --cluster my-hpc gpu-large # Get an environment on another user's cluster pw environments get --cluster pw://Jake.Thayne/my-hpc gpu-large # Get as JSON pw environments get --cluster my-hpc -o json gpu-large ``` ### Options ``` --cluster string Cluster the environment belongs to (required) -h, --help help for get -o, --output string Output format (table, json) (default "table") ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw environments](/docs/cli/pw/environments) - Manage compute environments # pw environments ls > Source: https://parallelworks.com/docs/cli/pw/environments/ls ## pw environments ls List compute environments ### Synopsis The **pw environments ls** command lists compute environments. Without **--cluster** it lists every environment across the clusters you can schedule on, with a cluster column. Pass **--cluster** to list one cluster, given as **pw://user/cluster** for a cluster owned by another user or as **cluster** for one of your own. ``` pw environments ls [flags] ``` ### Examples ``` # List the environments on every cluster you can schedule on pw environments ls # List the environments on one of your clusters pw environments ls --cluster my-hpc # List the environments on another user's cluster pw environments ls --cluster pw://Jake.Thayne/my-hpc # List only active environments pw environments ls --status active # List as JSON pw environments ls -o json ``` ### Options ``` --cluster string Cluster to list environments on (default: every cluster you can schedule on) -h, --help help for ls -o, --output string Output format (table, json, list) (default "table") --status string Filter environments by status (active, inactive) ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw environments](/docs/cli/pw/environments) - Manage compute environments # pw environments update > Source: https://parallelworks.com/docs/cli/pw/environments/update ## pw environments update Update an environment ### Synopsis The **pw environments update** command updates an environment's configuration. Only the settings you pass are changed. Setting **--status inactive** keeps the environment but stops sessions from being scheduled onto it. Use **--default** to set the value a scheduling parameter takes when a session does not specify one. Run **pw environments get** to see which parameters an environment accepts. ``` pw environments update [flags] ``` ### Examples ``` # Rename an environment for display pw environments update --cluster my-hpc --display-name "GPU (large)" gpu-large # Stop new sessions being scheduled onto an environment pw environments update --cluster my-hpc --status inactive gpu-large # Raise the wall time limit pw environments update --cluster my-hpc --max-time 48:00:00 gpu-large # Default sessions on this environment to 2 nodes pw environments update --cluster my-hpc --default numNodes=2 gpu-large ``` ### Options ``` --cluster string Cluster the environment belongs to (required) --default stringArray Default value for a scheduling parameter as key=value (repeatable) --default-time string Default wall time, for example 01:00:00 --description string Description of the environment --display-name string Human-readable name shown in the UI -h, --help help for update --max-time string Maximum wall time, for example 24:00:00 --status string Environment status: active or inactive ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw environments](/docs/cli/pw/environments) - Manage compute environments # pw forward > Source: https://parallelworks.com/docs/cli/pw/forward ## pw forward Forward remote ports to your local machine via SSH tunnels ### Synopsis The **pw forward** command creates SSH tunnels that make remote ports accessible on your local machine. This uses the same mechanism as the -L option in OpenSSH. Unlike **pw ssh -L**, this command automatically reconnects if the SSH connection is interrupted. Local listeners stay open across reconnects, so client programs only see a brief interruption rather than a closed port. This makes it ideal for long-lived tunnels. A connection whose server stops answering keepalives is detected as dead, torn down, and re-established automatically. Resource names can be specified in the following formats: - **pw://username/name** - full format with explicit username - **pw://name** - managed cluster by name in your organization - **name** - short format where username defaults to your username ``` pw forward -L [bind_address:]port:host:hostport [-L ...] [flags] ``` ### Examples ``` # Make remote port 8080 accessible at localhost:8080 pw forward -L 8080:localhost:8080 my-cluster # Forward multiple remote ports pw forward -L 5900:localhost:5901 -L 3000:localhost:3000 my-cluster # Bind to all interfaces (accessible from other machines on your network) pw forward -L 0.0.0.0:8080:localhost:8080 my-cluster # Forward a port from your user workspace pw forward -L 8080:localhost:8080 workspace ``` ### Options ``` -h, --help help for forward --keepalive int Interval in seconds between keepalive messages; an unresponsive connection is torn down and reconnected (0 to disable) (default 30) -L, --local stringArray Forward local [bind_address:]port to remote host:hostport (required, repeatable) ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw](/docs/cli/pw) - The Parallel Works ACTIVATE CLI # pw groups > Source: https://parallelworks.com/docs/cli/pw/groups ## pw groups Manage groups and their members ``` pw groups [flags] ``` ### Options ``` -h, --help help for groups ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw](/docs/cli/pw) - The Parallel Works ACTIVATE CLI * [pw groups create](/docs/cli/pw/groups/create) - Create a group * [pw groups get](/docs/cli/pw/groups/get) - Show a group and its members * [pw groups ls](/docs/cli/pw/groups/ls) - List groups in the organization * [pw groups members](/docs/cli/pw/groups/members) - Manage group members * [pw groups rm](/docs/cli/pw/groups/rm) - Delete a group * [pw groups roles](/docs/cli/pw/groups/roles) - Manage a group's roles * [pw groups update](/docs/cli/pw/groups/update) - Update a group's description # pw groups create > Source: https://parallelworks.com/docs/cli/pw/groups/create ## pw groups create Create a group ``` pw groups create [flags] ``` ### Examples ``` pw groups create --description "Research staff" research-team # Create a group with org roles assigned pw groups create --role org:admin --role org:users admins ``` ### Options ``` --description string Group description -h, --help help for create --org string Target organization (defaults to current context) -o, --output string Output format (table, json) (default "table") --role stringArray Role to assign (repeatable, e.g. org:admin) ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw groups](/docs/cli/pw/groups) - Manage groups and their members # pw groups get > Source: https://parallelworks.com/docs/cli/pw/groups/get ## pw groups get Show a group and its members ``` pw groups get [flags] ``` ### Examples ``` pw groups get research-team pw groups get -o json research-team ``` ### Options ``` -h, --help help for get --org string Target organization (defaults to current context) -o, --output string Output format (table, json) (default "table") ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw groups](/docs/cli/pw/groups) - Manage groups and their members # pw groups ls > Source: https://parallelworks.com/docs/cli/pw/groups/ls ## pw groups ls List groups in the organization ``` pw groups ls [flags] ``` ### Examples ``` pw groups ls pw groups ls -o json ``` ### Options ``` -h, --help help for ls --org string Target organization (defaults to current context) -o, --output string Output format (table, json) (default "table") ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw groups](/docs/cli/pw/groups) - Manage groups and their members # pw groups members > Source: https://parallelworks.com/docs/cli/pw/groups/members ## pw groups members Manage group members ``` pw groups members [flags] ``` ### Options ``` -h, --help help for members ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw groups](/docs/cli/pw/groups) - Manage groups and their members * [pw groups members add](/docs/cli/pw/groups/members/add) - Add a member to a group * [pw groups members ls](/docs/cli/pw/groups/members/ls) - List members of a group * [pw groups members rm](/docs/cli/pw/groups/members/rm) - Remove a member from a group # pw groups members add > Source: https://parallelworks.com/docs/cli/pw/groups/members/add ## pw groups members add Add a member to a group ``` pw groups members add [flags] ``` ### Examples ``` pw groups members add research-team jake.thayne ``` ### Options ``` -h, --help help for add --org string Target organization (defaults to current context) ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw groups members](/docs/cli/pw/groups/members) - Manage group members # pw groups members ls > Source: https://parallelworks.com/docs/cli/pw/groups/members/ls ## pw groups members ls List members of a group ``` pw groups members ls [flags] ``` ### Examples ``` pw groups members ls research-team pw groups members ls -o json research-team ``` ### Options ``` -h, --help help for ls --org string Target organization (defaults to current context) -o, --output string Output format (table, json) (default "table") ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw groups members](/docs/cli/pw/groups/members) - Manage group members # pw groups members rm > Source: https://parallelworks.com/docs/cli/pw/groups/members/rm ## pw groups members rm Remove a member from a group ``` pw groups members rm [flags] ``` ### Examples ``` pw groups members rm research-team jake.thayne ``` ### Options ``` -h, --help help for rm --org string Target organization (defaults to current context) ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw groups members](/docs/cli/pw/groups/members) - Manage group members # pw groups rm > Source: https://parallelworks.com/docs/cli/pw/groups/rm ## pw groups rm Delete a group ``` pw groups rm [flags] ``` ### Examples ``` pw groups rm research-team pw groups rm -f research-team ``` ### Options ``` -f, --force Skip confirmation prompt -h, --help help for rm --org string Target organization (defaults to current context) ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw groups](/docs/cli/pw/groups) - Manage groups and their members # pw groups roles > Source: https://parallelworks.com/docs/cli/pw/groups/roles ## pw groups roles Manage a group's roles ``` pw groups roles [flags] ``` ### Options ``` -h, --help help for roles ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw groups](/docs/cli/pw/groups) - Manage groups and their members * [pw groups roles set](/docs/cli/pw/groups/roles/set) - Replace a group's roles # pw groups roles set > Source: https://parallelworks.com/docs/cli/pw/groups/roles/set ## pw groups roles set Replace a group's roles ``` pw groups roles set [flags] ``` ### Examples ``` pw groups roles set --role org:admin --role org:users admins ``` ### Options ``` -h, --help help for set --org string Target organization (defaults to current context) -o, --output string Output format (table, json) (default "table") --role stringArray Role to assign (repeatable, e.g. org:admin) ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw groups roles](/docs/cli/pw/groups/roles) - Manage a group's roles # pw groups update > Source: https://parallelworks.com/docs/cli/pw/groups/update ## pw groups update Update a group's description ``` pw groups update [flags] ``` ### Examples ``` pw groups update --description "Updated description" research-team ``` ### Options ``` --description string New group description -h, --help help for update --org string Target organization (defaults to current context) -o, --output string Output format (table, json) (default "table") ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw groups](/docs/cli/pw/groups) - Manage groups and their members # pw kube > Source: https://parallelworks.com/docs/cli/pw/kube ## pw kube Kubernetes commands ### Synopsis The **pw kube** command group contains commands to interact with Kubernetes resources. ``` pw kube [flags] ``` ### Options ``` -h, --help help for kube ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw](/docs/cli/pw) - The Parallel Works ACTIVATE CLI * [pw kube auth](/docs/cli/pw/kube/auth) - Set up cluster configuration * [pw kube ls](/docs/cli/pw/kube/ls) - List all kubernetes clusters * [pw kube token](/docs/cli/pw/kube/token) - Token to authenticate with the Kubernetes API # pw kube auth > Source: https://parallelworks.com/docs/cli/pw/kube/auth ## pw kube auth Set up cluster configuration ### Synopsis The **pw kube auth** command must be followed by a cluster name. ``` pw kube auth [cluster name] [flags] ``` ### Examples ``` # Sets up kubectl context for **demo** cluster pw kube auth demo ``` ### Options ``` -h, --help help for auth --no-context-switch Skip switching to the new context after configuration ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw kube](/docs/cli/pw/kube) - Kubernetes commands # pw kube ls > Source: https://parallelworks.com/docs/cli/pw/kube/ls ## pw kube ls List all kubernetes clusters ``` pw kube ls [flags] ``` ### Examples ``` # List all kubernetes clusters pw kube ls # List all kubernetes clusters, displayed as json pw kube ls -o json # List all kubernetes clusters, displayed as a table # Tables display Name, total vCPUs, total Memory pw kube ls -o table ``` ### Options ``` -h, --help help for ls -o, --output string Output format (json, table) ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw kube](/docs/cli/pw/kube) - Kubernetes commands # pw kube token > Source: https://parallelworks.com/docs/cli/pw/kube/token ## pw kube token Token to authenticate with the Kubernetes API ### Synopsis The **pw kube token** command must be followed by a cluster name. Use this command to get a token to authenticate with the Kubernetes API. ``` pw kube token [clientId] [flags] ``` ### Examples ``` # Get a token with the cluster name **demo** pw kube token demo ``` ### Options ``` -h, --help help for token ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw kube](/docs/cli/pw/kube) - Kubernetes commands # pw lustre > Source: https://parallelworks.com/docs/cli/pw/lustre ## pw lustre Manage Lustre filesystems ### Synopsis The **Lustre** command group lets you create, delete, list, and copy files to your Lustre filesystems. ``` pw lustre [flags] ``` ### Options ``` -h, --help help for lustre ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw](/docs/cli/pw) - The Parallel Works ACTIVATE CLI * [pw lustre ls](/docs/cli/pw/lustre/ls) - List all Lustre filesystems # pw lustre ls > Source: https://parallelworks.com/docs/cli/pw/lustre/ls ## pw lustre ls List all Lustre filesystems ``` pw lustre ls [flags] ``` ### Examples ``` # List all Lustre filesystems pw lustre ls # List all Lustre filesystems, displayed as a table # Tables display URI, CSP, provisioning status, and CSP URI pw lustre ls -o table ``` ### Options ``` -h, --help help for ls -o, --output string Output format. One of: table, json, list (default "table") ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw lustre](/docs/cli/pw/lustre) - Manage Lustre filesystems # pw marketplace > Source: https://parallelworks.com/docs/cli/pw/marketplace ## pw marketplace Manage marketplace items ``` pw marketplace [flags] ``` ### Options ``` -h, --help help for marketplace ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw](/docs/cli/pw) - The Parallel Works ACTIVATE CLI * [pw marketplace add-to-account](/docs/cli/pw/marketplace/add-to-account) - Add a marketplace item to your account * [pw marketplace export](/docs/cli/pw/marketplace/export) - Export marketplace items to bundle directories * [pw marketplace get](/docs/cli/pw/marketplace/get) - Show a marketplace item * [pw marketplace icon](/docs/cli/pw/marketplace/icon) - Manage marketplace item icons * [pw marketplace import](/docs/cli/pw/marketplace/import) - Recreate marketplace items from exported bundles * [pw marketplace ls](/docs/cli/pw/marketplace/ls) - List marketplace items * [pw marketplace publish](/docs/cli/pw/marketplace/publish) - Publish a new marketplace item * [pw marketplace remove-from-account](/docs/cli/pw/marketplace/remove-from-account) - Remove a marketplace workflow reference from your account * [pw marketplace rm](/docs/cli/pw/marketplace/rm) - Delete a marketplace item * [pw marketplace slug](/docs/cli/pw/marketplace/slug) - Check whether a marketplace slug is available * [pw marketplace update](/docs/cli/pw/marketplace/update) - Update a marketplace item's metadata * [pw marketplace version](/docs/cli/pw/marketplace/version) - Manage marketplace item versions # pw marketplace add-to-account > Source: https://parallelworks.com/docs/cli/pw/marketplace/add-to-account ## pw marketplace add-to-account Add a marketplace item to your account ### Synopsis Mirrors the marketplace "Add to account" action. Workflows are added as a reference to the marketplace version; storage and compute items are forked into an owned resource, which requires **--name**. ``` pw marketplace add-to-account [flags] ``` ### Examples ``` # Add the latest version of a workflow to your account pw marketplace add-to-account my-workflow # Add a specific workflow version pw marketplace add-to-account --version v1.0.0 my-workflow # Fork a storage item into an owned bucket pw marketplace add-to-account --name my-bucket shared-bucket ``` ### Options ``` --convert-to-local For remote workflows, convert to local by fetching the YAML --ephemeral For storage items, make the forked storage ephemeral -h, --help help for add-to-account --name string Name for the forked resource (storage/compute items) --version string Version of the item to add (default "latest") ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw marketplace](/docs/cli/pw/marketplace) - Manage marketplace items # pw marketplace export > Source: https://parallelworks.com/docs/cli/pw/marketplace/export ## pw marketplace export Export marketplace items to bundle directories ### Synopsis Writes marketplace items to directory bundles (marketplace.yaml, README.md, icon, and per-version settings) that **pw marketplace import** can recreate on another platform. With a single item **-o** is the bundle directory; with several items each bundle is written to **/**. Prompts for any missing input when run on a terminal. ``` pw marketplace export [slug...] [flags] ``` ### Examples ``` # Export an item to ./my-workflow pw marketplace export my-workflow # Export to a specific directory, overwriting existing contents pw marketplace export -o /tmp/my-workflow --force my-workflow # Export several items as subdirectories of /tmp/bundles pw marketplace export -o /tmp/bundles my-workflow my-bucket # Pick the items and destination interactively pw marketplace export ``` ### Options ``` --force Overwrite non-empty destination directories -h, --help help for export -o, --output string Destination directory (single item: the bundle dir, default ./; multiple items: parent dir for subdirs, default .) ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw marketplace](/docs/cli/pw/marketplace) - Manage marketplace items # pw marketplace get > Source: https://parallelworks.com/docs/cli/pw/marketplace/get ## pw marketplace get Show a marketplace item ``` pw marketplace get [flags] ``` ### Examples ``` # Show item details pw marketplace get my-workflow # Output as JSON pw marketplace get -o json my-workflow # Dump the workflow YAML of the latest version pw marketplace get --yaml my-workflow # Dump the markdown readme of a specific version pw marketplace get --markdown --version v1.0.0 my-workflow ``` ### Options ``` -h, --help help for get --markdown Print the markdown readme -o, --output string Output format (table, json, yaml) --version string Version to use with --yaml/--markdown (default "latest") --yaml Print the workflow YAML definition ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw marketplace](/docs/cli/pw/marketplace) - Manage marketplace items # pw marketplace icon > Source: https://parallelworks.com/docs/cli/pw/marketplace/icon ## pw marketplace icon Manage marketplace item icons ``` pw marketplace icon [flags] ``` ### Options ``` -h, --help help for icon ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw marketplace](/docs/cli/pw/marketplace) - Manage marketplace items * [pw marketplace icon get](/docs/cli/pw/marketplace/icon/get) - Download a marketplace item's icon * [pw marketplace icon rm](/docs/cli/pw/marketplace/icon/rm) - Remove a marketplace item's icon * [pw marketplace icon set](/docs/cli/pw/marketplace/icon/set) - Upload a marketplace item's icon # pw marketplace icon get > Source: https://parallelworks.com/docs/cli/pw/marketplace/icon/get ## pw marketplace icon get Download a marketplace item's icon ``` pw marketplace icon get [flags] ``` ### Examples ``` # Download an item's icon (file extension follows the image type) pw marketplace icon get my-workflow # Download to a specific file pw marketplace icon get -o ./icon.png my-workflow ``` ### Options ``` -h, --help help for get -o, --output string Destination file (default .) ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw marketplace icon](/docs/cli/pw/marketplace/icon) - Manage marketplace item icons # pw marketplace icon rm > Source: https://parallelworks.com/docs/cli/pw/marketplace/icon/rm ## pw marketplace icon rm Remove a marketplace item's icon ``` pw marketplace icon rm [flags] ``` ### Examples ``` # Remove an item's icon pw marketplace icon rm my-workflow ``` ### Options ``` -h, --help help for rm ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw marketplace icon](/docs/cli/pw/marketplace/icon) - Manage marketplace item icons # pw marketplace icon set > Source: https://parallelworks.com/docs/cli/pw/marketplace/icon/set ## pw marketplace icon set Upload a marketplace item's icon ``` pw marketplace icon set [flags] ``` ### Examples ``` # Upload an icon image (PNG/JPEG/GIF/WebP) pw marketplace icon set my-workflow ./icon.png ``` ### Options ``` -h, --help help for set ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw marketplace icon](/docs/cli/pw/marketplace/icon) - Manage marketplace item icons # pw marketplace import > Source: https://parallelworks.com/docs/cli/pw/marketplace/import ## pw marketplace import Recreate marketplace items from exported bundles ### Synopsis Reads bundles written by **pw marketplace export** and recreates the items by publishing each version through the platform's typed marketplace endpoints. The directory is either a single bundle or a folder whose subdirectories are bundles (as written by a multi-item export); pointing at a folder imports several items at once. Items are private unless visibility flags are passed. Prompts for any missing input when run on a terminal. ``` pw marketplace import [dir] [flags] ``` ### Examples ``` # Import a bundle interactively pw marketplace import ./my-workflow # Pick items to import from a directory of bundles pw marketplace import ./backups # Import under a new slug, visible platform-wide, without prompts pw marketplace import --slug my-workflow-copy --platform --yes ./my-workflow ``` ### Options ``` --group strings Make the item visible to a group (repeatable) -h, --help help for import --name string Display name to publish under (default: the bundle's name) --organization Make the item visible to the publisher's organization --partner Make the item visible to partner organizations --platform Make the item visible to all platform users --slug string Slug to publish under (default: the bundle's slug) --yes Skip the confirmation prompt ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw marketplace](/docs/cli/pw/marketplace) - Manage marketplace items # pw marketplace ls > Source: https://parallelworks.com/docs/cli/pw/marketplace/ls ## pw marketplace ls List marketplace items ``` pw marketplace ls [flags] ``` ### Examples ``` # List all marketplace items pw marketplace ls # List only items you published pw marketplace ls --mine # List as plain slugs (one per line) pw marketplace ls -o list # Output as JSON pw marketplace ls -o json ``` ### Options ``` --featured Only featured items -h, --help help for ls --mine Only items published by you --modifiable Only items you can modify --org Only items published as your organization -o, --output string Output format (table, json, list) --verified Only verified items ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw marketplace](/docs/cli/pw/marketplace) - Manage marketplace items # pw marketplace publish > Source: https://parallelworks.com/docs/cli/pw/marketplace/publish ## pw marketplace publish Publish a new marketplace item ``` pw marketplace publish [flags] ``` ### Examples ``` # Publish a local workflow from a YAML file (private by default) pw marketplace publish --name "My Workflow" --slug my-workflow --yaml ./workflow.yaml # Publish a remote workflow from a git repository, visible platform-wide pw marketplace publish --name "My Workflow" --slug my-workflow --repo https://github.com/org/repo --branch main --platform # Publish a storage item from a JSON file of publish-body fields pw marketplace publish --subtype aws-bucket --name "My Bucket" --slug my-bucket --json ./bucket.json # Publish a storage item from stdin echo '{"region":"us-east-1","versioning":true}' | pw marketplace publish --subtype aws-bucket --name "My Bucket" --slug my-bucket --json - ``` ### Options ``` --branch string Git branch for a remote workflow --description string Short summary of the item --featured Mark as featured (platform admins only) --group strings Make the item visible to a group (repeatable) -h, --help help for publish --json string Path to a JSON file with the subtype's publish-body fields, or - for stdin --markdown string Path to a markdown file used as the item readme --name string Display name on the marketplace --organization Make the item visible to the publisher's organization -o, --output string Output format (json) --partner Make the item visible to partner organizations --platform Make the item visible to all platform users --published-as-org Publish under the organization display name (org admins only) --readme string Path to the README within the repo --repo string Git repository URL for a remote workflow --slug string URL-friendly identifier --subtype string Item subtype for non-workflow publishing; one of: aws-bucket, aws-disk, aws-efs, aws-lustre, aws-slurm, azure-azfiles, azure-bucket, azure-disk, azure-managedlustre, azure-netappfiles, azure-slurm, existing, google-bucket, google-disk, google-filestore, google-managedlustre, google-slurm, local, openstack-slurm, oracle-bucket, oracle-oraclefs, oracle-slurm, remote --thumbnail string Path to the thumbnail image within the repo --verified Mark as verified (platform admins only) --version string Initial version label (must start with v) (default "v1.0.0") --workflow-yaml string Path to the workflow YAML within the repo --yaml string Path to a local workflow YAML file ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw marketplace](/docs/cli/pw/marketplace) - Manage marketplace items # pw marketplace remove-from-account > Source: https://parallelworks.com/docs/cli/pw/marketplace/remove-from-account ## pw marketplace remove-from-account Remove a marketplace workflow reference from your account ### Synopsis Removes a workflow's account-version reference. Forked storage and compute resources are owned resources; delete them under **pw storage** or **pw compute** instead. ``` pw marketplace remove-from-account [flags] ``` ### Examples ``` # Remove the latest version of a workflow from your account pw marketplace remove-from-account my-workflow # Remove a specific workflow version pw marketplace remove-from-account --version v1.0.0 my-workflow ``` ### Options ``` -h, --help help for remove-from-account --version string Version of the item to remove (default "latest") ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw marketplace](/docs/cli/pw/marketplace) - Manage marketplace items # pw marketplace rm > Source: https://parallelworks.com/docs/cli/pw/marketplace/rm ## pw marketplace rm Delete a marketplace item ``` pw marketplace rm [flags] ``` ### Examples ``` # Delete an item (asks for confirmation) pw marketplace rm my-workflow # Delete without confirmation pw marketplace rm --yes my-workflow ``` ### Options ``` -h, --help help for rm --yes Skip the confirmation prompt ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw marketplace](/docs/cli/pw/marketplace) - Manage marketplace items # pw marketplace slug > Source: https://parallelworks.com/docs/cli/pw/marketplace/slug ## pw marketplace slug Check whether a marketplace slug is available ``` pw marketplace slug [flags] ``` ### Examples ``` # Check slug availability (exits nonzero if taken) pw marketplace slug my-new-item ``` ### Options ``` -h, --help help for slug ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw marketplace](/docs/cli/pw/marketplace) - Manage marketplace items # pw marketplace update > Source: https://parallelworks.com/docs/cli/pw/marketplace/update ## pw marketplace update Update a marketplace item's metadata ### Synopsis Updates only the fields whose flags are passed. The visibility flags (**--platform**, **--partner**, **--organization**, **--group**) are the exception: passing any of them replaces the item's visibility as a whole, so include every audience the item should keep. ``` pw marketplace update [flags] ``` ### Examples ``` # Rename an item pw marketplace update --name "New Name" my-workflow # Make an item visible to the whole platform pw marketplace update --platform my-workflow # Make an item private again pw marketplace update --platform=false --partner=false --organization=false --group= my-workflow ``` ### Options ``` --description string Short summary of the item --featured Mark as featured (platform admins only) --group strings Make the item visible to a group (repeatable) -h, --help help for update --markdown string Path to a markdown file used as the item readme --name string Display name on the marketplace --organization Make the item visible to the publisher's organization -o, --output string Output format (json) --partner Make the item visible to partner organizations --platform Make the item visible to all platform users --published-as-org Publish under the organization display name (org admins only) --slug string New URL-friendly identifier --verified Mark as verified (platform admins only) ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw marketplace](/docs/cli/pw/marketplace) - Manage marketplace items # pw marketplace version > Source: https://parallelworks.com/docs/cli/pw/marketplace/version ## pw marketplace version Manage marketplace item versions ``` pw marketplace version [flags] ``` ### Options ``` -h, --help help for version ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw marketplace](/docs/cli/pw/marketplace) - Manage marketplace items * [pw marketplace version ls](/docs/cli/pw/marketplace/version/ls) - List versions of a marketplace item * [pw marketplace version publish](/docs/cli/pw/marketplace/version/publish) - Publish a new version of a marketplace item * [pw marketplace version rm](/docs/cli/pw/marketplace/version/rm) - Remove a version from a marketplace item # pw marketplace version ls > Source: https://parallelworks.com/docs/cli/pw/marketplace/version/ls ## pw marketplace version ls List versions of a marketplace item ``` pw marketplace version ls [flags] ``` ### Examples ``` # List versions of an item pw marketplace version ls my-workflow # List as plain version labels (one per line) pw marketplace version ls -o list my-workflow # Output versions with their settings as JSON pw marketplace version ls -o json my-workflow ``` ### Options ``` -h, --help help for ls -o, --output string Output format (table, json, list) ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw marketplace version](/docs/cli/pw/marketplace/version) - Manage marketplace item versions # pw marketplace version publish > Source: https://parallelworks.com/docs/cli/pw/marketplace/version/publish ## pw marketplace version publish Publish a new version of a marketplace item ``` pw marketplace version publish [flags] ``` ### Examples ``` # Add a local workflow version from a YAML file pw marketplace version publish --version v1.1.0 --yaml ./workflow.yaml my-workflow # Replace an existing version's variables pw marketplace version publish --version v1.1.0 --replace --yaml ./workflow.yaml my-workflow # Add a storage/compute version from a JSON file of version fields pw marketplace version publish --version v2.0.0 --json ./bucket.json my-bucket ``` ### Options ``` --branch string Git branch for a remote workflow -h, --help help for publish --json string Path to a JSON file with the subtype's version fields, or - for stdin -o, --output string Output format (json) --readme string Path to the README within the repo --replace Replace an existing version's variables instead of adding a new version --repo string Git repository URL for a remote workflow --thumbnail string Path to the thumbnail image within the repo --version string Version label to add (must start with v) --workflow-yaml string Path to the workflow YAML within the repo --yaml string Path to a local workflow YAML file ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw marketplace version](/docs/cli/pw/marketplace/version) - Manage marketplace item versions # pw marketplace version rm > Source: https://parallelworks.com/docs/cli/pw/marketplace/version/rm ## pw marketplace version rm Remove a version from a marketplace item ``` pw marketplace version rm [flags] ``` ### Examples ``` # Remove a version (the item must keep at least one) pw marketplace version rm my-workflow v1.0.0 # Remove without confirmation pw marketplace version rm --yes my-workflow v1.0.0 ``` ### Options ``` -h, --help help for rm --yes Skip the confirmation prompt ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw marketplace version](/docs/cli/pw/marketplace/version) - Manage marketplace item versions # pw nfs > Source: https://parallelworks.com/docs/cli/pw/nfs ## pw nfs Manage NFS storages ### Synopsis The **NFS** command group lets you manage your NFS storages. ``` pw nfs [flags] ``` ### Options ``` -h, --help help for nfs ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw](/docs/cli/pw) - The Parallel Works ACTIVATE CLI * [pw nfs ls](/docs/cli/pw/nfs/ls) - List all NFS Storages # pw nfs ls > Source: https://parallelworks.com/docs/cli/pw/nfs/ls ## pw nfs ls List all NFS Storages ``` pw nfs ls [flags] ``` ### Examples ``` # List all NFS Storages pw nfs ls # List all NFS Storages, displayed as a table # Tables display URI, CSP, provisioning status, type, region, and tags pw nfs ls -o table ``` ### Options ``` -h, --help help for ls -o, --output string Output format. One of: table, json, list (default "table") ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw nfs](/docs/cli/pw/nfs) - Manage NFS storages # pw orgs > Source: https://parallelworks.com/docs/cli/pw/orgs ## pw orgs Manage organizations ``` pw orgs [flags] ``` ### Options ``` -h, --help help for orgs ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw](/docs/cli/pw) - The Parallel Works ACTIVATE CLI * [pw orgs delete](/docs/cli/pw/orgs/delete) - Delete an organization * [pw orgs ls](/docs/cli/pw/orgs/ls) - List organizations # pw orgs delete > Source: https://parallelworks.com/docs/cli/pw/orgs/delete ## pw orgs delete Delete an organization ### Synopsis The **pw orgs delete** command deletes an organization and all its users, groups, and settings. This action is irreversible. You will be prompted to type the organization name to confirm. Use **-f** to skip the confirmation prompt. ``` pw orgs delete [flags] ``` ### Examples ``` # Delete an organization pw orgs delete my-org # Skip confirmation pw orgs delete -f my-org ``` ### Options ``` -f, --force Skip confirmation prompt -h, --help help for delete ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw orgs](/docs/cli/pw/orgs) - Manage organizations # pw orgs ls > Source: https://parallelworks.com/docs/cli/pw/orgs/ls ## pw orgs ls List organizations ### Synopsis The **pw orgs ls** command lists all organizations accessible to you. ``` pw orgs ls [flags] ``` ### Examples ``` # List all organizations pw orgs ls # List as JSON pw orgs ls -o json # List names only pw orgs ls -o list ``` ### Options ``` -h, --help help for ls -o, --output string Output format (table, json, list) (default "table") ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw orgs](/docs/cli/pw/orgs) - Manage organizations # pw sessions > Source: https://parallelworks.com/docs/cli/pw/sessions ## pw sessions Manage sessions ``` pw sessions [flags] ``` ### Options ``` -h, --help help for sessions ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw](/docs/cli/pw) - The Parallel Works ACTIVATE CLI * [pw sessions connect](/docs/cli/pw/sessions/connect) - Connect to a running session * [pw sessions create](/docs/cli/pw/sessions/create) - Create a new session on a remote resource * [pw sessions ls](/docs/cli/pw/sessions/ls) - List all sessions * [pw sessions open](/docs/cli/pw/sessions/open) - Open a session in the browser * [pw sessions stop](/docs/cli/pw/sessions/stop) - Stop and delete a session # pw sessions connect > Source: https://parallelworks.com/docs/cli/pw/sessions/connect ## pw sessions connect Connect to a running session ### Synopsis Connect to a running session by name. The session must already be running. For desktop sessions, this creates a local TCP listener that proxies traffic to the session's WebSocket endpoint. For tunnel sessions, this creates an SSH port forward to the session's remote host and port. VS Code sessions are not supported by connect. Use **pw session open** to open in the browser or **pw vscode** for local VS Code. Press Ctrl+C to disconnect. This does not stop the session. ``` pw sessions connect [flags] ``` ### Examples ``` # Connect to a desktop session pw session connect my-desktop # Connect to a tunnel session on a specific local port pw session connect --port 8080 my-tunnel ``` ### Options ``` -h, --help help for connect --port int Local port to use (0 = auto-select) ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw sessions](/docs/cli/pw/sessions) - Manage sessions # pw sessions create > Source: https://parallelworks.com/docs/cli/pw/sessions/create ## pw sessions create Create a new session on a remote resource ### Synopsis The **pw session create** command creates a new session on a remote resource. Supported session types: - **desktop** - VNC desktop session - **vscode** - VS Code server session - **tunnel** - TCP port tunnel (requires --remote-port) By default, the command returns immediately after creating the session. Use **--wait** to wait for the session to be running before exiting. **--open** and **--connect** imply **--wait**. Resource names can be specified in the following formats: - **workspace** or **user-workspace** - your user workspace - **pw://username/name** - full format with explicit username - **pw://name** - managed cluster by name in your organization - **name** - short format where username defaults to your username By default a session runs on the cluster's login node. To run it on a compute node instead, either schedule a new worker with **--environment**, or reuse a worker you already have with **--worker**: - **--environment** submits a scheduler job for a dedicated worker and starts the session on it once the job runs. Pass **--param** to set the environment's scheduling parameters, and run **pw environments get** to see which parameters it accepts. Scheduling is queued, so pair this with **--wait**. - **--worker** starts the session on an existing connected worker, as listed by **pw workers ls**. This skips the queue. ``` pw sessions create --type TYPE [flags] ``` ### Examples ``` # Create a desktop session on your user workspace pw session create --type desktop workspace # Create a desktop session on a resource pw session create --type desktop my-cluster # Create a VS Code session pw session create --type vscode my-cluster # Create a VS Code session opening a specific directory pw session create --type vscode --directory '~/projects' my-cluster # Create a tunnel session forwarding a remote port pw session create --type tunnel --remote-port 8080 my-cluster # Create and immediately open in the browser pw session create --type desktop --open my-cluster # Create a session with a custom name pw session create --type tunnel --name my-tunnel --remote-port 8080 my-cluster # Create and immediately connect (port forward) pw session create --type tunnel --connect --port 8080 --remote-port 3000 my-cluster # Create a public session anyone can open without logging in pw session create --type desktop --public my-cluster # Schedule a desktop session onto a compute environment pw session create --type desktop --environment gpu-large --wait my-hpc # Schedule with environment parameters pw session create --type desktop --environment gpu-large --param numNodes=2 --wait my-hpc # Start a session on a worker that is already running pw session create --type desktop --worker 60c72b2f9b1e8d001c8e4f3a my-hpc ``` ### Options ``` --connect Connect (port forward) after creation (desktop and tunnel only, implies --wait) --directory string Directory to open in VS Code --environment string Schedule the session onto a compute environment, by name or ID -h, --help help for create --name string Custom session name (default: _) --open Open the session in the browser after creation (implies --wait) --param stringArray Scheduling parameter for --environment as key=value (repeatable) --port int Local port for --connect (0 = auto-select) --public Make the session publicly accessible: anyone with the link can open it without logging in. Requires your organization to allow public sessions. --remote-host string Remote host for tunnel type (default "localhost") --remote-port int Remote port (required for tunnel type) --type string Session type: desktop, vscode, tunnel (required) --wait Wait for the session to be running before exiting --worker string Run the session on an existing compute worker, by ID ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw sessions](/docs/cli/pw/sessions) - Manage sessions # pw sessions ls > Source: https://parallelworks.com/docs/cli/pw/sessions/ls ## pw sessions ls List all sessions ``` pw sessions ls [flags] ``` ### Examples ``` # List all sessions pw session ls # List all sessions, displayed as a table # Tables display URI, Status, Local Port, Remote Host, Remote Port, and Workflow Run pw sessions ls -o table # List only desktop sessions pw session ls --type desktop ``` ### Options ``` -h, --help help for ls -o, --output string Output format (json, table) -t, --type string Filter by session type (desktop, vscode, tunnel) ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw sessions](/docs/cli/pw/sessions) - Manage sessions # pw sessions open > Source: https://parallelworks.com/docs/cli/pw/sessions/open ## pw sessions open Open a session in the browser ### Synopsis Open a running session in your default browser. For desktop sessions, opens the VNC viewer in the browser. For VS Code sessions, opens the VS Code server in the browser. For tunnel sessions, opens the session page in the browser. The session name can be found using **pw session ls**. ``` pw sessions open [flags] ``` ### Examples ``` # Open a desktop session in the browser pw session open my-desktop # Open a vscode session in the browser pw session open my-vscode ``` ### Options ``` -h, --help help for open ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw sessions](/docs/cli/pw/sessions) - Manage sessions # pw sessions stop > Source: https://parallelworks.com/docs/cli/pw/sessions/stop ## pw sessions stop Stop and delete a session ### Synopsis The **pw session stop** command stops a running session and deletes it. The session name can be found using **pw session ls**. ``` pw sessions stop [flags] ``` ### Examples ``` # Stop a desktop session pw session stop desktop_1771523513 # Stop a tunnel session pw session stop tunnel_1771523513 ``` ### Options ``` -h, --help help for stop ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw sessions](/docs/cli/pw/sessions) - Manage sessions # pw ssh > Source: https://parallelworks.com/docs/cli/pw/ssh ## pw ssh Initiate an SSH connection to a resource ### Synopsis The **pw ssh** command initiates an SSH connection to a specific compute resource. The resource has to be running, and you must have SSH access to it. Resource names can be specified in the following formats: - **pw://username/name** - full format with explicit username - **pw://name** - managed cluster by name in your organization - **name** - short format where username defaults to your username - **worker/id** - compute node running one of your workers, as listed by **pw workers ls** ``` pw ssh [command] [flags] ``` ### Examples ``` # Interactively connect to a resource named 'my-resource' owned by you pw ssh my-resource # Interactively connect to a resource owned by another user pw ssh pw://Jake.Thayne/my-resource # Interactively connect to a managed cluster in your organization pw ssh my-managed-cluster pw ssh pw://my-managed-cluster # Interactively connect to your user workspace pw ssh workspace # Interactively connect to the compute node running one of your workers pw ssh worker/60c72b2f9b1e8d001c8e4f3a # Run the "hostname" command on a resource and exit pw ssh my-resource hostname # Run the "hostname" command on your user workspace and exit pw ssh workspace hostname # Connect to a node via a pw:// jump host (username defaults to resource username) pw ssh -J pw://Jake.Thayne/my-cluster 10.0.1.5 # Connect to a node via a jump host with an explicit username pw ssh -J pw://Jake.Thayne/my-cluster alice@10.0.1.5 # Run as a ProxyCommand for SSH ssh -i ~/.ssh/pwcli -o ProxyCommand="pw ssh --proxy-command %h" user@my-resource ssh -i ~/.ssh/pwcli -o ProxyCommand="pw ssh --proxy-command %h" user@pw://Jake.Thayne/my-resource ssh -i ~/.ssh/pwcli -o ProxyCommand="pw ssh --proxy-command %h" user@workspace # Run as a ProxyCommand for SSH, with port forward ssh -i ~/.ssh/pwcli -L 8080:localhost:80 -o ProxyCommand="pw ssh --proxy-command %h" user@my-resource ssh -i ~/.ssh/pwcli -R 80:localhost:8000 -o ProxyCommand="pw ssh --proxy-command %h" user@workspace # Run as a ProxyCommand for SCP scp -i ~/.ssh/pwcli -o ProxyCommand="pw ssh --proxy-command %h" file.txt user@my-resource:/home/user/file.txt scp -i ~/.ssh/pwcli -o ProxyCommand="pw ssh --proxy-command %h" file.txt user@workspace:/home/user/file.txt ``` ### Options ``` -h, --help help for ssh -J, --jump string Connect to the target via a pw:// jump host (similar to ssh -J) --keepalive int Interval in seconds between keepalive messages; an unresponsive connection is closed (0 to disable) (default 30) -L, --local stringArray Forward local [bind_address:]port to remote host:hostport --proxy-command Run as a proxy command for SSH or SCP -R, --remote stringArray Forward remote [bind_address:]port to local host:hostport -X, --x11 Enable X11 forwarding ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw](/docs/cli/pw) - The Parallel Works ACTIVATE CLI # pw ssh-public-keys > Source: https://parallelworks.com/docs/cli/pw/ssh-public-keys ## pw ssh-public-keys Get the SSH public keys for a user ### Synopsis The **pw ssh-public-keys** command retrieves the SSH public keys for a specific user. ``` pw ssh-public-keys [flags] ``` ### Options ``` -h, --help help for ssh-public-keys ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw](/docs/cli/pw) - The Parallel Works ACTIVATE CLI # pw subdomains > Source: https://parallelworks.com/docs/cli/pw/subdomains ## pw subdomains Reserve session subdomains ### Synopsis Reserve session subdomains so no other user can claim them. A reserved subdomain stays yours even while no session is serving it — use it later with **pw endpoints --subdomain NAME** or when creating a session. Requires the platform to have a sessions domain registered. ``` pw subdomains [flags] ``` ### Options ``` -h, --help help for subdomains ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw](/docs/cli/pw) - The Parallel Works ACTIVATE CLI * [pw subdomains list](/docs/cli/pw/subdomains/list) - List your reserved subdomains * [pw subdomains release](/docs/cli/pw/subdomains/release) - Release a reserved subdomain * [pw subdomains reserve](/docs/cli/pw/subdomains/reserve) - Reserve a subdomain for your user # pw subdomains list > Source: https://parallelworks.com/docs/cli/pw/subdomains/list ## pw subdomains list List your reserved subdomains ``` pw subdomains list [flags] ``` ### Options ``` -h, --help help for list ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw subdomains](/docs/cli/pw/subdomains) - Reserve session subdomains # pw subdomains release > Source: https://parallelworks.com/docs/cli/pw/subdomains/release ## pw subdomains release Release a reserved subdomain ``` pw subdomains release [flags] ``` ### Options ``` -h, --help help for release ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw subdomains](/docs/cli/pw/subdomains) - Reserve session subdomains # pw subdomains reserve > Source: https://parallelworks.com/docs/cli/pw/subdomains/reserve ## pw subdomains reserve Reserve a subdomain for your user ### Synopsis Reserve a subdomain: a label (my-app), which lands on the platform's default sessions domain, or the full host under any registered sessions domain (my-app.). ``` pw subdomains reserve [flags] ``` ### Examples ``` # Reserve a label on the default sessions domain pw subdomains reserve my-app # Reserve the full host under a specific sessions domain pw subdomains reserve my-app.sessions.example.com ``` ### Options ``` -h, --help help for reserve ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw subdomains](/docs/cli/pw/subdomains) - Reserve session subdomains # pw upgrade > Source: https://parallelworks.com/docs/cli/pw/upgrade ## pw upgrade Update the version of the CLI ### Synopsis The **pw upgrade** command updates the current version of the PW CLI to the latest from the platform that it is currently authenticated to. Pass **--canary** to upgrade to the canary build instead. ``` pw upgrade [flags] ``` ### Options ``` --canary Upgrade to the canary build instead of the authenticated platform's version -h, --help help for upgrade ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw](/docs/cli/pw) - The Parallel Works ACTIVATE CLI # pw users > Source: https://parallelworks.com/docs/cli/pw/users ## pw users Manage organization users ``` pw users [flags] ``` ### Options ``` -h, --help help for users ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw](/docs/cli/pw) - The Parallel Works ACTIVATE CLI * [pw users delete](/docs/cli/pw/users/delete) - Delete a user from the organization * [pw users ls](/docs/cli/pw/users/ls) - List organization users * [pw users reset-onboarding](/docs/cli/pw/users/reset-onboarding) - Reset onboarding state for one or more users # pw users delete > Source: https://parallelworks.com/docs/cli/pw/users/delete ## pw users delete Delete a user from the organization ### Synopsis The **pw users delete** command deletes a user and cleans up all their resources. By default it uses the organization from your current context. Use **--org** to target a different organization. You will be prompted to type the username to confirm deletion. Use **-f** to skip the confirmation prompt. ``` pw users delete [flags] ``` ### Examples ``` # Delete a user pw users delete jake.thayne # Delete a user from a specific organization pw users delete --org my-org jake.thayne # Skip confirmation pw users delete -f jake.thayne ``` ### Options ``` -f, --force Skip confirmation prompt -h, --help help for delete --org string Target organization (defaults to current context) ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw users](/docs/cli/pw/users) - Manage organization users # pw users ls > Source: https://parallelworks.com/docs/cli/pw/users/ls ## pw users ls List organization users ### Synopsis The **pw users ls** command lists all users in the organization. By default it uses the organization from your current context. Use **--org** to target a different organization. ``` pw users ls [flags] ``` ### Examples ``` # List all users pw users ls # List users in a specific organization pw users ls --org my-org # List as JSON pw users ls -o json # Search for a user pw users ls --search john # List only active users pw users ls --active true ``` ### Options ``` --active string Filter by active status (all, true, false) -h, --help help for ls --limit int Maximum number of users to return (default 50) --org string Target organization (defaults to current context) -o, --output string Output format (table, json, list) (default "table") --search string Filter by username, email, or name --sort-by string Sort by field (username, email, lastLogin, createdAt) --sort-dir string Sort direction (asc, desc) ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw users](/docs/cli/pw/users) - Manage organization users # pw users reset-onboarding > Source: https://parallelworks.com/docs/cli/pw/users/reset-onboarding ## pw users reset-onboarding Reset onboarding state for one or more users ### Synopsis The **pw users reset-onboarding** command marks the given users as needing to complete onboarding again. Requires the **org:users** role in the target organization (platform admins also qualify). By default it uses the organization from your current context. Use **--org** to target a different organization. ``` pw users reset-onboarding [username...] [flags] ``` ### Examples ``` # Reset one user pw users reset-onboarding alice # Reset multiple users in a specific organization pw users reset-onboarding --org my-org alice bob # Skip confirmation pw users reset-onboarding -f alice # Output as JSON pw users reset-onboarding -o json alice bob ``` ### Options ``` -f, --force Skip confirmation prompt -h, --help help for reset-onboarding --org string Target organization (defaults to current context) -o, --output string Output format (table, json) (default "table") ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw users](/docs/cli/pw/users) - Manage organization users # pw variables > Source: https://parallelworks.com/docs/cli/pw/variables ## pw variables Manage your user variables ``` pw variables [flags] ``` ### Examples ``` # Set a secret variable — value is prompted (hidden), keeping it out of shell history pw variables -k GITHUB_TOKEN # Set a public (non-secret) variable inline pw variables --public -k REGION --value us-east-1 # Fully interactive (prompts for key, secret, and value) pw variables # Pass a secret value inline (NOTE: visible in shell history — prefer the prompt above) pw variables -k GITHUB_TOKEN --value ghp_xxx # List your variables pw variables list ``` ### Options ``` -h, --help help for variables -k, --key string Variable key --public Make the variable public (non-secret); variables are secret by default --value string Variable value (omit to be prompted; inline secret values are visible in shell history) ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw](/docs/cli/pw) - The Parallel Works ACTIVATE CLI * [pw variables delete](/docs/cli/pw/variables/delete) - Delete a user variable * [pw variables list](/docs/cli/pw/variables/list) - List your user variables # pw variables delete > Source: https://parallelworks.com/docs/cli/pw/variables/delete ## pw variables delete Delete a user variable ``` pw variables delete [flags] ``` ### Examples ``` # Delete a variable pw variables delete GITHUB_TOKEN ``` ### Options ``` -h, --help help for delete ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw variables](/docs/cli/pw/variables) - Manage your user variables # pw variables list > Source: https://parallelworks.com/docs/cli/pw/variables/list ## pw variables list List your user variables ``` pw variables list [flags] ``` ### Examples ``` # List your variables pw variables list # Output as JSON pw variables list -o json ``` ### Options ``` -h, --help help for list -o, --output string Output format (interactive, json) (default "interactive") ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw variables](/docs/cli/pw/variables) - Manage your user variables # pw version > Source: https://parallelworks.com/docs/cli/pw/version ## pw version Show detailed CLI version information ``` pw version [flags] ``` ### Options ``` -h, --help help for version -o, --output string Output format (text, json) (default "text") ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw](/docs/cli/pw) - The Parallel Works ACTIVATE CLI # pw vscode > Source: https://parallelworks.com/docs/cli/pw/vscode ## pw vscode Open VS Code connected to a remote resource ### Synopsis Open Visual Studio Code connected to a remote resource via SSH. This configures VS Code's Remote-SSH extension to connect through the Parallel Works platform and launches VS Code. Requires the **code** CLI on your PATH and the Remote-SSH extension installed in VS Code. By default VS Code opens on the cluster's login node. To open it on a compute node instead, pick one of: - **--environment** schedules a new worker on a compute environment and opens VS Code on its node once the scheduler starts it. Pass **--param** to set the environment's scheduling parameters, and run **pw environments get** to see which parameters it accepts. - **--worker** opens on the node of a worker you already have, as listed by **pw workers ls**. This skips the queue. - **--jump-node** opens on a compute node by hostname. Worker sessions connect through the worker's own SSH server on the compute node, authenticated by your platform-registered key. Clusters whose agent is too old to run one, and **--jump-node**, instead go through the login node to the node's system SSH daemon, which must accept your key on its own. A worker scheduled this way outlives the editor. Release it with **pw workers delete** when you are done. ``` pw vscode [flags] [path] ``` ### Examples ``` # Open VS Code on a resource pw vscode my-cluster # Open VS Code in a specific directory pw vscode my-cluster /home/user/project # Open VS Code on another user's resource pw vscode otheruser/their-cluster # Schedule a compute node and open VS Code on it pw vscode --environment gpu-large my-hpc # Schedule with environment parameters pw vscode --environment gpu-large --param numNodes=2 my-hpc # Open VS Code on the compute node running a worker pw vscode --worker 60c72b2f9b1e8d001c8e4f3a my-hpc # Open VS Code on a compute node by hostname, via the login node pw vscode --jump-node node-0002 my-hpc ``` ### Options ``` --environment string Schedule a new worker on this compute environment, by name or ID, and open on its node -h, --help help for vscode --jump-node string Open on this compute node by hostname, jumping through the login node to the node's system SSH daemon --param stringArray Scheduling parameter for --environment as key=value (repeatable) --partition string Scheduler partition for a new worker, for use without --environment --worker string Open on the compute node running this worker, by ID ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw](/docs/cli/pw) - The Parallel Works ACTIVATE CLI # pw workers > Source: https://parallelworks.com/docs/cli/pw/workers ## pw workers Manage compute workers ### Synopsis The **pw workers** command group has commands for managing compute workers. A worker is a scheduler job that runs on a cluster's compute nodes and hosts sessions. Workers are normally created for you when you schedule a session onto an environment with **pw session create --environment**. Create one directly to pre-provision capacity, then start sessions on it with **pw session create --worker**. Workers belong to you rather than to a cluster, and are referenced by ID as shown by **pw workers ls**. ``` pw workers [flags] ``` ### Options ``` -h, --help help for workers ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw](/docs/cli/pw) - The Parallel Works ACTIVATE CLI * [pw workers create](/docs/cli/pw/workers/create) - Pre-provision a compute worker * [pw workers delete](/docs/cli/pw/workers/delete) - Stop and delete a compute worker * [pw workers get](/docs/cli/pw/workers/get) - Get details of a compute worker * [pw workers ls](/docs/cli/pw/workers/ls) - List your compute workers # pw workers create > Source: https://parallelworks.com/docs/cli/pw/workers/create ## pw workers create Pre-provision a compute worker ### Synopsis The **pw workers create** command submits a scheduler job that pre-provisions a compute worker, so sessions can start on it without waiting in the queue. Start a session on it with **pw session create --worker**. The cluster can be given as **pw://user/cluster**, **pw://cluster** or **cluster**, where an omitted user defaults to your username. Pass **--environment** to schedule the worker onto an environment, which determines the partition and validates **--param** values against the environment's schema. Run **pw environments get** to see which parameters an environment accepts. Scheduling is queued, so the command returns as soon as the job is submitted. Use **--wait** to wait for the worker's job to run and its tunnel to connect. ``` pw workers create [flags] ``` ### Examples ``` # Pre-provision a worker on an environment pw workers create --environment gpu-large my-hpc # Request two nodes for a longer wall time pw workers create --environment gpu-large --param numNodes=2 --param walltime=04:00:00 my-hpc # Pre-provision on a partition directly, without an environment pw workers create --partition gpu my-hpc # Wait for the worker to be ready pw workers create --environment gpu-large --wait my-hpc ``` ### Options ``` --environment string Environment to schedule the worker onto, by name or ID -h, --help help for create --param stringArray Scheduling parameter as key=value (repeatable) --partition string Scheduler partition to use when no environment is given --wait Wait for the worker to connect before exiting ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw workers](/docs/cli/pw/workers) - Manage compute workers # pw workers delete > Source: https://parallelworks.com/docs/cli/pw/workers/delete ## pw workers delete Stop and delete a compute worker ### Synopsis The **pw workers delete** command stops a compute worker's scheduler job and deletes it. Any sessions running on the worker stop with it. Worker IDs are shown by **pw workers ls**. ``` pw workers delete [flags] ``` ### Examples ``` # Delete a worker pw workers delete 60c72b2f9b1e8d001c8e4f3a ``` ### Options ``` -h, --help help for delete ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw workers](/docs/cli/pw/workers) - Manage compute workers # pw workers get > Source: https://parallelworks.com/docs/cli/pw/workers/get ## pw workers get Get details of a compute worker ### Synopsis The **pw workers get** command shows a compute worker's status, the environment it was scheduled onto, and the scheduler job backing it. Worker IDs are shown by **pw workers ls**. ``` pw workers get [flags] ``` ### Examples ``` # Get a worker pw workers get 60c72b2f9b1e8d001c8e4f3a # Get as JSON pw workers get -o json 60c72b2f9b1e8d001c8e4f3a ``` ### Options ``` -h, --help help for get -o, --output string Output format (table, json) (default "table") ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw workers](/docs/cli/pw/workers) - Manage compute workers # pw workers ls > Source: https://parallelworks.com/docs/cli/pw/workers/ls ## pw workers ls List your compute workers ### Synopsis The **pw workers ls** command lists your compute workers across all clusters. Use **--cluster** to list only the workers on one cluster. The cluster can be given as **pw://user/cluster**, **pw://cluster** or **cluster**, where an omitted user defaults to your username. ``` pw workers ls [flags] ``` ### Examples ``` # List all of your workers pw workers ls # List only connected workers pw workers ls --status connected # List the workers on one cluster pw workers ls --cluster my-hpc # List as JSON pw workers ls -o json ``` ### Options ``` --cluster string Filter by cluster -h, --help help for ls --limit int Maximum number of workers to return (default 100, max 500) -o, --output string Output format (table, json, list) (default "table") --skip int Number of workers to skip for pagination --status string Filter by status (pending, queued, starting, connected, stopping, stopped, error) ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw workers](/docs/cli/pw/workers) - Manage compute workers # pw workflows > Source: https://parallelworks.com/docs/cli/pw/workflows ## pw workflows Manage workflows ``` pw workflows [flags] ``` ### Options ``` -h, --help help for workflows ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw](/docs/cli/pw) - The Parallel Works ACTIVATE CLI * [pw workflows create](/docs/cli/pw/workflows/create) - Create a new workflow * [pw workflows delete](/docs/cli/pw/workflows/delete) - Delete a workflow * [pw workflows get](/docs/cli/pw/workflows/get) - Get details of a workflow * [pw workflows ls](/docs/cli/pw/workflows/ls) - List all workflows * [pw workflows run](/docs/cli/pw/workflows/run) - Run a saved workflow or a local YAML file * [pw workflows runs](/docs/cli/pw/workflows/runs) - Manage workflow runs * [pw workflows update](/docs/cli/pw/workflows/update) - Update a workflow # pw workflows create > Source: https://parallelworks.com/docs/cli/pw/workflows/create ## pw workflows create Create a new workflow ``` pw workflows create [flags] ``` ### Examples ``` # Create a local workflow with default template pw workflows create my-workflow # Create a workflow from a YAML file pw workflows create --yaml workflow.yaml my-workflow # Create a workflow with a display name pw workflows create --display-name "My Workflow" my-workflow ``` ### Options ``` --description string Description of the workflow --display-name string Display name for the workflow -h, --help help for create -o, --output string Output format (json) --yaml string Path to YAML file for workflow definition ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw workflows](/docs/cli/pw/workflows) - Manage workflows # pw workflows delete > Source: https://parallelworks.com/docs/cli/pw/workflows/delete ## pw workflows delete Delete a workflow ``` pw workflows delete [flags] ``` ### Examples ``` # Delete a workflow pw workflows delete my-workflow ``` ### Options ``` -h, --help help for delete ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw workflows](/docs/cli/pw/workflows) - Manage workflows # pw workflows get > Source: https://parallelworks.com/docs/cli/pw/workflows/get ## pw workflows get Get details of a workflow ``` pw workflows get [flags] ``` ### Examples ``` # Get workflow details pw workflows get my-workflow # Get workflow details as JSON pw workflows get -o json my-workflow # Get workflow YAML definition pw workflows get -o yaml my-workflow ``` ### Options ``` -h, --help help for get -o, --output string Output format (json, yaml) ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw workflows](/docs/cli/pw/workflows) - Manage workflows # pw workflows ls > Source: https://parallelworks.com/docs/cli/pw/workflows/ls ## pw workflows ls List all workflows ``` pw workflows ls [flags] ``` ### Examples ``` # List all workflows pw workflows ls # List as plain names (one per line) pw workflows ls -o list # Output as JSON pw workflows ls -o json ``` ### Options ``` -h, --help help for ls -o, --output string Output format (json, list) ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw workflows](/docs/cli/pw/workflows) - Manage workflows # pw workflows run > Source: https://parallelworks.com/docs/cli/pw/workflows/run ## pw workflows run Run a saved workflow or a local YAML file ``` pw workflows run [flags] ``` ### Examples ``` # Run a saved workflow by name pw workflows run my-workflow # Run a marketplace workflow by slug pw workflows run marketplace/my-marketplace-item # Run a workflow from a local YAML file pw workflows run ./my-workflow.yaml # Run with input parameters pw workflows run -i '{"param1": "value1"}' my-workflow # Run with inputs from a JSON file pw workflows run -i inputs.json my-workflow # Run with saved inputs pw workflows run --saved-inputs my-inputs my-workflow # Run with saved inputs, overriding individual values from --inputs pw workflows run --saved-inputs my-inputs -i '{"param1": "value1"}' my-workflow # Validate workflow without executing (dry run) pw workflows run --dry-run my-workflow # Run with a custom display name pw workflows run --name "Test run with new params" my-workflow # Output as JSON pw workflows run -o json my-workflow ``` ### Options ``` --dry-run Validate only, don't execute -h, --help help for run -i, --inputs string JSON string or file path with input values --name string Custom display name for the run -o, --output string Output format (interactive, json, text) (default "interactive") --saved-inputs string Name of saved inputs on the workflow to load input values from (overridden by --inputs) ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw workflows](/docs/cli/pw/workflows) - Manage workflows # pw workflows runs > Source: https://parallelworks.com/docs/cli/pw/workflows/runs ## pw workflows runs Manage workflow runs ``` pw workflows runs [flags] ``` ### Options ``` -h, --help help for runs ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw workflows](/docs/cli/pw/workflows) - Manage workflows * [pw workflows runs cancel](/docs/cli/pw/workflows/runs/cancel) - Cancel a running workflow run * [pw workflows runs clean](/docs/cli/pw/workflows/runs/clean) - Delete workflow runs based on filters * [pw workflows runs errors](/docs/cli/pw/workflows/runs/errors) - Show errors from a workflow run * [pw workflows runs list](/docs/cli/pw/workflows/runs/list) - List workflow runs * [pw workflows runs logs](/docs/cli/pw/workflows/runs/logs) - Fetch workflow run logs * [pw workflows runs view](/docs/cli/pw/workflows/runs/view) - View a workflow run # pw workflows runs cancel > Source: https://parallelworks.com/docs/cli/pw/workflows/runs/cancel ## pw workflows runs cancel Cancel a running workflow run ``` pw workflows runs cancel [flags] ``` ### Examples ``` # Cancel a run by slug pw workflows runs cancel swift-falcon-17 ``` ### Options ``` -h, --help help for cancel ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw workflows runs](/docs/cli/pw/workflows/runs) - Manage workflow runs # pw workflows runs clean > Source: https://parallelworks.com/docs/cli/pw/workflows/runs/clean ## pw workflows runs clean Delete workflow runs based on filters ``` pw workflows runs clean [flags] ``` ### Examples ``` # Delete runs older than 7 days pw workflows runs clean --older-than-days 7 # Delete all completed runs pw workflows runs clean --status completed # Delete specific runs by slug pw workflows runs clean --slugs swift-falcon-17,quiet-river-83 # Delete completed runs older than 30 days pw workflows runs clean --older-than-days 30 --status completed ``` ### Options ``` -h, --help help for clean --older-than-days int Delete runs older than N days --slugs string Comma-separated list of run slugs to delete --status string Delete runs with status (completed, error, canceled) ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw workflows runs](/docs/cli/pw/workflows/runs) - Manage workflow runs # pw workflows runs errors > Source: https://parallelworks.com/docs/cli/pw/workflows/runs/errors ## pw workflows runs errors Show errors from a workflow run ### Synopsis Extract and display failed jobs and steps from a workflow run with log tails. ``` pw workflows runs errors [flags] ``` ### Examples ``` # Show errors as JSON (default) pw workflows runs errors swift-falcon-17 # Show errors as text pw workflows runs errors -o text swift-falcon-17 # Show last 100 lines of logs per failed step pw workflows runs errors --tail 100 swift-falcon-17 ``` ### Options ``` -h, --help help for errors -o, --output string Output format (json or text) (default "json") --tail int Lines of log tail per failed step (default 50) ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw workflows runs](/docs/cli/pw/workflows/runs) - Manage workflow runs # pw workflows runs list > Source: https://parallelworks.com/docs/cli/pw/workflows/runs/list ## pw workflows runs list List workflow runs ``` pw workflows runs list [flags] ``` ### Examples ``` # List all workflow runs pw workflows runs list # List runs with a specific status pw workflows runs list --status completed # List runs for a specific workflow pw workflows runs list --workflow my-workflow # Search runs by name or slug pw workflows runs list --search "my run" # Output as JSON pw workflows runs list -o json ``` ### Options ``` -h, --help help for list --limit int Maximum number of runs to return (default 50) --offset int Number of runs to skip -o, --output string Output format (json, table) --search string Search by name or slug --status string Filter by status (running, completed, error, canceled) --workflow string Filter by workflow name ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw workflows runs](/docs/cli/pw/workflows/runs) - Manage workflow runs # pw workflows runs logs > Source: https://parallelworks.com/docs/cli/pw/workflows/runs/logs ## pw workflows runs logs Fetch workflow run logs ### Synopsis Fetch step logs from a workflow run. By default shows all steps; use filters to narrow output. ``` pw workflows runs logs [flags] ``` ### Examples ``` # Show all logs for a run pw workflows runs logs swift-falcon-17 # Show only failed step logs pw workflows runs logs --failed swift-falcon-17 # Show logs for a specific job and step pw workflows runs logs --job build --step run-tests swift-falcon-17 # Show last 50 lines per step pw workflows runs logs --tail 50 swift-falcon-17 # Follow logs until run completes pw workflows runs logs -f swift-falcon-17 # Output as JSON pw workflows runs logs -o json swift-falcon-17 # Show the run-level executor log (useful when a step fails before producing its own log) pw workflows runs logs --run-level swift-falcon-17 ``` ### Options ``` --failed Only show logs from failed/errored steps -f, --follow Poll and stream new lines until run completes -h, --help help for logs --job string Filter to a specific job name -o, --output string Output format (json) --run-level Fetch the run-level executor log (logs.out) instead of per-step logs --step string Filter to a specific step by name or index number (requires --job) --tail int Last N lines per step (0 = all) ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw workflows runs](/docs/cli/pw/workflows/runs) - Manage workflow runs # pw workflows runs view > Source: https://parallelworks.com/docs/cli/pw/workflows/runs/view ## pw workflows runs view View a workflow run ``` pw workflows runs view [flags] ``` ### Examples ``` # View a run interactively pw workflows runs view swift-falcon-17 # View a run by ID pw workflows runs view 507f1f77bcf86cd799439011 # Print run details as text pw workflows runs view -o text swift-falcon-17 # Output as JSON pw workflows runs view -o json swift-falcon-17 ``` ### Options ``` -h, --help help for view -o, --output string Output format (interactive, text, json) (default "interactive") ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw workflows runs](/docs/cli/pw/workflows/runs) - Manage workflow runs # pw workflows update > Source: https://parallelworks.com/docs/cli/pw/workflows/update ## pw workflows update Update a workflow ``` pw workflows update [flags] ``` ### Examples ``` # Update workflow YAML from a file pw workflows update --yaml workflow.yaml my-workflow # Update workflow display name pw workflows update --display-name "My Workflow" my-workflow # Update workflow description pw workflows update --description "Runs batch jobs" my-workflow # Update multiple fields at once pw workflows update --yaml workflow.yaml --display-name "New Name" my-workflow ``` ### Options ``` --description string New description for the workflow --display-name string New display name for the workflow -h, --help help for update -o, --output string Output format (json) --yaml string Path to YAML file to replace workflow definition ``` ### Options inherited from parent commands ``` --context string The context to use. Overrides PW_CONTEXT environment variable and current context from config. --platform-host string The Parallel Works ACTIVATE platform host to use. Will override any other platform host settings. -v, --verbose Enable verbose logging ``` ### SEE ALSO * [pw workflows](/docs/cli/pw/workflows) - Manage workflows # Compute > Source: https://parallelworks.com/docs/compute # Compute ACTIVATE can provision compute in a cloud account or connect infrastructure that your organization already operates. Choose a resource type based on who owns the infrastructure and how much of it you want ACTIVATE to manage. ## Choose a Compute Resource | Resource type | Best when | What ACTIVATE manages | Start here | |---|---|---|---| | **Provisioned cloud cluster** | You want on-demand compute in a connected cloud account | Provisions the cluster from an ACTIVATE configuration and lets you start, stop, and reconfigure it | [Create a cloud cluster](/docs/compute/creating-clusters) | | **Managed cluster** | Your organization operates a Linux HPC cluster and wants a shared ACTIVATE integration | Monitors registered nodes, can synchronize access, and supports connections through outbound agent tunnels; it does not provision the hardware | [Set up a managed cluster](/docs/compute/managed-clusters) | | **Existing cluster** | You need a connection from your ACTIVATE account to an HPC cluster whose administrators already manage identities and access | Stores the connection definition and uses your existing cluster account and authentication | [Configure an existing cluster](/docs/compute/configuring-existing-clusters) | | **Specialized integration** | Your infrastructure requires provider-specific identity or connection steps | Depends on the integration | [Connect a CoreWeave Slurm cluster](/docs/compute/connecting-coreweave-slurm) | ### Provisioned Cloud or Connected Infrastructure? Choose a **provisioned cloud cluster** when ACTIVATE should create the compute infrastructure for you. A cloud account and its supporting network, storage, and permissions must already be available to ACTIVATE. Choose a **managed cluster** when an organization administrator wants to expose one shared, organization-owned cluster to users through centralized permissions, monitoring, and optional access synchronization. An administrator installs the ACTIVATE agent on the nodes that ACTIVATE will manage. Choose an **existing cluster** when each user only needs an SSH connection to infrastructure managed outside ACTIVATE. Users connect with an account and authentication method that already exist on that cluster. Use a **specialized integration** when the infrastructure has additional provider-specific requirements. For example, CoreWeave Slurm uses an existing-cluster connection plus separate identity synchronization. If you want to run Kubernetes workloads instead of connecting to an HPC scheduler, start with [Kubernetes](/docs/kubernetes). ## Set Up and Use Your Resource The setup journey depends on the resource type: 1. **Confirm ownership and access.** For cloud clusters, confirm that ACTIVATE has access to the cloud account. For connected infrastructure, coordinate with its Linux, scheduler, identity, and network administrators. 2. **Create or connect the resource.** Follow the setup guide linked in the table above. 3. **Validate access.** Confirm that the resource appears in **Compute > Clusters** and test a connection with a pilot user before expanding access. 4. **Run work.** Use the resource to [run workflows](/docs/run/workflows/running-workflows), open [interactive sessions](/docs/run/sessions), or [submit Slurm jobs](/docs/compute/submitting-jobs), according to the capabilities of that resource. 5. **Monitor and operate it.** Review resource and job activity under **Compute** and [Monitoring](/docs/monitoring). Cloud infrastructure remains subject to its provider's usage charges while it is running. :::tip Not sure which connected-cluster option to choose? Use a managed cluster when you need a shared organization-level integration, node monitoring, agent tunnels, or ACTIVATE-managed Linux access. Use an existing cluster when you only need an individual connection profile. ::: # Configuring Cloud Clusters > Source: https://parallelworks.com/docs/compute/configuring-cloud-clusters # Configuring Cloud Clusters This page explains the parameters of a cluster’s configuration page. Most ACTIVATE users will work exclusively with elastic clusters. These clusters are made up of a controller node and compute nodes, with the controller delegating tasks to the compute nodes. Clusters have several adjustable parameters for both controller and compute nodes, such as compute instance types and node count. Additionally, compute nodes are grouped together in partitions, which have their own settings. For more information, see [**Partition Settings**](/docs/compute/configuring-cloud-clusters#partition-settings) below. ACTIVATE also supports an optional parallel filesystem, Lustre. For more information on setting up Lustre for your account, see [**Configuring Storage**](/docs/storage/configuring-storage). ## Accessing Configuration Settings You can access a resource’s configuration settings from the **Clusters** page. Click the name of the resource you want to configure. Alternatively, if you have the **Compute** module on your **Dashboard**, click the gear icon for the resource you want to configure. ![Screenshot of a resource in the My Compute Resources module on the Dashboard. The gear icon is highlighted.](/content-images/docs/compute/configuring-cloud-clusters/click-resource-config.png) Once you've navigated to your cluster, click **Edit**. ![Screenshot of the user clicking Edit.](/content-images/docs/compute/configuring-cloud-clusters/click-edit-cluster.png) ## About Saving When you change settings for a cluster, you must click **Save Changes**. ![Screenshot of the user clicking Save Changes.](/content-images/docs/compute/configuring-cloud-clusters/click-save-changes.png) ## About Live Updatable Settings Some settings can be updated while a cluster is running. These settings are marked with a icon on this page. When you change a live updatable setting, click **Save Changes**. A dialog box will appear with the message _Changing configuration while cluster is running will make it unavailable until the changes are complete. Are you sure you want to save?_ Click **Save**. Once your cluster updates, a notification will appear with the message _Cluster [name] configuration updated successfully_. ## General Settings Clusters will typically have these settings in the **Definition** tab of the configuration page. Settings with an asterisk \* are required. ![Screenshot of a cluster's general configuration settings in the Definition tab.](/content-images/docs/compute/configuring-cloud-clusters/general-settings.png) #### Name Use this field to name the cluster. The name you choose must be unique across your account. For example, you cannot have both a cluster and a storage resource named "demo". #### Display Name Use this field to give the cluster a display name, which will appear at the top of the cluster's page, on the **Clusters** page, and on the Dashboard in the **Compute** module. If you leave this field blank, the value for the cluster's **Name** will be displayed instead. #### Description Use this field to give the cluster a description of 100 characters or fewer. #### Tags Use this field to add tags to the cluster. Tags appear on the **Clusters** page. They are useful for information at a glance (such as "user guide" tags on the clusters we use for our documentation). #### Network Use this dropdown menu to select the network that your organization uses for a specific cloud service provider. If you're not sure which one to select, please contact your organization's administrator. For more information about networks, see [**Networks**](/docs/organization-admin/cloud/cloud-accounts/networks). #### Group Use this dropdown menu to select the group name that your organization uses to allocate costs. This menu is especially important if your organization is running multiple groups simultaneously. If you’re not sure which group to select, you can contact us or your organization’s ACTIVATE administrator. ## Controller Settings These settings define the configuration for the controller node, such as region, instance type, and OS image. Some settings will differ depending on which type of resource you’re using. For more information, see [**CSP-Specific Settings**](/docs/compute/configuring-cloud-clusters/#csp-specific-settings) below. ![Screenshot of a cluster's controller settings.](/content-images/docs/compute/configuring-cloud-clusters/controller-settings.png) #### Region Use this dropdown menu to select the region that your cluster will deploy computing resources into. A region represents a geographic area. #### Zone Use this dropdown menu to select the zone to use for the controller. A zone refers to an isolated location inside a region. #### Root Size (GiB) Use this field to specify the size of the root disk in gibibytes (GiB). #### Instance Type Use this dropdown menu to select the instance type of the controller. The instance type determines the CPUs and amount of memory available on the machine. Certain instance types may also have specialty hardware, such as GPUs or low-latency networking options. To see a list of available instance types and their cost per hour, click **See all sizes**. From the instance type list, you can click an option to select it. For more information about instance types and what their names mean, please see [**Choosing Instance Types**](/docs/compute/instance-types). #### Image Use this dropdown menu to select the operating system (OS) image for the cluster's controller node. If you're not sure which image to pick, we recommend using the latest version because this will ensure you have the most up-to-date software on your cluster; the latest image version includes OS updates and software required to connect to the ACTIVATE control plane. You can also use this dropdown menu to select custom cloud snapshots. #### IP Address Use this dropdown menu to choose the IP address that will be assigned to the cluster. You can choose an automatically assigned IP address or an IP address that you've created. For more information, please see [**Managing IP Addresses**](/docs/compute/managing-ip-addresses). ## CSP-Specific Settings Each cloud service provider (CSP) builds and configures their resources differently. Clusters on ACTIVATE have settings that correspond to each CSP’s model of cloud services. The CSP-specific parameters are outlined below. Please note that these CSP-specific settings will also appear as options inside the partition settings on clusters. ### Google ![Screenshot of a cluster's Google-specific settings.](/content-images/docs/compute/configuring-cloud-clusters/google-settings.png) #### Tier 1 Use this toggle button to enable Tier 1, which increases maximum egress bandwidth (upload speed) to 50–100 Gps, depending on the size of the instance. If Tier 1 is off, the egress bandwidth will range from 10–32 Gbps. For more information, see the [Google documentation on Tier 1](https://cloud.google.com/compute/docs/networking/configure-vm-with-high-bandwidth-configuration#limitations). ## Partition Settings {#partition-settings} You can create partitions in clusters to send your work to homogenously configured sets of worker nodes. If you click **+ Add Partition**, a list of new settings will appear. Typically, a partition will have the following configuration options. Some settings will differ depending on which type of resource you’re using. For more information, see [**CSP-Specific Settings**](/docs/compute/configuring-cloud-clusters/#csp-specific-settings) below. ![Screenshot of a cluster's partition settings.](/content-images/docs/compute/configuring-cloud-clusters/partitions-settings.png) #### Name Use this field to name your partition. You must use a unique name for each partition you create. #### Instance Type Use this dropdown menu to select the configuration of the partition. These options work in the same way that the controller instance types do. #### GPU _Available on Google N1 instance types._ Use this dropdown menu to attach a GPU to the partition's instances. Only GPUs that are available in the selected zone(s) are shown. Currently, only the **NVIDIA T4** can be selected. Other GPU types are listed but disabled because the recent NVIDIA drivers baked into most of our node images support only newer GPU architectures (NVIDIA Turing and later); older GPUs such as the V100 (Volta) and P100/P4 (Pascal) are no longer supported by those drivers. #### GPU Count Per Node Use this field to set how many GPUs to attach to each node in the partition. It appears alongside the **GPU** dropdown on N1 instances. #### Max Nodes Use this field to enter the max number of nodes in a partition. #### Elastic Image Use this dropdown menu to select the operating system image for the partition. We recommend using the latest version. #### MultiZone Enable this toggle to provision nodes in multiple zones. If there is not enough capacity in one zone, we will try to provision nodes in a different zone. This can be helpful for obtaining instances that are in high demand. The exact behavior depends on the cloud provider: - **AWS**: All nodes in a single request are placed in the same zone. If a zone cannot fit every node in the batch, we move the entire batch to the next zone you selected and try again. When adding nodes to a running cluster, we try the zone that already holds the most of the cluster's nodes first; if the cluster has no nodes yet, we try the controller's zone first when it is one of your selected zones. - **Google**: A single request is submitted at the region level, along with your list of allowed zones. Google Cloud then chooses zones from that list based on available capacity, so the request can spread or fall back across zones automatically. - **Azure**: Azure clusters do not use the **MultiZone** toggle. Selecting **Automatic** from the **Zone** dropdown instead lets Azure distribute the partition's compute nodes across the region's availability zones for you. :::warning Warning If nodes are provisioned in multiple zones, there may be costs associated with data transfer between zones. For more information, see the [**AWS documentation on data transfer costs**](https://aws.amazon.com/ec2/pricing/on-demand/#Data_Transfer) or the [**Google documentation on data transfer costs**](https://cloud.google.com/compute/network-pricing#egress_only_ip_addresses). ::: #### Zone(s) Use this dropdown menu to select which zone(s) nodes will be provisioned in within your selected region. If **MultiZone** is enabled, you can select multiple zones. #### Default Use this toggle button to specify whether a partition is the default location for running jobs. For more information on running jobs on specific partitions, see [**Submitting Jobs**](/docs/compute/submitting-jobs). :::info Default Partition This feature is important if you create multiple partitions. If you only create one partition, it will automatically be set to **Default** and cannot be changed, as shown in the screenshot above. ::: #### Use Placement Group _Currently available only on AWS and Google clusters._ Use this toggle button to enable the partition's instances to be launched as a placement group. Typically, partition instances are launched throughout a zone. This strategy minimizes the chances of disprupting users' work: if one of the instances fails, especially from an outage or damage, the other instances are likely to remain unaffected. With a placement group, the instances are instead launched close together. This strategy can improve network performance and is best suited for jobs that are small, short, or will not be affected by interruptions. For AWS clusters, this setting is enabled by default. #### Provisioning Mode _Available on AWS, Azure, and Google clusters._ Use this dropdown menu to choose how the partition's instances are provisioned. It defaults to **Standard**. - **Standard**: On-demand instances that run for any duration you set. Ideal for most workloads. - **Preemptible**: Lower cost, but can be reclaimed by the cloud at any time. Ideal for fault-tolerant workloads. Because another user can take over the resource at any time, use preemptible instances at your own risk. - **Flex-start** _(Google clusters only)_: Queued provisioning for scarce GPU capacity. May take hours or days to be fulfilled, then runs for up to 7 days. Available only on GPU or H4D instance types. Built on Google's [Dynamic Workload Scheduler](https://cloud.google.com/compute/docs/instances/about-flex-start-vms). :::info Flex-start and Dynamic Workload Scheduler Flex-start is available only on Google clusters and is built on Google Cloud's [Dynamic Workload Scheduler (Flex-start VMs)](https://cloud.google.com/compute/docs/instances/about-flex-start-vms). Instead of failing immediately when in-demand GPU capacity is unavailable, a flex-start request is _queued_ and fulfilled once capacity frees up — which can take minutes, hours, or longer. Once capacity is granted, the node runs for up to 7 days. Flex-start is best suited to GPU workloads that can tolerate a delayed, non-deterministic start in exchange for better access to scarce hardware. ::: #### Flex-start Wait Time (seconds) _Appears when **Provisioning Mode** is set to **Flex-start** (Google clusters)._ Use this field to set how long to wait for flex-start capacity before giving up. This is required for flex-start and accepts a value from 30 seconds to 7 days (604,800 seconds). It defaults to `300`. #### Max Run Duration (seconds) Use this field to set the maximum time a node runs before it is deleted automatically. For **Flex-start** partitions this is required and must be between 600 seconds and 7 days. For other provisioning modes it is optional — leave it empty for no limit. #### Capacity Reservation\* _Before you can use a capacity reservation on ACTIVATE, it must first be configured by an administrator in your organization. After this initial step, your administrator can distribute the values for **Reservation ID** and, if necessary, **Placement Group**._ Use this toggle button to enable on-demand capacity reservations, which reserve a set amount of compute capacity. When **Capacity Reservation** is enabled, a **Reservation ID** dropdown menu will appear. For AWS, you will also enter the **Placement Group**. ## Attached Filesystems Settings Use this section to attach any of your configured storage resources. For more information, please see [**Attaching Storage**](/docs/storage/attaching-storage). ## Advanced Settings ### Admin Settings #### Debug Mode Use this toggle button to disable clean-up for provisioning failures. The cluster owner will also have root access to the nodes for debugging purposes (`ssh root@`). ### Script Settings Optionally, you can set scripts to execute when you start a cluster. ![Screenshot of a cluster's script settings.](/content-images/docs/compute/configuring-cloud-clusters/scripts-settings.png) #### User Bootstrap Use this text box to set a script that executes once a controller node has started. For example, you can set files to automatically move into a specific folder. #### Bootstrap Controller Use this toggle button to specify whether your bootstrap script will run on the controller node. #### Bootstrap Compute Nodes Use this toggle button to specify whether your bootstrap script will run on compute nodes. #### Health Check Use this text box to set a script that runs a health check on a controller node. When the script is done running, you’ll see any error codes in red or an exit code of `0` in green if there are no errors. For more information, see **Health Checks** (coming soon). ### Scheduler Settings ACTIVATE uses [Slurm](https://slurm.schedmd.com/documentation.html) to manage jobs on controller and compute nodes. The settings below determine how Slurm behaves for your cluster's nodes. Please note that numerical values you enter in these fields are measured in seconds. ![Screenshot of a cluster's Slurm settings.](/content-images/docs/compute/configuring-cloud-clusters/scheduler-settings.png) #### Suspend Time Use this field to set how long Slurm will wait before shutting down idle nodes. This field is set to `300` by default. #### Resume Timeout Use this field to set the maximum amount of time Slurm will try to start nodes. If the nodes don’t start by the end of the set time, Slurm will end the initialization attempt. This field is set to `1200` by default. #### Suspend Timeout Use this field to set how long Slurm will wait to make nodes available again after shutting them down. This field is set to `300` by default. #### Return To Service Use this dropdown menu to select when down nodes are returned to service. The `Non Responsive` option means that down nodes will become available only if they were set to down because they were non-responsive. The `Any Reason` option means that down nodes will become available if they were set to down for any reason, including low memory, an unexpected reboot, or being non-responsive. This field is set to `Non Responsive` by default. ### User Workspace Mount Points You can specify multiple mount points for your cluster, which makes it easier to view, upload, and edit cluster files in the ACTIVATE **Editor** and terminal. ![Screenshot of a cluster's Alerts settings.](/content-images/docs/compute/configuring-cloud-clusters/user-workspace-mount-points.png) #### Cluster Path Use this field to enter the path that will be mounted from your cluster to your user workspace. You can use the following substitutions: - `__HOME__` is the user home directory on your cluster. - `__USER__` will be replaced by your cluster's remote username; this username may be the same as your ACTIVATE username in some cases. #### Workspace Path Use this field to enter the path to mount the cluster inside your user workspace. You can use the following substitutions: - `__HOME__` is the user workspace home directory. - `__USER__` will be replaced by your ACTIVATE username. - `__CLUSTER__` will be replaced by your cluster's name. ### Alerts ![Screenshot of a cluster's Alerts settings.](/content-images/docs/compute/configuring-cloud-clusters/alerts-settings.png) #### Runtime Alert Use this toggle button to enable runtime alerts. When enabled, you'll receive an automated email from noreply@parallelworks.com at a set hourly interval, reminding you that your cluster is still running: ```md Dear {username}, This is an automated message to inform you that your cluster {cluster_name} has been running for {time} hours. Please take note of the following details: Cluster name: {cluster_name} Cluster start time: {start_date} Total run time: {total_time} Next alert time: {next_alert} This alert can be turned off in the resource's properties page. Sincerely, Parallel Works ``` #### Session Cost Limit Use this toggle button to enable a session cost limit. When enabled, your cluster will be destroyed and you'll receive an automated email from noreply@parallelworks.com: ```md Dear {username}, This is an automated message to inform you that the current session for your cluster {cluster_name} has exceeded the cost limit. Please take note of the following details: Resource name: {cluster_name} Resource start time: {start_date} Total run time: {total_time} Current session cost: {current_cost} Session cost limit: {cost_limit} Your cluster will be terminated. Data saved on this resource is not recoverable. This automated action can be turned off in the resource's properties page under Session Cost Limit. Sincerely, Parallel Works ``` ## Load From Marketplace You can load pre-configured settings from existing resources in the Marketplace. First, [add an item](/docs/marketplace#favoriting-workflows) from the Marketplace. Next, create a new resource or navigate to an existing resource's settings. Click **Edit**, then **Load From Marketplace**. ![Screenshot of Load From Market button circled on a cluster's configuration page.](/content-images/docs/compute/configuring-cloud-clusters/click-load-from-marketplace.png) After you click **Load From Marketplace**, a dialog box will appear with more information: *This will change the cluster settings to a configuration from the Marketplace. Restoring will overwrite all changes you have made to these sections. Filesystems are configured separately. For more information, see [the documentation](/docs/storage).* Choose your resource from the dropdown menu, then click **Restore**. # Configuring Existing Clusters > Source: https://parallelworks.com/docs/compute/configuring-existing-clusters # Configuring Existing Clusters ACTIVATE allows users to access the capabilities of an existing HPC cluster remotely. :::info Looking for an organization-managed integration? Use a [managed cluster](/docs/compute/managed-clusters) when you want an organization-owned resource with explicitly registered nodes, centralized access management, resource monitoring, and sessions through a selected node. Continue with this guide when an individual user should connect through HPC Connect with an account and authentication method that the cluster already manages. ::: ## Creating a Cluster Definition Navigate to the **Clusters** page under the **Compute** tab. ![Screenshot of the user clicking the Clusters page.](/content-images/docs/compute/configuring-existing-clusters/click-clusters.png) Click the **+ Add Resource** button ![Screenshot of the user clicking the Add Resource button.](/content-images/docs/compute/configuring-existing-clusters/click-add-resource.png) Select **Existing Cluster**. ![step1](/content-images/docs/compute/configuring-existing-clusters/click-existing.png) You must enter a **Resource Name**. The **Display Name**, **Short description**, and **Tags** are all optional. Click the **Add Resource** button. ![step1](/content-images/docs/compute/configuring-existing-clusters/click-add-resource2.png) On the next page, click the **Definition** tab. ![Screenshot of the user clicking the Definition tab.](/content-images/docs/compute/configuring-existing-clusters/click-definition.png) If the existing cluster you wish to connect to utilizes a jump host, select **Yes** for the **Jump Node** option. Enter the proper **Jump Node User** and **Jump Node Host** information to continue. ![Screenshot of the Jump Node parameters.](/content-images/docs/compute/configuring-existing-clusters/jump-node-params.png) In the **Cluster Configuration** section, enter the **Username** and **Cluster Login Node**. Typically, the **Cluster Login Node** refers to the IP address of the cluster you wish to access. Your organization should have provided this information to you. Click **Save Changes**. ![Screenshot of the user clicking Save Changes.](/content-images/docs/compute/configuring-existing-clusters/click-save-changes.png) ## Connecting to the Cluster After configuring the cluster, navigate to the **Sessions** tab and click the power button. ![Screenshot of the user clicking the power button.](/content-images/docs/compute/configuring-existing-clusters/click-power-button.png) A dialog box will appear that will show HPC Connect authenticating your connection. ![Screenshot of a successful on-premises connection.](/content-images/docs/compute/configuring-existing-clusters/hpcconnect-modal.png) If your organization uses multi-factor authentication, you will be prompted to enter a token. This may be an RSA token, YubiKey, or other type of token that’s specific to your organization. This prompt will also appear if you use a passphrase protected key instead of the default workspace key. If no token is required, you will be connected to the cluster immediately. Once you're logged in to the cluster, you can run workflows as well as browse, edit, and upload files using the [**Editor**](/docs/your-workspace/editor). ## Disconnecting After you've finished utilizing the cluster, click the power button in the **Sessions** tab. A dialog box will appear. Click **Turn Off**. A notification will appear in the bottom right corner of your screen with the message _Stopping [cluster name]_. ## Configuring Settings Typically when you create an existing cluster, you’ll be connecting to an on-premises cluster associated with your organization. However, the instructions here for existing clusters can be used with any pre-created Slurm cluster. The settings that are specific to this type of cluster are outlined below. If you’re unsure what to choose for these options, contact your organization’s ACTIVATE administrator. ### General Settings #### Resource Account Use this dropdown menu to select how ACTIVATE will connect to the existing cluster. The `User Workspace (~/ssh/pw_id_rsa)` options means that ACTIVATE will try to SSH to the cluster by using only your account’s SSH key, which is stored at `~/.ssh/pw_id_rsa`. For more information about your SSH key, see [our documentation](/docs/compute/logging-in-controller#why-dont-i-have-to-use-an-ssh-key-from-within-the-platform). #### Jump Node Use this toggle button if you’re connecting to a cluster that has a jump node enabled. A jump node—also called a host node, bastion node, or login node—is a high-security server that allows a user to access a private machine or network. If you enable this feature, two new fields will appear for **Jump Node User** and **Jump Node Host**. Your organization will have these credentials if you need them. ### Cluster Configuration Settings #### Username Use this field to enter the username assigned to you for this cluster. :::info Username substitution On existing clusters, you can enter `__USER__` into any box and ACTIVATE will automatically substitute your username for that field. For example, if your username is `jdoe`, ACTIVATE will automatically substitute `__USER__` for `jdoe` in the **Working Directory** field. ::: #### Cluster Login Node Use this field to enter the IP address or host name of the cluster. #### Scheduler Type Use this dropdown menu to select the type of job scheduler the cluster uses. Currently, the **Existing Cluster** resource type supports Slurm and PBS. # Connecting a CoreWeave Slurm Cluster > Source: https://parallelworks.com/docs/compute/connecting-coreweave-slurm # Connecting a CoreWeave Slurm Cluster This guide connects a [CoreWeave](https://www.coreweave.com/) Slurm cluster (SUNK - Slurm on Kubernetes) to ACTIVATE so your users can submit batch jobs, open desktop sessions, and run workflows on it. There are two sides to it: 1. **Identity** - point the cluster's identity cache (`nsscache`) at ACTIVATE's SCIM API and add an SSH authorized-keys command, so ACTIVATE users, groups, and SSH keys resolve as real Linux accounts on the cluster. 2. **Connection** - register the cluster in ACTIVATE as an [existing cluster](/docs/compute/configuring-existing-clusters). Each identity step below can be applied two ways - pick one and stay consistent: - **Helm values (GitOps)** - set everything in the values file your SUNK `slurm` chart deployment consumes. This is the right choice when the deployment is managed through ArgoCD (the usual setup for CoreWeave-managed clusters). Depending on the Application's sync policy, hand-edited chart-managed resources are reverted immediately (self-heal), reverted on the next sync (auto-sync), or left in place but flagged as out-of-sync drift. Changes made through the values file survive in every case. - **kubectl (manual)** - edit the ConfigMaps directly. Fine for a quick proof of concept, or on clusters where automatic sync is disabled. :::info Connecting CoreWeave's Kubernetes API instead? If you want to manage the cluster's Kubernetes workloads through ACTIVATE rather than submit Slurm jobs, see [Connecting CoreWeave (Kubernetes)](/docs/kubernetes/connecting-clusters/coreweave). ::: ## Prerequisites - **Organization admin permissions** in ACTIVATE. - **SCIM provisioning enabled** for your organization, plus a **bearer token**. Follow [SCIM Provisioning](/docs/organization-admin/scim) first and keep the token and endpoint URL handy. - **`kubectl` access** to the cluster's `tenant-slurm` namespace (via the kubeconfig from CoreWeave). - For the Helm values method, **write access to the GitOps repository** whose values file the `slurm` ArgoCD Application consumes. - POSIX UIDs/GIDs and SSH public keys configured on your ACTIVATE users and groups - these are what get synchronized onto the cluster. ## Point nsscache at ACTIVATE's SCIM API CoreWeave's SUNK clusters resolve Linux identity through `nsscache`, which periodically syncs `passwd`, `group`, `shadow`, and `sshkey` maps from a source. We configure that source to be ACTIVATE's SCIM API, reading POSIX identity from the [CoreWeave extension attributes](/docs/organization-admin/scim#coreweave-extension-attributes). **Helm values (GitOps)** Add the following to the values file consumed by your `slurm` chart deployment. The two values you must set for your organization are **`scim_base_url`** (your SCIM endpoint) and **`scim_users_parameters`** (which requests the CoreWeave user extension). The chart's defaults fill in the rest of `nsscache.conf` (cache locations, `[passwd]`, `[shadow]`, and `[sshkey]` paths): ```yaml nsscache: enabled: true existingSecret: nsscache-scim-secret nsscacheConfig: default: source: scim scim_base_url: https:///api/organizations//scim/v2 scim_users_endpoint: Users scim_users_parameters: attributes=urn:coreweave:params:scim:schemas:extension:coreweave:2.0:CoreWeaveUser scim_groups_endpoint: Groups scim_groups_parameters: excludeInactiveUsers=true passwd: scim_override_home_directory: /mnt/home/%%u group: scim_path_gid: urn:coreweave:params:scim:schemas:extension:coreweave:2.0:CoreWeaveGroup/sunkPosixGroupId scim_path_groupname: urn:coreweave:params:scim:schemas:extension:coreweave:2.0:CoreWeaveGroup/sunkPosixGroupName ``` No restarts are needed after this syncs: the nsscache update CronJob runs every minute and mounts the rendered config fresh on each run. **kubectl (manual)** Edit the nsscache ConfigMap in the `tenant-slurm` namespace. Its name is prefixed with the Helm release name, typically `slurm`: ```bash kubectl edit cm/slurm-nsscache-conf -n tenant-slurm ``` Update it to match the following. The two values you must set for your organization are **`scim_base_url`** (your SCIM endpoint) and **`scim_users_parameters`** (which requests the CoreWeave user extension): ```yaml apiVersion: v1 data: nsscache.conf: | [DEFAULT] cache=files files_cache_filename_suffix=cache files_dir=/etc/nsscache maps=passwd,shadow,group,sshkey scim_base_url=https:///api/organizations//scim/v2 scim_groups_endpoint=Groups scim_groups_parameters=excludeInactiveUsers=true scim_users_endpoint=Users scim_users_parameters=attributes=urn:coreweave:params:scim:schemas:extension:coreweave:2.0:CoreWeaveUser source=scim timestamp_dir=/var/lib/nsscache [group] scim_path_gid=urn:coreweave:params:scim:schemas:extension:coreweave:2.0:CoreWeaveGroup/sunkPosixGroupId scim_path_groupname=urn:coreweave:params:scim:schemas:extension:coreweave:2.0:CoreWeaveGroup/sunkPosixGroupName scim_path_username=members/sunkPosixUsername [passwd] scim_default_shell=/bin/bash scim_override_home_directory=/mnt/home/%%u scim_path_gid=urn:coreweave:params:scim:schemas:extension:coreweave:2.0:CoreWeaveUser/sunkPosixGroupId scim_path_home_directory=urn:coreweave:params:scim:schemas:extension:coreweave:2.0:CoreWeaveUser/sunkPreferredHomeDirectory scim_path_login_shell=urn:coreweave:params:scim:schemas:extension:coreweave:2.0:CoreWeaveUser/sunkLoginShell scim_path_uid=urn:coreweave:params:scim:schemas:extension:coreweave:2.0:CoreWeaveUser/sunkPosixUserId scim_path_username=urn:coreweave:params:scim:schemas:extension:coreweave:2.0:CoreWeaveUser/sunkPosixUsername [shadow] scim_path_username=urn:coreweave:params:scim:schemas:extension:coreweave:2.0:CoreWeaveUser/sunkPosixUsername [sshkey] scim_path_ssh_keys=urn:coreweave:params:scim:schemas:extension:coreweave:2.0:CoreWeaveUser/sunkSshKeys scim_path_username=urn:coreweave:params:scim:schemas:extension:coreweave:2.0:CoreWeaveUser/sunkPosixUsername nsswitch.conf: | group: files cache passwd: files cache ``` :::warning On an ArgoCD-managed deployment, this edit is reverted immediately if self-heal is enabled, or on the next sync with auto-sync; even with automatic sync disabled, the Application reports it as out-of-sync drift. Use the Helm values method instead. ::: What the key settings do: - **`scim_base_url`** - your organization's SCIM endpoint, shown on the [SCIM Provisioning](/docs/organization-admin/scim) page (`https:///api/organizations//scim/v2`). - **`scim_users_parameters=attributes=...CoreWeaveUser`** - requests the CoreWeave user extension. ACTIVATE omits that block by default, so without this parameter the POSIX UID/GID, shell, home directory, and SSH keys would be missing. - **`scim_groups_parameters=excludeInactiveUsers=true`** - drops disabled ACTIVATE accounts from group membership, so deactivated users stop resolving on the cluster. - **`[group]` paths with the `...CoreWeaveGroup` URN prefix** - ACTIVATE nests `sunkPosixGroupId` and `sunkPosixGroupName` under the CoreWeave group extension in each Group resource. Without the URN prefix, nsscache looks for them at the top level, finds no GID, and skips every group (`Group missing GID, skipping` in the update job logs). `members/sunkPosixUsername` stays unprefixed - member entries carry that field at the top level. - **`scim_override_home_directory=/mnt/home/%%u`** - forces home directories under `/mnt/home`. This overrides the `sunkPreferredHomeDirectory` value from SCIM; set it to wherever home directories are mounted on your cluster. ### Provide the bearer token The SCIM API requires a bearer token on every request. On a SUNK cluster, nsscache reads it from the `nsscache-scim-secret` Secret in the `tenant-slurm` namespace - not from the configuration above (in the Helm values, `nsscache.existingSecret` names it). This Secret is provisioned with the cluster; update it with the token you minted in [SCIM Provisioning](/docs/organization-admin/scim#bearer-tokens): ```bash kubectl edit secret nsscache-scim-secret -n tenant-slurm ``` Secret values are base64-encoded, so encode the token before pasting it into the Secret's data field: ```bash printf '%s' '' | base64 ``` ## Configure the authorized keys command So that `sshd` can authorize logins using each user's ACTIVATE SSH keys, install an `AuthorizedKeysCommand` that fetches them through the `pw` CLI. **Helm values (GitOps)** The SUNK chart embeds its default authorized-keys script directly from a chart file, with no values hook to replace it - so instead of fighting over that ConfigMap, register your own command through two supported values: - **`login.sshdConfig`** adds an `AuthorizedKeysCommand` line pointing at your script. It renders ahead of the chart's built-in line, and `sshd` honors the first value it sees for a keyword, so yours wins. - **`login.s6`** runs a oneshot at login-pod startup (as root) that writes the script and pre-installs the `pw` CLI, so key lookups - which run unprivileged - never have to install anything. Add the following to your values file, **replacing ``** with your platform's hostname throughout. `PasswordAuthentication` and `AllowAgentForwarding` replicate the chart's defaults, which setting `sshdConfig` replaces: ```yaml login: sshdConfig: | PasswordAuthentication no AllowAgentForwarding yes AuthorizedKeysCommand /usr/local/share/pw-authorized-keys-command.sh s6: pw-authorized-keys-setup: type: oneshot timeoutUp: 120000 script: | #!/usr/bin/env bash # Writes the AuthorizedKeysCommand script referenced by # login.sshdConfig and pre-installs the pw CLI as root at pod start, # so key lookups (which run unprivileged) never need to install it. set -e cat > /usr/local/share/pw-authorized-keys-command.sh <<'EOS' #!/bin/bash # AuthorizedKeysCommand: fetch the user's SSH public keys via the pw CLI. set -e PLATFORM_HOST="${PLATFORM_HOST:-https://}" PW_INSTALL_DIR="${PW_INSTALL_DIR:-/usr/local/bin}" PW_BIN="$PW_INSTALL_DIR/pw" # /tmp is always writable, even by `nobody`. The lock only needs to # exist during one install attempt, so ephemeral storage is fine. INSTALL_LOCK="${PW_INSTALL_LOCK:-/tmp/pw-install.lock}" locate_pw() { if [ -x "$PW_BIN" ]; then return fi local found found="$(command -v pw 2>/dev/null || true)" if [ -n "$found" ] && [ -x "$found" ]; then PW_BIN="$found" fi } locate_pw if [ ! -x "$PW_BIN" ]; then # flock prevents concurrent sshd invocations from racing the install. ( flock -x 9 if [ ! -x "/usr/local/bin/pw" ] && ! command -v pw >/dev/null 2>&1; then # Send install output to stderr so it doesn't end up in the # keys stream sshd reads from stdout. curl -fsSL https:///cli/install.sh \ | bash -s -- --to "$PW_INSTALL_DIR" 1>&2 fi ) 9>"$INSTALL_LOCK" locate_pw fi if [ ! -x "$PW_BIN" ]; then echo "pw CLI not found and install failed" >&2 exit 1 fi # Validate username contains only safe characters. if [[ ! "$1" =~ ^[a-zA-Z0-9._-]+$ ]]; then exit 1 fi exec "$PW_BIN" ssh-public-keys --platform-host "$PLATFORM_HOST" "$1" EOS chmod 0755 /usr/local/share/pw-authorized-keys-command.sh # Best-effort: the authorized-keys script lazily installs pw as a # fallback, so a transient failure here must not block pod startup. if ! command -v pw >/dev/null 2>&1 && [ ! -x /usr/local/bin/pw ]; then curl -fsSL https:///cli/install.sh \ | bash -s -- --to /usr/local/bin \ || echo "WARN: pw CLI pre-install failed; will retry lazily" >&2 fi ``` The login StatefulSet defaults to the `OnDelete` update strategy, so after this change syncs, delete the login pod to recreate it with the new sshd config and s6 service (find it with `kubectl get pods -n tenant-slurm`): ```bash kubectl delete pod -n tenant-slurm ``` Confirm it works by execing into the recreated login pod and running the command with a username: ```bash kubectl exec -it -n tenant-slurm -- \ /usr/local/share/pw-authorized-keys-command.sh ``` **kubectl (manual)** Replace the content of the chart's authorized-keys ConfigMap. Save the following as `slurm-nsscache-authorized-keys-command.yaml`, **replacing ``** with your platform's hostname throughout: ```yaml apiVersion: v1 kind: ConfigMap metadata: name: slurm-nsscache-authorized-keys-command namespace: tenant-slurm data: # Filename kept as .py for drop-in compatibility with the existing # AuthorizedKeysCommand path in sshd_config. The shebang determines the # interpreter, so bash content here is fine. nsscache-authorized-keys-command.py: | #!/bin/bash # AuthorizedKeysCommand: fetch the user's SSH public keys via the pw CLI. # Installs pw on first invocation; subsequent calls reuse the cached binary. set -e PLATFORM_HOST="${PLATFORM_HOST:-https://}" PW_INSTALL_DIR="${PW_INSTALL_DIR:-/usr/local/bin}" PW_BIN="$PW_INSTALL_DIR/pw" # /tmp is always writable, even by `nobody`. The lock only needs to exist # during one install attempt, so ephemeral storage is fine. INSTALL_LOCK="${PW_INSTALL_LOCK:-/tmp/pw-install.lock}" locate_pw() { if [ -x "$PW_BIN" ]; then return fi local found found="$(command -v pw 2>/dev/null || true)" if [ -n "$found" ] && [ -x "$found" ]; then PW_BIN="$found" fi } locate_pw if [ ! -x "$PW_BIN" ]; then # flock prevents concurrent sshd invocations from racing the install. ( flock -x 9 if [ ! -x "/usr/local/bin/pw" ] && ! command -v pw >/dev/null 2>&1; then # Send install output to stderr so it doesn't end up in the # keys stream sshd reads from stdout. curl -fsSL https:///cli/install.sh \ | bash -s -- --to "$PW_INSTALL_DIR" 1>&2 fi ) 9>"$INSTALL_LOCK" locate_pw fi if [ ! -x "$PW_BIN" ]; then echo "pw CLI not found and install failed" >&2 exit 1 fi # Validate username contains only safe characters. if [[ ! "$1" =~ ^[a-zA-Z0-9._-]+$ ]]; then exit 1 fi exec "$PW_BIN" ssh-public-keys --platform-host "$PLATFORM_HOST" "$1" ``` Apply it: ```bash kubectl apply -f slurm-nsscache-authorized-keys-command.yaml ``` :::warning This ConfigMap is owned by the SUNK Helm chart, which hardcodes its content - on an ArgoCD-managed deployment, this edit is reverted immediately if self-heal is enabled, or on the next sync with auto-sync; even with automatic sync disabled, the Application reports it as out-of-sync drift. Use the Helm values method instead. ::: A running login pod won't pick up the new ConfigMap until it restarts. Delete the Slurm login pod so it's recreated with the updated command mounted (find it with `kubectl get pods -n tenant-slurm`): ```bash kubectl delete pod -n tenant-slurm ``` Confirm it works by execing into the recreated login pod and running the command with a username: ```bash kubectl exec -it -n tenant-slurm -- \ /usr/local/share/nsscache-authorized-keys-command.py ``` On the first SSH login after the pod comes back, the script installs the `pw` CLI if it isn't already present, then calls `pw ssh-public-keys` to return the user's keys for `sshd` to authorize. When everything is wired up correctly, running the command manually prints that user's authorized SSH public keys - for example, passing `mcquade` returns mcquade's keys. ## Register the cluster in ACTIVATE With identity resolving on the cluster, connect it like any other on-premises cluster: 1. Follow [Configuring Existing Clusters](/docs/compute/configuring-existing-clusters) to create the cluster definition. 2. Set the **Scheduler Type** to **Slurm**. 3. Enter the **Cluster Login Node** (the cluster's login/jump host) and your **Username**. You can use the `__USER__` token in any field and ACTIVATE substitutes the logged-in user's username automatically. ## Verify First, confirm the identity cache is populating. nsscache writes each synced map into a `slurm-nsscache-` Secret in `tenant-slurm`. Decode the `passwd` cache to check that your ACTIVATE users are landing on the cluster with the expected UID, GID, shell, and home directory: ```bash kubectl get secret slurm-nsscache-passwd -n tenant-slurm -o yaml \ | yq '.data."passwd.cache"' | base64 -d ``` The `group`, `shadow`, and `sshkey` maps populate the parallel `slurm-nsscache-group`, `slurm-nsscache-shadow`, and `slurm-nsscache-sshkey` Secrets (keyed `group.cache`, `shadow.cache`, and `sshkey.cache`). An empty or stale cache usually means the SCIM URL, the bearer token, or the `attributes` parameter is wrong. If the `group` cache specifically stays empty, check the latest `slurm-nsscache-update-cronjob` job logs: `Group missing GID, skipping` means the `[group]` paths are missing the `...CoreWeaveGroup` URN prefix described above. Then confirm the end-to-end connection: 1. From the **Sessions** tab, power on the cluster and confirm the connection succeeds. 2. Confirm your account resolves on the cluster (`id ` should show the POSIX UID/GID and group memberships synced from ACTIVATE). 3. Submit a test job and confirm it runs. See [Submitting Jobs via Slurm](/docs/compute/submitting-jobs). # Creating Cloud Clusters > Source: https://parallelworks.com/docs/compute/creating-clusters # Creating Cloud Clusters This guide explains how to create an elastic cluster that ACTIVATE provisions in a connected cloud account. If you want to connect infrastructure that your organization already operates, first [compare the available compute resource types](/docs/compute). Before you begin, confirm that your organization has configured a cloud account and that you know which provider and configuration your project should use. If you are unsure, contact your ACTIVATE administrator. ## Choose an Elastic Cluster Type Users who are familiar with Slurm will generally be more comfortable with elastic clusters than elastic pools. Elastic pools are a legacy resource type and are not recommended for new resources. The CSP you choose depends on your organization, workflow needs, and whether you already have a cloud account from a specific CSP. Otherwise, any elastic cluster is a good choice to start with. ## Create the Resource Navigate to the **Clusters** page and select **+ Add Resource**. ![Screenshot of the Clusters page immediately after clicking Clusters.](/content-images/docs/compute/creating-clusters/click-add-resource.png) Select an elastic cluster for the cloud service provider (CSP) your organization uses. ![Screenshot of the Clusters page immediately after selecting the + Add Resource button.](/content-images/docs/compute/creating-clusters/resource-configuration.png) You must enter a **Cluster Name**. The **Display Name**, **Description**, and **Tags** are optional. If you leave **Display Name** blank, the cluster will default to the **Cluster Name** text. Optionally, you can use the toggle button for **Enable run time alert**. When enabled, you'll receive an automated email from `noreply@parallelworks.com` at a set hourly interval, reminding you that your cluster is still running: ```md Dear {username}, This is an automated message to inform you that your cluster {cluster_name} has been running for {time} hours. Please take note of the following details: Cluster name: {cluster_name} Cluster start time: {start_date} Total run time: {total_time} Next alert time: {next_alert} This alert can be turned off in the resource's properties page. Sincerely, Parallel Works ``` When you click the toggle button, the field for **Alert Interval (Hours)** will appear. The value you enter here determines how often you'll receive run time alerts. ![Screenshot of the Clusters page immediately after clicking the toggle button for Enable real time alert.](/content-images/docs/compute/creating-clusters/runtime-alert.png) When you're ready, click **Add Resource**. Your resource creation will be confirmed on the next page with the message _Resource created_. You can configure your resource from this page. For more information on configuring clusters generally or what you need to configure clusters on specific CSPs, please see [**Configuring Clusters**](/docs/compute/configuring-cloud-clusters). Your new cluster will also appear in the **Computing Resources** module on the **Home** page. ## How should I configure my resource? If you’re simply testing resources or if your organization has not provided specific configuration settings for your project, we recommend using a configuration from the Marketplace. For more information, please see [**Configuring Clusters** > **Load From Market**](/docs/compute/configuring-cloud-clusters#load-from-marketplace). # Creating OS Snapshots > Source: https://parallelworks.com/docs/compute/creating-os-snapshots # Creating OS Snapshots After configuring a cluster, you may wish to save its data for later use on other clusters. You can create a snapshot of the cluster's root disk, which saves its operating system, data, and any applications you've installed. When you start a new cluster and select your snapshot as the image, the saved data will appear on the cluster. OS snapshots are different from [cloud snapshots](/docs/account-settings/cloud-snapshots) in that cloud snapshots do not contain an operating system. This means that cloud snapshots cannot be used as your root disk. ## Creating a Snapshot After starting a cluster, navigate to its **Sessions** page. In **Attached Storages**, click the snapshot icon. ![Screenshot of the user clicking the menu icon in Attached Storages.](/content-images/docs/compute/creating-os-snapshots/click-monitor-icon.png) Name your snapshot. Please note that the name must: - begin with a letter. - be between 3 and 36 characters. - use only numbers, hyphens, and lowercase letters. Spaces are not accepted. Click **Create**. ![Screenshot of the user clicking Create.](/content-images/docs/compute/creating-os-snapshots/click-create.png) The snapshot will begin the provisioning process, and you'll be redirected to the **Snapshots** page. ![Screenshot of the Snapshots page while a snapshot is provisioning.](/content-images/docs/compute/creating-os-snapshots/snapshot-provisioning.png) Click **provisioning** if you'd like to see the steps of the process. When the snapshot has been created, its status will change to **provisioned**. ![Screenshot of the Snapshots page while a snapshot has already been provisioned.](/content-images/docs/compute/creating-os-snapshots/snapshot-provisioned.png) ## Sharing a Snapshot If you share a snapshot with a group in your organization, users in that group will be able to restore their own disks' settings from your snapshot. This is useful if, for example, you and another group's users are conducting similar types of work. On the **Snapshots** page, click the share icon. ![Screenshot of the user clicking a snapshot's share icon.](/content-images/docs/compute/creating-os-snapshots/click-share-icon.png) On the next page, select the group(s) you want to share the snapshot with. You'll see the message _Permission updated successfully._ ## Deleting a Snapshot On the **Snapshots** page, click the delete icon. ![Screenshot of the user clicking a snapshot's delete icon.](/content-images/docs/compute/creating-os-snapshots/click-delete-icon.png) A dialog box will appear with the message _Are you sure you want to delete this snapshot?_ Click **Delete**. A notification will appear with the message _Snapshot is waiting to be destroyed. This may take a few minutes._ When this process is finished, the snapshot's **Status** will display as **deleted** for the next hour. :::info Note Please note that deleting a snapshot does not stop the cluster it was created from. You must stop the cluster separately. ::: # Choosing Instance Types > Source: https://parallelworks.com/docs/compute/instance-types # Choosing Instance Types When configuring a cloud-based cluster, there are many instance types to choose from, and each cloud service provider (CSP) has their own naming conventions. Elements of instance type names correspond to elements of the physical machines that clusters are deployed from. This page explains these instance naming conventions for AWS, Azure, and Google clusters. Please note that specific instance types are subject to change as CSPs add and remove hardware; however, you can always refer to this page to help identify nodes and any additional features that are included with them. ## AWS On AWS, instance types are named following a pattern based on: - instance family - generation family - processor family - additional capabilities - instance size ![An example of an AWS instance type with labels for each element.](/content-images/docs/compute/instance-types/aws-instance-example.png) _An example of an AWS instance type from their documentation_ ### Instance Families | Syntax | Description | | ------ | -------------------------- | | c | Compute optimized | | d | Dense storage | | f | [FPGA](https://aws.amazon.com/ec2/instance-types/f1/) | | g | Graphics intensive | | hpc | High performance computing | | inf | [AWS Inferentia](https://aws.amazon.com/machine-learning/inferentia/) | | m | General purpose | | mac | macOS | | p | GPU accelerated | | r | Memory optimized | | t | Burstable performance | | trn | [AWS Trainium](https://aws.amazon.com/machine-learning/trainium/) | | u | High memory | | vt | Video transcoding | | x | Memory intensive | ### Processor Families | Syntax | Description | | ------ | -------------------------- | | a | AMD processors | | g | [AWS Graviton](https://aws.amazon.com/ec2/graviton/) processors | | i | Intel processor | **Note for the `i` syntax**: Many older Intel-based instance types do not include this code. It was likely added when AWS began offering more Graviton and AMD-based options. ### Additional Capabilities | Syntax | Description | | ------ | -------------------------- | | d | Instance store volumes | | n | Network and [EBS](https://aws.amazon.com/ebs/) optimized | | e | Extra storage or memory | | z | High performance | | flex | [Flex instance](https://aws.amazon.com/ec2/instance-types/m7i/) | ### Instance Generations Older instance generations are usually kept available for a set period of time, but it’s suggested to use newer versions for optimal performance. - [documentation](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html#current-gen-instances) for the current generation of AWS instances - [documentation](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html#previous-gen-instances) for the previous generation of AWS instances ### Selection Guidelines For CPU-based workloads, most ACTIVATE users will want to select **compute-optimized** instance types, which include the **c** and **hpc** instance families: - **c5n.18xlarge**: One of ACTIVATE’s default configuration instances. c5 instances are based on Intel Skylake processors. Note that the instance name is missing an `i` in the name because it predates other processors being included in the family. - **c6in.24xlarge**: A newer generation of the `c` instance family. Note that this instance includes an `i` in the name to separate it from `c6a` (AMD) and `c6g` (Graviton) instances. - **hpc6a.48xlarge**: AMD EPYC-based instances designed specifically for HPC workloads For GPU-based workloads, look for instances in the **g** and **p** families: - **g5.48xlarge**: g5 instances are equipped with NVIDIA A10G Tensor Core GPUs and AMD EPYC processors. - **p3.16xlarge**: p3 instances include Intel Skylake processors and NVIDIA V100 Tensor Core GPUs. :::info Note Instance options vary by zone and region. If you're trying to use a specific instance type and it's not visible in the dropdown, try changing to a different region first. ::: ### Further Reading You can read more about AWS instances and naming conventions any time by visiting [this page](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html) of their documentation. ## Azure Azure's naming structure follows this pattern: [Family] + [Sub-family] + [# of vCPUs] + [Constrained vCPUs] + [Additive Features] + [Accelerator Type] + [Version] On ACTIVATE, we also add an Azure instance's [tier](https://learn.microsoft.com/en-us/azure/search/search-sku-tier#tier-descriptions). For example, the Azure instance `Standard_HC44rs` can be broken down into: - **Tier**: Standard - **Family**: H - **Sub-family**: C - **CPUs**: 44 - **Additive Features**: rs - **r**: RDMA capable - **s**: Premium Storage capable ### Instance Families | Syntax | Description | | ------ | --------------------------------------------- | | A | Entry-level VMs for dev/test | | Bs | Economical burstable VMs | | D | General purpose compute | | E | Optimized for in-memory applications | | F | Compute optimized virtual machines | | G | Memory and storage optimized virtual machines | | H | High Performance Computing virtual machines | | Ls | Storage optimized virtual machines | | M | Memory optimized virtual machines | | Mv2 | Largest memory optimized virtual machines | | N | GPU-enabled virtual machines | #### Instance Sub-families Many Azure instance families include sub-families with different features. For example, H-Series instances come in two flavors: - **HB**: Up to 120 AMD EPYC 7003-series CPU cores, 448 GB of RAM, and no hyperthreading - **HC**: Up to 44 Intel Xeon Platinum 8168 processor cores, 8 GB of RAM per CPU core, no hyperthreading, and up to 4 Managed Disks ### Additional Capabilities | Syntax | Description | | ------ | --------------------------------------------- | | a | AMD-based processor | | b | Block Storage performance | | d | diskful (that is, a local temp disk is present); this feature is for newer Azure VMs; see [Ddv4 and Ddsv4-series](https://learn.microsoft.com/en-us/azure/virtual-machines/ddv4-ddsv4-series) | | i | isolated size | | l | low memory; a lower amount of memory than the memory intensive size | | m | memory intensive; the most amount of memory in a particular size | | p | ARM CPU | | t | tiny memory; the smallest amount of memory in a particular size | | s | Premium Storage capable, including possible use of [Ultra SSD](https://learn.microsoft.com/en-us/azure/virtual-machines/disks-types#ultra-disks)| | C | confidential | | NP | node packing | | r | [RDMA](https://www.microsoft.com/en-us/research/publication/empowering-azure-storage-with-rdma/) capable | Please note that this is not a complete list of additive features. Additionally, these identifiers are not used in all node types that may apply to them. For example, `Standard_HB60rs` instances have AMD EPYC processors, but don’t have an `a` listed as an additional capability. ### Instance Generations (version) Like other cloud providers, Azure instances are routinely updated with newer generations. Azure has product pages for each instance series that describes their specifications, current generation, and additional features. Information for the H-Series nodes can be found on [this page](https://learn.microsoft.com/en-us/azure/virtual-machines/sizes-hpc). ### Selection Guidelines For compute clusters, we suggest using Azure H-Series nodes as they are InfiniBand/RDMA enabled for high-speed networking. Our primary default cluster configuration uses `Standard_HC44rs` instances. For Lustre, stick to instances that have `d` and `s` listed as additional features for their enhanced storage functionality. ### Further Reading You can read more about Azure naming conventions by visiting [this page](https://learn.microsoft.com/en-us/azure/virtual-machines/vm-naming-conventions) of their documentation. You can read more about Azure instance types on [this page](https://azure.microsoft.com/en-us/pricing/details/virtual-machines/series/) of their documentation. ## Google ### Machine Families & Series Google instances fall into one of four categories (called familes) and are further categorized by their series and generation. - **General-purpose**: best price-performance ratio for a variety of workloads - **e2** - **n2, n2d, n1** - **c3** - **tau t2d, tau t2a** - **Compute-optimized**: highest performance per core on Compute Engine and optimized for compute-intensive workloads - **h3** - **c2, c2d** - **Memory-optimized**: ideal for memory-intensive workloads, offering more memory per core than other machine families, with up to 12 TB of memory - **m3, m2, m1** - **Accelerator-optimized**: ideal for massively parallelized Compute Unified Device Architecture (CUDA) compute workloads, such as machine learning (ML) and high-performance computing (HPC); this family is the best option for workloads that require GPUs - **a2** - **g2** ### Selection Guidelines `h3-standard-88` is Google’s newest node type that's suitable for HPC workloads. This type features 88 vCPUs (no hyperthreading), 352GB memory, and up to 200 Gbps network egress bandwidth. `c2-standard-60 instances` are smaller than the **h3** nodes, but are also well suited for HPC applications. For GPUs, try the **a2** series. Alternatively, you can attach an NVIDIA T4 GPU to an **n1** instance — see [Partition Settings](/docs/compute/configuring-cloud-clusters#partition-settings). ### Further Reading You can read more about Google instances and naming conventions any time by visiting [this page](https://cloud.google.com/compute/docs/machine-resource) of their documentation. # Logging In to the Controller > Source: https://parallelworks.com/docs/compute/logging-in-controller # Logging In to the Controller Clusters use one node, called a controller, to delegate tasks to compute nodes so they can carry out commands and complete jobs. You can complete many tasks on ACTIVATE after logging in to the controller, such as submitting jobs and transferring data. There are multiple ways to log in to the controller. ## Within the Platform ### One-Click SSH Connection After you've started a cluster, navigate to the **Home** page. In the **Compute** module, click on the cluster's IP address. Alternatively, you can click the terminal icon, then click the arrow icon. A dropdown menu of your active clusters will appear. Click the one you'd like to SSH into. ![Screenshot of an active cluster with its IP address circled.](/content-images/docs/compute/logging-in-controller/one-click-options.png) A terminal will open on the bottom half of your screen, where you'll be automatically logged in to your cluster's controller node. ### Manual SSH Connection After you’ve started a cluster, navigate to the **Home** page. In the **Compute** module, click on the clipboard next to the running cluster's IP address to copy it. ![Screenshot of the user clicking the copy icon for an IP address.](/content-images/docs/compute/logging-in-controller/click-cluster-copy-icon.png) Open the terminal . Enter the command `ssh username@IPaddress`. The terminal will display your last login and location. ![Screenshot of the terminal after using SSH with the cluster IP address to log in to the controller.](/content-images/docs/compute/logging-in-controller/SSH-terminal-activate.png) :::info Note Each time you start a cluster, the controller will be assigned a random IP address from the cloud provider’s available addresses. If you stop the cluster, this IP address is released automatically and will most likely not be the same when you start the cluster again. Although it’s unlikely that you’ll encounter the same cluster IP address, it may occur if you start and stop a cluster frequently. You may receive the following message: `WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!`. ![Screenshot of a duplicate IP address warning in a macOS Terminal window. ](/content-images/docs/compute/logging-in-controller/duplicate-IP-warning.png) To resolve the issue, enter the command `ssh-keygen -R controllerIPaddress`. You should see the following message: ```shell [demo@pw-user-demo ~]$ ~ ssh-keygen -R 35.224.100.236 # Host 35.224.100.236 found: line 137 /Users/demo/.ssh/known_hosts updated. Original contents retained as /Users/demo/.ssh/known_hosts.old [demo@pw-user-demo ~]$ ~ ssh canary.parallel.works The authenticity of host '35.224.100.236' can't be established. ED25519 key fingerprint is SHA256:KzR9SCW5QKmICeH2e5z7ZHPgAdoUOUuBNpkqj8UqSog. This key is not known by any other names Are you sure you want to continue connecting (yes/no/[fingerprint])? ``` Enter `yes`. You'll see a message that the IP address has been added to the list of known hosts. ```shell Warning: Permanently added '35.224.100.236' (ED25519) to the list of known hosts. Last login: Wed Jan 11 16:40:36 2023 from 104-60-190-63.lightspeed.hstntx.sbcglobal.net [demo@pw-user-demo ~]$ ``` ::: ## Outside the Platform You can add an SSH key to your ACTIVATE account, which will allow you to log in to any active cluster from any device with that SSH key on it. For more information, please see [**Managing SSH Keys**](/docs/account-settings/authentication#managing-ssh-keys). ## FAQ ### Why don't I have to use an SSH key from within the platform? Each user's workspace has an SSH key preprovisioned, so logging in to the controller through the IDE doesn't require SSH key management. The public key is automatically propagated to the controller while the private key stays inside your workspace. Whenever you start a new cluster, a new key is generated and propagated to facilitate SSH to compute nodes. This process works because the home directory is shared across all nodes in the cluster; adding your public workspace key to the `authorized_keys` file on the controller automatically allows you to SSH to the compute nodes too. You can access your public workspace key at any time with the command `cat ~/.ssh/pw_id_rsa.pub` in an IDE terminal. ### Why do I see `__ failed login attempts` the first time I log in to the controller? These failed login attempts won't affect your cluster's performance: they're a result of how the ACTIVATE platform communicates with cloud service providers to make resources available. During the provisioning process, the platform repeatedly tries to SSH to the controller. While the controller comes online, the platform attempts to establish a tunnel connection from the user workspace to the controller. Because the user workspace key isn't available on the system until partway through the bootstrap process, the system registers some of these connection attempts as failures. Below is a diagram of this process. ![Diagram of the workspace provisioning process.](/content-images/docs/compute/logging-in-controller/SSH-tunnel-diagram.png) ### What if I don’t have an SSH key? The steps below will guide you through finding and creating SSH keys on your device for both macOS and Windows. :::info Note The instructions in this section will work on Windows if you use a shell emulator like [Git BASH](https://gitforwindows.org/) or [PowerShell](https://learn.microsoft.com/en-us/powershell/scripting/install/installing-powershell-on-windows?view=powershell-7.3). If you use [PuTTY](https://www.putty.org/) to manage your SSH keys on Windows, see [**What if I use PuTTY?**](/docs/compute/logging-in-controller/#what-if-i-use-putty) below. ::: #### Check for SSH Keys Open Terminal (macOS) or Command Prompt (Windows). Enter `ls .ssh` to check for SSH keys on your device. If you’ve never generated an SSH key, you’ll see the message `ls: .ssh: No such file or directory`. ![Screenshot of an empty /.ssh/ directory on macOS.](/content-images/docs/compute/logging-in-controller/empty-SSH-directory.png) If you do have SSH keys on your device, they’ll be listed. If you want to use one of your existing keys, see **Get Your Public Key** below. #### Create an SSH Key Enter `ssh-keygen`. You’ll see the following message: ```shell Generating public/private rsa key pair. Enter file in which to save the key (/Users/YourName/ .ssh/id_rsa): ``` ![Screenshot of command ssh-keygen in a macOS Terminal window.](/content-images/docs/compute/logging-in-controller/SSH-keygen-command.png) Type the name of the new location, or press **return/enter** if you want to keep the default location. If this is the first time you’ve generated an SSH key and you use the default location, you'll see `Created directory ' /Users/YourName/ .ssh'.`. ![Screenshot of passphrase prompt in a macOS Terminal window.](/content-images/docs/compute/logging-in-controller/passphrase-prompt.png) You'll be prompted to enter a passphrase for your SSH key with the following message: ```shell [Enter passphrase (empty for no passphrase): [Enter same passphrase again: ``` Enter a passphrase, or press **return/enter** for both lines if you don’t want to use one. You'll see the following message, along with your key fingerprint and the key’s randomart image: ```shell Your identification has been saved in /Users/YourName/ .ssh/id_rsa Your public key has been saved in /Users/YourName/ .ssh/id_rsa.pub ``` ![Screenshot of SSH key randomart image in a macOS Terminal window.](/content-images/docs/compute/logging-in-controller/SSH-random-art.png) Enter `ls .ssh` again. Now you'll see your private and public SSH keys. ![Screenshot of listed SSH keys in a macOS Terminal window.](/content-images/docs/compute/logging-in-controller/SSH-key-list.png) #### Get Your Public Key Enter `cat .ssh/id_rsa.pub`. You’ll see the full contents of your public SSH key. ![Screenshot of a public SSH key in a macOS Terminal window.](/content-images/docs/compute/logging-in-controller/SSH-public-key.png) Copy all of the text from the beginning of `ssh-rsa` to the end of `local`. This is what you’ll paste into the **Access Public Key** text box in your cluster’s configuration settings or the **Key** text box in **Account** > **Authentication** > **Key**. :::caution Important For safety's sake, never store a private SSH key on a server. If someone gained access to your private key, they could use it to access any other device that key protects. ::: ### What if I use PuTTY? Public SSH keys must be in OpenSSH format before you can use them on the ACTIVATE platform. If you use PuTTY, your SSH keys are likely saved in a PPK format like this: ```shell PuTTY-User-Key-File-2: ssh-rsa Encryption: none Comment: rsa-key-20211005 Public-Lines: 6 AAAAB3NzaC1yc2EAAAABJQAAAQEAo7FYgire/SVeCEmN3CLxKgQhG5kCqt+eL4VU X81/zO+lf1P8RjsjCNLrRd0o2zfquhaNFbYKA+DSo6Vpg18EYHiQA/HgEOgzUAF7 Tq4OaZl3yVyJKjzxQDXHnRhnJmCJ438PJD69crQh4apGtuPQuJOOKJe1PCpcp7Fy P2+y2Hb0wM23K60tWsML9wf2P6gsY/vYxV+wNlohJa9LuY2dtk39kCs/5tmIOfHi tOE+3ZjxzYTV0xlLNF+Gjxm1GV38YIa9R9fzdMXqm2HiHFbT5YbB6MaB/brDhVtO dLha0y8OITQosmogA13mOcfYLlbgou65eHT+Nj9tALKEX3LgDw== ``` Before copying a PPK key, it must be converted to OpenSSH format. The easiest way to do this is with PuTTYgen, typically included with PuTTY installations. Below is a CLI example using PuTTYgen to convert a PPK key to OpenSSH format: ```shell $ puttygen putty_key.ppk -L -o putty_key.pub # Command explanation: * 'putty_key.ppk' -> the source key file * '-L' -> OpenSSH public key output type * '-o putty_key.pub' -> The output file name ``` The result is a single line public key file in OpenSSH format: ```shell $ cat putty_key.pub ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEAo7FYgire/SVeCEmN3CLxKgQhG5kCqt+eL4VUX81/zO+lf1P8RjsjCNLrRd0o2zfquhaNFbYKA+DSo6Vpg18EYHiQA/HgEOgzUAF7Tq4OaZl3yVyJKjzxQDXHnRhnJmCJ438PJD69crQh4apGtuPQuJOOKJe1PCpcp7FyP2+y2Hb0wM23K60tWsML9wf2P6gsY/vYxV+wNlohJa9LuY2dtk39kCs/5tmIOfHitOE+3ZjxzYTV0xlLNF+Gjxm1GV38YIa9R9fzdMXqm2HiHFbT5YbB6MaB/brDhVtOdLha0y8OITQosmogA13mOcfYLlbgou65eHT+Nj9tALKEX3LgDw== rsa-key-20211005 ``` Now you can add this key to your ACTIVATE account. For more details on that process, please see [**Authentication**](/docs/account-settings/authentication#create-an-ssh-key). # Managed Clusters > Source: https://parallelworks.com/docs/compute/managed-clusters # Managed Clusters A managed cluster connects Linux infrastructure that your organization already operates to ACTIVATE. An agent on each registered node reports health and resource information, detects supported schedulers, and maintains an outbound tunnel to the platform. ACTIVATE can then provide shared access, sessions, monitoring, and optional Linux identity management without provisioning or owning the machines. Your organization remains responsible for the hardware, operating system, scheduler, storage, network, backups, and capacity. ## Choose the Right Integration Managed clusters and existing clusters both connect infrastructure that ACTIVATE did not provision, but they serve different operating models. | Capability | Managed Cluster | Existing Cluster | | --- | --- | --- | | Ownership in ACTIVATE | One organization-owned resource | A connection definition for a user's access | | Setup | Register an ACTIVATE agent on each node you want to manage or observe | Configure SSH connection details and credentials | | Visibility | Node inventory, metrics, filesystems, and supported scheduler data | Connection and job-submission capabilities | | Identity | Optionally synchronize ACTIVATE users, groups, SSH keys, home-directory setup, and sudo membership | Use accounts and authentication already configured on the cluster | | Sessions | Run through a selected registered node's platform tunnel | Connect through the user's workspace and HPC Connect | Choose a managed cluster when an organization administrator and Linux administrator will operate one shared integration. Choose an [existing cluster](/docs/compute/configuring-existing-clusters) when users need an SSH connection profile and identity is managed outside ACTIVATE. ## Architecture Every registered node makes outbound HTTPS and WebSocket connections to the ACTIVATE control plane over TCP port 443. Heartbeats carry node inventory and metrics. A persistent tunnel can carry SSH and managed sessions back to a selected node without requiring a public inbound route to that node. The agent also exposes Prometheus metrics on TCP port 9100 on every registered node. Restrict that listener to trusted monitoring systems and cluster networks. agent + SSH"] controller["Scheduler controller
agent + Slurm or PBS"] session["Session node
agent"] monitored["Other monitored nodes
agent"] end user -->|"browser or CLI"| api login -->|"heartbeat + outbound tunnel · TCP 443"| api controller -->|"heartbeat + scheduler data · TCP 443"| api session -->|"heartbeat + outbound tunnel · TCP 443"| api monitored -->|"heartbeat + outbound tunnel · TCP 443"| api api -. "SSH or session over live tunnel" .-> login api -. "managed session" .-> session classDef platformNode fill:#dbeafe,stroke:#3b82f6,stroke-width:2px,color:#1e3a5f classDef clusterNode fill:#d1fae5,stroke:#10b981,stroke-width:2px,color:#064e3b classDef userNode fill:#ede9fe,stroke:#8b5cf6,stroke-width:2px,color:#4c1d95 class api platformNode class login,controller,session,monitored clusterNode class user userNode style platform stroke:#3b82f6,stroke-width:2px style cluster stroke:#10b981,stroke-width:2px `} /> A small cluster can use one machine for several roles. Larger or security-sensitive environments can separate them. | Node role | Register it when | What ACTIVATE uses it for | | --- | --- | --- | | Login node | Users will open terminals or use CLI SSH through this node | SSH destination and, while its tunnel is connected, tunneled SSH | | Scheduler controller | You want scheduler data in ACTIVATE | Slurm partitions and jobs, or PBS jobs | | Session node | Users will launch browser desktop or VS Code sessions | Host for managed sessions over its live tunnel | | Other node | You want its health, filesystems, or access settings managed | Node metrics, inventory, and optional access management | ## Choose a Deployment Profile Start with the smallest profile that meets your goal. Add access-management settings only after the basic connection works. | Profile | Register | Enable | Best for | | --- | --- | --- | --- | | Monitoring only | Scheduler controller and any nodes you want to observe | No access-management settings | Inventory, health, and scheduler visibility without changing Linux identity configuration | | Tunnel access with existing identities | Login node, session node if needed, and scheduler controller | Usually no identity settings | Sites where usernames, home directories, and SSH keys already exist | | ACTIVATE-managed identity and access | Every node where users must resolve, sign in, or receive sudo membership | User Population plus the settings required by your policy | Centralized ACTIVATE users, groups, SSH keys, home-directory setup, and sudo membership | ## Responsibilities and Handoffs Agree on ownership before registration, especially because the agent runs as root and access-management options alter system configuration. | Role | Responsibilities | | --- | --- | | ACTIVATE organization administrator | Create the resource, configure connections and access, grant permissions, select the session node, and coordinate agent updates | | Linux or HPC administrator | Approve and install the agent, which runs as root; validate NSS/PAM/SSH/sudo changes; manage the scheduler; and restore host configuration during offboarding | | Network or security administrator | Permit outbound platform traffic, restrict the metrics listener, and approve any direct SSH path or package downloads | | End user | Maintain their ACTIVATE SSH public key, use the assigned access level, and follow site job and session policies | The ACTIVATE administrator should hand the Linux administrator the intended node roles, deployment profile, access settings, and rollback plan. After validation, give users the cluster name, their access level, the supported login method, and the site's scheduler and session guidance. ## Setup Journey 1. [Plan the topology, check prerequisites, and register a pilot node](/docs/compute/managed-clusters/planning-and-setup). 2. [Configure Linux identity and grant access](/docs/compute/managed-clusters/identity-and-access), if required. 3. Complete the pilot acceptance checks before registering the remaining nodes. 4. Share [connection, session, workflow, and job instructions](/docs/compute/managed-clusters/using-managed-clusters) with users. 5. Follow the [operations and offboarding guide](/docs/compute/managed-clusters/operations) for monitoring, updates, troubleshooting, and removal. # Managed Cluster Identity and Access > Source: https://parallelworks.com/docs/compute/managed-clusters/identity-and-access # Managed Cluster Identity and Access Managed clusters can use accounts already maintained on the Linux hosts, or the agent, which runs as root, can synchronize ACTIVATE identity and access data. Coordinate these settings with the Linux administrator because they change NSS, PAM, `sshd`, and `sudoers` configuration. ## Prepare Identities For ACTIVATE-managed identities: 1. Confirm each user has a unique ACTIVATE username and POSIX UID. Organization administrators can set UIDs during [user import](/docs/organization-admin/managing-users#importing-users). 2. Organize membership with [ACTIVATE groups](/docs/organization-admin/managing-groups). ACTIVATE assigns each group a POSIX GID when it is created; confirm assigned GIDs do not collide with local or directory-service groups before synchronization. 3. Ask each user who will use ACTIVATE-managed SSH keys to add a public key under **Account > Authentication > SSH Keys**. See [Managing SSH Keys](/docs/account-settings/authentication#managing-ssh-keys). 4. Check usernames, UIDs, and GIDs against local and directory-service accounts on every affected node. Resolve collisions before enabling synchronization. The managed-cluster SSH username is the user's ACTIVATE username. If that username does not already resolve on the host, enable **User Population** on every node where the user must sign in or run processes. ## Choose Access-Management Settings Open the cluster and click **Edit**. The cluster settings become defaults for registered nodes and are applied by the agent on a subsequent heartbeat. | Setting | Changes on an enabled node | Dependencies and recommended use | | --- | --- | --- | | **User Population** | Installs and configures `libnss_cache`, then synchronizes authorized ACTIVATE users and groups into passwd, shadow, and group cache files | Enable first when ACTIVATE supplies Linux identities. It is required for synchronized `pwsudo` membership. | | **Home Directories** | Configures PAM to create `/home/` at first login and deploys first-login SSH key generation for node-to-node SSH | Pair with **User Population** for users who do not already exist locally. Existing home-directory contents are not removed when disabled. | | **SSH Keys** | Configures `sshd` to retrieve a user's public keys from ACTIVATE | Users must have a public key in ACTIVATE. Test for conflicts with an existing `AuthorizedKeysCommand`, cloud guest agent, or SSH policy. | | **Sudo Access** | Creates a sudoers rule granting passwordless sudo to the `pwsudo` group | Enable **User Population** too; without it, ACTIVATE cannot synchronize users into `pwsudo`. Grant only Sudo or Admin permission to intended administrators. | **User Population** can install build dependencies and obtain `libnss_cache` source from GitHub. Review the package and network requirements in [Plan and Set Up](/docs/compute/managed-clusters/planning-and-setup#before-you-begin). ### Recommended Enablement Order 1. Enable **User Population** on the pilot and confirm `getent passwd ` and `id ` return the intended UID and groups. 2. Enable **Home Directories** if ACTIVATE-managed users need automatic home creation, then complete one pilot login. 3. Enable **SSH Keys**, validate `sshd` configuration, and complete an ACTIVATE-key login. 4. Enable **Sudo Access** only after verifying synchronized `pwsudo` membership and the approved Sudo or Admin grant. 5. Repeat the [pilot acceptance checklist](/docs/compute/managed-clusters/planning-and-setup#pilot-acceptance-checklist) before applying the settings cluster-wide. :::caution System configuration changes Test on a non-critical node with a host backup or documented rollback path. Enabling or disabling these settings can restart SSH and alter NSS, PAM, `sshd`, and sudo behavior. Maintain an independent administrative access path while validating the changes. ::: ## Node-Level Overrides To give one node different access settings, open **Nodes**, select the node, and click **Settings**. Values that differ from cluster defaults appear as **Overridden**. Each setting inherits the cluster default independently until you override it. Use **Reset to default** for a setting when the node should follow future cluster-level changes again. After changing an override, confirm the effective settings in the agent logs and with the host-level checks above. ## Grant Cluster Access Open the cluster's actions menu and select **Manage Access**. Grant a level to the entire organization or selected groups. | Access level | User capability | Linux effect when synchronization is enabled | | --- | --- | --- | | **Login** | View the cluster, sign in as a normal user, and submit jobs | User and group data are synchronized when **User Population** is enabled | | **Sudo** | Includes Login access and permits administrative work | User joins `pwsudo` when **User Population** and **Sudo Access** are enabled | | **Admin** | Highest managed-cluster access level; also includes sudo access | User joins `pwsudo` under the same setting dependencies | Organization administrator permission is still required to create, configure, or delete the managed cluster. Managed clusters do not have a Writer level. Access changes reach online nodes after a subsequent heartbeat. Validate access on every node where the user must resolve or sign in, not only the login node. ## Remove or Reduce Access Plan revocation like an operational change: 1. Account for the user's jobs, sessions, files, and service ownership. 2. Remove the group or organization grant, or reduce Sudo/Admin to Login. 3. Keep the relevant agents online and wait for a subsequent heartbeat. 4. When **User Population** is enabled, verify the cache and `pwsudo` membership changed on every affected node. When a synchronized user loses all cluster access, the agent removes that user from its cache and attempts to terminate processes running under the revoked UID. It also attempts to terminate the user's processes when Sudo or Admin access is reduced to Login. Treat that behavior as disruptive: do not revoke access during an active workload without coordination. :::caution Revocation is not host restoration Removing sudo permission prevents future synchronized `pwsudo` membership, but it cannot undo files, services, credentials, scheduled tasks, or other persistent changes the user previously made as root. Audit or restore the affected nodes when you need assurance that those changes are gone. ::: For removal of the integration itself, use the [offboarding procedure](/docs/compute/managed-clusters/operations#offboard-a-node-or-cluster) while the agent can still clean up its managed settings. # Operate and Troubleshoot Managed Clusters > Source: https://parallelworks.com/docs/compute/managed-clusters/operations # Operate and Troubleshoot Managed Clusters Use this guide for routine monitoring, agent updates, incident checks, and safe removal of a managed-cluster integration. :::info Responsibilities Organization administrators perform ACTIVATE actions such as agent updates and record removal. Linux or HPC administrators run host commands, validate system configuration, and preserve an independent recovery path. Coordinate both roles during troubleshooting and offboarding. ::: ## Monitor the Integration The agent sends a heartbeat every 30 seconds, including node identity, operating-system and hardware information, resource metrics, filesystems, and supported scheduler data. A node is marked offline after about 90 seconds without a heartbeat. Review these signals separately: | Signal | What it proves | What it does not prove | | --- | --- | --- | | **Online** | ACTIVATE recently received a heartbeat | The persistent tunnel is connected or SSH works | | **Tunnel Connected** | ACTIVATE can currently open tunnel streams to the agent | Linux identity, SSH, or session software is configured correctly | | Scheduler data | The controller agent detected supported scheduler services and commands | Every scheduler command or job is healthy | | Access-management logs | The agent attempted to reconcile desired settings | The user can complete a real login and workload | Use a real pilot terminal, session, and test job after changes that affect networking, identity, SSH, the scheduler, or the agent. ## Update Agents When an online, tunnel-connected node reports an older supported agent version, organization administrators can select **Update agent** from that node's actions. Use **Update all agents** on **Nodes** to dispatch the update to every eligible node. During an update, the running agent replaces itself with the new binary and reconnects without starting a new systemd service process. It reports its new version on a later heartbeat. Offline, disconnected, already current, already updating, or unsupported agents are skipped and reported separately. Update a pilot first, verify heartbeats, tunnel connectivity, access, and scheduler data, and then update the remaining nodes in batches. ## Troubleshooting ### A Node Does Not Finish Registering - Generate a new token; the previous token may have expired, been used, or been exposed. - Confirm the node can reach the exact ACTIVATE platform host over TCP port 443 with trusted TLS. - Confirm the CLI was installed at `/usr/local/bin/pw` and rerun the displayed registration command with root privileges. - Confirm the system hostname is not already in use by a different registered machine. - Read logs with `sudo journalctl -xefu pw-agent --output=cat`. ### A Node Is Offline or Its Tunnel Is Disconnected - Check `sudo systemctl status pw-agent` and, if appropriate, restart it with `sudo systemctl restart pw-agent`. - Confirm outbound HTTPS and WebSocket traffic is not blocked or intercepted by a proxy. - Remember that heartbeat and tunnel status are separate. A node can briefly remain online after its tunnel disconnects. - If the node is the login target, determine whether ACTIVATE is attempting the [documented direct fallback](/docs/compute/managed-clusters/planning-and-setup#login-address) and whether that route is intended. ### Metrics on TCP 9100 Are Exposed or Unavailable - Restrict TCP 9100 at the host or network firewall to approved monitoring systems. The endpoint has no credential check. - Confirm no other service is already using port 9100. - Check the agent log for a Prometheus exporter startup error. - A failure of this listener does not by itself prove that platform heartbeats or the managed tunnel have failed; check them independently. ### Scheduler Partitions or Jobs Do Not Appear - Confirm the agent is installed on the scheduler controller. - For Slurm, confirm the node can run `squeue --version`, `sinfo`, and `squeue`, and that `slurmctld` is running. - For PBS, confirm the node can run `qstat --version` and `qstat`, and that `pbs_server` is running. - Expect partitions only for Slurm. The PBS integration reports jobs, not partitions. - Review agent logs for scheduler command errors. ### A User Cannot Sign In - Confirm the user or one of their groups has Login, Sudo, or Admin access. - Confirm the user's ACTIVATE username and POSIX UID do not conflict with local identities. - For an ACTIVATE-managed identity, verify **User Population** is enabled on the login node and check `getent passwd ` and `id `. - If the user needs automatic home creation, verify **Home Directories** is enabled and inspect PAM logs. - If using ACTIVATE SSH keys, verify **SSH Keys** is enabled, the user has a public key under **Account > Authentication**, and `sshd` accepted its managed configuration. - Wait for a subsequent heartbeat, then inspect both agent and SSH service logs. ### Sudo Membership Does Not Appear - Enable both **User Population** and **Sudo Access** on the node. The sudoers rule alone does not synchronize `pwsudo` group membership. - Confirm the user has Sudo or Admin cluster access. - Check `id ` after the next heartbeat and review agent logs. - Confirm that a node-level override has not disabled either required setting. See [Node-Level Overrides](/docs/compute/managed-clusters/identity-and-access#node-level-overrides). ## Offboard a Node or Cluster Deleting a node or cluster in ACTIVATE revokes platform access and removes its ACTIVATE record, but it does not uninstall the agent or restore every host change. Disable access management while the agent remains registered and online so it can perform its supported cleanup. ### 1. Prepare the Workload and Recovery Path 1. Notify users and account for running jobs, sessions, processes, files, scheduled tasks, and services. 2. Preserve an administrative access path that does not depend on ACTIVATE-managed identities or SSH keys. 3. Back up affected NSS, PAM, `sshd`, and sudo configuration under your site's change process. ### 2. Disable Managed Access Settings In the cluster and any node overrides, disable **Sudo Access**, **SSH Keys**, **Home Directories**, and **User Population**. Keep the agent running and connected through at least a subsequent heartbeat. Reset or disable overrides that would otherwise keep a setting enabled. Verify on every affected node that: - `/etc/sudoers.d/pwsudo` is removed. - The ACTIVATE-managed `AuthorizedKeysCommand` configuration is removed and SSH still validates and restarts successfully. - ACTIVATE-managed PAM home-directory configuration and its first-login key-generation script are removed. - `/etc/passwd.cache`, `/etc/shadow.cache`, and `/etc/group.cache` are removed. - Users can still sign in through the independent administrative path. Disabling **User Population** intentionally leaves the installed `libnss_cache` library and `cache` references in `nsswitch.conf`; the cache files are removed. Review those retained artifacts with the Linux administrator. Remove them only if no other service uses them and your normal host-change procedure calls for it. Existing home directories and user-owned data are not deleted. ### 3. Remove the ACTIVATE Records To remove one node, open **Nodes**, select the node, open **Settings**, and click **Delete Node**. ACTIVATE removes its node record, revokes the node credential, and disconnects its tunnel. To remove the integration, select **Delete** from the cluster actions menu. This removes only the ACTIVATE record; it does not delete machines, scheduler configuration, user data, or agent installations. ### 4. Remove Host Artifacts On each retired node, stop and disable the service: ```bash sudo systemctl disable --now pw-agent ``` After confirming that no other service uses them, remove `/etc/systemd/system/pw-agent.service` and reload systemd under your normal administration process. Review `/root/.config/pw/credentials` for the agent identity; do not delete the whole credentials file if it contains another CLI context. The [`pw context` commands](/docs/cli/pw/context) can list and remove individual contexts. Remove `/usr/local/bin/pw` only if no user, service, or remaining ACTIVATE integration on the host needs the CLI. Finally, verify that the service cannot restart, the node no longer appears in ACTIVATE, TCP 9100 is closed, and no unintended ACTIVATE-managed access remains. # Plan and Set Up a Managed Cluster > Source: https://parallelworks.com/docs/compute/managed-clusters/planning-and-setup # Plan and Set Up a Managed Cluster Use this guide to connect one pilot node, validate the complete path, and then roll the agent out to the remaining nodes. ## Before You Begin Choose a [deployment profile and assign responsibilities](/docs/compute/managed-clusters) before changing any hosts. You need: - Organization administrator permission in ACTIVATE. - Root or `sudo` access to every node you plan to register. - A Linux distribution that uses `systemd`. - `curl` and an SSH server on nodes that users will access interactively. - Slurm or PBS client commands on the scheduler controller if you want job information in ACTIVATE. - A maintenance window and host backups appropriate for any NSS, PAM, `sshd`, or `sudoers` changes you plan to enable. Access-management automation supports Debian- and RHEL-family distributions. **User Population** may install `git`, `make`, and a C compiler, then build `libnss_cache` from source if the library is absent. Permit access to the host's package repositories and GitHub during initial configuration, or preinstall the dependencies under your site's change process. ## Check Network Paths | Direction | Source | Destination | Port and protocol | Purpose | | --- | --- | --- | --- | --- | | Outbound | Every registered node | ACTIVATE platform host | TCP 443, HTTPS/WSS | Registration, heartbeats, API calls, and the managed tunnel | | Inbound within trusted networks | Approved monitoring systems | Every registered node | TCP 9100, HTTP | Prometheus metrics exposed by the agent | | Inbound to the selected login node | Platform, workspace, or approved user networks, depending on login configuration | SSH server | TCP 22 | Direct SSH path when the configured route does not use the tunnel | | Local on the selected login node | Managed agent | SSH server | TCP 22 | Final SSH hop when ACTIVATE uses the managed tunnel; this does not require a public inbound rule | The metrics endpoint on TCP 9100 does not require credentials. The agent listens on all interfaces by default, so use host or network firewalls to prevent public or untrusted access. The platform connection itself is outbound; you do not need a public inbound route for the managed tunnel. See [Compute Cluster Agent Connectivity](/docs/self-hosting/ports#agent-connectivity) for the broader control-plane network model. ## Choose the Pilot Start with a non-critical node that represents the operating system and security configuration you will use in production. If possible, choose a node that can perform the intended login or scheduler-controller role so the pilot can validate more than heartbeats. Do not enable cluster-wide access management until the pilot agent is online. When you are ready to test those settings, use a [node-level override](/docs/compute/managed-clusters/identity-and-access#node-level-overrides). ## Create the Resource 1. Open **Compute > Clusters**. 2. Click **Add Resource** and select **Managed Cluster**. 3. Enter a unique cluster name. Display name, description, tags, and favorite status are optional. 4. Click **Add Resource**. This creates an organization-level record in ACTIVATE. It does not create or modify any machines. ## Register the Pilot Node 1. Open the managed cluster and select **Nodes**. 2. Click **Add Node**. 3. Click **Generate Registration Token**. 4. On the node, run the installation command shown in ACTIVATE. It follows this form: ```bash curl -fsSL https:///cli/install.sh | bash -s -- --to /usr/local/bin ``` 5. Run the registration command shown on the page: ```bash sudo /usr/local/bin/pw agent register --token '' --systemd ``` The command exchanges the token for a node-specific credential, installs and enables `/etc/systemd/system/pw-agent.service`, and starts the agent. The service runs as root. :::caution Protect the installer and registration token Use the exact HTTPS installer URL displayed by your ACTIVATE deployment. If your security policy requires source review, download and inspect the installer before executing it instead of piping it directly to Bash. The registration token is a secret, expires after 24 hours, and works once. The command-line form can be recorded in shell history and may be briefly visible to local process inspection. Generate it only when ready, use a trusted administrative session, and remove the command from history according to your shell and site policy. Generate a replacement for every additional node or after any suspected exposure. ::: A node is identified by its system hostname. Registering the same hostname again replaces that node's credential and registration. Before re-registering, confirm that no other active machine is using that hostname. ## Verify the Agent On the node, inspect the service and follow its logs: ```bash sudo systemctl status pw-agent sudo journalctl -xefu pw-agent --output=cat ``` The agent sends a heartbeat every 30 seconds. ACTIVATE marks a node offline after it has missed heartbeats for about 90 seconds. **Online** and **Tunnel Connected** are separate states; verify both when the node will handle SSH or sessions. ## Configure the Node Roles Open the cluster and click **Edit**. ### Login Address Choose where terminal and CLI SSH connections land: - **Registered node** uses that node's live tunnel when available. - **User workspace** uses the user's workspace as the connection point when it can route to the cluster. - **Custom address** uses an administrator-supplied hostname or IP address. If you use a custom address, enable **Proxy SSH** when the platform should proxy the connection rather than let the client connect directly. :::caution A registered node is not a tunnel-only policy If the selected registered node is offline or its tunnel is unavailable, ACTIVATE may fall back to a direct SSH connection to that node's configured hostname. Make sure DNS and firewall policy allow only the direct path you intend. Do not rely on the registered-node selection to prohibit direct SSH. ::: ### Session Node Select the registered node that should host browser desktop and VS Code sessions. It can differ from the login node, but its tunnel must show **Connected** when a session starts. Choose **None** to disable managed sessions for the cluster. ### Scheduler Controller Register the node running `slurmctld` or `pbs_server` to publish cluster scheduler data without duplicating it from every node. ACTIVATE displays Slurm partitions and jobs. For PBS, it displays jobs; do not expect a PBS partition view. If you chose the ACTIVATE-managed identity and access profile, [configure identity and access on the pilot](/docs/compute/managed-clusters/identity-and-access) now. Return here only after the applicable NSS, PAM, SSH-key, and sudo checks succeed. ## Pilot Acceptance Checklist Complete the basic connection checks and every identity check that applies to your deployment profile before registering more nodes: - [ ] The pilot appears **Online**, and its hostname, operating system, architecture, filesystems, and metrics are correct. - [ ] If the node will carry SSH or sessions, its tunnel appears **Connected**. - [ ] The intended login address is configured, and a pilot user can open a terminal using the expected route. - [ ] If using Slurm, partitions and a test job appear. If using PBS, a test job appears. - [ ] If using ACTIVATE-managed identities, a pilot user's UID, groups, home directory, SSH key, and sudo behavior match policy. - [ ] Removing the pilot user's access or sudo permission produces the expected process-revocation behavior described in the [identity guide](/docs/compute/managed-clusters/identity-and-access#remove-or-reduce-access). - [ ] If sessions are enabled, a pilot desktop or VS Code session starts on the selected session node. - [ ] TCP 9100 is unreachable from untrusted networks and reachable only from approved monitoring systems, if any. - [ ] Agent logs show no repeated heartbeat, tunnel, scheduler, or access-management errors. - [ ] Linux and ACTIVATE administrators have recorded the effective settings and rollback plan. ## Roll Out the Remaining Nodes After all applicable pilot checks pass, generate a fresh registration token for each node. Register only nodes that ACTIVATE needs to observe, use as a connection target, or configure. After each batch, verify node status, tunnel state where required, and effective access-management settings before continuing. After rollout, share the [user guide](/docs/compute/managed-clusters/using-managed-clusters) and the site's support path with everyone who receives access. # Use a Managed Cluster > Source: https://parallelworks.com/docs/compute/managed-clusters/using-managed-clusters # Use a Managed Cluster Use this guide to open terminals and sessions, run workflows, submit scheduler jobs, and understand the managed-cluster status shown in ACTIVATE. :::info For organization administrators Before handing the cluster to users, provide its ACTIVATE name, the user's Login, Sudo, or Admin access level, the expected login route, and the site's scheduler, session, and support policies. ::: ## Open a Terminal Select **Open Terminal** from the cluster page to connect to the configured login address. The SSH username is your ACTIVATE username. From a local terminal with the authenticated ACTIVATE CLI, run: ```bash pw ssh ``` The explicit managed-cluster form is also supported: ```bash pw ssh pw:// ``` See [`pw ssh`](/docs/cli/pw/ssh) for port forwarding and ProxyCommand examples. When the login address is a registered node with a live tunnel, ACTIVATE carries SSH through that tunnel. If the node is offline or its tunnel is unavailable, ACTIVATE may attempt a direct connection to the selected node's hostname. Ask your administrator which path is expected; a registered-node selection does not guarantee tunnel-only access. ## Start a Desktop or VS Code Session An organization administrator must first select a tunnel-connected **Session Node**. It can differ from the login node. Use **Quick Launch** on the cluster's **Details** tab, or create a session from **Sessions**. A session remains assigned to the node selected when it was created even if the cluster's Session Node setting changes later. - Follow [Desktop Sessions](/docs/run/sessions/desktops) for a browser-based graphical desktop on the selected session node. - Follow [VS Code Sessions](/docs/run/sessions/vscode) for browser VS Code or a local VS Code Remote-SSH connection. - Use an [interactive session](/docs/run/sessions/interactive-sessions) when you need a scheduler-allocated compute node rather than the configured session node. Sessions cannot start while the selected node's agent tunnel is disconnected. Check the node's tunnel state or contact the cluster administrator if a session remains pending or fails. ## Run Workflows and Submit Jobs Users with cluster access can select the managed cluster as a workflow compute resource. See [Running Workflows](/docs/run/workflows/running-workflows). You can also open a terminal and submit jobs using the site's scheduler commands. For Slurm examples, see [Submitting Jobs via Slurm](/docs/compute/submitting-jobs). Follow your Linux administrator's instructions for partitions, queues, accounts, storage, and software modules. ## Understand What ACTIVATE Displays - **Details** summarizes online nodes, CPU, memory, storage, current and historical utilization, and active sessions. It also displays partitions for a detected Slurm controller. - **Jobs** lists active Slurm or PBS jobs. Slurm jobs can be filtered by partition. - **Nodes** shows each registered node's status, type, operating system, agent version, tunnel state, and last heartbeat. - A node detail page shows CPU, memory, disk, load, uptime, process count, network totals, IP addresses, filesystems, and metric history. ACTIVATE reports scheduler data only from the registered node where it detects `slurmctld` or `pbs_server`. PBS jobs appear, but PBS partitions are not reported. ## Access Problems If you cannot sign in: 1. Confirm you have Login, Sudo, or Admin access to the cluster. 2. Confirm your ACTIVATE username is the Linux username expected by the site. 3. If the site uses ACTIVATE SSH keys, confirm your public key under **Account > Authentication > SSH Keys**. 4. Tell the administrator whether browser terminal, `pw ssh`, or both fail and whether the selected login node appears online. Administrators can continue with [operations and troubleshooting](/docs/compute/managed-clusters/operations#troubleshooting). # Managing IP Addresses > Source: https://parallelworks.com/docs/compute/managing-ip-addresses # Managing IP Addresses When creating a cluster, an ephemeral IP address is automatically chosen and assigned to the cluster. Alternatively, you can create a static, shareable IP address. This feature is useful if these two conditions are true for you: * Your application depends on having the same IP address each time you run it. * You need to start and stop your cluster. For example, you could be using a cluster to access a server that needs to whitelist your IP address before you can connect. If your IP address changes, the server firewall would need to be updated every time you access it. Instead, you could create an IP address to use each time and maintain your access. Another example is assigning a domain name to your cluster. You could create a reliable IP address to use in DNS. ## Creating an IP Address Navigate to **IP Addresses**. ![Screenshot of the user clicking IP Addresses in the navigation pane.](/content-images/docs/compute/managing-IP-addresses/click-IP-addresses.png) Click **+ Add IP Address**. ![Screenshot of the user clicking the Add IP Address button.](/content-images/docs/compute/managing-IP-addresses/click-add-IP-address1.png) You must select a provider (AWS, Azure, or Google) before you can select a **Cloud Infrastructure** and **Region**. A **Resource Name** is required. The **Description** and **Tags** are optional. Click **Add IP Address**. ![Screenshot of the user clicking the + Add IP Address button.](/content-images/docs/compute/managing-IP-addresses/click-add-IP-address2.png) The message *IP created* will appear in the bottom right corner of your screen. Your IP address will begin the provisioning process. ![Screenshot of the user clicking the + Add IP Address button.](/content-images/docs/compute/managing-IP-addresses/IP-address-provisioning.png) You can click the status to see a detailed provisioning log. ![Screenshot of the user clicking the IP provisioning status.](/content-images/docs/compute/managing-IP-addresses/click-provisioning-status.png) ![Screenshot of the IP address provisioning log.](/content-images/docs/compute/managing-IP-addresses/active-provisioning-log.png) Once the IP address is provisioned, you can click the copy icon to share it. ![Screenshot of the user clicking the copy icon for the provisioned IP address.](/content-images/docs/compute/managing-IP-addresses/click-copy-IP-address.png) ## Attaching an IP Address Navigate to the **Definition** tab of the cluster you'd like to attach the IP address to. In **Controller Settings**, use the **IP Address** dropdown menu to select one of your IP addresses. ![Screenshot of the user clicking IP Address dropdown menu.](/content-images/docs/compute/managing-IP-addresses/click-IP-address-dropdown.png) Click **Save Changes**. ![Screenshot of the user clicking Save Changes.](/content-images/docs/compute/managing-IP-addresses/click-save-changes.png) When your cluster has been provisioned, you'll see the attached IP address in the provisioning logs and at the top of the page. ![Screenshot of the user clicking IP Address dropdown menu.](/content-images/docs/compute/managing-IP-addresses/IP-provisioned-on-cluster.png) ## Deleting an IP Address Navigate to **IP Addresses**. ![Screenshot of the user clicking IP Addresses in the navigation pane.](/content-images/docs/compute/managing-IP-addresses/click-IP-addresses.png) Click the delete icon. ![Screenshot of the user clicking IP Addresses in the navigation pane.](/content-images/docs/compute/managing-IP-addresses/click-delete-IP-address.png) A dialog box will appear with the message _Are you sure you want to delete this IP address?_ Click **Delete**. The message _IP address is waiting to be destroyed. This may take a few minutes._ will appear in the bottom right corner of your screen. Your IP address will begin the provisioning process. # Navigating Clusters > Source: https://parallelworks.com/docs/compute/navigating-cloud-clusters # Navigating Clusters ## Details ![Screenshot of the Details section on a cluster’s configuration page.](/content-images/docs/compute/navigating-cloud-clusters/blank-new-cluster-page.png) The **Details** tab displays information about your cluster’s configuration settings. ### Workflows* _*Only available on active clusters_ This module lets you run workflows directly from your cluster. ### Observability* _*Only available on active clusters_ This module displays usage graphs for CPU, memory, and root disk storage on your cluster.The x axis represents time by the minute. The y axis represents the percentage of the resource you've used. Mouse over a graph line to display exact percentages and amounts in GiB. Click **Expand** on any graph to see a larger version. Click the time dropdown menu to change the interval of data between 1, 3, and 8 hours. Please note that data older than 8 hours is discarded. ### Attached Storages* _*Only available on active clusters_ This module displays any storage resources that are attached to your cluster, including the root disk. To add attached storage, please see [**Configuring Storage**](/docs/storage/configuring-storage) and [**Attaching Storage**](/docs/storage/attaching-storage). Click the monitor icon to create a snapshot of the storage resource. For more information, please see [**Working With Disk Snapshots**](/docs/storage/working-with-disk-snapshots). ### Cluster Definition The **Cluster Definition** module lists the parameters and status of the controller node on your cluster. Please note that if you’ve just created your cluster, many parameters in **Cluster Definition** will be blank. #### Status You can click a cluster's **Status** to see detailed provisioning logs. ![Screenshot of the user clicking a cluster's provisioning status.](/content-images/docs/compute/navigating-cloud-clusters/click-provisioning-status.png) ![Screenshot of a cluster's provisioning logs during the provisioning process.](/content-images/docs/compute/navigating-cloud-clusters/blank-provision-logs-provisioning.png) #### IP Address When a cluster is active, you can click its IP Address to connect via SSH. ![Screenshot of the user clicking a cluster's IP address.](/content-images/docs/compute/navigating-cloud-clusters/click-ip-address.png) A terminal will appear on the bottom half of your screen, where you'll be connected to the controller node. You can also click the copy icon to copy your IP address. ![Screenshot of the user clicking a cluster's IP address.](/content-images/docs/compute/navigating-cloud-clusters/click-copy-ip-address.png) ### Partitions If you have any partitions on your cluster, details about them will be listed in **Partitions**. ## Jobs ![Screenshot of the Jobs section on a cluster’s configuration page.](/content-images/docs/compute/navigating-cloud-clusters/blank-running-jobs.png) The **Jobs** tab displays a monitor for any running Slurm jobs on your cluster. ## Action Bar ![Screenshot of the Details section on a cluster’s config page.](/content-images/docs/compute/navigating-cloud-clusters/blank-new-cluster-page.png) The action bar displays the major actions you can perform with your cluster. ### Start/Resume Use this button to start your cluster. You can only click **Start/Resume** when a cluster isn't provisioned or after you've stopped it by clicking **Stop**. ### Stop Use this button to stop your cluster's controller. This action is equivalent to pressing a physical power button or running the `shutdown` command. You can click **Start / Resume** to resume the controller while it's stopped. When stopped, clusters continue to accrue costs only for attached storage resources and IP addresses. You will not be charged for compute resources. ### Destroy Use this button to destroy your cluster, which deprovisions all nodes and ephemeral filesystems. If you want to use the cluster again, it will have to start the provisioning process from the beginning when you click **Start / Resume**. ### Edit Use this button to edit your cluster's configuration settings. For more information, please see [**Configuring Clusters**](/docs/compute/configuring-cloud-clusters). ### Connect Via SSH Use this button to open a terminal and automatically connect to your cluster's controller node via SSH. ### Favorite Use this button to favorite your cluster. Favorited items appear on your Dashboard in the **Compute** module. After favoriting, this button will change to **Unfavorite**. Click it to remove the cluster from your Dashboard. ### Manage Access Use this button to manage which groups in your organization can access your cluster. Your group name(s) will be specific to your organization. There are four levels of access: - **Admin** grants users the same level of access as the owner of the cluster, including the ability to delete it. - **Writer** grants users the ability to edit the cluster’s configuration as well as log in to the cluster. - **Sudo** grants users the ability to log in to the cluster with root access via the `sudo` command. Root access allows users to do anything inside both the controller and compute nodes. - **Login** grants users the ability to log in to any compute node on the cluster by using the `ssh` command. Users' home directories are created automatically on the first login. Removing this permission revokes access after 30 seconds and kills any active sessions. If you’re not sure which group to select, you can contact us or your organization’s ACTIVATE administrator. :::caution About Sudo Access Although you can remove **sudo** access, it is best to reprovision a cluster to ensure access is revoked. This is because once a user has **sudo** access, they can install software and make changes to the cluster which may not be easily reversible. ::: After selecting or unselecting a group, click **Save Access**. ![Screenshot of the user clicking Save Access after editing group permissions.](/content-images/docs/compute/navigating-cloud-clusters/click-save-access.png) ### Delete Configuration Use this button to delete your cluster. After deletion, it will no longer appear on your **Clusters** page. ### Duplicate Use this button to make a copy of your cluster. When you duplicate a cluster, you'll be asked to name it. The copy will appear on your **Clusters** page. ### Publish Use this button to publish a copy of your cluster in the Marketplace. Other users in your organization will be able to use the published version in their own ACTIVATE accounts. For more information, please see [**Publishing an Item**](/docs/marketplace#publishing-an-item). ### JSON This button shows the JSON code version of your resource’s configuration settings. You can manually adjust these settings, then click **Save**. ![Screenshot of the user clicking Save after editing the JSON details.](/content-images/docs/compute/navigating-cloud-clusters/click-save-json-slideout.png) ## What's the difference between stopping, destroying, and deleting clusters? Stopping a cluster shuts down the controller node, preventing some costs from accruing. While stopped, you will not pay for the controller node compute costs, but you will continue to pay for any filesystems and storage. If you spent time customizing the controller but do not need to use it for a period, you can stop the cluster instead of destroying it. As an alternative, you may consider snapshotting the controller and then when you're ready to resume, you can start the controller back up. Another reason to stop the controller can be for troubleshooting. Anytime the system would benefit from rebooting, you may stop and then resume the controller to achieve that effect. Destoying a cluster completely deprovisions it from the cloud. This deletes all ephemeral filesystems, all disks, the controller node, and all compute nodes are immediately deleted. Any running or pending jobs will be lost as resources are deleted. Deleting a cluster configuration removes it entirely from your account. There are no costs incurred for having cluster configurations in your account. More succinctly: - Stopping temporarily shuts down the controller. - Destroying completely removes all provisioned resources, including ephemeral filesystems and compute nodes. - Deleting a configuration completely removes that configuration from our platform. # Shared Directories > Source: https://parallelworks.com/docs/compute/shared-directories # Shared Directories This section provides an overview of the directories shared between the compute nodes and the controller nodes in HPC cloud clusters. Understanding these shared directories is crucial for managing data and optimizing job performance in your cluster setup. ![Diagram of the shared directories in a cluster.](/content-images/docs/compute/shared-directories/SharedDirectoriesAug23.svg) ## Home Directory The home directory serves as a central storage location and plays a key role in your cluster's operation. It is automatically NFS exported from the controller node, and all compute nodes inside a cluster automatically mount `/home` over NFS. Because the home directory is part of the controller's root disk, it gets deleted when a cluster is turned off. This directory is a no-cost alternative to cloud storage and can be used for job execution, storing configurations, and performing small file operations. For ease of use, you can mount the cluster owner's home directory into their user workspace using SSHFS by configuring [**User Workspace Mount Points**](/docs/compute/configuring-cloud-clusters#user-workspace-mount-points) in the cluster configuration. We recommend leveraging this mount to conveniently drag and drop small files as well as open scripts and logs in the integrated development environment (IDE). However, it's important to note that using this directory for large file transfers between the user workspace and the controller is not recommended. Instead, we recommend using the commands [`rsync`](https://linux.die.net/man/1/rsync) or [`scp`](https://linux.die.net/man/1/scp). For more information, please see [**Transferring Data**](/docs/storage/transferring-data/obtaining-credentials). ## Cloud Storage To meet your specific storage needs, you have the flexibility to create additional storage and filesystems that can be attached to your clusters. These options provide you with customizable storage solutions tailored to your workload. For more information on managing storage and attaching additional storage resources to your clusters, please see [**Storage**](/docs/storage). ### Low Performance #### Persistent Cloud Object Storage Cloud storage presents an excellent option for persistent and cost-effective data storage. You can utilize AWS S3, Azure Blob Storage, Google Cloud Storage (GCS) objects that can be mounted to the controller and compute nodes using the [Filesystem in Userspace (FUSE)](https://www.kernel.org/doc/html/next/filesystems/fuse.html) technology. This type of storage allows you to store your results securely before turning off a cluster. To enhance performance, we recommend employing manual data copying with corresponding commands such as [`gsutil`](https://cloud.google.com/storage/docs/gsutil), [`aws s3`](https://docs.aws.amazon.com/cli/latest/userguide/cli-services-s3-commands.html), or [`azcopy`](https://learn.microsoft.com/en-us/azure/storage/common/storage-use-azcopy-v10). #### Persistent Cloud NFS Storage Alternatively to object storage, you have access to managed filesystem services such as Filestore on GCP or EFS on AWS. These services offer the ability to mount filesystems to the controller and compute nodes over NFS. These filesystems, like object storage, are persistent, and can offer better performance than object storage. Please note that setting this up currently requires assistance from our support team. :::tip Persistent Storage You can utilize persistent filesystems for installing custom user-specific software that needs to be readily available whenever a cluster is started. Moreover, it serves as a reliable location for storing your results securely before shutting down a cluster, allowing for seamless continuation of your work in subsequent sessions. ::: ### High Performance #### Lustre Lustre storage offers a powerful parallel distributed filesystem that can be mounted to the controller and compute nodes. You can configure Lustre storage as either persistent or ephemeral, depending on your requirements. However, it's important to be mindful of the cost implications associated with Lustre filesystems; in general, Lustre is more suitable for large-scale HPC workloads with demanding I/O operations. ## Image Disks Image disks are disks that are created from a cloud image, and that disk is directly attached to the controller. The controller automatically NFS exports image disks and compute nodes automatically mount those exports. Files written to these disks will not persist across sessions, as the disk is created from the image source each time a cluster is started. Leveraging image disks is a practical choice when you need to install organization-wide software, making it readily available to all users. # Starting and Stopping Clusters > Source: https://parallelworks.com/docs/compute/starting-stopping-clusters # Starting and Stopping Clusters This page explains how to start, stop, and destroy clusters. For more information about these actions, please see [this page](/docs/compute/navigating-cloud-clusters#whats-the-difference-between-stopping-destroying-and-deleting-clusters). ## Starting Clusters On your **Home** page, navigate to the **Compute** module. Click the power button of the cluster you'd like to start. ![Screenshot of inactive cluster in Computing Resources module. The power button is grayed out and the stopped bubble on the right is red.](/content-images/docs/compute/starting-stopping-clusters/blank-idle-cluster.png) You'll see the message _Starting [Cluster Name]_. While the cluster starts, the power button will flash green, and the **requested** status bubble will turn yellow. ![Screenshot of cluster starting up. The power button flashes green and the requested bubble on the right is yellow.](/content-images/docs/compute/starting-stopping-clusters/blank-starting-cluster.png) When your cluster is provisioned, both the power button and the **active** status bubble will turn green. ![Screenshot of active cluster. The power button is solid green and the active bubble on the right is green.](/content-images/docs/compute/starting-stopping-clusters/blank-running-cluster.png) Alternatively, you can navigate to your cluster's page and click ** Start/Resume**. The cluster's **Status** will change to **provisioning**. :::info Note It may take up to 5 minutes for a cluster to start. ::: ### Monitoring Status While your cluster is starting, you can see its status in the provisioning logs. Go to **Clusters** > your cluster > **Details** and click the cluster's **Status**. - Steps that have completed are green with a checkmark icon. - Ongoing steps are blue with a loading icon. - Upcoming steps are gray with a clock icon. - If a cluster fails to start, the step at which it failed will be red with an error icon. ![Screenshot of a cluster's logs while it is being provisioned.](/content-images/docs/compute/starting-stopping-clusters/blank-provision-logs-provisioning.png) ## Stopping Clusters When the cluster's controller is stopped, you can resume it anytime by pressing **Start / Resume**. Please note that you cannot stop a cluster if there are any active compute nodes. To stop a cluster, navigate to its page and click ** Stop**. ## Destroying Clusters When you're ready to deprovision a cluster, navigate to the **Home** page and click the power button. A dialog box will appear with the message _Are you sure you want to turn off [Cluster Name]?_ Click **Turn Off** to stop the cluster. You'll see the message _Stopping [Cluster Name]_. Alternatively, you can navigate to the cluster's page and click ** Destroy**. When you destroy a cluster, any attached nodes and [ephemeral storage resources](/docs/storage/#storage-types) will also be terminated. Only the data in persistent storage resources will remain. It’s important to copy any data you’d like to keep to persistent storage or to a remote location. :::info Note It’s essential to destroy a cluster when you’ve finished your work. Clusters that run unmonitored continue to accrue additional charges, which will be subtracted from your organization’s allotment. ::: # Submitting Jobs via Slurm > Source: https://parallelworks.com/docs/compute/submitting-jobs # Submitting Jobs via Slurm :::info About Jobs There are two ways you can submit jobs to a cluster: by using workflows or through any terminal or command-line interface. For the workflows option, please see [**Running Workflows**](/docs/run/workflows/running-workflows). ::: After you’ve started a cluster, log in to the controller with your preferred method. The quickest way to submit a job is to transfer your file(s) to the cluster, then run the command `sbatch`. In this example, we submitted the file `demo_test1.sbatch` with `sbatch`: ```shell [demo@democluster-60 ~]$ ls demo_test1.sbatch [demo@democluster-60 ~]$ sbatch demo_test1.sbatch Submitted batch job 2 ```
After submitting a job, you can watch its progress with the command `watch squeue`, which will update every two seconds with the job's status in the `ST` column: ```shell Every 2.0s: squeue JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) 4 test.part test demo CF 0:08 2 demo-democluster-00060-1-[0001-0002] ```
You can also use `watch 'sinfo;echo;squeue'` if you want to see general cluster information in addition to your job's progress: ```shell Every 2.0s: sinfo; echo; squeue PARTITION AVAIL TIMELIMIT NODES STATE NODELIST test.partition1* up infinite 2 mix# demo-democluster-00060-1-[0001-0002] test.partition1* up infinite 3 idle~ demo-democluster-00060-1-[0003-0005] test.partition2 up infinite 5 idle~ demo-democluster-00060-2-[0001-0005] JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) 4 test.part test demo CF 0:26 2 demo-democluster-00060-1-[0001-0002] ```
When using `watch squeue` or `watch 'sinfo;echo;squeue'`, the `ST` column will show `CF` while the node(s) configure. All of the rows beneath `JOBID` will clear when your job is finished: ```shell Every 2.0s: sinfo; echo; squeue PARTITION AVAIL TIMELIMIT NODES STATE NODELIST test.partition1* up infinite 2 idle% demo-democluster-00060-1-[0001-0002] test.partition1* up infinite 3 idle~ demo-democluster-00060-1-[0003-0005] test.partition2 up infinite 5 idle~ demo-democluster-00060-2-[0001-0005] JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) ```
Once the job is finished, you can check its output with `cat file_name`. Our file `demo_test1.sbatch` inlcuded instructions to send our completed job's data to an `std.out` file and any errors to an `std.err` file: ```shell [demo@democluster-60 ~]$ ls demo_test1.sbatch std.err std.out [demo@democluster-60 ~]$ cat std.err [demo@democluster-60 ~]$ cat std.out demo-democluster-00060-1-0001 demo-democluster-00060-1-0001 demo-democluster-00060-1-0002 demo-democluster-00060-1-0002 ``` Using `cat std.err` didn’t return anything because the job executed without errors. ## Common Slurm Commands This section gives a quick overview of the commands you’ll use most often when interacting with clusters. You can use any of these commands in any terminal after logging in to a controller node. Because ACTIVATE uses Slurm to manage jobs, you can use any of their system commands. For an extensive list of those options, see [Slurm’s command guide](https://slurm.schedmd.com/quickstart.html#commands). You can also enter `man` in front of any command (such as `man sacct`) to see its description and a list of other available commands in Slurm’s virtual manual. :::info About Job IDs When we say “job ID” in this section, we mean the job ID that Slurm assigns to your work, which will appear when running many of these commands. ID numbers in the **Worflow Monitor** and the **jobs** folder on the ACTIVATE platform act as a separate identifier to help us track how many jobs we’ve ever run on the platform. Using any of the commands in this section will generate a new Slurm job ID. ::: :::info About Fault Tolerance Fault tolerance is defined by how well an infrastructure remains functional or online even when there are service disruptions because of outages or natural disasters. On ACTIVATE, cluster deletions are queue-based for fault tolerance. The cluster startup process has no retries for fault tolerance, but the logs are visible so users can see any problems that occur. For compute node startup requests, fault tolerance is implemented with retries via Slurm (by default, there is a new startup attempt approximately every 20 minutes). ::: ### Job Management #### salloc `salloc` retrieves resources for your job without executing any tasks. Using this command retrieves resources before you need them by signaling the system to reserve a specified number of nodes. For example, `salloc -N 2` will reserve two compute nodes, for a total of three nodes, including the controller. `salloc` is useful if you’re sharing a cluster with other users in your organization: using this command means that once a job is finished, the allocated nodes will remain on reserve for your use until you disconnect from the cluster (meaning that your wait times will be shorter because another user cannot take control of your allocated nodes, so you won’t have to wait for more nodes to become available or wait for them to start once they’re available). #### sbatch `sbatch` submits a job script that will execute later. You can also configure nodes with `sbatch` by adding these options: - `--n-tasks-per-node` to specify the number of CPUs - `-t` to specify the maximum amount of time you want these resources to run with the format of `0:0:0` for hours, minutes, and seconds For example, `sbatch demo_test1.sbatch --n-tasks-per-node 5 -t 3:0:0` would run the file `demo_test1.sbatch` and request 5 CPUs for 3 hours of maximum run time. #### srun `srun` executes a job script. You can use the same options from `salloc` and `sbatch` with `srun`: - `-N` to specify the number of nodes - `--n-tasks-per-node` to specify the number of CPUs - `-t` to specify the maximum amount of time you want these resources to run For example, `srun -N 1 --pty bash` would request 1 compute node and open a pseudoterminal, creating an interactive command-line session. #### scancel `scancel` paired with a job ID ends a pending or running job or job step. For example: ```shell [demo@democluster-60 ~]$ sbatch demo_test1.sbatch Submitted batch job 6 [demo@democluster-60 ~]$ scancel scancel: error: No job identification provided [demo@democluster-60 ~]$ scancel 6 ``` If you cancel a job, it will disappear from your queue. ### Cluster Management #### sinfo `sinfo` shows information about the nodes and partitions you’re using. By default, `sinfo` displays partition names, availability, time limit, the number of nodes, state, and the node’s ID number (which is displayed as `username-democluster-00019-1-[0001-0005]`). - Please note that if you enter `sinfo` without setting up partitions, you’ll receive the error message `slurm_load_partitions: Unable to contact slurm controller (connect failure)`. #### squeue `squeue` shows a list of running and pending jobs. By default, `squeue` shows job ID number, partition, username, job status, number of nodes, and node names for all queued and running jobs. You can also use these commands to adjust `squeue`’s output: - `--user` to see only one user’s jobs, such as `--user=yourPWusername` - `--long` to show non-abbreviated information and add the field `timelimit` - `--start` to estimate a job’s start time ### Notification Management :::warning About Notifications This section applies only to cloud clusters, not on-premises clusters. ::: By default, cloud clusters will send job start/finish notifications to ACTIVATE. You can change that setting or add it as an email notification by following the steps in [**Managing Notifications**](/docs/account-settings/managing-notifications). To enable additional job status notifications, you can also pair the flag `--mail-type` with the commands `salloc`, `sbatch`, or `srun`. For example, the command `sbatch --mail-type=FAIL exampleScript.sbatch` will send a notification if your job fails to start or complete. You can add multiple notification events to the `--mail-type` flag at once and separate them with commas: `sbatch --mail-type=BEGIN,END exampleScript.sbatch` Alternatively, you can add tags inside a Slurm batch file, as seen in this example: ```bash #!/bin/bash #SBATCH --mail-type=BEGIN,END echo "Hello, World!" ``` :::info Which method should I use? Both methods above work equally well. The primary difference is that entering the flag and notification event(s) outside the file will override any settings inside of your batch script, but will not cause anything to be written into the file. ::: #### Notification Events The table below lists the events currently supported by the `--mail-type` flag. | Type | Notification Event | | ---------------- | ----------------------- | | `ALL` | equivalent to `BEGIN,END,FAIL,INVALID_DEPEND,REQUEUE,STAGE_OUT` | | `NONE` | does not send notifications; this is the default | | `BEGIN` | job start | | `END` | job end | | `FAIL` | job failure | | `REQUEUE` | job is requeued | | `INVALID_DEPEND`| a job’s dependency cannot be satisfied, so the job will not run | | `STAGE_OUT` | when a job has completed or been cancelled, but has not yet released its resources | | `TIME_LIMIT_50` | when a job reaches 50% of its walltime* limit | | `TIME_LIMIT_80` | when a job reaches 80% of its walltime* limit | | `TIME_LIMIT_90` | when a job reaches 90% of its walltime* limit | | `TIME_LIMIT` | when a job reaches its walltime* limit | | `ARRAY_TASKS` | sends other option notifications for each array task instead of for the array as a whole; without this option, `BEGIN`, `END`, and `FAIL` notifications will only notify once for the full array instead of sending a notification for each individual array task | *_The walltime limit is the user set limit for how long a job can run._ _Please note that walltime limits are infinite by default. A walltime limit can be added when starting a job._ ### Troubleshooting #### sacct `sacct` shows a summary of users as well as completed and running jobs. Using this command will display a table with a job’s ID number, name, partition, status, exit code, whose account it’s running on, and how many CPUs it’s using. For troubleshooting purposes, the `State` and `ExitCode` fields from running `sacct` are especially useful for determining whether a node has failed and, if so, why. If you reach out to us for help, one of our support engineers may ask you for the information you see after running `sacct`. #### scontrol `scontrol` can delegate commands to specific job IDs and nodes. Please note that many `scontrol` commands can only be executed as user root. You can use these commands with a job ID to adjust `scontrol`’s output: - `suspend` to pause a job's processes - `resume` to continue a job's processes - `hold` to make a job a lower priority, putting it “on hold” so higher priority jobs will run first - `release` to remove a job from the hold list - `show job` to get detailed information about a job # Getting Started: Cloud Clusters > Source: https://parallelworks.com/docs/getting-started # Getting Started: Cloud Clusters Because there are many uses for ACTIVATE, this tutorial's aim is to familiarize users with the platform and typical steps a user might follow. You will learn how to provision elastic HPC clusters, manage buckets, transfer data, and run computations. ## Provision a Bucket You can use several different types of storage on ACTIVATE. For this guide, we'll be using bucket storage. Buckets are efficient, inexpensive, and and easy to use. Navigate to **Buckets**. ![Screenshot of the user clicking Buckets in the ACTIVATE sidebar.](/content-images/docs/getting-started/click-buckets.png) Click **+Add Storage**. ![Screenshot of the user clicking the +Add Storage button.](/content-images/docs/getting-started/click-add-storage.png) Choose which type of bucket you'll create. Give your bucket a **Resource Name**. Optionally, add a **Description** and **Tags**. Click **Add Storage**. ![Screenshot of the user clicking the Add Storage button.](/content-images/docs/getting-started/bucket-click-add-storage.png) On the next page, the bucket will be pre-configured with your organization's default **Cloud Infrastructure** and **Group**. If you need to change these parameters, click **Save Changes** after doing so. ![Screenshot of the user clicking Save Changes for a bucket.](/content-images/docs/getting-started/bucket-click-save-changes.png) Click the bucket's power button. The bucket will take a few minutes to start. You can proceed to the next step while you wait. ## Provision a Cluster Navigate to the **Marketplace**. ![Screenshot of the user clicking Marketplace.](/content-images/docs/getting-started/click-marketplace.png) Select **Compute** to see pre-configured clusters. ![Screenshot of the user clicking Compute in the Marketplace.](/content-images/docs/getting-started/click-compute.png) Select the cluster that best suits your needs. ![Screenshot of the user clicking a cluster in the Marketplace.](/content-images/docs/getting-started/click-compute-resource.png) Click **Fork latest**. ![Screenshot of the user clicking the Fork button.](/content-images/docs/getting-started/click-compute-fork-version.png) Enter a name for your cluster under the **New Compute Name** option and click **Fork**. ![Screenshot of the user clicking the Fork button.](/content-images/docs/getting-started/click-compute-fork-button.png) Use the **Group** dropdown menu to select the group that your organization uses to allocate costs. The remaining cluster settings have already been configured. Click **Save Changes**. ![Screenshot of the user clicking the Save Changes button.](/content-images/docs/getting-started/click-group-save-changes.png) ## Attach a Bucket Click **Edit** on your cluster's page. ![Screenshot of the user clicking Edit on a cluster.](/content-images/docs/getting-started/click-cluster-edit.png) At the bottom of the page, click **+Add Attached Filesystems**. ![Screenshot of the user clicking Add Attached Filesystems.](/content-images/docs/getting-started/click-add-attached-filesystems.png) Select the bucket you want to use from the **Storage** dropdown menu. Enter `/bucket` in the **Mount Point** option. Click **Save Changes**. ![Screenshot of the user clicking Save Changes on a cluster.](/content-images/docs/getting-started/click-save-changes-attached-filesystems.png) ## Start the Cluster Start the cluster by clicking **Start/Resume**. ![Screenshot of the user clicking a cluster's Start/Resume button.](/content-images/docs/getting-started/click-start.png) You'll see the message _Starting [Cluster Name]_. While the cluster starts, the **Status** will show **provisioning** with a yellow bubble. When your cluster is online, both the **Status** will show **active** with a green bubble. ![Screenshot of an active cluster.](/content-images/docs/getting-started/cluster-active.png) ## Log In to the Cluster Clusters use one node, called a controller, to delegate tasks to compute nodes. You'll need to log in to the controller to interact with the cluster. While on your cluster's page, click its **IP Address**. ![Screenshot of a user clicking a cluster's IP address.](/content-images/docs/getting-started/click-cluster-IP-address.png) A terminal will pop up on the bottom of the screen, showing the following message: ``` Warning: Permanently added '34.60.48.100' (ED25519) to the list of known hosts. [username@cluster-name-01 ~]$ ``` ## Create a File Next, you'll create a file inside your user container, then transfer it to your bucket. The instructions in the following sections follow [this MPI tutorial](https://mpitutorial.com/tutorials/mpi-hello-world/). In the terminal, click the plus icon to open another tab. ![Screenshot of a user clicking the plus button in a terminal on ACTIVATE.](/content-images/docs/getting-started/click-plus.png) In the new terminal tab, create a file with this code: ``` cat << EOF >> hello-world.c #include #include int main(int argc, char** argv) { // Initialize the MPI environment MPI_Init(NULL, NULL); // Get the number of processes int world_size; MPI_Comm_size(MPI_COMM_WORLD, &world_size); // Get the rank of the process int world_rank; MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); // Get the name of the processor char processor_name[MPI_MAX_PROCESSOR_NAME]; int name_len; MPI_Get_processor_name(processor_name, &name_len); // Print off a hello world message printf("Hello world from processor %s, rank %d out of %d processors\n", processor_name, world_rank, world_size); // Finalize the MPI environment. MPI_Finalize(); } EOF ``` Press **Enter**. ## Retrieve Bucket Credentials All buckets use short-term credentials, making it easy to transfer data between a bucket and other resources. You'll need those credentials to manage access to the bucket. Navigate to your bucket's page. Click **Credentials**. ![Screenshot of a user clicking the Credentials button on an active bucket.](/content-images/docs/getting-started/click-bucket-credentials.png) A dialog box will appear with CSP-specific commands for your bucket. **AWS** Screenshot of AWS bucket credentials. **Azure** Screenshot of Azure bucket credentials. **Google** Screenshot of Google bucket credentials. Copy and paste the first command into the same terminal tab where you created the file above. Press **Enter**. ## Upload File to Bucket Next, you'll use the PW CLI to transfer the file you created above. In the same terminal tab, enter this commmand to copy `hello-world.c` to your bucket: ``` pw buckets cp hello-world.c $BUCKET_URI/hello-world.c ``` Use the list command `pw buckets ls` to check that your file transferred: ``` username@pw-user-username:~/pw$ pw buckets ls pw://username/bucketname pw://username/bucketname/hello-world.c username@pw-user-username:~/pw$ ``` ## Authenticate the PW CLI Before you transfer the file from the bucket to your cluster, you'll need to authenticate the PW CLI on the cluster. First, create a short-term token on ACTIVATE. You can follow our instructions [here](/docs/account-settings/authentication#managing-tokens). Copy the token. Log in to the cluster again ([this step](/docs/getting-started#log-in-to-the-cluster) above). Enter `pw auth` and paste your token. Press Enter. You'll see the following message: ``` 2025-03-31T16:23:19Z [INFO] Authenticated as username [username@usernamecluster-3 ~]$ ``` ## Download File to Cluster Copy and paste your bucket's credentials again ([this step](/docs/getting-started#retrieve-bucket-credentials) above). Copy and paste the exact command below. The value for `BUCKET_URI` will be auto-populated with your bucket's URI. ``` pw buckets cp $BUCKET_URI/hello-world.c hello-world.c ``` ## Compile and Run MPI Test Enter this command: ``` ``` Enter this command: ``` mpicc -o hello hello-world.c ``` Next, you'll create a test job using a script. Enter the following: ``` cat << EOF >> hello-world.sbatch #!/bin/bash #SBATCH -N 2 #SBATCH --ntasks-per-node=2 mpirun -np 2 -N 1 $HOME/hello EOF ``` Press Enter. Run the job with this command: ``` sbatch hello-world.sbatch ``` ## Monitor Job Go to your cluster's page. In the **Observability** module, you'll see your cluster's CPU activity change as it runs the job you just submitted. ![Screenshot of a cluster's Observability module.](/content-images/docs/getting-started/cluster-CPU-changes.png) Click **Jobs**. ![Screenshot of the user clicking the Jobs tab on a cluster's page.](/content-images/docs/getting-started/click-jobs-cluster.png) You'll see the state of your partition. ![Screenshot of a cluster's running job.](/content-images/docs/getting-started/jobs-running-partition.png) ## Shut Down Resources Navigate to the configuration page for your bucket. Click the power button. A module will appear. Click **Deprovision**. Next, navigate to the configuration page for your cluster. Click **Destroy**. ![Screenshot of a user clicking the Destroy button a cluster.](/content-images/docs/getting-started/click-destroy.png) A module will appear. Click **Destroy**. # Kubernetes > Source: https://parallelworks.com/docs/kubernetes # Kubernetes ACTIVATE provides built-in Kubernetes cluster management that lets you connect external clusters, manage workloads, deploy Helm charts, track costs, and control resource quotas — all from a single interface. ## Key Capabilities - **[Connecting Clusters](/docs/kubernetes/connecting-clusters)** — Register external Kubernetes clusters and share them with your groups - **[kubectl Access](/docs/kubernetes/kubectl-access)** — Authenticate to clusters using the PW CLI with federated OIDC credentials - **[Namespaces](/docs/kubernetes/namespaces)** — Create namespaces, associate them with allocations, and grant groups role-based access - **[Managing Workloads](/docs/kubernetes/managing-workloads)** — Create, view, edit, restart, and delete Deployments, StatefulSets, Jobs, Pods, and more across clusters - **[Pod Logs](/docs/kubernetes/pod-logs)** — Stream container logs in real time - **[Workload Metrics](/docs/kubernetes/workload-metrics)** — Monitor CPU, memory, and storage usage with built-in charts - **[Helm Charts](/docs/kubernetes/helm-charts)** — Install, roll back, and uninstall Helm releases - **[Resource Quotas](/docs/kubernetes/resource-quotas)** — Set CPU, memory, and GPU limits per namespace - **[Cost Tracking](/docs/kubernetes/cost-tracking)** — Calculate and monitor per-namespace compute costs - **[Services & Storage](/docs/kubernetes/services-and-storage)** — Inspect services, persistent volumes, ConfigMaps, and Secrets - **[Nodes & GPUs](/docs/kubernetes/nodes-and-gpus)** — View node capacity and configure NVIDIA MIG GPU profiles ## Architecture ACTIVATE connects to your Kubernetes clusters using OIDC token federation. When a user accesses a cluster through the UI or CLI: 1. ACTIVATE issues a short-lived OIDC token (10-minute TTL) containing the user's identity and group memberships 2. The target cluster validates the token against ACTIVATE's OIDC provider 3. Kubernetes RBAC policies map the user's groups to cluster roles and namespace access This approach requires no long-lived credentials to be stored and ensures that access is always scoped to the user's current permissions and group memberships. :::info OIDC Requirement Clusters must be configured to trust ACTIVATE as an OIDC identity provider. See [Connecting Clusters](/docs/kubernetes/connecting-clusters) for setup details. ::: ## Getting Started 1. **Connect a cluster** — Add your first Kubernetes cluster in the [cluster connection](/docs/kubernetes/connecting-clusters) page 2. **Set up CLI access** — Install the PW CLI and run `pw kube auth` to configure [kubectl access](/docs/kubernetes/kubectl-access) 3. **Explore workloads** — Browse running workloads in the [workloads view](/docs/kubernetes/managing-workloads) # Connecting Clusters > Source: https://parallelworks.com/docs/kubernetes/connecting-clusters # Connecting Clusters Parallel Works lets you bring your own Kubernetes clusters and manage them through a unified interface. Once connected, you can deploy workloads, manage access through groups, and monitor resources across all of your clusters from a single pane of glass. ## Prerequisites Before connecting a cluster, make sure you have the following: - **Cluster endpoint URL** — The public HTTPS endpoint of your Kubernetes API server (e.g. `https://k8s.example.com:6443`). - **CA certificate** (if needed) — The Certificate Authority (CA) certificate for the cluster, used to establish a trusted TLS connection to the API server. If the API server presents a publicly trusted certificate, no CA certificate is required. - **Network connectivity** — The Parallel Works platform must be able to reach your cluster endpoint over the network. Make sure that any firewalls or security groups allow inbound connections to the API server from the platform. - **Organization admin permissions** — Only organization admins can add or modify clusters. :::info OIDC Requirement Your cluster must be configured to accept OIDC-based authentication. Parallel Works uses OIDC token federation to authenticate users against connected clusters. See [Security Model](#security-model) below for details. ::: ## Adding a Cluster 1. Navigate to **Kubernetes > Clusters** in the sidebar. 2. Click **Add Cluster** to open the cluster registration drawer. 3. Fill in the fields: - **Cluster Name** — A name for the cluster using lowercase letters, numbers, and hyphens (other characters are removed automatically). - **Cluster Endpoint** — The public HTTPS URL of your Kubernetes API server. - **CA Certificate** (optional) — Paste the PEM-encoded CA certificate for your cluster, or click **Discover from endpoint** to fetch it automatically from the API server. Leave it blank if the cluster uses a publicly trusted certificate. 4. Click **Add Cluster** to save. After the cluster is added, you are redirected to the cluster definition page where you can verify the connection and configure access. :::warning Naming Restrictions The cluster name cannot contain special characters. Only lowercase letters, numbers, and hyphens are allowed (e.g. `prod-cluster-01`). ::: ## Verifying Connectivity Once a cluster is added, Parallel Works verifies the connection by querying the Kubernetes API for the cluster's node list. On the **Clusters** page, each connected cluster displays: - **vCPUs** — Total CPU capacity across all nodes. - **Memory** — Total memory capacity across all nodes. If the platform cannot reach the cluster, the cluster still appears in the list but shows zero resources. This typically indicates a network connectivity issue or an invalid CA certificate. :::tip Connectivity Check If a cluster shows 0 CPUs and 0 memory, double-check that the endpoint is reachable from the platform and that the CA certificate is correct. ::: Each reachable cluster also has a **Connect** button that displays the `pw kube auth` command for configuring local [kubectl access](/docs/kubernetes/kubectl-access). ## Granting Users Access Access to a connected cluster is controlled in two layers: 1. **Cluster sharing** — Share the cluster with the groups that should be able to see and use it. Group members can then browse the cluster's resources, and their group memberships are included in the OIDC tokens used to authenticate against the cluster (see [Security Model](#security-model) below). 2. **Namespace role bindings** — Organization admins create namespaces and grant each group a Kubernetes role (`admin`, `edit`, or `view`) within specific namespaces on the [Namespaces](/docs/kubernetes/namespaces) page. :::info Group Prerequisites Groups must be created in the organization before they can be granted access. The reserved group name `cluster-admins` cannot be used as a regular group name — it is managed internally by the platform. ::: ## Multi-Cluster Management The Kubernetes section provides a unified view across all connected clusters. From the sidebar, you can access: - **Clusters** — View and manage all connected clusters. - **Nodes** — Inspect node details and GPU operator configuration (admin only). - **Quotas** — Set resource quotas per namespace (admin only). - **Namespaces** — Create namespaces and manage group access (admin only). - **Workloads** — List deployments, stateful sets, daemon sets, replica sets, jobs, cron jobs, and pods across clusters. - **Services** — View services across clusters. - **Storages** — Manage PersistentVolumeClaims and PersistentVolumes. - **ConfigMaps & Secrets** — Browse configuration resources. - **Helm Charts** — Install, rollback, and manage Helm releases. All resource views support filtering by cluster and namespace, making it straightforward to manage resources across a large fleet of clusters. ## Security Model Parallel Works uses **OIDC token federation** to authenticate users against connected Kubernetes clusters. This eliminates the need to distribute long-lived kubeconfig files or service account tokens. ### How It Works 1. When a user accesses a connected cluster, the platform generates a short-lived **OIDC JWT token** on behalf of the user. 2. The token is signed by the platform's OIDC issuer (`https:///api/oidc`). 3. The token is scoped to the specific cluster (using the cluster ID as the JWT audience). 4. The connected cluster validates the token using the platform's OIDC discovery endpoint and public keys. ### Token Properties | Property | Value | |----------|-------| | **TTL** | 10 minutes | | **Audience** | The specific cluster ID | | **Subject** | `user:` | | **Issuer** | `https:///api/oidc` | ### Group-Based Access Control Each OIDC token includes group claims that map to Kubernetes RBAC: - **`cluster-scope`** — Included in every token. Grants read-only access to cluster-scoped resources like storage classes and runtime classes via a dedicated ClusterRole. - **`cluster-admins`** — Included for organization admins and platform admins. Grants full administrative access to the cluster. - **Group names** — If the user belongs to groups that the cluster is shared with, those group names are included as claims. These map to the namespace-scoped RoleBindings managed on the [Namespaces](/docs/kubernetes/namespaces) page, granting each group its assigned role (`admin`, `edit`, or `view`) within the corresponding namespaces. This model ensures that regular users can only access namespaces their groups have been granted, while organization admins retain full cluster-level access. All tokens are short-lived, reducing the risk associated with credential leakage. # Connecting CoreWeave (Kubernetes) > Source: https://parallelworks.com/docs/kubernetes/connecting-clusters/coreweave # Connecting CoreWeave (Kubernetes) This guide walks through connecting a [CoreWeave](https://www.coreweave.com/) Kubernetes cluster to ACTIVATE so you can manage its workloads, storage, and access through the platform. It builds on the generic [Connecting Clusters](/docs/kubernetes/connecting-clusters) flow with the specifics of CoreWeave's console, endpoint naming, and OIDC configuration. :::info Two ways to connect CoreWeave CoreWeave can be connected in two distinct ways. This guide covers connecting it as a **Kubernetes provider**. If you instead want to attach a CoreWeave **Slurm** cluster (SUNK) so users can submit batch jobs, see [Connecting a CoreWeave Slurm Cluster](/docs/compute/connecting-coreweave-slurm). ::: ## Prerequisites - **Organization admin permissions** in ACTIVATE - only org admins can add clusters. - **Access to the CoreWeave Cloud Console** for the target cluster, including its kubeconfig. - **Network reachability** - ACTIVATE must be able to reach the cluster's Kubernetes API server over HTTPS. ## Download the kubeconfig In the CoreWeave Cloud Console, open the cluster, click the **⋮** (three dots) menu, and download the kubeconfig file. You can sanity-check it by prefixing `kubectl` with the downloaded file: ```bash KUBECONFIG="CWKubeconfig_ue01a" kubectl get pods ``` ## Determine the API endpoint The CoreWeave console shows the cluster's endpoint, for example: ``` mycluster-1a2b3c4d.k8s.us-east-01a.coreweave.com ``` ACTIVATE connects to the Kubernetes **API server**, which is reached by prefixing the endpoint with `api.`: ``` api.mycluster-1a2b3c4d.k8s.us-east-01a.coreweave.com ``` You will enter this as an HTTPS URL (`https://api.`) when configuring the cluster. ## Add the cluster in ACTIVATE 1. Navigate to **Kubernetes → Clusters** in the sidebar. 2. Click **Add Cluster**. 3. Fill in the registration form: - **Cluster Name** - a lowercase alphanumeric name (e.g. `coreweave`). - **Cluster Endpoint** - the `https://api.` URL derived above. - **CA Certificate** - leave this blank. CoreWeave's API server presents a publicly-trusted certificate, so ACTIVATE validates it against the system trust store with no custom CA bundle. 4. Save. You are taken to the cluster's **Definition** page. ![Adding a CoreWeave cluster in ACTIVATE: the Setup & Prerequisites panel on the left and the Cluster Configuration form on the right.](/content-images/docs/kubernetes/connecting-clusters/coreweave-add-cluster.png) ## Complete the cluster prerequisites The **Definition** page shows a **Setup & Prerequisites** panel. Complete each item against your CoreWeave cluster: ### Enable resource quotas Ensure resource quotas are enabled in your CoreWeave cluster configuration. ACTIVATE relies on namespace quotas to track and bound per-group usage. ### Create the cluster-admin role binding Using the kubeconfig you downloaded, grant the `cluster-admin` role to the `parallelworks:cluster-admins` group: ```bash kubectl create clusterrolebinding parallelworks:cluster-admin \ --clusterrole=cluster-admin \ --group=parallelworks:cluster-admins ``` This is what lets ACTIVATE org and platform admins administer the cluster once OIDC is wired up. ### Configure OIDC on CoreWeave ACTIVATE authenticates users to the cluster with short-lived [OIDC tokens](/docs/kubernetes/connecting-clusters#security-model) rather than long-lived kubeconfigs. The **Setup & Prerequisites** panel displays the exact values to use - copy each into the matching field of CoreWeave's **Enable OIDC** configuration (found in the cluster's **Auth** step in the CoreWeave Cloud Console). ![Enabling OIDC in the CoreWeave Cloud Console Auth step.](/content-images/docs/kubernetes/connecting-clusters/coreweave-oidc-config.png) | ACTIVATE value | Example | CoreWeave field | |----------------|---------|-----------------| | `issuer` | `https:///api/oidc` | **Issuer URL** | | `clientId` | your cluster's ID | **Client ID** | | `userClaim` | `sub` | **Username Claim** | | `groupsClaim` | `groups` | **Groups Claim** | | `groupPrefix` | `parallelworks:` | **Groups Prefix** | Additional CoreWeave fields: - **Signing Algorithms** - `RS256` (the only algorithm ACTIVATE advertises in its OIDC discovery document at `https:///api/oidc/.well-known/openid-configuration`). - **Username Prefix** - leave empty unless your environment requires one. - **Certificate Authority** - not required; ACTIVATE's OIDC issuer presents a publicly trusted certificate. :::info Why the group prefix matters The `parallelworks:` group prefix is what ties the `cluster-admin` role binding from the previous step to ACTIVATE's identity tokens. ACTIVATE emits the `parallelworks:cluster-admins` group claim for admins, and CoreWeave prepends the prefix to every group it receives - so the binding and the claim line up. ::: ## Verify the connection Back on the **Clusters** page, a successfully connected cluster reports its total **vCPUs** and **Memory**. If it shows zeros, re-check the endpoint URL and that the API server is reachable from ACTIVATE. Once connected, you can browse the cluster's live workloads under **Kubernetes → Workloads**: ![Viewing CoreWeave cluster workloads in ACTIVATE.](/content-images/docs/kubernetes/connecting-clusters/coreweave-workloads.png) ## Share the cluster with groups To give your teams access, share the cluster with the appropriate ACTIVATE groups, then create namespaces and grant each group a role within them on the [Namespaces](/docs/kubernetes/namespaces) page. See [Granting Users Access](/docs/kubernetes/connecting-clusters#granting-users-access) for details. # Cost Tracking > Source: https://parallelworks.com/docs/kubernetes/cost-tracking # Cost Tracking ACTIVATE can track per-namespace compute costs on your Kubernetes clusters. When enabled, a cost-tracking agent runs inside the cluster, periodically sampling CPU and memory usage for every pod. These samples are combined with configurable pricing rates to produce cost records broken down by namespace. ## Enabling Cost Tracking To enable cost tracking for a cluster: 1. Navigate to **Kubernetes > Clusters** and open the cluster's **Definition** page. 2. Click **Enable Cost Tracking** in the action bar. 3. Confirm the prompt — this will deploy new pods to the cluster to collect cost data. The cluster's cost tracking status will change to **Provisioning** while the agent is being deployed. Once the agent is running, the status changes to **Enabled**. :::info Cluster Requirement Enabling cost tracking deploys a cost-tracking agent as pods inside the target cluster. The agent requires the Kubernetes Metrics Server to be available on the cluster. ::: ## Status Indicators The cost tracking status for a cluster is displayed next to the cluster name at the top of its **Definition** page. Possible statuses are: | Status | Meaning | |--------|---------| | **Enabled** | Cost tracking is active and collecting data | | **Disabled** | Cost tracking is not running on this cluster | | **Provisioning** | The cost-tracking agent is being deployed to the cluster | | **Deleting** | The cost-tracking agent is being removed from the cluster | Click the status indicator to view detailed provisioning steps and progress. ## Configuring Pricing Once cost tracking is enabled, you can set custom pricing rates that determine how resource usage is converted into cost values. Two rates are configurable: | Rate | Description | Default | |------|-------------|---------| | **CPU Price** (per core/min) | Cost charged per vCPU core per minute of usage | $0.00055 | | **Memory Price** (per GB/min) | Cost charged per GiB of memory per minute of usage | $0.00007 | To update pricing: 1. Open the **Manage Cost Tracking** drawer and select the cluster from the **Cluster Name** dropdown. 2. Enter new values in the **CPU Price (per core/min)** and **Memory Price (per GB/min)** fields. 3. Click **Update Prices**. The new rates are sent to the cost-tracking agent running on the cluster and take effect immediately for all future cost calculations. :::tip Pricing Guidance Set prices to match your infrastructure costs. For cloud-hosted clusters, you can derive per-core and per-GiB minute rates from your cloud provider's pricing for the instance types in your node pools. ::: ## How Costs Are Calculated The cost-tracking agent samples resource data at regular intervals. For each sampling interval, costs are calculated as follows: ### 1. Collect Pod-Level Usage and Requests For every pod in every namespace, the agent collects: - **CPU usage** — actual CPU cores consumed (from the Metrics Server) - **CPU requests** — CPU cores reserved in the pod spec - **Memory usage** — actual bytes of memory consumed (from the Metrics Server) - **Memory requests** — bytes of memory reserved in the pod spec ### 2. Determine Billable Resources For each pod, the billable amount for each resource is the **greater of usage or requests**: ``` billable_cpu = max(cpu_usage, cpu_requested) billable_memory = max(memory_usage, memory_requested) ``` This means you are charged for at least what you requested, even if actual usage is lower. If usage exceeds the request, you are charged for the higher actual usage. ### 3. Aggregate by Namespace Billable CPU and memory values are summed across all pods within each namespace. This produces a single CPU (in cores) and memory (in GiB) total per namespace per sampling interval. ### 4. Apply Pricing Rates The final cost for each namespace is: ``` cpu_cost = billable_cpu_cores * cpu_price_per_core_per_minute memory_cost = billable_memory_gib * memory_price_per_gib_per_minute total_cost = cpu_cost + memory_cost ``` Each cost record is stored with a timestamp and the namespace (group) it belongs to. :::info Memory Units Memory values are collected in bytes and converted to GiB (divided by 1024^3) before pricing is applied. ::: ## Disabling Cost Tracking To disable cost tracking for a cluster: 1. Navigate to the cluster's **Definition** page. 2. Click **Disable Cost Tracking** in the action bar. 3. Confirm the prompt. :::warning Data Loss Disabling cost tracking **removes all collected cost data** for the cluster. This action cannot be undone. If you need to retain historical cost data, export it before disabling tracking. ::: The status will change to **Deleting** while the cost-tracking agent pods are removed from the cluster. Once removal is complete, the status returns to **Disabled**. ## See Also - [Resource Quotas](/docs/kubernetes/resource-quotas) — set CPU, memory, and GPU limits per namespace - [Workload Metrics](/docs/kubernetes/workload-metrics) — monitor real-time resource usage for individual workloads # Helm Charts > Source: https://parallelworks.com/docs/kubernetes/helm-charts # Helm Charts Parallel Works provides a built-in Helm chart manager that lets you install, roll back, and uninstall Helm releases on your Kubernetes clusters directly from the web UI. You can configure chart repositories, customize values with the integrated YAML editor, and track release history without leaving the platform. ## Installing a Helm Chart Navigate to **Kubernetes > Helm Charts** and click **Install Helm Chart** in the action bar. A configuration drawer opens with two steps: chart configuration and values customization. ### Step 1: Configure the Chart Fill in the following fields: | Field | Required | Description | |-------|----------|-------------| | **Cluster Name** | Yes | The target Kubernetes cluster | | **Repository Name** | Yes | A name for the Helm repository (e.g., `bitnami`) | | **Repository URL** | Yes | The URL of the Helm repository (e.g., `https://charts.bitnami.com/bitnami`) | | **Chart Name** | Yes | The name of the chart to install (e.g., `nginx`) | | **Chart Version** | No | A specific chart version. Leave empty to install the latest version | | **Release Name** | Yes | A unique name for this Helm release (lowercase letters, numbers, and hyphens only) | | **Namespace** | Yes | The target namespace for the release | | **Load default values** | No | Toggle to load the chart's default `values.yaml` for editing | Click **Next** to proceed to the values editor. ### Step 2: Customize Values The second step presents a full-screen YAML editor where you can customize the chart's configuration values. - If **Load default values** is enabled, the editor is pre-populated with the chart's default `values.yaml`. Edit any values you want to override before installing. - If **Load default values** is disabled, the editor starts empty. Enter only the values you want to set. :::tip Default Values Loading default values gives you a complete reference of every configurable option the chart supports. This is useful when you are installing a chart for the first time and want to see all available settings. ::: Click **Back** to return to the configuration step, or click **Install** to deploy the chart. The platform adds the repository, resolves the chart, parses your YAML values, and runs the Helm install operation against the selected cluster and namespace. :::info Install Timeout The install operation has a 15-minute timeout. For large or complex charts, the release may continue reconciling in the background after the initial install completes. ::: ## Viewing Helm Releases The **Kubernetes > Helm Charts** page displays a table of all Helm releases across your clusters. Each row shows: | Column | Description | |--------|-------------| | **Name** | The release name (click to view details) | | **Status** | Current release status: Deployed, Pending, Failed, Superseded, or Uninstalled | | **Namespace** | The Kubernetes namespace the release is installed in | | **Cluster** | The cluster the release belongs to (hidden when filtering by a single cluster) | | **Chart** | The chart name | | **Version** | Chart version and application version | | **Rev** | Current revision number | | **Updated** | Time since the last update | Use the filter bar at the top of the page to narrow results by cluster, namespace, or status. You can also search by release name, namespace, or chart name. ## Release Details and History Click a release name to open its detail page. The detail view shows the current release status, chart version, revision number, and last update time. The release history lists every revision of the release, including: - **Revision number** -- incremented with each install, upgrade, or rollback - **Status** -- the outcome of that revision (e.g., deployed, superseded, failed) - **Chart** -- the chart name and version used for that revision - **App version** -- the application version from the chart metadata - **Updated** -- when the revision was created ## Rolling Back a Release From the release detail page, click **Rollback** in the action bar. Enter the revision number you want to roll back to in the dialog that appears, then confirm. - The revision number must be less than the current revision and greater than zero. - A successful rollback creates a new revision with the configuration from the target revision. :::info Changing a Release's Configuration To deploy a release with different values or a newer chart version, uninstall the release and reinstall it with the updated configuration, or roll back to a previous revision that had the configuration you want. ::: ## Uninstalling a Release From the release detail page, click **Delete** in the action bar. Confirm the deletion in the dialog. This uninstalls the Helm release from the namespace and removes all associated Kubernetes resources created by the chart. :::warning Irreversible Action Uninstalling a Helm release permanently removes its resources from the cluster. This action cannot be undone. ::: ## Chart Repository Configuration When you install a Helm chart, the platform automatically registers the repository using the **Repository Name** and **Repository URL** you provide. There is no separate repository management step -- the repository is configured as part of the install flow. To install charts from different repositories, provide the appropriate repository name and URL each time you install. Common public repositories include: | Repository | URL | |-----------|-----| | Bitnami | `https://charts.bitnami.com/bitnami` | | Ingress-NGINX | `https://kubernetes.github.io/ingress-nginx` | | Jetstack (cert-manager) | `https://charts.jetstack.io` | | Prometheus Community | `https://prometheus-community.github.io/helm-charts` | # kubectl Access > Source: https://parallelworks.com/docs/kubernetes/kubectl-access # kubectl Access Use the PW CLI to authenticate with Kubernetes clusters managed by Parallel Works. The CLI handles kubeconfig generation, certificate management, and OIDC token-based authentication so you can use `kubectl` against your clusters without manual configuration. ## Prerequisites - The [PW CLI](/docs/cli/pw) installed and configured - `kubectl` installed on your local machine - Access to at least one Kubernetes cluster in your organization ## Listing Available Clusters To see which Kubernetes clusters you have access to, run: ```bash pw kube ls ``` This lists all clusters available in your organization. You can control the output format: ```bash # Output as JSON pw kube ls -o json # Output as a table (shows name, total vCPUs, total memory) pw kube ls -o table ``` :::tip Quick Overview Use `pw kube ls -o table` for a quick overview of cluster capacity. ::: ## Authenticating with a Cluster The `pw kube auth` command configures your local kubeconfig with everything needed to connect to a cluster: ```bash pw kube auth ``` For example, to set up access to a cluster named **demo**: ```bash pw kube auth demo ``` This command performs the following steps automatically: 1. Retrieves the cluster's CA certificate and API server endpoint from the platform 2. Adds or updates a cluster entry in your kubeconfig with the CA certificate embedded 3. Configures user credentials using the OIDC exec-credential plugin (calls `pw kube token` automatically when `kubectl` needs a token) 4. Creates a context named `pw#` and switches to it After running `pw kube auth`, you can immediately use `kubectl`: ```bash kubectl get namespaces kubectl get pods -n ``` ### Options | Flag | Description | |------|-------------| | `--no-context-switch` | Configure the cluster without switching your active kubectl context | :::info Context Naming The context is named `pw#`. You can switch between contexts with `kubectl config use-context pw#`. ::: ## Manual Token Generation If you need a raw OIDC token (for example, to use with a custom tool or API client), use: ```bash pw kube token ``` This outputs an `ExecCredential` JSON object compatible with the Kubernetes [client-go credential plugin](https://kubernetes.io/docs/reference/access-authn-authz/authentication/#client-go-credential-plugins) protocol: ```json { "apiVersion": "client.authentication.k8s.io/v1", "kind": "ExecCredential", "status": { "token": "" } } ``` :::warning Token Expiry Tokens expire after **10 minutes**. The exec-credential plugin handles renewal automatically when you use `pw kube auth`, but if you use tokens manually you will need to regenerate them before they expire. ::: ## How Authentication Works Parallel Works uses OIDC (OpenID Connect) tokens to authenticate users with Kubernetes clusters. Here is how the flow works: 1. When you run `pw kube auth `, the CLI configures kubectl to use `pw kube token ` as an exec-based credential plugin. 2. Each time `kubectl` makes a request, it invokes `pw kube token` to obtain a fresh OIDC token. 3. The Kubernetes API server validates the token against the platform's OIDC provider. ### Token Claims Each OIDC token contains the following claims: | Claim | Value | |-------|-------| | `sub` (subject) | `user:` | | `aud` (audience) | The cluster ID | | `iss` (issuer) | `https:///api/oidc` | | `groups` | List of group names the user belongs to, plus `cluster-scope` | | `platform_host` | The platform hostname | | `exp` (expiry) | 10 minutes from issuance | ## Namespace Access Access to namespaces is determined by your group memberships: - Organization admins grant groups access to specific namespaces with a role of `admin`, `edit`, or `view` — see [Namespaces](/docs/kubernetes/namespaces). - You can access any namespace that one of your groups has been granted, at the role assigned to that group. - Organization admins have access to all namespaces on the cluster. To see which namespaces are available to you: ```bash kubectl get namespaces ``` ## Admin vs Regular User Permissions | | Regular User | Organization Admin | |---|---|---| | **Cluster groups** | `cluster-scope` + group names | `cluster-scope` + `cluster-admins` + group names | | **Namespace access** | Only namespaces matching their group memberships | All namespaces | | **Use case** | Day-to-day workload management within group namespaces | Full cluster administration | Organization admins are automatically added to the `cluster-admins` group, which grants elevated permissions across the cluster. ## Troubleshooting ### "kubectl not found" The `pw kube auth` command requires `kubectl` to be installed and available on your `PATH`. Install it by following the [official Kubernetes documentation](https://kubernetes.io/docs/tasks/tools/). ### Token Errors If you see authentication errors when running `kubectl` commands: 1. Verify that you are logged in to the PW CLI (`pw auth whoami`). 2. Re-run `pw kube auth ` to refresh your kubeconfig. 3. Confirm the cluster is still available with `pw kube ls`. ### Wrong Context If `kubectl` is targeting the wrong cluster, check and switch your context: ```bash kubectl config current-context kubectl config use-context pw# ``` ## See Also - [CLI Reference: pw kube auth](/docs/cli/pw/kube/auth) - [CLI Reference: pw kube token](/docs/cli/pw/kube/token) - [CLI Reference: pw kube ls](/docs/cli/pw/kube/ls) # Managing Workloads > Source: https://parallelworks.com/docs/kubernetes/managing-workloads # Managing Workloads The Workloads view provides a unified interface for monitoring and managing Kubernetes workloads across all your connected clusters. You can create new workloads with a guided builder, inspect resource status, view detailed metadata, edit configurations, restart, and delete workloads directly from the platform. ## Navigating the Workloads View Access the workloads view by navigating to **Kubernetes > Workloads** in the sidebar. The page displays a filterable, sortable table of all workloads across your connected clusters. ## Supported Workload Types The platform supports the following Kubernetes workload types: | Type | Description | |------|-------------| | **Deployment** | Manages stateless application replicas with rolling updates | | **StatefulSet** | Manages stateful applications with persistent storage and ordered deployment | | **DaemonSet** | Ensures a pod runs on all (or selected) nodes in a cluster | | **Job** | Runs a task to completion with a specified number of completions | | **CronJob** | Schedules Jobs to run on a recurring cron-based schedule | | **Pod** | The smallest deployable unit in Kubernetes | | **ReplicaSet** | Maintains a stable set of replica pods (typically managed by a Deployment) | ## Creating Workloads Click **Add workload** on the Workloads page to open the guided workload builder. The builder lets you deploy a containerized workload without writing a manifest by hand — the form generates the Kubernetes YAML for you, with a live preview alongside. ### Execution Types Choose how the workload should run: | Type | Behavior | |------|----------| | **Deployment** | Long-running service that restarts automatically (default) | | **StatefulSet** | Long-running service with stable identity and storage | | **Job** | Runs once to completion | | **CronJob** | Runs on a recurring schedule | | **Pod** | A single bare pod | ### Configuration The form adapts to the selected execution type: - **Common** — Name (lowercase letters, numbers, and hyphens), target cluster, and namespace - **Deployment / StatefulSet** — Number of replicas - **CronJob** — Cron schedule expression (e.g., `*/5 * * * *`) - **Job** — Completions, parallelism, and backoff limit - **Pod** — Restart policy (`Always`, `OnFailure`, or `Never`) For each container, you can set the image, command and arguments, CPU and memory requests and limits (e.g., `250m`, `512Mi`), container ports, environment variables, and volume mounts. Volumes can be backed by a PersistentVolumeClaim or an `emptyDir`. ### YAML Preview and Overrides The right-hand panel shows the manifest generated from your form inputs as you type. If you need settings the form does not cover, click **Edit YAML** to switch to a manual editing mode and adjust the manifest directly before submitting. The manifest is validated before the workload is created. ## List View The workloads list view presents all workloads in a sortable table. Click any column header to sort by that field. ### Filtering The filter bar at the top of the table provides several ways to narrow down the displayed workloads: - **Cluster** -- Select one or more clusters to show workloads from only those clusters. When no cluster is selected, workloads from all connected clusters are shown. - **Namespace** -- Filter by one or more Kubernetes namespaces. - **Type** -- Filter by workload type (Deployment, StatefulSet, DaemonSet, Job, CronJob, Pod). - **Status** -- Filter by workload status (Running, Pending, Failed, Unknown, Completed). - **Search** -- Type a name to filter workloads by name. The search is case-insensitive and matches partial names. Use the **Clear all** button to reset all active filters at once. ### Table Columns Each row in the workloads table displays the following information: | Column | Description | |--------|-------------| | **Name** | The workload name. Click to open the detail view. | | **Status** | A color-coded status indicator showing the current state of the workload. | | **Type** | The workload type (Deployment, StatefulSet, etc.). | | **Cluster** | The cluster where the workload is running (hidden when filtering by a single cluster). | | **Namespace** | The Kubernetes namespace the workload belongs to. | | **Pods** | The number of ready pods versus total pods (e.g., `3/3`). | | **Created** | When the workload was created. | ### Status Indicators Workload status is shown with a color-coded icon: - **Ok / Running** -- The workload is healthy and all expected pods are ready. - **Pending** -- The workload is starting up or waiting for resources. - **Failed** -- The workload has encountered an error. - **Completed** -- The workload (Job) has finished successfully. - **Unknown** -- The status could not be determined. ## Detail View Click on any workload name in the list to open its detail view. The detail page shows comprehensive information about the selected resource. ### Resource Metadata The top panel displays key metadata fields that vary by workload type: **Common fields across all types:** - Name, Namespace, Resource Version, and Creation Timestamp **Deployment-specific fields:** - Replica counts: updated, ready, available, and unavailable **StatefulSet-specific fields:** - Desired replicas, observed generation, associated service name, and persistent volume claim specifications **DaemonSet-specific fields:** - Pod counts: desired, current, ready, available, and unavailable - Update strategy type **Job-specific fields:** - Parallelism, completions, backoff limit, active/ready/succeeded pod counts, start and completion times - Job conditions table showing message, reason, type, status, and transition times **CronJob-specific fields:** - Cron schedule expression, last schedule time, concurrency policy, and starting deadline - Job template specification with parallelism and completion settings **Pod-specific fields:** - Phase, host IP, pod IP, start time, and labels - Container statuses table with name, ready state, restart count, image, and started state **ReplicaSet-specific fields:** - Owner references (API version, kind, name, UID, controller, block owner deletion) - Desired, current, and ready replica counts ### Pod Template For Deployments, StatefulSets, DaemonSets, Jobs, and CronJobs, the detail view includes a **Pod Template** section showing: - Labels applied to pods - Termination grace period - Restart policy - Init containers (if any) - Containers - Volumes ### Pod List For workload types that manage pods (Deployments, StatefulSets, DaemonSets, ReplicaSets, and Jobs), the detail view includes a table of associated pods with columns for: | Column | Description | |--------|-------------| | **Name** | Pod name (links to the pod detail view) | | **Status** | Current pod phase (Running, Pending, etc.) | | **Ready** | Ready containers vs. total containers (e.g., `1/1`) | | **Restarts** | Total restart count across all containers | | **Age** | Time since the pod was created | ### ReplicaSet History For **Deployments**, the detail view includes a ReplicaSet history table showing all associated ReplicaSets sorted by revision number: | Column | Description | |--------|-------------| | **Revision** | Deployment revision number (links to the ReplicaSet detail view) | | **Name** | ReplicaSet name | | **Desired** | Desired replica count | | **Current** | Current replica count | | **Ready** | Number of ready replicas | | **Age** | Time since the ReplicaSet was created | ### Viewing JSON and YAML The detail view provides both a structured view and a raw representation of the resource: - The structured view displays the resource metadata and status in a readable format. - Click **View / Edit YAML** to open a side drawer containing the full YAML representation of the resource. - Use the **Copy** button in the YAML drawer to copy the resource definition to your clipboard. ## Editing Resources You can edit any workload resource directly from the platform: 1. Navigate to the workload detail view. 2. Click **View / Edit YAML** to open the YAML editor drawer. 3. Modify the YAML in the built-in editor. 4. Click **Update resource** to apply the changes. The platform sends the updated YAML to the Kubernetes API, which validates and applies the changes. If the update fails (for example, due to a validation error), an error message is displayed. :::warning Full Replacement Editing a resource YAML replaces the entire resource specification. Make sure you understand the impact of your changes before applying them. ::: :::tip Rolling Updates For Deployments, editing the pod template spec triggers a rolling update by default, creating a new ReplicaSet while scaling down the old one. ::: ## Restarting Workloads Deployments, StatefulSets, and DaemonSets have a **Restart** action on their detail page. Restarting performs a Kubernetes rolling restart: pods are replaced gradually so the workload stays available throughout. Use this to pick up updated ConfigMaps, Secrets, or images without editing the workload spec. ## Opening a Shell in a Pod On a pod's detail page, click **Execute Shell** to open an interactive terminal session inside a running container. If the pod has multiple containers, you are prompted to choose which container to connect to. The session runs `kubectl exec` against the pod using your own federated credentials, so your access matches your [namespace permissions](/docs/kubernetes/namespaces). ## Deleting Workloads To delete a workload, use the delete action on the workload detail page and confirm in the dialog. The confirmation shows the workload type and how many pods will be affected. Deletion cascades: removing a workload also removes the resources it manages. For example, deleting a Deployment deletes its ReplicaSets and Pods. Pods are given a **30-second grace period** to shut down — they receive a `SIGTERM` signal and can perform cleanup tasks such as draining connections or saving state before being terminated. :::warning StatefulSets and Data Deleting a StatefulSet that manages persistent volumes may result in data loss. Review the workload's storage before deleting. ::: :::warning Protected Namespace Deleting workloads in the `kube-system` namespace is not permitted. This protects critical system components from accidental removal. ::: :::info Supported Types Supported workload types for deletion: Deployment, StatefulSet, DaemonSet, ReplicaSet, Job, CronJob, and Pod. ::: ## Observability The workload detail view includes an **Observability** panel with real-time metrics charts for: - **CPU** usage over time - **Memory** usage over time (in GB) - **Storage** usage over time (in GiB) You can select a time range of **1 Hour**, **3 Hours**, or **8 Hours** using the dropdown in the panel header. Metrics refresh automatically. For more details on metrics, see [Workload Metrics](/docs/kubernetes/workload-metrics). # Namespaces > Source: https://parallelworks.com/docs/kubernetes/namespaces # Namespaces The Namespaces view lets organization admins create Kubernetes namespaces on connected clusters, associate them with budget allocations, and control which groups can access each namespace and at what permission level. :::info Admin Only The Namespaces view is available to organization admins and platform admins only. ::: ## Viewing Namespaces Navigate to **Kubernetes > Namespaces** in the sidebar to see the namespaces across your connected clusters. | Column | Description | |--------|-------------| | **Name** | The namespace name. | | **Cluster** | The cluster the namespace belongs to. | | **Shared With** | The groups that have been granted access, along with their assigned role. | | **Allocation** | The budget allocation associated with the namespace, if any. | | **Status** | The namespace phase: `Active` or `Terminating`. | Use the cluster filter and name search at the top of the page to narrow the view. ## Creating a Namespace 1. Navigate to **Kubernetes > Namespaces** and click the add action. 2. Fill in the form: - **Cluster** — The cluster to create the namespace on. - **Name** — The namespace name (lowercase letters, numbers, and hyphens). - **Allocation** (optional) — Associate the namespace with a budget allocation so that usage within the namespace is attributed to it. 3. Save to create the namespace on the cluster. ## Granting Groups Access Each namespace can be shared with one or more groups by creating **role bindings**. A role binding grants every member of a group a Kubernetes role within the namespace: | Role | Permissions | |------|-------------| | **admin** | Full control over most resources in the namespace, including the ability to manage roles and role bindings within it | | **edit** | Read and write access to most resources in the namespace, but no ability to manage access | | **view** | Read-only access to most resources in the namespace | These map to the corresponding [Kubernetes built-in ClusterRoles](https://kubernetes.io/docs/reference/access-authn-authz/rbac/#user-facing-roles). The platform creates and manages the RoleBinding objects on the cluster for you. Role bindings can be edited (to change a group's role) or deleted (to revoke a group's access) at any time. Because [OIDC tokens](/docs/kubernetes/connecting-clusters#security-model) are short-lived, access changes take effect within minutes. :::info Cluster Sharing For group members to see the cluster in the first place, the cluster itself must also be shared with their group. See [Granting Users Access](/docs/kubernetes/connecting-clusters#granting-users-access). ::: ## Deleting a Namespace Select the delete action on a namespace and confirm. The namespace and **everything in it** — workloads, services, persistent volume claims, ConfigMaps, and Secrets — is removed from the cluster. The namespace shows a `Terminating` status while Kubernetes finishes cleaning up its resources. :::warning Irreversible Action Deleting a namespace permanently deletes all resources it contains. This action cannot be undone. ::: ## See Also - [Connecting Clusters](/docs/kubernetes/connecting-clusters) — Register clusters and understand the access model - [Resource Quotas](/docs/kubernetes/resource-quotas) — Set CPU, memory, and GPU limits per namespace - [kubectl Access](/docs/kubernetes/kubectl-access) — How group memberships map to namespace access from the CLI # Nodes & GPUs > Source: https://parallelworks.com/docs/kubernetes/nodes-and-gpus # Nodes & GPUs ACTIVATE provides visibility into the nodes running across your Kubernetes clusters and tools for managing NVIDIA GPU configurations, including Multi-Instance GPU (MIG) partitioning. :::info Admin Only The Nodes view is available to organization admins and platform admins only. ::: ## Viewing Cluster Nodes Navigate to **Kubernetes > Nodes** in the sidebar to view all nodes across your connected clusters. ### Node Table Columns | Column | Description | |--------|-------------| | **Name** | The node hostname. Click to open the node detail page. | | **Cluster** | The cluster the node belongs to (hidden when filtering by a single cluster). | | **Kubernetes Version** | The kubelet version running on the node (e.g., `v1.28.4`). | | **Container Runtime** | The container runtime and version (e.g., `containerd://1.7.2`). | | **Internal IP** | The node's internal network IP address. | | **Architecture** | The CPU architecture (e.g., `amd64`, `arm64`). | ### Filtering Nodes Use the filter bar to narrow results: - **Clusters** — Show nodes from specific clusters only - **Search** — Free-text search across node name and cluster name ## Node Detail Page Click a node name to open its detail page. This page displays comprehensive information about the selected node. ### System Information The detail page shows the following system-level properties: | Property | Description | |----------|-------------| | **OS Image** | The operating system image (e.g., `Ubuntu 22.04.3 LTS`). | | **Kernel Version** | The Linux kernel version. | | **Operating System** | The OS type (e.g., `linux`). | | **Architecture** | The CPU architecture. | | **Container Runtime Version** | The container runtime and version. | | **Kubernetes Version** | The kubelet version. | | **Internal IP** | The node's internal IP address. | ### Capacity and Allocatable Resources Each node reports two sets of resource quantities: - **Capacity** — The total physical resources available on the node - **Allocatable** — The resources available for pod scheduling (capacity minus system-reserved resources) Both sets include: | Resource | Format | Example | |----------|--------|---------| | **CPU** | Number of cores | `8` | | **Memory** | Gigabytes | `32Gi` | | **Ephemeral Storage** | Gigabytes | `100Gi` | | **Pods** | Maximum pod count | `110` | | **NVIDIA GPUs** | GPU count (if present) | `4` | :::tip Resource Overhead Compare the capacity and allocatable values to understand how much overhead is reserved for system components like the kubelet and OS processes. ::: ### Node Labels The detail page displays all labels assigned to the node. Labels commonly include: - `kubernetes.io/hostname` — The node hostname - `kubernetes.io/arch` — CPU architecture - `kubernetes.io/os` — Operating system - `node.kubernetes.io/instance-type` — Instance type (on cloud providers) - `nvidia.com/gpu.product` — GPU model name (on GPU nodes) - `nvidia.com/mig.config` — Current MIG configuration label ## GPU Management For nodes equipped with NVIDIA GPUs, ACTIVATE provides tools to install and manage the NVIDIA GPU Operator and configure MIG partitioning directly from the node detail page. ### NVIDIA GPU Operator The GPU Operator automates the management of GPU drivers, container toolkits, and device plugins on Kubernetes. From the node detail page, you can install, upgrade, or roll back the GPU Operator Helm chart. #### Installing the GPU Operator 1. Navigate to the node detail page for a GPU-equipped node 2. Click the **GPU Operator** button in the action bar 3. Fill in the installation form: | Field | Description | Default | |-------|-------------|---------| | **Helm Chart Version** | The GPU Operator chart version to install | `v25.3.0` | | **Namespace** | The namespace for the GPU Operator deployment | `gpu-operator` | | **Create Namespace** | Whether to create the namespace if it does not exist | `true` | | **Containerd Config** | Path to the containerd configuration file (optional) | — | | **Containerd Socket** | Path to the containerd socket (optional) | — | 4. Click **Install NVIDIA GPU Operator** The operator is installed from the `https://helm.ngc.nvidia.com/nvidia` Helm repository using the `nvidia/gpu-operator` chart. #### Upgrading the GPU Operator If the GPU Operator is already installed, the same form appears with an **Upgrade NVIDIA GPU Operator** button instead. The upgrade uses the same Helm chart configuration. #### Rolling Back When the GPU Operator is installed, the drawer also shows the **Release History** table with all previous revisions. Click the rollback button next to any revision to revert to that version. ### MIG Configuration NVIDIA Multi-Instance GPU (MIG) allows a single physical GPU to be partitioned into multiple isolated GPU instances, each with dedicated compute, memory, and bandwidth resources. #### MIG Strategies ACTIVATE supports two MIG strategies: | Strategy | Description | |----------|-------------| | **Single** | All GPU instances on the node use the same MIG profile. Use this when all workloads on the node have identical GPU requirements. | | **Mixed** | Different MIG profiles can coexist on the same GPU. Use this for heterogeneous workloads with varying GPU requirements. | #### Configuring MIG 1. Navigate to the node detail page for a GPU node that has the GPU Operator installed 2. Click the **NVIDIA MIG** button in the action bar 3. Select a **MIG Strategy** (`single` or `mixed`) 4. Enter a **MIG Strategy Config** value that specifies the MIG profile to apply Common configuration values include: - `all-1g.6gb` — All instances configured as 1g.6gb (smallest slice) - `all-2g.12gb` — All instances configured as 2g.12gb - `all-3g.24gb` — All instances configured as 3g.24gb - `all-balanced` — A balanced mix of MIG instance sizes (for mixed strategy) 5. Click **Configure MIG** :::info GPU-Dependent Profiles The available MIG profiles depend on the GPU model. The configuration drawer displays the default MIG partitioning options for the detected GPU type, loaded from the `default-mig-parted-config` ConfigMap managed by the GPU Operator. ::: #### What Happens During MIG Configuration When you apply a MIG configuration, ACTIVATE performs two operations: 1. **Patches the cluster policy** — Updates the `clusterpolicies.nvidia.com/cluster-policy` CRD to set the MIG strategy (e.g., `mixed` or `single`) at `/spec/mig/strategy` 2. **Labels the node** — Applies the `nvidia.com/mig.config` label to the target node with the specified configuration value (e.g., `all-balanced`) The GPU Operator detects these changes and automatically reconfigures the GPU partitioning on the node. :::warning Workload Disruption Changing MIG configuration may temporarily disrupt GPU workloads running on the node. Plan MIG reconfiguration during maintenance windows when possible. ::: ## Cross-Cluster Queries The nodes list view aggregates data from all connected clusters by default. The response metadata includes: - **Total clusters queried** — How many clusters were contacted - **Successful clusters** — How many responded successfully - **Total nodes** — The combined count of nodes returned If a cluster is unreachable, the remaining clusters still return their results. ## See Also - [Resource Quotas](/docs/kubernetes/resource-quotas) — Set GPU limits per namespace - [Helm Charts](/docs/kubernetes/helm-charts) — Manage Helm releases including the GPU Operator - [Managing Workloads](/docs/kubernetes/managing-workloads) — View GPU workloads running across your clusters # Pod Logs > Source: https://parallelworks.com/docs/kubernetes/pod-logs # Pod Logs ACTIVATE lets you view container logs for any running pod directly in the web UI, so you can debug and monitor workloads without switching to a terminal. ## Viewing Logs 1. Go to **Kubernetes > Workloads** 2. Select a cluster and namespace 3. Click on a pod name to open its detail page 4. Scroll down to the **Logs** panel The Logs panel displays the most recent log output from the pod's container in a scrollable viewer. :::info Pod-Level Only The Logs panel only appears when viewing an individual pod. For higher-level workloads such as Deployments or StatefulSets, navigate to one of their child pods to access logs. ::: ## Real-Time Streaming The viewer loads the most recent **100 lines** of log output, then automatically polls for new lines every few seconds. New output is appended to the bottom of the viewer as it arrives — you don't need to refresh the page. Duplicate lines are automatically filtered out, so you'll always see a clean, continuous log stream. :::tip Longer History If you need more history than the viewer shows, or want to filter by time, use `kubectl logs` with the `--tail` and `--since-time` flags via [kubectl access](/docs/kubernetes/kubectl-access). ::: :::tip Session Persistence Logs are accumulated in the browser for the duration of your session. If you navigate away from the pod and return, the log viewer resets and fetches the latest lines again. ::: ## See Also - [Managing Workloads](/docs/kubernetes/managing-workloads) — Browse and manage pods, Deployments, and other workload types - [Workload Metrics](/docs/kubernetes/workload-metrics) — Monitor CPU, memory, and storage usage for workloads # Resource Quotas > Source: https://parallelworks.com/docs/kubernetes/resource-quotas # Resource Quotas Resource quotas let you set limits on CPU, memory, and GPU usage per namespace across your Kubernetes clusters. Use quotas to prevent any single namespace from consuming more than its fair share of cluster resources. ## What Quotas Control Each quota is scoped to a specific namespace on a specific cluster and enforces limits on three resource types: | Resource | Unit | Description | |----------|------|-------------| | **CPU** | Millicores (e.g., `1000m` = 1 core) | Maximum CPU that workloads in the namespace can consume | | **Memory** | Mebibytes (e.g., `1Gi`, `512Mi`) | Maximum memory that workloads in the namespace can consume | | **GPU** | Count (e.g., `1`) | Maximum number of NVIDIA GPUs that workloads in the namespace can request | Kubernetes enforces these limits at the scheduling level. Pods that would exceed the quota are rejected until resources are freed. ## Creating a Quota 1. Navigate to **Kubernetes > Quotas** and click **Add Quota** in the action bar. 2. Fill in the quota form: | Field | Required | Description | |-------|----------|-------------| | **Cluster Name** | Yes | The target Kubernetes cluster | | **Namespace** | Yes | The namespace to apply the quota to | | **CPU** | Yes | CPU limit (e.g., `1000m` for 1 core, `500m` for half a core) | | **Memory** | Yes | Memory limit (e.g., `1Gi`, `2048Mi`) | | **GPU** | Yes | GPU limit (integer, e.g., `0` for no GPUs, `2` for two GPUs) | 3. Click **Create Quota**. :::info Managed by Platform Quotas are created as Kubernetes `ResourceQuota` objects in the target namespace. The platform manages these objects for you -- you do not need to write YAML manifests. ::: ## Viewing Quota Utilization The **Kubernetes > Quotas** page displays a table of all quotas across your clusters. Each quota row shows the current usage relative to the configured limit for CPU, memory, and GPU. Usage is displayed as a progress bar with the format **used / limit**: | Utilization | Color | Meaning | |-------------|-------|---------| | 0 -- 50% | Green | Healthy usage, plenty of headroom | | 50 -- 70% | Yellow | Moderate usage, consider monitoring | | Above 70% | Red | High usage, namespace is approaching its limit | Use the cluster and namespace filters at the top of the page to narrow the view. :::tip High Utilization If a quota's CPU or memory bar is consistently red, consider increasing the limit or moving workloads to a less utilized namespace. ::: ## Editing a Quota 1. On the **Quotas** page, select a single quota by clicking its checkbox. 2. Click **Edit** in the action bar. 3. Update the CPU, memory, or GPU limits in the form. 4. Click **Update Quota**. :::warning Existing Workloads Lowering a quota below current usage does not terminate running workloads, but it prevents new pods from being scheduled until usage drops below the new limit. ::: ## Deleting Quotas 1. On the **Quotas** page, select one or more quotas by clicking their checkboxes. 2. Click **Delete** in the action bar. 3. Confirm the deletion in the dialog. Deleting a quota removes the `ResourceQuota` object from the namespace. Workloads in the namespace are no longer subject to the deleted limits. # Services & Storage > Source: https://parallelworks.com/docs/kubernetes/services-and-storage # Services & Storage ACTIVATE provides a unified view of Kubernetes services, persistent storage, ConfigMaps, and Secrets across all connected clusters. You can filter, search, and inspect these resources without switching between clusters or namespaces. ## Services Navigate to **Kubernetes > Services** in the sidebar to view all services across your clusters. ### Service Table Columns | Column | Description | |--------|-------------| | **Name** | The service name. Click to view full resource details. | | **Type** | The Kubernetes service type: `ClusterIP`, `NodePort`, `LoadBalancer`, or `ExternalName`. | | **Namespace** | The namespace the service belongs to. | | **Cluster** | The cluster hosting the service (hidden when filtering by a single cluster). | | **Cluster IP** | The internal cluster IP address assigned to the service. | | **External IP** | The external IP or hostname assigned by a load balancer, or the explicitly configured external IPs. Displays `-` if none. | | **Ports** | Port mappings in `port:targetPort/protocol` format (e.g., `80:8080/TCP`). | | **Created** | Relative timestamp showing when the service was created. | ### Filtering Services Use the filter bar at the top of the services table to narrow results: - **Clusters** — Show services from specific clusters only - **Namespaces** — Filter by one or more namespaces - **Types** — Filter by service type (`ClusterIP`, `NodePort`, `LoadBalancer`, `ExternalName`) - **Search** — Free-text search across service name, namespace, cluster, cluster IP, and external IP ### Selectors Each service includes a **selector** field that shows which pods the service targets. Selectors are displayed as comma-separated `key=value` pairs (e.g., `app=nginx,tier=frontend`). Services without selectors show an empty value. ## Persistent Volume Claims (PVCs) Navigate to **Kubernetes > Storages** in the sidebar to view PVCs and PVs across your clusters. PVCs represent storage requests made by pods. The storage table displays the following information for each PVC: | Column | Description | |--------|-------------| | **Name** | The PVC name. Click to view full resource details. | | **Status** | Binding status: `Bound`, `Pending`, or `Failed`. | | **Type** | Displays `PVC`. | | **Namespace** | The namespace the PVC belongs to. | | **Cluster** | The cluster hosting the PVC. | | **Capacity** | The provisioned storage capacity (e.g., `10Gi`). | | **Access** | Access mode abbreviations: `RWO` (ReadWriteOnce), `ROX` (ReadOnlyMany), `RWX` (ReadWriteMany), `RWOP` (ReadWriteOncePod). | | **Storage Class** | The storage class used for provisioning (e.g., `standard`, `gp3`). | | **Used By** | The pod currently using this PVC. Click the pod name to navigate to the pod details. | | **Created** | Relative timestamp showing when the PVC was created. | ### Access Mode Reference | Abbreviation | Full Name | Description | |-------------|-----------|-------------| | `RWO` | ReadWriteOnce | Volume can be mounted as read-write by a single node | | `ROX` | ReadOnlyMany | Volume can be mounted as read-only by many nodes | | `RWX` | ReadWriteMany | Volume can be mounted as read-write by many nodes | | `RWOP` | ReadWriteOncePod | Volume can be mounted as read-write by a single pod | ## Persistent Volumes (PVs) PVs are cluster-scoped storage resources. They appear alongside PVCs in the same storage table. | Column | Description | |--------|-------------| | **Name** | The PV name. | | **Status** | Volume phase: `Available`, `Bound`, `Released`, or `Failed`. | | **Type** | Displays `PV`. | | **Namespace** | Displays `-` (PVs are cluster-scoped). | | **Cluster** | The cluster hosting the PV. | | **Capacity** | The total storage capacity of the volume. | | **Access** | Supported access modes (same abbreviations as PVCs). | | **Storage Class** | The storage class of the volume. | | **Reclaim Policy** | What happens when the PVC is deleted: `Retain`, `Delete`, or `Recycle`. | | **Created** | Relative timestamp showing when the PV was created. | ### Filtering Storage Use the filter bar to narrow storage results: - **Clusters** — Show storage from specific clusters only - **Namespaces** — Filter by namespace (applies to PVCs only) - **Types** — Filter by `PVC` or `PV` - **Status** — Filter by status: `Bound`, `Pending`, `Available`, `Released`, or `Failed` - **Search** — Free-text search across name, namespace, cluster, storage class, volume name, and claim reference :::info Admin Access Required PVs are cluster-scoped resources and only appear when querying across all namespaces (admin users). Non-admin users see only PVCs within their accessible namespaces. ::: ## ConfigMaps & Secrets Navigate to **Kubernetes > ConfigMaps & Secrets** in the sidebar to view configuration data across your clusters. ### ConfigMap and Secret Table Columns | Column | Description | |--------|-------------| | **Name** | The resource name. Click to view full details including key-value data. | | **Type** | Either `ConfigMap` or `Secret`. | | **Namespace** | The namespace the resource belongs to. | | **Cluster** | The cluster hosting the resource. | | **Data** | Number of keys in the resource (e.g., `3 keys`). | | **Created** | Relative timestamp showing when the resource was created. | ### ConfigMaps ConfigMaps store non-confidential configuration data as key-value pairs. When you click a ConfigMap name, you can view: - All keys and their values - Binary data keys (marked with a `(binary)` suffix) - Labels attached to the ConfigMap - Which deployments reference the ConfigMap (via volume mounts or `envFrom`) ### Secrets Secrets store sensitive data such as passwords, tokens, and TLS certificates. ACTIVATE displays: - The list of keys contained in the secret (values are not exposed in the listing) - The secret type (e.g., `Opaque`, `kubernetes.io/tls`, `kubernetes.io/dockerconfigjson`) - Which deployments reference the secret - Labels attached to the secret :::warning Filtered Tokens Service account tokens are automatically filtered out from the secrets list to reduce noise. Only application-level secrets are shown. ::: ### Filtering ConfigMaps & Secrets - **Clusters** — Show configs from specific clusters only - **Namespaces** — Filter by one or more namespaces - **Types** — Filter by `ConfigMap` or `Secret` - **Search** — Free-text search across name, namespace, and cluster ## Cross-Cluster Queries All resource views in this section aggregate data from every connected cluster by default. The response metadata includes: - **Total clusters queried** — How many clusters were contacted - **Successful clusters** — How many clusters responded successfully - **Total resources** — The combined count of resources returned If a cluster is unreachable, the other clusters still return their results and the error is noted in the response metadata. This ensures partial availability does not block the entire view. ## See Also - [Managing Workloads](/docs/kubernetes/managing-workloads) — View and manage Deployments, StatefulSets, and other workload types - [Connecting Clusters](/docs/kubernetes/connecting-clusters) — Add clusters to enable cross-cluster resource views # Workload Metrics > Source: https://parallelworks.com/docs/kubernetes/workload-metrics # Workload Metrics ACTIVATE provides built-in observability charts for Kubernetes workloads. CPU, memory, and storage usage are collected from the Kubernetes metrics-server and displayed as time-series charts on each workload's detail page. ## Accessing Metrics Metrics are available on the detail page for workload-level resources (Deployments, StatefulSets, and Jobs, including Jobs created by CronJobs). To view them: 1. Go to **Kubernetes > Workloads** 2. Select a cluster and namespace 3. Click on a workload name to open its detail page 4. The **Observability** panel is displayed at the top of the page :::info Workload-Level Only Metrics are shown for workload-level resources, not individual pods. To view metrics for a Deployment, click on the Deployment itself rather than one of its pods. ::: ## Available Charts The Observability panel displays three charts side by side: ### CPU Usage Shows CPU consumption in **cores** over time. The chart plots: - **Usage** — Actual CPU consumed by all containers in the workload's pods - **Request** — The sum of CPU requests configured across containers (displayed when set) - **Limit** — The sum of CPU limits configured across containers (displayed when set) ### Memory Usage Shows memory consumption in **GB** over time. The chart plots: - **Usage** — Actual memory used by all containers in the workload's pods - **Request** — The sum of memory requests configured across containers (displayed when set) - **Limit** — The sum of memory limits configured across containers (displayed when set) ### Storage Usage Shows ephemeral storage consumption in **GiB** over time. The chart plots: - **Usage** — Actual ephemeral storage used by the workload's pods - **Limit** — The node's ephemeral storage capacity (displayed when available) :::tip Ephemeral Storage Storage metrics are collected from the Kubernetes node's `/stats/summary` endpoint and reflect ephemeral storage usage, not persistent volume usage. For persistent volume information, see [Services & Storage](/docs/kubernetes/services-and-storage). ::: ## Time Range Selection A dropdown in the Observability panel header lets you select the time window for all three charts: | Option | Description | |--------|-------------| | **1 Hour** | Show metrics from the last 1 hour | | **3 Hours** | Show metrics from the last 3 hours | | **8 Hours** | Show metrics from the last 8 hours (default) | The selected time range applies to all three charts simultaneously. The default view is **8 Hours**, giving you a broad view of workload behavior. ## Auto-Refresh Metrics data refreshes automatically. There is no need to manually reload the page — the charts update in place with the latest data points from the metrics-server. ## Data Source ACTIVATE collects metrics from the [Kubernetes metrics-server](https://github.com/kubernetes-sigs/metrics-server), which must be installed on each connected cluster. The metrics-server provides point-in-time CPU and memory usage for pods and nodes. The platform's metrics collection process works as follows: 1. **Pod metrics** — CPU and memory usage are read from the metrics-server's `PodMetrics` API (`metrics.k8s.io/v1beta1`) 2. **Resource requests and limits** — CPU, memory, and ephemeral storage requests/limits are read from each pod's container spec 3. **Storage metrics** — Ephemeral storage usage is read from each node's `/stats/summary` proxy endpoint 4. **Aggregation** — Metrics are aggregated at the workload level (Deployment, StatefulSet, etc.) by resolving each pod's parent owner reference 5. **Storage** — Collected metrics are stored with timestamps and can be queried over the selected time range :::warning Metrics Server Required If the metrics-server is not installed on a cluster, the Observability panel will not display any data. Ensure that `metrics-server` is deployed and running in the `kube-system` namespace of each cluster you want to monitor. ::: ## Workload Types Metrics aggregation resolves each pod's owner to determine which workload it belongs to: | Pod Owner | Resolved Workload | |-----------|-------------------| | ReplicaSet (owned by Deployment) | Deployment | | StatefulSet | StatefulSet | | Job | Job | | DaemonSet | Excluded | | Standalone pod | Excluded | :::info Excluded Workloads DaemonSet pods and standalone pods (pods with no owner reference) are excluded from workload-level metrics collection because they are not typically associated with a user-managed workload. A DaemonSet's detail page therefore shows an empty Observability panel. ::: ## See Also - [Pod Logs](/docs/kubernetes/pod-logs) — Stream and view container logs for individual pods - [Managing Workloads](/docs/kubernetes/managing-workloads) — Browse and manage Deployments, StatefulSets, and other workload types - [Cost Tracking](/docs/kubernetes/cost-tracking) — Monitor per-namespace compute costs # Navigating the Marketplace > Source: https://parallelworks.com/docs/marketplace # Navigating the Marketplace In the ACTIVATE Marketplace, you can access pre-configured workflows, storage resources, and compute resources from other users in your organization. Click your username, then **Marketplace**. ![Screenshot of the user clicking Marketplace from the username dropdown menu.](/content-images/docs/marketplace/click-marketplace.png) You’ll be taken to the Marketplace home page. ![Screenshot of the Marketplace's home page.](/content-images/docs/marketplace/marketplace-home-page.png) All resource categories are limited to ten items by default. Click **View all** to see a complete item list. Use the search bar at the top of the page to find items by creator, type, or name. To filter viewable items, click an item in **Filters** or **Type** on the left. Any Marketplace item with a green check icon is verified by your organization. ## Favoriting Workflows Click the worfklow you’d like to use. ![Screenshot of the user selecting a Marketplace workflow item.](/content-images/docs/marketplace/click-workflow-marketplace.png) On the next page, click **latest** to open the dropdown menu of versions. Choose the version you'd like to use. ![Screenshot of the user clicking the version arrow.](/content-images/docs/marketplace/click-worfklow-version-menu.png) :::info About Versions If you select the latest version, your Marketplace item will be updated whenever the item’s creator makes a change or a new version. Alternatively, you can select any of the versions listed in the dropdown menu. If you use a specific version of an item, it will not be updated in your account if the item’s creator makes changes. ::: Click the **Use** button. ![Screenshot of the user clicking the use button.](/content-images/docs/marketplace/click-workflow-use-button.png) The **Use** button will turn green. The message _Using version successfully_ will appear in the bottom right corner of your screen. The workflow will appear under **Marketplace Workflows** on your **Workflows** page. The version number or _latest_ will be included in the item’s **Name** and **Tags**. ![Screenshot of the workflow appearing on the user's Workflows page.](/content-images/docs/marketplace/marketplace-workflows-view.png) ## Forking an Item This method allows you to copy an item into your ACTIVATE account. ### Forking Compute Resources Click the compute resource you’d like to use. ![Screenshot of the user selecting a Marketplace workflow item.](/content-images/docs/marketplace/click-compute-resource.png) On the next page, click **latest** to open the dropdown menu of versions. Choose the version you'd like to use. ![Screenshot of the user clicking the version arrow.](/content-images/docs/marketplace/click-compute-version-menu.png) Click the **Fork** button. ![Screenshot of the user clicking the Fork icon.](/content-images/docs/marketplace/click-compute-fork-version.png) A dialog box will appear. Enter a **New compute name**. Click **Fork**. ![Screenshot of the user clicking the Fork button.](/content-images/docs/marketplace/click-compute-fork-button.png) You’ll be taken to the new compute resource's configuration page. The compute resource will also appear on the **Clusters** page. The version number you created the fork from will be included in **Tags**. ![Screenshot of the workflow appearing on the user's Workflow's page.](/content-images/docs/marketplace/forked-compute-view.png) ### Forking Workflows Click the workflow you’d like to use. ![Screenshot of the user selecting a Marketplace workflow item.](/content-images/docs/marketplace/click-workflow-marketplace.png) On the next page, click the fork icon. ![Screenshot of the user clicking the Fork icon.](/content-images/docs/marketplace/click-workflow-fork-icon.png) A dialog box will appear. Enter a **New workflow name**. Click **Fork**. ![Screenshot of the user clicking the Fork button.](/content-images/docs/marketplace/click-workflow-fork-button.png) You’ll be taken to the new workflow's configuration page. The workflow will also appear on the **Workflows** page beneath **My Workflows**. Forking automatically creates the new item from the latest published version; the version number you created the fork from will be included in **Tags**. ![Screenshot of the workflow appearing on the user's Workflow's page.](/content-images/docs/marketplace/forked-workflow-view.png) ### Forking Storage Resources Click the storage resource you’d like to use. ![Screenshot of the user selecting a Marketplace workflow item.](/content-images/docs/marketplace/click-storage-resource.png) On the next page, click **latest** to open the dropdown menu of versions. Choose the version you'd like to use. ![Screenshot of the user clicking the version arrow.](/content-images/docs/marketplace/click-storage-version-menu.png) Click the **Fork** button. ![Screenshot of the user clicking the Fork icon.](/content-images/docs/marketplace/click-storage-fork-version.png) A dialog box will appear. Enter a **New storage name**. Click the checkbox if you want your new resource to be **Persistent**. Click **Fork**. ![Screenshot of the user clicking the Fork button.](/content-images/docs/marketplace/click-storage-fork-button.png) You’ll be taken to the new storage resource's configuration page. The storage resource will also appear on the **Storage** page with your other storage resources. The version number you created the fork from will be included in **Tags**. ![Screenshot of the workflow appearing on the user's Workflow's page.](/content-images/docs/marketplace/forked-storage-view.png) ## Publishing an Item You can quickly and easily share an item in your account with other users in your organization. At the bottom of the Marketplace page, click **Publish to Marketplace**. ![Screenshot of the usering clicking Publish to Marketplace.](/content-images/docs/marketplace/click-publish-marketplace.png) On the next page, choose the **Item to publish** from your account. Enter a **Name**. This is the item’s display name and must be a unique value. Enter a **Marketplace Slug**. This is a unique identifier that appears at the end of the Marketplace URL when others navigate to the item’s page. Choose the **Privacy** level for your item. When you’re done, click **Publish**. ![Screenshot of the user clicking Publish.](/content-images/docs/marketplace/click-publish.png) The message _Successfully published item_ will appear in the top right corner of your screen, and you’ll be taken to the item’s Marketplace page. ![Screenshot of the new workflow's Marketplace page.](/content-images/docs/marketplace/newly-published-workflow.png) ## Editing an Item Click the Marketplace item you’d like to edit. ![Screenshot of the user selecting a Marketplace workflow item.](/content-images/docs/marketplace/click-workflow-marketplace.png) Click the edit icon. ![Screenshot of the user clicking the edit icon.](/content-images/docs/marketplace/click-edit-workflow.png) You’ll be taken to the item’s **General** settings. ![Screenshot of the General settings tab.](/content-images/docs/marketplace/blank-edit-workflow-settings.png) You can change the same settings that were chosen when the item was created: **Name**, **Marketplace Slug**, and **Privacy**. Use the **Summary** field to add a short description that will be displayed beneath the item’s thumbnail on the Marketplace. Admin Settings - If you check **Verified**, a green checkmark will be displayed next to the item’s name on the Marketplace. - If you check **Featured**, the item will be displayed at the top of the Marketplace for all users in your organization. - If you check **Publish as Organization**, the item’s creator will be your organization’s name instead of your username. If you click the **Description** tab, you can add a markdown description that will be displayed on the item’s Marketplace page. ## Publishing a New Item Version Click the Marketplace item you’d like to version. ![Screenshot of the user selecting a Marketplace workflow item.](/content-images/docs/marketplace/click-workflow-marketplace.png) Click the edit icon. ![Screenshot of the user clicking the edit icon.](/content-images/docs/marketplace/click-edit-workflow.png) Click **Versions**. ![Screenshot of the user clicking the Versions tab.](/content-images/docs/marketplace/click-versions-tab.png) Click **Publish**. ![Screenshot of the user clicking the Publish button.](/content-images/docs/marketplace/click-publish-new-workflow.png) Choose the **Resource** that will be this item's new verison. Enter a **Version** number. This value must start with "v" followed by at least two characters. We recommend the format v0.0.0 to accomodate a range of version changes. Click **Publish version**. ![Screenshot of the user clicking Publish version.](/content-images/docs/marketplace/click-publish-version.png) The message _Version published successfully_ will appear in the top right corner of your screen. ## Deleting an Item Click the Marketplace item you’d like to delete. ![Screenshot of the user selecting a Marketplace workflow item.](/content-images/docs/marketplace/click-workflow-marketplace.png) Click the edit icon. ![Screenshot of the user clicking the edit icon.](/content-images/docs/marketplace/click-edit-workflow.png) Click the **Delete** button. ![Screenshot of the user clicking the Delete button.](/content-images/docs/marketplace/click-delete-workflow.png) The message _Item deleted successfully_ will appear in the top right corner of your screen. ## Further Reading For more information about creating your own workflows, please see [**Building Workflows**](/docs/run/workflows/building-workflows). # Machine Learning > Source: https://parallelworks.com/docs/ml # Machine Learning ACTIVATE lets you provision managed machine learning environments connected to cloud infrastructure such as Azure Machine Learning Studio. ## ML Workspaces - [Adding an ML Resource](/docs/ml/adding-ml-resources) — Create and manage ML workspace resources ## Related Documentation - [AI](/docs/ai) — The AI gateway, Chat, providers, and best practices - [Getting Started](/docs/getting-started) — Tutorial for new users # Adding an ML Resource > Source: https://parallelworks.com/docs/ml/adding-ml-resources # Adding an ML Resource :::info Feature may not be available on all platforms Not all deployments of ACTIVATE support the Machine Learning feature. If you do not see the **Machine Learning** option in your ACTIVATE account, please contact support for more information. ::: You can add machine learning resources to your ACTIVATE account. In this example, we’ll be adding a resource that connects to [Azure Machine Learning Studio](https://learn.microsoft.com/en-us/shows/ai-show/azure-machine-learning-studio). Navigate to **Machine Learning**. ![Screenshot of the user clicking Machine Learning.](/content-images/docs/ml/adding-ml-resources/click-machine-learning.png) Click **Add ML Workspace**. ![Screenshot of the user clicking Add ML Workspace.](/content-images/docs/ml/adding-ml-resources/click-add-ML-workspace.png) You must enter a **Resource Name** and choose a **Cloud Infrastructure**, **Group**, and **Region**. The **Description** and **Tags** are optional. Click **Add Machine Learning resource**. ![Screenshot of the user clicking Add Machine Learning resource.](/content-images/docs/ml/adding-ml-resources/click-add-ML-resource.png) A notification will appear with the message _Machine Learning resource created_. You'll also be redirected to your list of Machine Learning resources. ![Screenshot of a Machine Learning resource being created.](/content-images/docs/ml/adding-ml-resources/ML-resource-provisioning.png) Once the resource has been created, the page will display the status, namespace, and region. From this page, you can: - click the name of your resource to see more information about it. - click the status to see a detailed log of its progress. - click **Open Workspace** to access Azure Machine Learning Studio, which will open in a new browser tab. ## Deleting a Resource On the **Machine Learning** page, click the delete icon. A dialog box will appear with the message _Are you sure you want to delete this Machine Learning resource?_ Click **Delete**. A notification will appear with the message _Machine Learning resource deleted successfully_. # Monitoring > Source: https://parallelworks.com/docs/monitoring # Monitoring The Monitor section provides visibility into your running resources, job status, and cloud spending. ## Monitoring Areas ### [Instances & Jobs](/docs/monitoring/instances-and-jobs) Track your running compute resources and job status: - View active and recently terminated instances - Monitor cluster status and health - Track job execution and completion ### [Costs](/docs/monitoring/costs) Understand and manage your cloud spending: - View cost dashboards and trends - Track spending by resource type - Monitor allocation usage - Generate cost reports ## Quick Links - [Instances & Jobs](/docs/monitoring/instances-and-jobs) - Resource and job monitoring - [Cost Dashboard](/docs/monitoring/costs) - Cost tracking and analysis # Monitoring Costs > Source: https://parallelworks.com/docs/monitoring/costs # Monitoring Costs ACTIVATE features a dashboard that tracks costs across all cloud service providers (CSPs). The cost dashboard shows metrics down to an individual user’s cluster session. Cost data is pulled directly from CSPs to show charges by usage type, such as compute instances and storage. The dashboard’s real-time cost tracking feature is designed to provide an accurate approximation of cloud costs between billing updates, capturing resource usage since the most recent official billing update. Official billing updates can be spaced by many hours; a large cluster can incur substantial expenses in that time window, so near real-time billing is an important feature to help users monitor their costs. :::info Note Please note that you won’t see the cost dashboard if your organization has not enabled it. ::: ## The Cost Dashboard To reach the cost dashboard, navigate to the **Cost** page. ![Screenshot of overview for the Cost page.](/content-images/docs/monitoring/costs/blank-cost-dashboard.png) By default, you’ll see the following data in the cost dashboard. You can change the view at any time; for more information, please see [**Filtering Data**](#filtering-data) below. Please note that all monetary values are listed in U.S. dollars (USD). ### Graphs The cost dashboard features several graphs to help users visualize data. Unless otherwise noted, all filters can change a graph’s displayed data. For more details, please see [**Filtering Data**](#filtering-data) below. #### Daily Cost This graph shows the accumulated daily cost for users in a group within the selected **Time** filter. You can mouse over any bar to see detailed costs for that day. For more details, please see [**About Cost Types**](/docs/monitoring/costs#about-cost-types) below. #### Total Spend Over Time This graph shows a group’s total expenditures to date. Because this graph shows an accumulation of cost data for a group, only the **Group** filter changes its displayed data. #### Cost by User This graph shows a breakdown of costs by group users within the selected **Time** filter. You can mouse over unlabeled pieces of the graph to see usernames. #### Cost by Type This graph shows a breakdown of costs by type within the selected **Time** filter. You can mouse over unlabeled pieces of the graph to see cost types. For more details about these costs, please see [**About Cost Types**](/docs/monitoring/costs#about-cost-types) below. ### Metrics The cost dashboard features several data modules that display important usage metrics. Unless otherwise noted, all filters can change a metric’s displayed data. For more details, please see [**Filtering Data**](#filtering-data) below. #### Filtered Cost This metric shows the costs for the filters you’ve applied. For example, the cost dashboard defaults to data for the month to date and includes real-time tracking. The **Filtered Cost** module displays data only for those users within those parameters until you change the filters. #### Total Allocations This metric shows the total allocations that have been allotted for a group. Allocations are set by ACTIVATE platform administrators; for more information, please see **Enforcing Allocations** (coming soon). #### Remaining Allocations This metric shows how much a group can spend before reaching its set cost allocation. #### Active Users This metric shows the active users for the filters you’ve applied. For example, the cost dashboard defaults to data for the month to date and includes real-time tracking. There could be one hundred total users in your selected group, but with these filters, **Active Users** would show how many users used clusters and/or storage within that time period. #### Total Spend This metric shows the amount all users in your group have spent. Because this graph shows an accumulation of cost data for a group, only the **Group** filter changes its displayed data. If real-time tracking is enabled, this metric updates every three minutes. If real-time tracking is disabled, update time is CSP dependent. - AWS updates two to three times each day. They don't have a set billing time. - Azure updates once each day. Their billing time depends on when your billing report was created. - Google updates five to eight times each day. They don't have a set billing time. #### Percent Used Allocations This metric shows the percentage of allocations used by all users in a group. Because this graph shows an accumulation of cost data for a group, only the **Group** filter changes its displayed data. If real-time tracking is enabled, this metric updates every three minutes. If real-time tracking is disabled, update time is CSP dependent. ### Tables The cost dashboard features several tables that display important usage data. All filters can change a table’s displayed data. For more details, please see [**Filtering Data**](#filtering-data) below. Please note that all tables list data in descending order of costs. #### User Cost This table shows a breakdown of costs by user within the selected time frame. #### Cost by Session This table shows a breakdown of costs by users’ sessions within the selected time frame. #### Cost by Instance Type This table shows a breakdown of costs by instance type within the selected time frame. #### Cost by Type This table shows a breakdown of costs by type within the selected time frame. For more details about these costs, please see [**About Cost Types**](/docs/monitoring/costs#about-cost-types) below. ## Filtering Data There are a variety of options for filtering the cost dashboard’s data, including: - Group - Time - Realtime - User - Type - Pool - Session Three filters must have options selected: **Group**, **Realtime**, and **Time**. These options are pinned to the top of the **Cost** page. By default, these options are set to the first group you were added to, included real-time billing, and costs for the month to date. You can click any of these options to change them. To add additional filters, click **Filter Options** and select any filter from the list. Next, use the dropdown menu to select the filter parameter. All filter dropdown menus include a search bar for quickly finding parameters. Please note that some filters are conditional. For example, you must select a **User** before you can select a **Pool**. You must select a **Pool** before you can select a **Session**. ## Printing Data You can print the cost dashboard data at any time. Click **Options**, then **Print**. ![Screenshot of the user selecting Print in the Options dropdown menu.](/content-images/docs/monitoring/costs/click-print-costs.png) A **Print** window will appear. Select the option for **Save as PDF**. Click **Save**. The cost dashboard page will be downloaded to your device as a PDF. ## About Cost Types Project costs can be divided into three broad categories: compute, storage, and network charges. Compute costs include the controller, compute nodes, and custom images. Because compute nodes are capable of starting and stopping elastically based on scheduler load, charges can be minimized when a cluster is left on with a period of idle time between jobs. Storage costs include disks attached to compute nodes, as well as optional storage deployed with a cluster. Other storage charges include persistent storage maintained outside of cluster configuration. For more information, please see [**Storage Types**](/docs/storage/#storage-types). Network charges may accrue if data is transferred from the cloud or across regions. ### Compute Charges #### Compute This cost type includes instance-related charges. Primarily, these costs include the instances themselves. Some CSPs also include attached items, such as external network interfaces. #### Compute Nodes This cost type is similar to **Compute** costs, but only includes data for compute nodes. ### Storage Charges #### Storage This cost type is associated with `pwbilling` and `ca-cloudmgmt`, which applies only to AWS instances. #### Storage-Disk This cost type applies to disk storage on Azure instances. #### Storage-EBS This cost type applies to AWS instances. Elastic Block Storage (EBS) is a subset of the AWS service Elastic Cloud Compute (EC2). **Storage-EBS** includes instance local disks as well as snapshots. #### Storage-EFS This cost type applies to AWS instances. Elastic Filesystem (EFS) is an AWS feature. #### Storage-File This cost type applies to Azure instances with `Premium LRS All Other Operations` enabled. #### Storage-GCS This cost type applies to Google instances with Google Cloud Storage (GCS) enabled. #### Storage-Image This cost type includes snapshots on all CSPs. #### Storage-Lustre This cost type applies to Lustre storage resources. #### Storage-PD This cost type includes local boot disks for Google instances. PD stands for persistent disk. #### Storage-S3 This cost type applies to AWS instances. Simple Storage Service (S3) is a bucket storage resource from AWS. ### Network Charges #### Egress This cost type applies to data transfers out of the cloud. #### Ingress This cost type applies to data transfers into the cloud. To better understand what counts as ingress and egress on a particular cloud, please see their respective documentation. - [AWS](https://aws.amazon.com/blogs/architecture/overview-of-data-transfer-costs-for-common-architectures/) - [Azure](https://azure.microsoft.com/en-us/pricing/details/bandwidth/) - [Google](https://cloud.google.com/vpc/network-pricing) ### Other Charges #### Infrastructure This cost type includes cloud infrastructure charges, such as network transit gateways. #### Other This cost type includes miscellaneous charges that are not essential for tracking purposes. Charges in this category include items like API requests, security operations, and CSP-specific support fees. #### Unknown This cost type includes charges that haven't been labeled on the ACTIVATE platform yet. Our cost types are based on the way CSPs name their charges. Because each CSP stores many different types of cost data, our engineering team must sort, consolidate, and map that data to corresponding ACTIVATE cost types. **Unknown** costs are re-assessed quarterly. # Monitoring Your Work > Source: https://parallelworks.com/docs/monitoring/instances-and-jobs # Monitoring Your Work ACTIVATE features several data monitoring modules as well as a monitor dashboard to track your work. ## Home The **Home** page displays important data at a glance. ### Workflow Monitor This module shows a snapshot of your most recently run workflows. ![Screenshot of the Workflow Monitor module.](/content-images/docs/monitoring/instances-and-jobs/workflow-monitor.png) Data columns for your workflows include: - ID - Workflow - Status - Submitted - Runtime (Minutes) If you click a workflow’s **ID** number or its name in the **Workflow** column, you’ll be taken to a more detailed view on the [**Workflows**](#workflows) page. A workflow’s **Status** can be Started, Running, Completed, Canceled, or Error. The **Workflow Monitor** also includes three important action buttons: - Cancel Run - Run Workflow Again - View Active Workflow If you click the icon to re-run a workflow, you’ll be taken to the workflow’s configuration form on the **Workflows** page. ### Storage Resources This module shows your favorited storage resources and their status (**active**, **starting**, or **stopped**). ![Screenshot of the Storage Resources module.](/content-images/docs/monitoring/instances-and-jobs/storage-resources.png) If you click the information icon, you’ll be taken to the storage’s configuration form on the **Storage** page. ### Compute This module shows your favorited resources and their status (**active** nodes and **requested** nodes if active or **stopped** if inactive). ![Screenshot of the Compute module.](/content-images/docs/monitoring/instances-and-jobs/blank-running-cluster.png) The navy bar reflects the number of maximum nodes a resource can have. In the screenshot above, the resource has the controller node and a partition that’s configured for 10 maximum nodes, for a total of 11 possible nodes. The green bar reflects the number of active nodes on a compute resource. In the screenshot above, the resource is active but not running any jobs, so there is 1 active node (the controller). If you click the gear icon, you’ll be taken to the resource’s **Definition** tab on the **Clusters** page. If you click the information icon, you’ll be taken to the resource’s **Sessions** tab on the **Clusters** page. ## Workflows On the **Workflows** page, click a workflow. You’ll be taken to the workflow’s **Jobs** tab. ![Screenshot of the Jobs tab on the Workflows page after clicking a workflow.](/content-images/docs/monitoring/instances-and-jobs/workflow-jobs-tab.png) The **Workflow Monitor** here mirrors the [**Workflow Monitor**](/docs/monitoring/instances-and-jobs#workflow-monitor) from the **Home** page. The **Job logs** module shows details about specific workflow sessions. When you navigate to this page, this module shows `No log found` until you click a job number in the **ID** column. If you navigate to this page after clicking the eye icon on a running workflow, the **Job logs** module will show details for that active session. You can save workflow logs by clicking the **Download** button. ## Clusters When monitoring a cluster, the most important features are its [**Status**](/docs/compute/navigating-cloud-clusters#status) and [**Jobs**](/docs/compute/navigating-cloud-clusters#jobs) tab. ## Storage When you click on a persistent storage resource, you’ll be taken to the storage’s **Sessions** tab. ![Screenshot of the Sessions tab on the Storage page after clicking a storage resource.](/content-images/docs/monitoring/instances-and-jobs/storage-disk-jobs-tab.png) The **Sessions** module shows details about all your sessions with this storage resource, including: - Session - Status - Creation Time - Deletion Time The **Logs** module shows details about specific storage sessions. When you navigate to this page, the **Provision** and **Deletion** tabs here show `Log not found` until you click a number in the **Session** column. You can save storage logs by clicking the **Download** button. :::info Ephemeral Storage Please note that ephemeral storage resources don’t have this page because they’re created and destroyed with a resource. You can see more details about ephemeral storage resources by navigating to their attached resource and clicking on the **Storages** tab of the **Logs** module. ::: ## Monitor In the sidebar category **Monitor**, there are two pages: **Cost** and **Instances**. ### Cost The **Cost** page shows your cost data across ACTIVATE. For more information about this page, please see [**Monitoring Costs**](/docs/monitoring/costs). ### Instances The **Instances** page shows your active and deleted clusters within the last hour. Each instance listed here includes the following data: - Pool - Session - Region - Number of Running Instances - Started - Deleted - State If a cluster is active, its **State** will show **Running** in yellow. If a cluster has recently been shut down, its **State** will show **Deleted** in blue. ![Screenshot of a running and a deleted cluster on the Instances page.](/content-images/docs/monitoring/instances-and-jobs/instances-page-running-deleted.png) If you haven’t started or stopped a cluster within the last hour, the **Instances** tab will show the message _No instances found_. ![Screenshot of a blank Instances tab on the Monitor page.](/content-images/docs/monitoring/instances-and-jobs/instances-page-no-instances.png) # Navigating ACTIVATE > Source: https://parallelworks.com/docs/navigating-activate # Navigating ACTIVATE This page introduces the major features of ACTIVATE to help new users get oriented.
## Your Workspace Your personal workspace includes tools for managing files and interacting with ACTIVATE. For detailed documentation on each component, see: - [**Dashboard**](/docs/your-workspace/dashboard) - Your central hub for monitoring workflows, sessions, and clusters - [**Editor**](/docs/your-workspace/editor) - Full-featured IDE for editing files and code - [**Explorer**](/docs/your-workspace/explorer) - File browser for managing files - [**Terminal**](/docs/your-workspace/terminal) - Command-line access to your workspace - [**Inbox**](/docs/your-workspace/inbox) - Notifications and messages If you want to customize your workspace layout, see [**Customizing Layouts**](/docs/account-settings/customizing-layouts). ## Run The **Run** tab houses the pages for different options to complete work on ACTIVATE. ### Workflows On the **Workflows** page, you can create and manage your workflows. Any workflows you add from the **Marketplace** will appear here automatically. ![Screenshot of the Workflows page immediately after selecting Workflows.](/content-images/docs/navigating-ACTIVATE/blank-workflows-page.png) For more information, please see [**About Workflows**](/docs/run). ### Sessions ![Screenshot of the Sessions page.](/content-images/docs/navigating-ACTIVATE/blank-running-session.png) On the **Sessions** page, you can access running sessions. A session is a secure, shareable connection between a cluster and a workflow. Sessions can also generate interactive applications. For more information, please see [**About Sessions**](/docs/run/sessions/interactive-sessions). ## Compute The **Compute** tab houses the pages for different computing resources. ### Clusters On the **Clusters** page, you can create and manage clusters as well as access any shared clusters. ![Screenshot of the Compute page immediately after selecting Resources.](/content-images/docs/navigating-ACTIVATE/blank-compute-page.png) For help choosing, creating, or connecting a resource, start with the [**Compute overview**](/docs/compute). ## Storage The **Storage** tab houses the pages for different storage types: **Lustre**, **NFS**, **Disks**, **Buckets**, and **Snapshots**. For more information about these options, please see [**Storage**](/docs/storage). ![Screenshot of the NFS page.](/content-images/docs/navigating-ACTIVATE/blank-nfs-page.png) ## Monitor The **Monitor** tab houses pages that show important information about your resources and ACTIVATE platform usage. ### Cost The **Cost** page displays cost tracking information for your organization, such as total spend over time and allocation usage. ![Screenshot of the Buckets page immediately after selecting Buckets.](/content-images/docs/navigating-ACTIVATE/blank-cost-page.png) For more information, please see [**Monitoring Costs**](/docs/monitoring/costs). ### Instances The **Instances** page displays any running clusters and clusters that have been deleted within the last hour. For more information, please see [**Instances**](/docs/monitoring/instances-and-jobs#instances) in [**Monitoring Your Work**](/docs/monitoring/instances-and-jobs). ![Screenshot of the Buckets page immediately after selecting Buckets.](/content-images/docs/navigating-ACTIVATE/blank-instances-page2.png) ## Marketplace On the **Marketplace** page, you can select pre-configured workflows, storage resources, and compute resources for your projects. ![Screenshot of the Marketplace page immediately after selecting Marketplace.](/content-images/docs/navigating-ACTIVATE/blank-marketplace.png) For more information, please see [**Marketplace**](/docs/marketplace). ## Feature Preview With the Feature Preview, you can test upcoming features before they're integrated into ACTIVATE. Click your username, then select **Feature Preview**. ![Screenshot of the user clicking Feature Preview.](/content-images/docs/navigating-ACTIVATE/click-feature-preview.png) A new dialog box will appear with a list of features. Select a feature, then click **Enable**. ![Screenshot of the user clicking Enable.](/content-images/docs/navigating-ACTIVATE/click-enable-feature-preview.png) Enabled features will display a green checkmark next to their names. ![Screenshot of an enabled feature in Feature Preview.](/content-images/docs/navigating-ACTIVATE/enabled-feature-preview.png) You can remove features at any time by clicking **Disable**. _Please note that the items listed in the Feature Preview are controlled by your organization's administrator._ # For Organization Admins > Source: https://parallelworks.com/docs/organization-admin ## About Partners, Organizations, and Groups On the ACTIVATE platform, we use partners, organizations, and groups to organize users and manage access permissions. This user hierarchy is shown in the diagram below with a detailed explanation afterward. ![Diagram of ACTIVATE's hierarchy of partners, organizations, groups, and users.](/content-images/docs/organization-admin/managing_orgs_1_june23.svg) **Platform Settings** are the highest level from which the platform can be configured. Only ACTIVATE administrators can manage these settings. Currently, the settings that can be configured at the platform level are cloud service providers (CSPs) and multipliers. The next management level is **Partner Organizations**, which have the ability to create other organizations. Organizations created by a partner organization are considered to be _managed by_ the partner organization. Any organization that manages another organization can: - access all of the organization's settings, users, groups, and CSP billing data. - set custom billing multipliers. - configure allowed instance types. All organizations can: - configure allowed instance types. - configure default resources, which are created for new users. - customize the organization theme, sidebar, and login banner. **Groups** are used to manage user permissions that affect the administration of users, groups, and group settings. Note that to configure many of these settings, you must be in a group with the `org:admin` role, or a role specific to the setting you're configuring. Partner organizations and ACTIVATE administrators are automatically granted necessary roles to configure organizations. For more specific information, please see [**About Group Roles**](#about-group-roles) below. **Users** are intended to be named users (i.e. one real person per username), and our system is designed around this idea. These elements create a user hierarchy with a waterfall structure, where each tier inherits the settings above it but can be overridden at the lower level. ### Navigating Organization Settings When you select an organization, you'll see a sidebar on the left with the following sections: - **Users** and **Groups** — Manage the people in your organization. - **Settings** — Configure [Authentication](/docs/organization-admin/settings/authentication), [Policies](/docs/organization-admin/settings/policies), [Webhooks](/docs/organization-admin/settings/webhooks), and [Variables](/docs/organization-admin/settings/variables). - **Customize** — Adjust the [Theme](/docs/organization-admin/customize/theme), [Sidebar](/docs/organization-admin/customize/sidebar), [Onboarding](/docs/organization-admin/customize/onboarding), and [Login Banner](/docs/organization-admin/customize/login-banner). - **Cloud** — Manage [Cloud Accounts](/docs/organization-admin/cloud/cloud-accounts), [Instance Types](/docs/organization-admin/cloud/instance-types), [Bootstrap Script](/docs/organization-admin/cloud/bootstrap-script), and [Reservations](/docs/organization-admin/cloud/reservations), and view your organization's [Network Topology](/docs/organization-admin/cloud/topology). - **Billing** — View the [Cost Dashboard](/docs/organization-admin/billing/cost) and configure [Allocation Thresholds](/docs/organization-admin/billing/thresholds). - **Partner** — For partner organizations: configure [Billing Multiplier](/docs/organization-admin/partner/billing-multiplier) and [Instance Limits](/docs/organization-admin/partner/instance-limits). - **Admin** — Platform-level configuration, visible to [platform administrators](/docs/organization-admin/admin) only. ### Organizations for Partners and ACTIVATE Administrators The **Organizations** list will look different for you than it will for most users. Partners and administrators see a list that includes their own organization and all organizations that they manage. This page displays each organization's name and which organization it's managed by (if any). Click on any organization to open its settings. There are two features that are important for partner organizations: [configuring billing multipliers](/docs/organization-admin/partner/billing-multiplier) and [creating organizations](/docs/organization-admin/creating-organizations). ## About Group Roles We currently have four ACTIVATE roles to customize user permissions within your organization. - Users with the `org:admin` permission have full control. They can make any changes to any settings in the organization. - Users with the `org:settings` permission can manage organization settings. - Users with the `org:users` permission can create and manage users. - Users with the `org:groups` permission can create and manage groups. However, they cannot assign or remove roles for groups; only users with the `org:admin` permission have access to make those changes. These roles are controlled through groups. All users within a group have the same permissions. Groups can also have multiple roles assigned to them. At this time, you cannot assign roles to individual users. # Platform Administration > Source: https://parallelworks.com/docs/organization-admin/admin # Platform Administration Platform-level configuration for this organization. Only visible to platform administrators. ## Navigation From the **Organizations** list, select your organization. In the sidebar, click **Admin**. ## Organization Flags Configure high-level flags that control organization behavior. - **Partner Organization** — Toggle whether this organization can create and manage other organizations. - **Enforce MFA** — Require all users in this organization to use multi-factor authentication. - **Receive Active User Report** — When enabled, shows an **Email Recipients** field where you can enter a comma-separated list of email addresses that will receive periodic active user reports. ## Domain & Access Configure the organization's platform access and domain settings. - **Platform Domain** — The URL of the platform instance (e.g., `activate.parallel.works`). - **Seats** — The number of user seats allocated to this organization. Set to `0` for unlimited. - **Default User Host** — The default hostname for user workspaces (e.g., `user-1.example.com`). - **Custom Login Domain** — A custom domain for the organization's login page (e.g., `example.parallel.works`). ## Workspace Settings A JSON editor for configuring workspace-level settings that apply to all users in the organization. The following fields are available: - `k8sMounts` — Kubernetes volume mounts - `mounts` — Additional filesystem mounts - `envs` — Environment variables - `dns` — Custom DNS servers - `homeDirPrefix` — Home directory prefix path - `dockerNetwork` — Docker network configuration Click **Save Configuration** to apply changes. ## Deleting an Organization :::caution Warning Deleting an organization is a permanent, destructive action that cannot be undone. ::: At the bottom of the Admin page, click **Delete this organization**. A confirmation modal will appear requiring you to type the organization name to confirm. This action will: - Permanently delete the organization and all of its users, groups, and cloud accounts - Terminate all associated cloud resources # Allocations (Preview) > Source: https://parallelworks.com/docs/organization-admin/billing/allocations # Allocations (Preview) Allocations are named budgets — denominated in U.S. dollars or in a custom unit such as core-hours, GPU-hours, or a pool of service credits — that let organization admins track and cap usage independently of groups. Custom units are the typical use case: awarded HPC compute, grant-funded resources, and other non-dollar accounting that the Cost Dashboard alone cannot represent. You can share an allocation with one or more groups, nest it under a parent allocation, and feed it usage from the platform or from external sources like HPC clusters. :::info Feature Preview Allocations is currently in **Feature Preview**. To use it, enable **both** of the following features for your own account: - `allocations` — exposes the Allocations UI and APIs. - `cost` — enables the updated cost dashboard that allocation usage feeds into. Click your username, select **Feature Preview**, then click **Enable** next to each feature. See [Feature Preview](/docs/navigating-activate#feature-preview) for the full walkthrough. Until both are enabled on your account, the **Allocations** page will not appear in your sidebar. ::: ## Concepts ### Allocations An allocation is a named budget owned by your organization. Each allocation tracks three values: - **Total** — the budgeted amount. - **Used** — confirmed spend recorded against the allocation. - **Estimated used** — pending or in-flight spend that has not yet been finalized. Allocations can optionally be nested one level under a parent allocation, which is useful when you want to carve a department-level budget into project-level sub-budgets. ### Units A **unit** is the dimension an allocation is measured in. By default, allocations are denominated in U.S. dollars. Organizations can also define custom units — for example, `core-hours` or `gpu-hours` — and attach time-varying rate rules so that pricing can change over time without rewriting historical usage. ### SKUs A **SKU** (Stock Keeping Unit) is a billable resource type attached to a custom unit. When you set up a custom unit, you define the SKUs that describe what it charges for — for example, `SLURM_NODE_HOUR` for a per-node-hour HPC rate, or distinct codes for individual license tiers. Each usage event references a SKU code so the platform can rate it correctly against the unit's rules. ### Usage events A **usage event** is a record of consumption against an allocation. Each event carries a quantity, a start/end time, and a SKU code. The platform rates the event using the SKU's unit rules and rolls the result into the allocation's **Used** and **Estimated used** totals. Usage events can be deleted if a charge needs to be reversed. ## Creating an allocation From the **Organizations** list, select your organization. In the sidebar, under **Billing**, click **Allocations**, then click **New Allocation**. #### Name A unique name for the allocation within your organization. This name is shown in the dashboard and is used by integrations that record usage against the allocation. #### Total The budgeted amount, expressed in the allocation's unit. #### Unit The billing dimension. Leave this set to **USD** for a dollar-denominated budget, or select a custom unit your organization has defined. #### Parent allocation Optional. Select an existing allocation to nest this one beneath. Child allocations consume from the parent's pool. Only one level of nesting is supported. Click **Save** when you're done. ## Sharing an allocation By default, only organization admins can see or use a new allocation. To let other users record or consume against it, find the allocation in the table and click the **permissions** icon in the **Actions** column to open its permissions panel. You can grant three permission levels, either to specific groups or organization-wide: - **Read** — view the allocation and its usage. - **Use** — call the usage-event API to record consumption against the allocation. - **Admin** — edit the allocation's total and manage its permissions. ## Recording usage :::info API only In this preview, usage events can only be recorded through the platform's REST API — there is no in-platform UI for adding usage, and launching a cluster does not yet automatically bill to an allocation. To populate an allocation, call the usage-event endpoint directly or run an integration that does so on your behalf. ::: The endpoint accepts a quantity, a start and end time, and a SKU code. The platform rates the event using the SKU's unit rules and updates the allocation's totals. ## Viewing usage The allocations table shows each allocation's **Total**, **Used**, **Estimated**, **Remaining**, and **% Used** at a glance. To drill into the individual usage events recorded against an allocation, click the **usage** ($) icon in the **Actions** column. As with the Cost Dashboard: - **Used** reflects confirmed, finalized spend (for cloud usage, this is the true-cost data imported from your cloud service provider, which may lag by 24-48 hours). - **Estimated used** reflects real-time, in-flight consumption that has not yet been confirmed. The sum of the two gives you a near real-time view of how much of the allocation remains available. ## Editing and deleting To change an allocation's total, click the **edit** icon in the **Actions** column and update the **Total** field. Other fields (name, unit, parent) are fixed at creation time. To delete an allocation, click the **trash** icon in the **Actions** column. Deletion removes the allocation along with all of its recorded usage events, so make sure you have exported any data you need first. ## Tracking Slurm usage If your organization runs Slurm-managed HPC clusters, the [`slurm-tracker`](https://github.com/parallelworks/slurm-tracker) CLI can post usage from those clusters directly into the allocations system. It runs on a Slurm login or controller node (typically as a cron job every few minutes), maps each Slurm account to an allocation and each Slurm partition to a SKU, and records core-hour consumption as usage events. See the [slurm-tracker README](https://github.com/parallelworks/slurm-tracker) for installation, configuration, and the account-to-allocation mapping format. # Cost Dashboard > Source: https://parallelworks.com/docs/organization-admin/billing/cost # Cost Dashboard The Cost Dashboard provides an interactive view of your organization's cloud spending. Use it to monitor costs across groups, time periods, and cloud providers. ## Navigation From the **Organizations** list, select your organization. In the sidebar, under **Billing**, click **Cost**. ## Filters The dashboard includes the following filter controls at the top of the page: - **Time Period** — Select the time range for cost data (e.g., "Month to Date", "Last 30 Days", "Last 90 Days", etc.). - **Group** — Filter cost data by a specific group within the organization, or view all groups. - **Realtime** — Toggle between realtime (estimated) data and true cost data from your cloud service providers. Realtime data is available immediately but may differ slightly from final CSP billing. True cost data may be delayed by up to 24-48 hours depending on the provider. ## Dashboard Modules The dashboard displays cost data through visualization modules showing spending breakdowns by group, time period, and cloud provider. ## Understanding Cost Data - **Realtime data** is estimated based on active compute usage and is available immediately. It provides a close approximation of actual costs but may not account for all billing adjustments from your CSP. - **True cost data** is imported from your cloud service provider's billing exports and represents the actual billed amounts. This data is typically delayed by 24-48 hours. :::info Note The Cost Dashboard requires that billing infrastructure has been configured for at least one cloud account. See [Cloud Account Billing](/docs/organization-admin/cloud/cloud-accounts/billing) for setup instructions. ::: # Allocation Thresholds > Source: https://parallelworks.com/docs/organization-admin/billing/thresholds # Allocation Thresholds This page explains how to set and monitor allocations for your organization's groups. When a group reaches its allocation total, its users will no longer be able to start clusters. You can also set [custom allocation thresholds](/docs/organization-admin/billing/thresholds#setting-allocation-thresholds) for your organization. This feature can alert users when their group approaches its allocation total as well as freeze or shut down clusters when an allocation total is reached. :::info Note The steps included on this page can only be completed by **ACTIVATE platform administrators** and users with the `org:admin` role. For more information, please see [**About Group Roles**](/docs/organization-admin/#about-group-roles). ::: ## Setting Allocations From the **Organizations** list, select your organization. In the sidebar, under **Managing Groups**, click **Groups**. In the **Groups** tab, click **Edit Allocations**. ![Screenshot of the user clicking the Edit Cost Allocations button.](/content-images/docs/organization-admin/billing/thresholds/click-edit-allocations.png) Enter a value in the **Allocation Total** field. This number is measured in U.S. dollars. Click **Save Allocations**. ![Screenshot of the user clicking Save Allocations.](/content-images/docs/organization-admin/billing/thresholds/click-save-allocations.png) Once you've set an allocation total, a group's accumulated costs will appear in the **Allocation Used** column. ![Screenshot of the allocation usage appearing in the Allocation Used column.](/content-images/docs/organization-admin/billing/thresholds/allocations-used.png) ## Setting Allocation Thresholds From the **Organizations** list, select your organization. In the sidebar, under **Billing**, click **Thresholds**. Click **Add Allocation Threshold**. ![Screenshot of the user clicking the Add Allocation Threshold button.](/content-images/docs/organization-admin/billing/thresholds/click-add-threshold.png) ### Configure Allocation Thresholds You can configure your allocation threshold with the settings outlined below. ![Screenshot of all allocation threshold settings.](/content-images/docs/organization-admin/billing/thresholds/blank-add-threshold-page.png) #### Threshold(%) Use this field to set the allocation threshold as a percentage from `0` to `100`. For example, if a group's allocation total is $5,000, an `85%` threshold will affect users when their total spend reaches $4,250. #### Name Use this field to name your threshold. Common names for thresholds include `warning` and `shutdown`. Please note that this field must be one word, lower-cased, and contain no numbers or special characters. #### Description Use this field to enter a description for the alert icon that appears on clusters. When users mouse over the icon, this **Description** appears as a tool tip. ![Screenshot of tooltip on an allocation warning on the Dashboard.](/content-images/docs/organization-admin/billing/thresholds/warning-allocation-home-page.png) #### Label Color Use this selection tool to choose the color of the alert icon that appears on clusters. Click on the colored box to expand it into a color dropper. ![Screenshot of color dropper expanding into the color selection tool.](/content-images/docs/organization-admin/billing/thresholds/threshold-color-picker.png) Click the arrows to cycle the color fields between RGB, HSL, and Hex values. #### Use Realtime Data Use this toggle button to enable real-time cost tracking for your threshold. By default, this option is set to `No`. If you don't enable real-time cost tracking, the cost tracking will be calculated using the true cost data from CSPs. #### Actions Use this dropdown menu to select the action for your threshold. Options include: - **Notify**: Users receive an alert via email. - **Freeze**: Users will not be able to start new clusters. - **Shutdown**: All clusters will be shut down. You can select more than one action at a time for your threshold alert, especially if you want users to receive a notification for `freeze` or `shutdown`. For more info, please see [**Alert Content Template**](/docs/organization-admin/billing/thresholds#alert-content-template) below. :::info Note The **Shutdown** action only shuts down clusters. It does not delete storage or any other resources. ::: #### Alert Subject Use this field to enter a subject for your alert email. #### Send To Group Use this toggle button to send the alert email to all users in a group whenever it reaches its allocation threshold. By default, this option is set to `Yes`. #### Extra Recipients Use this field to enter email addresses for additional users who will receive the threshold alert email. #### Alert Content Template Use this field to enter the text of the threshold alert email. Each action has a default email template that populates this field. You can change the text or replace it completely. If you write your own alert template, you can use the variables below in the body of your message. The variables will automatically be filled in with the correct information. - `{allocation}`: a group's total budget allocation - `{allocation_used}`: a group's current total spend - `{allocation_used_percent}`: the percentage of allocation a group has used - `{estimated_allocation_used}`: a group's current estimated (real-time) total spend - `{estimated_allocation_used_percent}`: the estimated (real-time) percentage of allocation a group has used - `{group}`: a group's name - `{name}`: the threshold's label you entered in the [**Name**](/docs/organization-admin/billing/thresholds#name) field - `{organization}`: your organization's name - `{threshold}`: the value you entered in the [**Threshold(%)**](/docs/organization-admin/billing/thresholds#threshold) field :::info About Alerts If you want users to be notified about a threshold for the `freeze` or `shutdown` actions, you have to add the `notify` action too. ::: ### Save Allocation Thresholds After you've customized the settings above, click **Save Allocation Threshold**. ![Screenshot of the new allocation appearing in the user's organization settings.](/content-images/docs/organization-admin/billing/thresholds/click-save-allocation-threshold.png) Your new allocation threshold will appear in your organization's settings. ![Screenshot of the user clicking the edit icon for an allocation threshold.](/content-images/docs/organization-admin/billing/thresholds/click-edit-allocation-threshold-icon.png) ## Editing Allocation Thresholds In your organization's settings, click the edit icon to change an allocation threshold. ![Screenshot of the user clicking the delete icon for an allocation threshold.](/content-images/docs/organization-admin/billing/thresholds/click-delete-allocation-threshold-icon.png) Next, you'll see the threshold's configuration page, where you can edit any of the settings in [**Threshold Configuration**](#configure-allocation-thresholds) above. Click **Save Allocation Threshold** when you're done making changes. # Bootstrap Script > Source: https://parallelworks.com/docs/organization-admin/cloud/bootstrap-script ## About Organization Bootstrap Scripts This page explains how to add a bootstrap script for your organization. The script will run whenever a user in your organization starts a cluster in their account. This feature is useful for automating tasks, such as sending ACTIVATE data to a specific location. ## Navigating to Organization Bootstrap Settings From the **Organizations** list, select your organization. In the sidebar, under **Cloud**, click **Bootstrap Script**. Enter your bootstrap script in the text box. This text will run as a bash script during cluster provisioning. When you're done, click **Save**. Your changes will be applied immediately. :::info Note If a user adds their own bootstrap script in a cluster's configuration settings, the script you set with the instructions will run before the user's added script. ::: ## Testing a Sample Bootstrap Script You can test this feature with a simple script that echoes text in a designated file. Enter the following command in the bootstrap script box: ```bash echo "hello world" > /tmp/org-boot.out exit 0 ``` Click **Save**. Navigate to the **Compute** page and start one of your clusters. When the cluster is active, log in to the controller with `ssh`. For detailed instructions on that process, please see [Logging In to the Controller](/docs/compute/logging-in-controller). After logging in, navigate to `/tmp`. Read `org-boot.out` to see that it matches the `echo` command. :::info Note If you encounter errors during this test, please contact us. ::: # Cloud Accounts > Source: https://parallelworks.com/docs/organization-admin/cloud/cloud-accounts # Cloud Accounts ## What Is a Cloud Account? A cloud account is ACTIVATE's unified concept for connecting to and managing infrastructure on a cloud service provider (CSP). Each cloud account represents a set of credentials and configuration that links your CSP environment to ACTIVATE, allowing you to provision networks, manage billing, control access, and run compute workloads -- all from a single interface. Cloud accounts are managed at the organization level. Once a cloud account is added, it becomes available for network provisioning, billing configuration, and access sharing with groups within your organization. ## Supported Cloud Service Providers ACTIVATE supports the following cloud service providers: - **Amazon Web Services (AWS)** -- authenticated via access keys - **Microsoft Azure** -- authenticated via service principal client secrets - **Google Cloud** -- authenticated via service account keys - **OpenStack** -- authenticated via application credentials :::info Feature Flag **Oracle Cloud Infrastructure (OCI)** is available as a feature-flagged provider. Contact your ACTIVATE administrator to enable Oracle Cloud support for your organization. ::: ## Cloud Account Lifecycle Setting up a cloud account follows these general steps: 1. **Prepare your CSP** -- Configure the necessary roles, permissions, and credentials in your cloud provider. See the CSP-specific preparation guides in [Managing Cloud Accounts](/docs/organization-admin/cloud/cloud-accounts/managing-cloud-accounts) for details. 2. **Add the cloud account** -- Register the cloud account in ACTIVATE by providing your CSP credentials. ACTIVATE will verify that the credentials have sufficient permissions. 3. **Create networks** -- Provision the networking infrastructure (VPCs, subnets, route tables, etc.) that clusters will be deployed on. See [Networks](/docs/organization-admin/cloud/cloud-accounts/networks) for details. 4. **Provision billing** -- Set up billing infrastructure so that ACTIVATE can track and report on cloud spend. See [Billing](/docs/organization-admin/cloud/cloud-accounts/billing) for details. 5. **Configure access** -- Share the cloud account with specific groups in your organization. See [Access Control](/docs/organization-admin/cloud/cloud-accounts/access-control) for details. ## GovCloud and Assured Workloads ACTIVATE supports government-specific cloud environments for the following providers: - **AWS GovCloud** -- isolated AWS regions designed to host sensitive data and regulated workloads - **Azure Government** -- Microsoft's cloud environment for US government agencies and their partners - **Google Assured Workloads** -- compliance-focused workload configurations for regulated industries When adding a cloud account for one of these providers, you can enable the GovCloud option to ensure ACTIVATE provisions resources in the appropriate government regions. ## Naming Convention Cloud account names must use **lowercase letters and numbers only**. Special characters, spaces, and uppercase letters are not permitted. Choose a descriptive name that identifies the CSP and purpose of the account, as the name cannot be changed after creation. # Access Control > Source: https://parallelworks.com/docs/organization-admin/cloud/cloud-accounts/access-control # Access Control Cloud account access control determines which groups in your organization can use a cloud account to provision networks and start clusters. By default, a newly created cloud account is not shared with any group. ## How Access Control Works Access is managed through a single permission type called **network**. When a group is granted the network permission for a cloud account, members of that group can create and manage networks under that account and use those networks when starting clusters. There are two ways to share a cloud account: - **Organization-wide sharing** -- Share the cloud account with every group in the organization. When this option is enabled, all groups automatically receive the network permission and the individual group checkboxes are locked. - **Group-based access** -- Restrict access to specific groups. Only the selected groups will be able to provision networks and use the cloud account for clusters. :::note Resource Type Access As of v7.0.0, available resource types are automatically determined by cloud account access. If a group has the network permission on at least one cloud account for a given cloud service provider, that CSP's resource types are available to the group. ::: ## Managing Access To manage which groups can use a cloud account: 1. Navigate to **Organization > Cloud Accounts** and click the cloud account name to open the detail page. 2. Click **Manage access** in the action bar. This opens the **Group Permissions Manager** panel. 3. In the permissions panel you will see a table listing every group in your organization along with an **Organization** row at the top. ### Sharing with the entire organization To grant access to all groups at once, check the **network** checkbox in the **Organization** row. When organization-wide access is enabled, all individual group checkboxes are automatically checked and disabled because access is inherited from the organization setting. ### Sharing with specific groups To grant access to individual groups, leave the Organization row unchecked and check the **network** checkbox next to each group that should have access. ### Saving changes After adjusting the checkboxes, click **Save Access** to apply the changes. A confirmation message will appear once the update is saved. ## Viewing Current Access You can see the current sharing status of a cloud account on its detail page under the **Shared with** field in the Account Details section. This field shows one of the following: - **Entire Organization** -- The cloud account is shared with all groups. - **N groups** -- The cloud account is shared with a specific number of groups. Click the link to open the permissions panel and see which groups have access. - **Not shared** -- No groups have access to the cloud account. # Billing > Source: https://parallelworks.com/docs/organization-admin/cloud/cloud-accounts/billing # Billing Cloud service providers (CSPs) provide resource usage and cost reports at set intervals. ACTIVATE can provision the necessary infrastructure to enable CSP billing exports, allowing the platform to access, process, and display cost data on the [cost dashboard](/docs/monitoring/costs). Billing is managed directly from the cloud account detail page. Navigate to **Cloud Accounts**, select an account, and use the billing options available on that page. :::info One-Time Setup Per CSP Billing only needs to be provisioned **once per CSP per organization**. After setting up billing on one cloud account, all other cloud accounts using the same CSP automatically detect billing data within an hour. You do not need to provision billing separately for each cloud account. ::: ## AWS Billing Infrastructure Provisioning billing infrastructure on AWS creates the following resources: - **Cost Usage Report**: exports AWS cost data periodically - **S3 Bucket**: stores exported AWS cost data The diagram below shows how ACTIVATE communicates with AWS after billing infrastructure is provisioned. ![A diagram of AWS billing data being sent to ACTIVATE.](/content-images/docs/organization-admin/cloud/cloud-accounts/billing/billing_diagram_aws.png) ## Azure Billing Infrastructure Provisioning billing infrastructure on Azure creates the following resources: - **Cost Export**: exports Azure cost data daily - **Billing Resource Group**: groups the storage account and container - **Storage Account**: an account to contain the blob storage container - **Blob Container**: stores exported Azure cost data - **Cost Management Export Provider**: registers the necessary provider for cost export (not included in the diagram) The diagram below shows how ACTIVATE communicates with Azure after billing infrastructure is provisioned. ![A diagram of Azure billing data being sent to ACTIVATE.](/content-images/docs/organization-admin/cloud/cloud-accounts/billing/billing_diagram_azure.png) ## Google Billing Infrastructure Provisioning billing infrastructure on Google creates the following resources: - **BigQuery Dataset**: stores exported Google cost data - **BigQuery Data Transfer API**: enables the necessary API to export data to BigQuery (not included in the diagram) The diagram below shows how ACTIVATE communicates with Google after billing infrastructure is provisioned. ![A diagram of Google billing data being sent to ACTIVATE.](/content-images/docs/organization-admin/cloud/cloud-accounts/billing/billing_diagram_google.png) ## Need Help? If you need assistance with billing setup or have questions about billing infrastructure, please contact support. # Provisioning Billing > Source: https://parallelworks.com/docs/organization-admin/cloud/cloud-accounts/billing/provisioning-billing # Provisioning Billing This page explains how to provision billing infrastructure for a cloud account, enabling ACTIVATE to access, process, and display cost data on the [cost dashboard](/docs/monitoring/costs). :::info One-Time Setup Billing only needs to be provisioned **once per CSP per organization**. After provisioning billing on one cloud account, all other cloud accounts using the same CSP automatically detect billing data within an hour. ::: ## Provisioning Billing 1. Navigate to **Cloud Accounts**. 2. Select the cloud account you want to provision billing for. 3. Click **Provision Billing**. The provisioning process and required fields vary by CSP. ### AWS Select the **Region** you want your billing infrastructure to be deployed in. For more information about regions, see the [AWS documentation](https://aws.amazon.com/blogs/architecture/what-to-consider-when-selecting-a-region-for-your-workloads/). #### AWS Cost Allocation Tags ACTIVATE manages billing data by attaching tags to provisioned cloud resources. To enable the necessary tags in your AWS billing data, you need to activate custom cost allocation tags in your AWS account. See the [AWS documentation](https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_billing.html) for the required permissions to complete the steps below. 1. Log in to the **AWS Management Console**. 2. Navigate to the **Billing** page. 3. Click **Cost allocation tags**. 4. In the tab for **User-defined allocation tags**, activate the following tags: - `pw-deployment-id` - `pw-deployment-name` - `pw-deployment-type` - `pw-resource-group-id` ### Azure Select the **Region** you want your billing infrastructure to be deployed in. For more information about regions, see the [Azure documentation](https://learn.microsoft.com/en-us/azure/reliability/availability-zones-overview#regions). Toggle the **Cost Management Export** option to **Yes** if you have not yet registered the `Microsoft.CostManagementExports` provider in your Azure subscription. If you toggle the option to **Yes** but have already registered the `Microsoft.CostManagementExports` provider, the provisioner will fail because Azure denies duplicate registration attempts. For more details about providers, see the [Azure documentation](https://learn.microsoft.com/en-us/azure/azure-resource-manager/management/azure-services-resource-providers). ### Google Select the **Region** you want your billing infrastructure to be deployed in. For more information about regions, see the [Google documentation](https://cloud.google.com/compute/docs/regions-zones). In the **Project** field, enter the Project ID of the project where the billing infrastructure will be deployed. Your Google credential will need certain permissions enabled in this project. For more information about required permissions, see [Preparing Google](/docs/organization-admin/cloud/cloud-accounts/preparing-google). #### Manual BigQuery Export Setup Google does not have an automated option to export billing data to the provisioned BigQuery dataset. Please contact support for assistance with completing this configuration. ## Deprovisioning Billing To remove billing infrastructure from a cloud account: 1. Navigate to **Cloud Accounts**. 2. Select the cloud account with provisioned billing. 3. Click **Deprovision Billing**. :::caution Warning Deprovisioning billing removes the billing infrastructure from your CSP account. If this is the only cloud account with provisioned billing for this CSP, all cloud accounts using that CSP will lose access to billing data. ::: ## Billing Status Each cloud account displays a billing status that indicates the current state of billing data availability: - **Checking**: ACTIVATE is currently checking for billing data. - **Provisioned**: Billing data is available for this cloud account. This status is set automatically when ACTIVATE detects billing data from the CSP, which is checked hourly. - **Unprovisioned**: No billing data is available for this cloud account. ## Troubleshooting If the provisioning process encounters errors, you can retry by first deprovisioning the infrastructure and then provisioning again. If errors persist after retrying, please contact support. # Instance Types > Source: https://parallelworks.com/docs/organization-admin/cloud/cloud-accounts/instance-types # Instance Types This page explains how to manage the allowed instance types for cloud clusters at the organization level. Restricting instance types is useful when your users only need certain machine sizes for their work, or when you want to control costs by limiting access to expensive instance types. ## Configuring Allowed Instance Types 1. Navigate to **Organization > Cloud Accounts**. 2. Click the **Instance Types** button in the action bar. 3. The instance types page displays options for each cloud service provider. By default, all instance types are available. 4. To restrict the available instance types, deselect the types you do not want users to access. Only the selected instance types will appear when users configure cloud clusters. 5. Click **Save** to apply your changes. The new settings take effect immediately. Instance type restrictions apply across the entire organization. Any user creating a cloud cluster will only be able to select from the allowed instance types. ## OpenStack Flavor Pricing For OpenStack cloud accounts, ACTIVATE syncs the available flavors (instance types) from your OpenStack environment. Administrators can view and edit the cost per hour for each flavor. This pricing information is used for cost tracking and reporting within ACTIVATE. To manage OpenStack flavor pricing: 1. Navigate to **Organization > Cloud Accounts** and click the name of an OpenStack cloud account. 2. On the cloud account detail page, scroll down to the **OpenStack Flavors** section. This table lists all flavors synced from your OpenStack environment, including their vCPUs, memory, disk size, and current cost per hour. 3. To update pricing, edit the **Cost/hr** value for any flavor. 4. Click **Save Costs** to apply the changes. :::tip Stale Flavors OpenStack flavors are periodically synced from your OpenStack environment. If a flavor appears as stale, the flavor may have been removed or modified in OpenStack since the last sync. ::: ## Organization Bootstrap Script Administrators can configure a bootstrap script that runs on all cloud clusters before any user bootstrap or health check scripts execute. This script is accessible from the **Bootstrap Script** button on the Cloud Accounts page. For more information, see [Organization Bootstrap Script](/docs/organization-admin/cloud/bootstrap-script). # Managing Cloud Accounts > Source: https://parallelworks.com/docs/organization-admin/cloud/cloud-accounts/managing-cloud-accounts # Managing Cloud Accounts This page explains how to add, view, update, and delete cloud service provider accounts in your ACTIVATE organization. Cloud accounts store the credentials that ACTIVATE uses to provision infrastructure and start clusters on your behalf. ## Adding a Cloud Account 1. Navigate to **Organization > Cloud Accounts**. 2. Click **Add Account**. 3. Enter a **Name** for the cloud account. 4. Select your **Cloud Service Provider** from the dropdown menu. 5. Fill in the provider-specific fields described below. 6. Click **+ Add Account**. **AWS** | Field | Description | |-------|-------------| | **Account ID** | A 12-digit number that uniquely identifies your AWS account. You can find this in the upper-right corner of the AWS Management Console. | | **GovCloud** | Enable this toggle if the account belongs to an AWS GovCloud region. | | **AWS Access Key ID** | The access key ID for an IAM user or role with the required permissions. | | **AWS Secret Access Key** | The corresponding secret access key. | If you do not have an access key, see [Managing access keys for IAM users](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html) in the AWS documentation. **Azure** | Field | Description | |-------|-------------| | **Subscription ID** | The ID of the Azure subscription where resources will be provisioned. | | **GovCloud** | Enable this toggle if the subscription belongs to an Azure Government region. | | **Azure Client ID** | The Application (client) ID of the service principal. | | **Azure Client Secret** | A client secret generated for the service principal. | | **Azure Tenant ID** | The Directory (tenant) ID of your Azure Active Directory. | If you do not have a service principal, see [Create a service principal](https://learn.microsoft.com/en-us/azure/active-directory/develop/howto-create-service-principal-portal#set-up-authentication) in the Azure documentation. **Google Cloud** | Field | Description | |-------|-------------| | **Project ID** | The Google Cloud project ID where resources will be provisioned. | | **GovCloud** | Enable this toggle if the project uses Assured Workloads. When enabled, you must also provide a **CMEK Crypto Key ID**. | | **Google Service Account JSON Credentials** | The full JSON key file for a service account with the required permissions. | | **Role IDs** | A comma-separated list of role IDs granted to the service account (for example, `roles/owner,roles/compute.admin`). | If you do not have a service account key, see [Create and delete service account keys](https://cloud.google.com/iam/docs/keys-create-delete) in the Google Cloud documentation. **OpenStack** **Project** Some OpenStack endpoints require a project ID and others require a project name, so both values are required. | Field | Description | |-------|-------------| | **Project ID** | The ID of the project in OpenStack. | | **Project Name** | The name of the project in OpenStack. | | **Project Domain** | The domain the project belongs to. Defaults to `default`. | **Endpoints** | Field | Description | |-------|-------------| | **Identity Endpoint** | The Keystone identity endpoint (for example, `http://example.openstack.com:5000/v3/`). | | **Compute Endpoint** | The Nova compute endpoint (for example, `http://example.openstack.com:8774/v2.1/`). | | **Network Endpoint** | The Neutron network endpoint (for example, `http://example.openstack.com:9696/`). | **Credentials** | Field | Description | |-------|-------------| | **Username** | The OpenStack username. | | **Password** | The corresponding password. | | **Domain** | The domain the user belongs to. Defaults to `default`. | For more information, see [Application Credentials](https://docs.openstack.org/keystone/queens/user/application_credentials.html) in the OpenStack documentation. **Oracle Cloud** **Oracle Cloud Infrastructure** | Field | Description | |-------|-------------| | **Tenancy OCID** | The OCID of your Oracle Cloud tenancy. Found in the Oracle Cloud Console under **Administration > Tenancy Details**. | | **Compartment OCID** | The OCID of the compartment where resources will be provisioned. Found under **Identity > Compartments**. | **API Key Credentials** | Field | Description | |-------|-------------| | **User OCID** | The OCID of the user. Found in the Oracle Cloud Console under **Identity > Users**. | | **API Key Fingerprint** | The fingerprint of the API signing key, generated when you add an API key to your user. | | **API Private Key (PEM)** | The private key in PEM format used for API authentication. This is the private key you downloaded when creating the API key. | After the account is created, ACTIVATE automatically validates that the provided credentials have sufficient permissions. You can check the validation status on the cloud account detail page. ## Viewing Cloud Account Details To view details for a cloud account, navigate to **Organization > Cloud Accounts** and click the account name. The detail page displays the following information: - **Principal** -- The primary credential identifier (for example, the AWS Access Key ID or the Google service account email). - **Billing** -- Whether billing has been provisioned for this account, along with when billing data was last refreshed. - **Permissions** -- Whether the credential has sufficient permissions. If permissions are insufficient, a link to the relevant preparation guide is provided. - **Credentials last updated** -- When the credentials were last changed. - **Shared with** -- Which groups or the entire organization have access to use this cloud account for network provisioning. - **Networks** -- A table of all networks provisioned under this cloud account. From the detail page you can also manage access permissions, provision or deprovision billing, and add networks. ## Updating Credentials To rotate or update the credentials on an existing cloud account: 1. Navigate to **Organization > Cloud Accounts** and click the account name. 2. Click **Update Credentials** in the action bar. 3. Update the credential fields as needed. The account name and cloud service provider cannot be changed. 4. Click **Update Credentials** to save. After updating, ACTIVATE re-validates the credential permissions automatically. ## Deleting a Cloud Account :::warning Network Deprovisioning Deleting a cloud account will deprovision all networks associated with the account. Ensure that no active clusters are running on those networks before proceeding. ::: To delete a cloud account: 1. Navigate to **Organization > Cloud Accounts**. 2. Click the delete icon next to the account you want to remove. 3. Confirm the deletion in the dialog. If billing has been provisioned for the account, deprovision billing before deleting the account. # About Networks > Source: https://parallelworks.com/docs/organization-admin/cloud/cloud-accounts/networks # About Networks In order to provision cloud clusters, you must first deploy a network into your cloud account. A network is a networking stack deployed into your cloud service provider (CSP) that clusters run on top of. Networks are managed per cloud account, and you can deploy multiple networks within a single account. Below, you can find specific details about the implementation of networks for each CSP. ## AWS Networks Deploying a network provisions the following resources on AWS: - a Virtual Private Cloud (VPC) - an internet gateway - public and private subnets - public and private route tables and routes - an Elastic IP address for the NAT gateway - a Route 53 Hosted Zone - a security group The schematic below shows an ACTIVATE-deployed cluster in AWS Cloud. The controller and compute nodes are shown in Availability Zone us-east-1a inside the us-east-1 Region. When using the Centralized NAT [networking mode](/docs/organization-admin/cloud/cloud-accounts/networks/configuring-networks#networking-modes), compute nodes in a region use a single NAT gateway for outbound internet connectivity. This NAT gateway is pre-provisioned as part of the network. The AMI used for the controller and compute nodes is inside the Parallel Works AWS account. :::info Expense Information Depending on the networking mode, a NAT gateway will be created resulting in an additional monthly charge in your AWS account. For more information, please see this [AWS pricing list](https://aws.amazon.com/vpc/pricing/). ::: ![A diagram of ACTIVATE clusters in AWS Cloud.](/content-images/docs/organization-admin/cloud/cloud-accounts/networks/AWS-diagram.png) _A diagram of ACTIVATE clusters in AWS Cloud_ ## Azure Networks Deploying a network on Azure provisions a similar set of networking resources, including a virtual network, subnets, NAT gateway, and associated security rules. ![A diagram of ACTIVATE clusters in Azure Cloud.](/content-images/docs/organization-admin/cloud/cloud-accounts/networks/Azure-diagram.png) _A diagram of ACTIVATE clusters in Azure Cloud_ ## Google Networks Deploying a network on Google Cloud provisions a VPC network, subnets, firewall rules, and Cloud DNS resources in the specified project and region. ## OpenStack Networks For OpenStack environments, network configuration is specific to your OpenStack deployment. Networks are created using your provider's available networking resources, regions, and flavors. # Configuring Networks > Source: https://parallelworks.com/docs/organization-admin/cloud/cloud-accounts/networks/configuring-networks # Configuring Networks This page explains the networking modes available to all networks and how to configure networks according to CSP-specific parameters. ## Networking Modes ACTIVATE provides different networking modes for compute nodes on a cluster. The networking mode determines how compute nodes connect to the internet. Select a mode using the **Provisioning Mode** field when creating a network. The mode cannot be changed after the network is created. The same modes are available for AWS, Azure, and Google Cloud accounts, although some modes are implemented differently depending on the CSP. See the CSP tabs below for details. OpenStack networks are managed by your OpenStack provider and do not use networking modes. | Mode | Description | Tracks Egress Cost? | Notes | | :-------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------- | :-----------------: | :--------------------------------------------------------------------------------------: | | Centralized NAT | This networking mode will provision a NAT gateway. The NAT gateway will be used for outbound internet connectivity for all compute nodes in the region. | No | The NAT gateway will incur a charge for every hour it is running. | | Controller NAT | All compute nodes will route their outbound internet traffic through the cluster's controller node, sharing a single outbound IP address. | Yes | Compute nodes depend on the controller for outbound internet connectivity. | | Public IP | This networking mode will assign a public IP address to each compute node. The nodes' public IPs will not be accessible from the internet. | Yes | Each node will have its own IP address rather than having the same one as other nodes. | | Private | This networking mode creates a fully private network with no direct internet access. | No | Outbound connectivity can optionally be provided by a NAT gateway or by platform peering. | In modes that track egress cost, outbound traffic originates from IP addresses that belong to the cluster's own nodes, so egress charges can be attributed to the cluster that generated them. In the other modes, egress traffic flows through a shared NAT gateway and is billed at the network level. ### Private Mode Options When you select the **Private** networking mode, two additional options become available: - **Peer to Platform**: Connects the private network to the ACTIVATE platform, allowing resources in the network to communicate with the platform. If disabled, the network is isolated. Peering is currently supported on AWS via a Transit Gateway; see the AWS tab below. - **Enable NAT Gateway**: Available when the network is not peered to the platform. When enabled, ACTIVATE provisions a NAT gateway that allows resources in the private network to make outbound internet connections (for example, downloading packages or accessing external APIs) while remaining unreachable from the internet. :::warning NAT Gateway Costs In networking modes that provision a NAT gateway, the NAT gateway incurs a charge for every hour it is running. For more information, see your CSP's pricing documentation, for example the [AWS pricing list](https://aws.amazon.com/vpc/pricing/). ::: ## CSP-Specific Configuration **AWS** ### Region Select the **Region** that you want your network to be deployed in. For more information about Regions, see the [AWS documentation](https://aws.amazon.com/blogs/architecture/what-to-consider-when-selecting-a-region-for-your-workloads/). ### CIDR Block Enter a **CIDR block** for the network in the selected region. CIDR blocks must be valid and cannot overlap with other regions in the same network. ### Networking Modes on AWS - **Centralized NAT** provisions public and private subnets in each availability zone, with a single NAT gateway shared by all compute nodes in the region. - **Controller NAT** requires partitions to be in the same availability zone as the controller. Multi-zone partitions are not supported in this mode. - **Public IP** places compute nodes in public subnets, each with its own public IP address. - **Private** provisions private subnets only. Outbound connectivity is available through the optional NAT gateway or through Transit Gateway peering. ### Transit Gateway Peering (Private Mode) When using the **Private** networking mode on AWS, you can peer the network to the ACTIVATE platform via a Transit Gateway. If you enable peering, you must provide a **Transit Gateway ID**. The **Enable NAT Gateway** option is not available when using Transit Gateway peering, as traffic is expected to route through a central networking account. **Azure** ### Region Select the **Region** that you want your network to be deployed in. For more information about Regions, see the [Azure documentation](https://learn.microsoft.com/en-us/azure/reliability/availability-zones-overview#regions). ### VM Image Resource Group ID Enter the Resource ID of the resource group you want this network to be associated with. If you don't have a resource group, you can [create one](https://learn.microsoft.com/en-us/azure/azure-resource-manager/management/manage-resource-groups-portal#create-resource-groups). You can find the Resource ID in the Azure portal by navigating to **Home** > **Pay-As-You-Go | Resource groups** > **GroupName** > **Properties** > **Resource ID**. ### VM Image Resource Group Name Enter the name of the resource group you want this network to be associated with. ### NAT IP Availability Zone Enter the Availability Zone that you want your network's IP address to be deployed in. We suggest entering `Zone-Redundant` in this field. For more information about Availability Zones, see the [Azure documentation](https://learn.microsoft.com/en-us/azure/reliability/availability-zones-service-support). ### Networking Modes on Azure - Compute nodes are always placed in a private subnet. In every mode except **Private**, the controller node receives a public IP address. - **Centralized NAT** attaches an Azure NAT gateway to the private subnet for outbound connectivity. - **Controller NAT** routes outbound traffic through a load balancer with a dedicated public IP, so compute nodes share a single outbound IP address. Outbound traffic uses the load balancer's IP address rather than the controller's. - **Public IP** does not assign individual public IP addresses to compute nodes on Azure; only the controller receives a public IP address. **Google** ### Project ID Enter the **Project ID** of the Google Cloud project that you want this network to be deployed in. If you don't have a project, please see [Preparing Google](/docs/organization-admin/cloud/cloud-accounts/preparing-google/). ### Region Select the **Region** that you want your network to be deployed in. For more information about Regions, see the [Google documentation](https://cloud.google.com/compute/docs/regions-zones). ### Availability Zone Select the **Availability Zone** for the network within the chosen region. ### Networking Modes on Google - Google networks use a single subnet per region rather than separate public and private subnets. - **Centralized NAT** provisions a Cloud Router and Cloud NAT for outbound connectivity. - **Controller NAT** creates a VPC route that directs compute node traffic through the controller. - **Public IP** assigns an external IP address to each compute node. **OpenStack** Network configuration for OpenStack is specific to your deployment. Networking modes do not apply to OpenStack; clusters connect to networks that already exist in your OpenStack environment. Available regions, networks, and flavors are synced from your OpenStack provider. Contact your OpenStack administrator for details about available networking resources. # Creating Networks > Source: https://parallelworks.com/docs/organization-admin/cloud/cloud-accounts/networks/creating-networks # Creating Networks This page explains how to create a network in your cloud account, which will allow members of your organization to provision clusters. ## Steps 1. Navigate to **Cloud Accounts** in the sidebar. 2. Select the cloud account you want to add a network to. 3. Click **Add Network**. 4. Enter a **Name** for the network. The name must contain only lowercase letters and numbers. 5. Select a **Provisioning Mode**, which determines the networking mode for the network. The mode cannot be changed after the network is created. For more information about networking modes, see [Configuring Networks](/docs/organization-admin/cloud/cloud-accounts/networks/configuring-networks#networking-modes). 6. Configure the **Regions** and **CIDR blocks** for your network. Each region must have a unique CIDR block, and CIDR blocks cannot overlap. 7. Submit the form to begin provisioning. The network will start provisioning automatically, and you can track its progress on the network detail page. :::info About Regions You can configure multiple regions for a single network. Each region requires its own CIDR block, and regions must be unique within a network. ::: # Managing Networks > Source: https://parallelworks.com/docs/organization-admin/cloud/cloud-accounts/networks/managing-networks # Managing Networks This page explains how to view, edit, and delete networks associated with your cloud accounts. ## Viewing Networks To view the networks for a cloud account, navigate to **Cloud Accounts** and select the account. The networks associated with that account will be listed on the account detail page. Click on a network to view its detail page, which includes: - **Provision status** tracking for the network's cloud resources (e.g., VPCs, subnets, security groups, DNS zones) - **Region and CIDR configuration** for the network - **Cloud resource details** provisioned by the network ### Provision Status Each network tracks its provisioning progress through a series of status indicators. A network can be in one of the following states: | Status | Description | | :------------ | :------------------------------------------------------------ | | Pending | The provisioning step has not yet started. | | Provisioning | The step is currently being provisioned. | | Provisioned | The step has completed successfully. | | Failed | The step encountered an error during provisioning. | | Deleting | The resource is being deprovisioned. | ## Editing Networks You can modify a network's regions and CIDR blocks after it has been created. To edit a network: 1. Navigate to the network detail page. 2. Update the **Regions** and **CIDR blocks** as needed. 3. Save your changes. The network will be re-provisioned with the updated configuration. :::info CIDR Validation When editing a network, CIDR blocks must remain valid and cannot overlap with other regions in the same network. ::: ## Deleting Networks To delete a network: 1. Navigate to the network detail page. 2. Click **Delete Network**. :::warning About Deletion When you delete a network, the infrastructure will be deprovisioned from your CSP account. This process removes all cloud resources associated with the network, including VPCs, subnets, and security groups. Ensure that no clusters are running on the network before deleting it. ::: ## Troubleshooting After initiating network provisioning, you won't be able to edit the configuration while the network is being built. If the provisioning process encounters errors, you can delete the network and create a new one. If errors persist, please contact support. # AWS > Source: https://parallelworks.com/docs/organization-admin/cloud/cloud-accounts/preparing-aws # AWS This page explains how to set up an AWS account so that ACTIVATE can manage your AWS infrastructure, clusters, billing, storage, and usage data. :::info The steps on this page should be completed by a **cloud engineer** in your organization. ::: ## AWS Account We recommend creating a new AWS account for the ACTIVATE platform, which will allow you to keep your existing AWS account separate from the platform and make it easier to manage billing and usage data. This will also ensure the principle of least privilege, as ACTIVATE will only have access to the resources it needs to manage. If you use AWS Organizations, you can [create a new account within your organization](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_accounts_create.html). Otherwise, you can [make a non-organization account](https://aws.amazon.com/premiumsupport/knowledge-center/create-and-activate-aws-account/). ## Setting Up AWS Credentials To get started quickly, you can [create a new IAM User](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html) and assign the `AdministratorAccess` AWS-managed policy to it. Alternatively, you can [create the policies](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html) listed in [**AWS Policies**](#aws-policies) below, then attach those policies to the IAM user. ### Create an Access Key ACTIVATE requires the use of an AWS access key to authenticate with AWS. If you don't have an access key, you can [create one](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html). :::info Security Best Practices The ACTIVATE platform will immediately rotate the secret access key after it's entered into the system. The platform will then use the rotated secret access key to generate short-term credentials, which will be used by all ACTIVATE services. For more information about AWS keys and security best practices, see [this FAQ on the AWS website](https://aws.amazon.com/premiumsupport/knowledge-center/security-best-practices/). ::: ### AWS Policies This section includes the policies you'll need to attach to the IAM user you create for ACTIVATE. You can create these policies in the IAM console, or you can create them in the AWS CLI by entering the JSON files listed under each policy. #### pw-ec2-mgmt This policy allows ACTIVATE to manage EC2 resources. ```json { "Version": "2012-10-17", "Statement": [ { "Sid": "pwec2mgmt", "Effect": "Allow", "Action": [ "ec2:AllocateAddress", "ec2:AssociateAddress", "ec2:AssociateDhcpOptions", "ec2:AssociateRouteTable", "ec2:AttachInternetGateway", "ec2:AttachVolume", "ec2:AuthorizeSecurityGroupEgress", "ec2:AuthorizeSecurityGroupIngress", "ec2:CreateDhcpOptions", "ec2:CreateImage", "ec2:CreateInternetGateway", "ec2:CreateKeyPair", "ec2:CreateNatGateway", "ec2:CreateNetworkInterface", "ec2:CreatePlacementGroup", "ec2:CreateRoute", "ec2:CreateRouteTable", "ec2:CreateSecurityGroup", "ec2:CreateSnapshot", "ec2:CreateSubnet", "ec2:CreateTags", "ec2:CreateVolume", "ec2:CreateVpc", "ec2:DeleteDhcpOptions", "ec2:DeleteInternetGateway", "ec2:DeleteKeyPair", "ec2:DeleteNatGateway", "ec2:DeletePlacementGroup", "ec2:DeleteRoute", "ec2:DeleteRouteTable", "ec2:DeleteSecurityGroup", "ec2:DeleteSnapshot", "ec2:DeleteSubnet", "ec2:DeleteVolume", "ec2:DeleteVpc", "ec2:DeregisterImage", "ec2:DescribeAccountAttributes", "ec2:DescribeAddresses", "ec2:DescribeAvailabilityZones", "ec2:DescribeDhcpOptions", "ec2:DescribeImages", "ec2:DescribeInstanceAttribute", "ec2:DescribeInstanceTypes", "ec2:DescribeInstances", "ec2:DescribeInternetGateways", "ec2:DescribeKeyPairs", "ec2:DescribeNatGateways", "ec2:DescribeNetworkAcls", "ec2:DescribeNetworkInterfaces", "ec2:DescribePlacementGroups", "ec2:DescribeRegions", "ec2:DescribeRouteTables", "ec2:DescribeSecurityGroups", "ec2:DescribeSnapshots", "ec2:DescribeSubnets", "ec2:DescribeTags", "ec2:DescribeVolumes", "ec2:DescribeVpcAttribute", "ec2:DescribeVpcClassicLink", "ec2:DescribeVpcClassicLinkDnsSupport", "ec2:DescribeVpcs", "ec2:DetachInternetGateway", "ec2:DetachVolume", "ec2:DisassociateAddress", "ec2:DisassociateRouteTable", "ec2:GetPasswordData", "ec2:ImportKeyPair", "ec2:ModifyImageAttribute", "ec2:ModifyInstanceAttribute", "ec2:ModifyNetworkInterfaceAttribute", "ec2:ModifySubnetAttribute", "ec2:ModifyVpcAttribute", "ec2:RegisterImage", "ec2:ReleaseAddress", "ec2:RevokeSecurityGroupEgress", "ec2:RunInstances", "ec2:StartInstances", "ec2:StopInstances", "ec2:TerminateInstances" ], "Resource": "*" } ] } ``` #### pw-fsx-mgmt This policy allows ACTIVATE to manage FSx resources. ```json { "Version": "2012-10-17", "Statement": [ { "Sid": "pwfsxmgmt", "Effect": "Allow", "Action": [ "fsx:CreateFilesystem", "fsx:DeleteFilesystem", "fsx:DescribeFilesystems", "fsx:ListTagsForResource", "fsx:TagResource", "fsx:UntagResource", "iam:CreateServiceLinkedRole", "iam:PutRolePolicy" ], "Resource": "*" } ] } ``` :::info Note `iam:CreateServiceLinkedRole` and `iam:PutRolePolicy` are required for using S3 import/export with FSx. If S3 import/export is not needed, these permissions can be removed. ::: #### pw-route53-mgmt This policy allows ACTIVATE to manage Route 53 resources. ```json { "Version": "2012-10-17", "Statement": [ { "Sid": "pwroute53mgmt", "Effect": "Allow", "Action": [ "route53:ChangeResourceRecordSets", "route53:ChangeTagsForResource", "route53:CreateHostedZone", "route53:DeleteHostedZone", "route53:GetChange", "route53:GetDNSSEC", "route53:GetHostedZone", "route53:ListHostedZones", "route53:ListResourceRecordSets", "route53:ListTagsForResource" ], "Resource": "*" } ] } ``` #### pw-sts-mgmt This policy allows ACTIVATE to create federated users used for short term tokens. ```json { "Version": "2012-10-17", "Statement": [ { "Sid": "pwstsmgmt", "Effect": "Allow", "Action": ["sts:GetCallerIdentity", "sts:GetFederationToken"], "Resource": "*" } ] } ``` #### pw-tgw-mgmt If you're using a Transit Gateway account, these additional permissions are necessary to attach created VPCs to the Transit Gateway. ```json { "Version": "2012-10-17", "Statement": [ { "Sid": "pwfsxmgmt", "Effect": "Allow", "Action": [ "ec2:CreateTransitGatewayVpcAttachment", "ec2:DescribeTransitGatewayVpcAttachments", "ec2:DescribeTransitGateways", "ec2:DeleteTransitGatewayVpcAttachment" ], "Resource": "*" } ] } ``` #### pw-buckets This policy allows ACTIVATE to access billing information and Create and Mange S3 Buckets. ```json { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "cur:*", "s3:CreateBucket", "s3:DeleteBucket", "s3:DeleteBucketPolicy", "s3:DeleteObject", "s3:DeleteObjectVersion", "s3:GetAccelerateConfiguration", "s3:GetBucketAcl", "s3:GetBucketCORS", "s3:GetBucketLocation", "s3:GetBucketLogging", "s3:GetBucketObjectLockConfiguration", "s3:GetBucketPolicy", "s3:GetBucketPolicyStatus", "s3:GetBucketRequestPayment", "s3:GetBucketTagging", "s3:GetBucketVersioning", "s3:GetBucketWebsite", "s3:GetEncryptionConfiguration", "s3:GetLifecycleConfiguration", "s3:GetObject", "s3:GetObjectAcl", "s3:GetObjectVersion", "s3:GetReplicationConfiguration", "s3:ListAllMyBuckets", "s3:ListBucket", "s3:ListBucketVersions" "s3:ListBucketVersions", "s3:PutAccelerateConfiguration", "s3:PutBucketAcl", "s3:PutBucketCORS", "s3:PutBucketLogging", "s3:PutBucketObjectLockConfiguration", "s3:PutBucketPolicy", "s3:PutBucketRequestPayment", "s3:PutBucketTagging", "s3:PutBucketVersioning", "s3:PutBucketWebsite", "s3:PutEncryptionConfiguration", "s3:PutLifecycleConfiguration", "s3:PutObject", "s3:PutObjectAcl", "s3:PutReplicationConfiguration" ], "Resource": "*" } ] } ``` #### pw-storage This policy allows ACTIVATE to create and manage EFS storages. ```json { "Version": "2012-10-17", "Statement": [ { "Sid": "pwstoragemgmt", "Effect": "Allow", "Action": [ "elasticfilesystem:CreateFileSystem", "elasticfilesystem:CreateMountTarget", "elasticfilesystem:DeleteFileSystem", "elasticfilesystem:DeleteMountTarget", "elasticfilesystem:DescribeFileSystems", "elasticfilesystem:DescribeLifecycleConfiguration", "elasticfilesystem:DescribeMountTargetSecurityGroups", "elasticfilesystem:DescribeMountTargets", "elasticfilesystem:TagResource" ], "Resource": "*" } ] } ``` # Azure > Source: https://parallelworks.com/docs/organization-admin/cloud/cloud-accounts/preparing-azure # Azure This page explains how to set up an Azure subscription so that ACTIVATE can manage your Azure infrastructure, clusters, billing, storage, and usage data. :::info The steps on this page should be completed by a **cloud engineer** in your organization. ::: ## Azure Subscription We recommend [creating a new Azure subscription](https://learn.microsoft.com/en-us/azure/cost-management-billing/manage/create-subscription) for the ACTIVATE platform, which will allow you to keep your existing Azure subscription separate from the platform and make it easier to manage billing and usage data. This will also ensure the principle of least privilege, as ACTIVATE will only have access to the resources it needs to manage. To learn more about Azure subscriptions, please see the [Azure documentation](https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/ready/landing-zone/design-area/resource-org-subscriptions). ## Setting Up Azure Credentials To get started quickly, you can [create a new service principal](https://docs.microsoft.com/en-us/azure/active-directory/develop/howto-create-service-principal-portal) and add the `Owner` role. This will allow ACTIVATE to manage all resources in your subscription. If you want to limit the scope of the service principal, you can create a custom role and assign it to the service principal. ### Creating a Client Secret ACTIVATE uses Azure client secrets to authenticate with Azure. You can create a new client secret by following the steps in the [Azure documentation](https://learn.microsoft.com/en-us/azure/active-directory/develop/howto-create-service-principal-portal#option-2-create-a-new-application-secret). ### Azure Access Policies #### pw-billing Assign the following predefined roles to your application in order for ACTIVATE to provision billing infrastructure and access true cost data. ```json Owner Storage Blob Data Owner ``` # Google > Source: https://parallelworks.com/docs/organization-admin/cloud/cloud-accounts/preparing-google # Google This page explains how to set up a Google account so that ACTIVATE can manage your Google infrastructure, clusters, billing, storage, and usage data. :::info The steps on this page should be completed by a **cloud engineer** in your organization. ::: ## Google Account We recommend [creating a new Google project](https://cloud.google.com/resource-manager/docs/creating-managing-projects) for the ACTIVATE platform, which will allow you to keep your existing Google project separate from the platform and make it easier to manage billing and usage data. This will also ensure the principle of least privilege, as ACTIVATE will only have access to the resources it needs to manage. Ensure the following APIs are enabled for the project in the [API & Services page](https://cloud.google.com/endpoints/docs/openapi/enable-api): - Cloud Resource Manager API - IAM API - Compute Engine API - Filestore API ## Setting Up Google Credentials To get started quickly, you can [create a new service account](https://cloud.google.com/iam/docs/creating-managing-service-accounts) and add the `Owner` role. This will allow ACTIVATE to manage all resources in your project. If you want to limit the scope of the service account, you can create a custom role and assign it to the service account. ### Creating a Service Account Key ACTIVATE uses service account keys to authenticate with Google Cloud. You can create a new service account key by following the steps on [the Google documentation](https://cloud.google.com/iam/docs/creating-managing-service-account-keys#creating_service_account_keys). ### Google Permissions This section includes the permissions or roles you'll need to assign to the Google service account you create for ACTIVATE. You can create a custom role with all the necessary permissions in the IAM console. #### pw-billing These permissions are used to provision and access billing infrastructure. You can also assign the existing Google IAM roles `BigQuery User` and `Service Usage Admin` to your Google service account. ```json serviceusage.operations.get serviceusage.services.disable serviceusage.services.enable serviceusage.services.get serviceusage.services.list monitoring.timeSeries.list serviceusage.operations.cancel serviceusage.operations.delete serviceusage.operations.list serviceusage.quotas.get serviceusage.quotas.update serviceusage.services.use bigquery.datasets.create bigquery.datasets.get bigquery.jobs.create bigquery.tables.list resourcemanager.projects.get bigquery.bireservations.get bigquery.capacityCommitments.get bigquery.capacityCommitments.list bigquery.config.get bigquery.datasets.getIamPolicy bigquery.jobs.list bigquery.models.list bigquery.readsessions.create bigquery.readsessions.getData bigquery.readsessions.update bigquery.reservationAssignments.list bigquery.reservationAssignments.search bigquery.reservations.get bigquery.reservations.list bigquery.routines.list bigquery.savedqueries.get bigquery.savedqueries.list bigquery.transfers.get bigquerymigration.translation.translate resourcemanager.projects.list ``` # OpenStack > Source: https://parallelworks.com/docs/organization-admin/cloud/cloud-accounts/preparing-openstack # OpenStack This page explains how to set up an OpenStack environment so that ACTIVATE can manage your OpenStack infrastructure, clusters, and usage data. :::info The steps on this page should be completed by a **cloud engineer** in your organization. ::: ## OpenStack Project We recommend creating a dedicated OpenStack project for the ACTIVATE platform, which will allow you to keep your existing projects separate from the platform and make it easier to manage usage data. This will also ensure the principle of least privilege, as ACTIVATE will only have access to the resources it needs to manage. ## Setting Up OpenStack Credentials ACTIVATE authenticates with OpenStack using a username and password. You will need to provide the following information when adding your OpenStack cloud account in ACTIVATE: ### Project Details | Field | Description | |-------|-------------| | **Project ID** | The unique identifier of your OpenStack project. | | **Project Name** | The name of your OpenStack project. Some OpenStack endpoints require a project ID and others require a project name, so both are needed. | | **Project Domain** | The domain the project belongs to. Defaults to `default` if not specified. | You can find your Project ID and Project Name in the OpenStack dashboard under **Identity > Projects**, or by running `openstack project list` from the CLI. ### Endpoint URLs ACTIVATE requires the following OpenStack service endpoint URLs: | Field | Description | Example | |-------|-------------|---------| | **Identity Endpoint** | The Keystone identity service URL. | `http://example.openstack.com:5000/v3/` | | **Compute Endpoint** | The Nova compute service URL. | `http://example.openstack.com:8774/v2.1/` | | **Network Endpoint** | The Neutron network service URL. | `http://example.openstack.com:9696/` | You can find your endpoint URLs in the OpenStack dashboard under **Identity > Application Credentials**, or by running `openstack endpoint list` from the CLI. ### User Credentials | Field | Description | |-------|-------------| | **Username** | The OpenStack username for authentication. | | **Password** | The password for the OpenStack user. | | **User Domain** | The domain the user belongs to. Defaults to `default` if not specified. | We recommend creating a dedicated user for ACTIVATE with the appropriate roles assigned in your project. At a minimum, the user should have the `member` and `admin` roles on the project to allow ACTIVATE to manage compute, network, and storage resources. :::info Automatic Metadata Sync After you add your OpenStack cloud account, ACTIVATE will automatically sync metadata from your OpenStack environment, including available regions, instance flavors, and networks. This information is used when deploying infrastructure through ACTIVATE. ::: # Oracle Cloud > Source: https://parallelworks.com/docs/organization-admin/cloud/cloud-accounts/preparing-oracle # Oracle Cloud This page explains how to set up an Oracle Cloud Infrastructure (OCI) account so that ACTIVATE can manage your Oracle Cloud infrastructure, clusters, and usage data. :::warning Feature Availability Oracle Cloud support is currently feature-flagged and may not be available in all ACTIVATE deployments. Contact your ACTIVATE administrator to enable Oracle Cloud support. ::: :::info The steps on this page should be completed by a **cloud engineer** in your organization. ::: ## Oracle Cloud Account We recommend creating a dedicated compartment for the ACTIVATE platform, which will allow you to keep your existing resources separate from the platform and make it easier to manage usage data. You can [create a compartment](https://docs.oracle.com/en-us/iaas/Content/Identity/Tasks/managingcompartments.htm) in the Oracle Cloud Console under **Identity > Compartments**. ## Setting Up Oracle Cloud Credentials ACTIVATE authenticates with Oracle Cloud using API key-based authentication. You will need to provide the following information when adding your Oracle Cloud account in ACTIVATE. ### Tenancy and Compartment | Field | Description | Format | |-------|-------------|--------| | **Tenancy OCID** | The OCID of your Oracle Cloud tenancy. Found in the Oracle Cloud Console under **Administration > Tenancy Details**. | `ocid1.tenancy.oc1...` | | **Compartment OCID** | The OCID of the compartment to use for resources. Found under **Identity > Compartments**. | `ocid1.compartment.oc1...` | ### API Key Credentials Oracle Cloud uses API signing keys for authentication. To set up API key credentials: 1. Navigate to **Identity > Users** in the Oracle Cloud Console and select the user account that ACTIVATE will use. 2. Under **Resources**, select **API Keys**. 3. Click **Add API Key**. 4. Select **Generate API Key Pair** to create a new key pair, or **Paste a Public Key** if you already have one. 5. Download the private key file (PEM format) and store it securely. 6. After adding the key, Oracle Cloud will display a configuration file preview that contains the required values. For more details, see the [Oracle Cloud documentation on API signing keys](https://docs.oracle.com/en-us/iaas/Content/API/Concepts/apisigningkey.htm). You will need the following credentials: | Field | Description | Format | |-------|-------------|--------| | **User OCID** | The OCID of the user. Found under **Identity > Users**. | `ocid1.user.oc1...` | | **API Key Fingerprint** | The fingerprint of the API signing key. Generated when you add an API key to your user. | `aa:bb:cc:dd:ee:ff:00:11:22:33:44:55:66:77:88:99` | | **API Private Key (PEM)** | The private key in PEM format used for API authentication. This is the private key you downloaded when creating the API key pair. | PEM-encoded RSA private key | ### Required Policies Ensure the user has sufficient permissions to manage resources in the target compartment. At a minimum, you can assign the user to a group with the following policy: ``` Allow group to manage all-resources in compartment ``` For more restrictive access, create policies that grant permissions for compute, networking, and storage resources. See the [Oracle Cloud policy reference](https://docs.oracle.com/en-us/iaas/Content/Identity/Reference/policyreference.htm) for details. # Instance Types > Source: https://parallelworks.com/docs/organization-admin/cloud/instance-types # Instance Types This page explains how to choose which instance types users will have access to when they configure clusters on the **Compute** page. This feature is useful if, for example, your users only need a certain amount of power for their work; in that case, you can limit instances to only lower CPU types. From the **Organizations** list, select your organization. In the sidebar, under **Cloud**, click **Instance Types**. In **Allowed instance types**, if **Default Settings** is selected, users will have access to all instance types. Select **Custom Settings** to make changes. You can customize instance types on AWS, Azure, and Google resources. Use the arrows for each CSP to open their dropdown menus. Click the instance type(s) you want to add. The instance type(s) you select will appear in the list below the dropdown menus. When you're done, click **Save Instance Types**. Your changes will be applied immediately. ![Screenshot of the circled CSP arrows and Save Instance Types button.](/content-images/docs/organization-admin/cloud/instance-types/click-save-instance-types.png) # Capacity Reservations > Source: https://parallelworks.com/docs/organization-admin/cloud/reservations # Capacity Reservations ## Navigation From the Organizations list, select your organization. In the sidebar, under **Cloud**, click **Reservations**. ## Overview Manually map capacity reservation IDs to groups for billing data. ## Prerequisites Before setting a capacity reservation on ACTIVATE, you must first create the reservation on your CSP's management console: - [AWS documentation](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-capacity-reservations.html) - [Azure documentation](https://learn.microsoft.com/en-us/azure/virtual-machines/capacity-reservation-create?tabs=portal1%2Capi1%2Capi2) - [GCP documentation](https://cloud.google.com/compute/docs/instances/reservations-overview) ## Adding a Reservation 1. Click **Add Reservation**. 2. Enter the **Reservation ID** from your CSP's management console. 3. Select a **Group** from the dropdown. Note: only one group can be assigned per capacity reservation, and access will be limited to that group's members. 4. Click **Add**. ## Managing Reservations Reservations appear in a table and can be deleted individually. # Network Topology > Source: https://parallelworks.com/docs/organization-admin/cloud/topology ## About Network Topology The **Topology** page displays an interactive diagram of your organization's cloud infrastructure. It shows your cloud accounts and their networks, the compute resources and containers connected to them, and how everything links back to the ACTIVATE platform — all built automatically from your organization's [cloud accounts](/docs/organization-admin/cloud/cloud-accounts). Use it to get a quick visual answer to questions like "which networks does this cloud account contain?" and "what's running where?" ## Viewing the Topology From the **Organizations** list, select your organization. In the sidebar, under **Cloud**, click **Topology**. The diagram groups networks and resources under each cloud account. Hover over a connection to highlight it, and drag nodes to rearrange the layout. Use the controls to navigate the diagram: - **Zoom in** and **Zoom out** adjust the zoom level. - **Fit to view** centers the entire diagram in the viewport. - **Reset layout** returns any nodes you've dragged to their original positions. - **Download as PNG** exports the current diagram as an image. :::info Note If your organization has no cloud accounts or networks configured yet, the page displays _No cloud accounts or networks to display_. See [**Managing Cloud Accounts**](/docs/organization-admin/cloud/cloud-accounts/managing-cloud-accounts) to add one. ::: # Creating Organizations > Source: https://parallelworks.com/docs/organization-admin/creating-organizations # Creating Organizations This page explains how to create and delete organizations on ACTIVATE. ## Creating an Organization Navigate to the **Organizations** list. Click **Create Organization**. Enter a name for your organization, then click **Create Organization**. A success message will appear, and the new organization will be listed on the **Organizations** page. ## Deleting Organizations :::caution Warning Deleting an organization is a permanent action that cannot be undone. All users, groups, cloud accounts, and associated cloud resources will be removed. ::: Navigate to the organization you want to delete. In the sidebar, click **Admin**. At the bottom of the Admin page, click **Delete this organization**. A confirmation modal will appear requiring you to type the organization name to confirm the deletion. For more details on the Admin page, see [Platform Administration](/docs/organization-admin/admin). # Configuring Login Banner > Source: https://parallelworks.com/docs/organization-admin/customize/login-banner # Configuring Login Banner ## Navigation From the Organizations list, select your organization. In the sidebar, under **Customize**, click **Login Banner**. ## Overview Configure a notice banner that will be displayed on the organization login page. When set, the login page will show a split layout with this notice displayed on the left side. The page has two panels side by side: a form on the left and a live preview on the right. ## Fields ### Banner Title The title shown in the banner header (e.g., "System Access Notice"). ### Banner Body The body content of the banner. Supports markdown formatting: - **Bold text** using `**bold**` - *Italic text* using `*italic*` - Bullet lists - Links using `[text](url)` ## Saving Changes - **Discard Changes** -- Resets the form to the last saved state. - **Save Banner** -- Saves the banner configuration. This button is disabled until changes are made. After saving, you are redirected back to the organization Users page. ## Default Behavior When no banner is configured, the login page uses the standard centered layout. # Onboarding > Source: https://parallelworks.com/docs/organization-admin/customize/onboarding ## About Onboarding When new users log in to ACTIVATE for the first time, they are guided through an onboarding flow that helps them set up their account. During onboarding, users are presented with recommended compute resources and workflows to add to their account. The marketplace items you choose on the **Onboarding** page are what appear as **"Recommended by [Your Organization]"** during that flow. Recommending compute resources ensures new users start with the resource configurations your organization expects them to use. A copy of each selected resource is made for the new user's account — these copies are independent, so changes to one user's resource won't affect others. Recommending workflows is useful if there's a particular workflow that you expect all of your users to need, such as running a Jupyter Notebook. ## Choosing Recommended Compute Resources From the **Organizations** list, select your organization. In the sidebar, under **Customize**, click **Onboarding**. The **Compute Resources** section lists the compute resources shown to new users on the onboarding resources step, with a counter showing how many are currently recommended. Use the dropdown to browse compute resources published to the marketplace for your organization, and select a resource to add it to the recommended list. To remove a resource, click the trash icon in its row. ## Choosing Recommended Workflows On the same page, the **Workflows** section lists the workflows shown to new users on the onboarding workflows step. Use the dropdown to browse workflows published to the marketplace for your organization, and select a workflow to add it to the recommended list. To remove a workflow, click the trash icon in its row. :::info Note Only items published to the marketplace for your organization can be recommended. If a section is empty, publish an item to the [marketplace](/docs/marketplace) first. ::: ## Saving Changes Click **Save** at the top right of the page to apply your changes. A dialog box with the message _Recommended resources saved_ will appear, and your selections will be recommended during the onboarding flow for all new users created after saving. # Customizing Default Sidebar > Source: https://parallelworks.com/docs/organization-admin/customize/sidebar # Customizing Default Sidebar ## Navigation From the Organizations list, select your organization. In the sidebar, under **Customize**, click **Sidebar**. ## Overview Customize the default sidebar items shown to users in this organization. Users can override these settings from their personal sidebar settings. ## Sidebar Modes The page provides two modes via radio buttons: ### Default Settings Uses the platform default sidebar configuration. All navigation items are shown. ### Custom Settings Allows you to toggle visibility of individual sidebar navigation items. When selected, a list of all navigation items appears with checkboxes. Some items are marked as "unhideable" and cannot be removed. ## How It Works 1. Select the **Custom Settings** radio button to reveal the list of sidebar navigation items. 2. Use the checkboxes to toggle visibility of each item. 3. Changes are applied immediately when toggling items. :::note Note Individual users can override these organization defaults from their personal account settings. ::: # Customizing Organization Theme > Source: https://parallelworks.com/docs/organization-admin/customize/theme # Customizing Organization Theme Here you can change how the page looks for users in the organization. All users in the organization will see these changes. Users can opt-out of organization-specific themes in their account settings. ## Navigation From the **Organizations** list, select your organization. In the sidebar, under **Customize**, click **Theme**. ## Options At the top of the Theme page, you will find two options that control how you interact with the theme editor: - **Preview Settings** — When checked, changes are previewed live on the page as you edit. This allows you to see how your theme will look before saving. - **Calculate Complementary Colors** — When enabled, selecting a color for certain settings will automatically calculate and set complementary colors for related settings. For example, setting a sidebar hover background color will auto-suggest a matching sidebar hover text color. ## Color Presets A row of predefined color presets is displayed near the top of the page. Selecting a preset populates all color fields at once, giving you a quick starting point for your theme. Select **default** to reset to the platform default theme. ## Top Banner Settings Configure a banner that appears at the top of every page for users in your organization. - **Top Banner Message** — Text displayed in the banner at the top of every page. - **Top Banner Text Color** — Color of the banner text. - **Top Banner Background Color** — Background color of the banner. ## Logo Settings Upload and configure organization logos. - **Show Powered By** — Checkbox to display "Powered by Parallel Works" next to the logo. This option is only available to platform administrators. - **Standard Logo** — Upload or remove the organization logo displayed on light backgrounds. - **Dark Mode Logo** — Upload or remove the logo variant displayed on dark backgrounds. - **Invert Logo on Dark Backgrounds** — Toggle to invert logo colors on dark backgrounds. ## Sidebar Settings Customize the colors of the sidebar navigation. - **Banner Color** — The primary color for the sidebar header/banner area. - **Sidebar Text Color** — Text color in the sidebar. - **Sidebar Hover Background** — Background color when hovering over sidebar items. - **Sidebar Hover Text** — Text color when hovering over sidebar items. - **Sidebar Active Background** — Background color of the currently active sidebar item. - **Sidebar Active Text** — Text color of the currently active sidebar item. ## Element Settings Configure the appearance of primary interactive elements such as buttons. - **Element Color** — Primary button/element background color. - **Element Text Color** — Text color on primary buttons/elements. ## App & Panel Settings Control the colors of the main application layout and content panels. - **App Background** — Main application background color. - **App Text Color** — Main application text color. - **Panel Background** — Panel/card background color. - **Panel Text Color** — Panel/card text color. - **Muted Panel Background** — Background for muted/secondary panels. - **Muted Panel Text Color** — Text color in muted panels. - **Muted Text Color** — Color for secondary/helper text. - **Link Color** — Color for hyperlinks. ## Border & Input Settings Customize borders, dividers, and form input appearances. - **Border Color** — Color for borders and dividers. - **Input Background** — Background color for form inputs. - **Disabled Input Background** — Background for disabled inputs. - **Disabled Input Text** — Text color for disabled inputs. ## Interactive Elements Configure hover state colors for interactive elements throughout the interface. - **Hover Color** — Background color for hover states on interactive elements. - **Hover Text Color** — Text color for hover states. ## Saving Each color field has a reset button (refresh icon) that reverts that individual color to its last saved value. - **Reset** — Reverts all changes to the last saved state. - **Save Theme** — Saves all changes permanently. All users in the organization will see the updated theme. # Managing Groups > Source: https://parallelworks.com/docs/organization-admin/managing-groups # Managing Groups This page explains how to create, edit, and delete groups on ACTIVATE. Groups are used to assign user permissions, designate cost allocations, and share resources between users. ## Navigating to the Groups Page From the **Organizations** list, select your organization. In the sidebar, click **Groups**. The **Groups** page displays the section header "Groups" with the description "Manage groups and their resource allocations." ## Listing Groups All groups in your organization are listed in a table with the following columns: - **Group Name** -- clickable link that opens the group edit page - **Description** -- the group's description - **Allocation Used** -- the amount of allocation currently consumed by the group - **Allocation Total** -- the total allocation assigned to the group - **Members** -- the number of users in the group - **Created** -- the date the group was created (formatted as MM/DD/YY) - **Delete** -- a trash icon to delete the group Allocation values are formatted with thousand separators for readability. Use the **Search groups...** field to filter groups by name. The search is case-insensitive. ## Creating a Group 1. On the **Groups** page, click **Add Group** in the top right corner. 2. Enter a **Name** for your group. The name input automatically removes special characters and only allows alphanumeric characters, dashes, and underscores. 3. Optionally, enter a **Description**. 4. Click **Create Group** to submit. You will be redirected to the groups list on success, where your new group will appear in the table. ## Editing Allocations You can update allocation totals for all groups at once using batch editing. 1. On the **Groups** page, click **Edit Allocations** in the groups list header. 2. The **Allocation Total** column becomes editable for all groups. Modify values as needed. 3. Click **Save Allocations** to save all changes in a single batch update. Success or error messages are shown per group to indicate the result of each update. ## Editing a Group Click a group name in the table to open the group edit page. The edit page has three sections: **Manage Description**, **Manage Roles**, and **Manage Members**. ### Manage Description Use the text input to update the group's description. Click **Save Description** to save your changes. ### Manage Roles This section displays four role checkboxes that control what permissions members of the group have within your organization: - **`org:admin`** -- Full control over an organization - **`org:settings`** -- Can manage organization settings - **`org:users`** -- Can create and manage users - **`org:groups`** -- Can create and manage groups, except groups with the `org:admin` role Check or uncheck the roles as needed, then click **Save Roles** to apply your changes immediately. ### Manage Members Use the dropdown search field to find and add organization users to the group. Select a user from the dropdown to add them as a member. Current group members are displayed in a table with the following columns: - **Members** -- the member's username - **Email** -- the member's email address - **Delete** -- a trash icon to remove the member from the group To remove a member, click the trash icon next to their name. The user will be removed from the group immediately. :::info About Removing Members Removing a user from a group only affects their group-based permissions and resource allocations. Their account and their access to ACTIVATE will not be affected. ::: ## Deleting a Group 1. In the groups table, click the trash icon on the row of the group you want to delete. 2. A confirmation modal will appear: "Are you sure you want to delete this group?" 3. Click **Confirm** to delete the group. # Managing Users > Source: https://parallelworks.com/docs/organization-admin/managing-users # Managing Users This page explains how to list, create, import, edit, and delete users on ACTIVATE. ## Listing Users From the **Organizations** list, select your organization. The **Users** page is the default view. The users table displays the following columns: - **User** — Avatar, display name, and email address. A green dot on the avatar indicates the user is currently online (active within the last 60 seconds). - **Status** — Shows **Active** (green badge) for licensed users or **No license** (amber badge) for users without a license. - **Last Login** — The date and time of the user's most recent login. - **Actions** — Available actions such as **Impersonate user** (platform administrators only). ### Searching and Filtering Use the **search field** above the table to filter users by username or email. Results update automatically as you type. Filter pills below the search field let you narrow the list: - **All** — Show all users. - **Active** — Show only users with an active license. - **No license** — Show only users without a license. ### Sorting Click the **Username** or **Last Login** column headers to sort the table by that column. Click again to reverse the sort order. ### Pagination The table displays 50 users per page. Use the **Previous** and **Next** buttons at the bottom of the table to navigate between pages. The table auto-refreshes every 30 seconds to keep the data current. ## Creating New Users To create a new user individually: 1. On the **Users** page, click the **Add user** button in the top-right corner. 2. Fill in the form fields, which are arranged in a 2x2 grid: - **Name** — The user's display name. - **Username** — Must contain only alphanumeric characters, periods, and hyphens. - **Email** — The user's email address. - **Password** — Must meet complexity requirements (see below). 3. Click **Create user** to submit. ### Password Requirements Passwords must meet all of the following complexity requirements: - Minimum length - At least one uppercase letter - At least one lowercase letter - At least one number - At least one special character :::info We do not send any emails regarding the creation of new users. You will need to share the login credentials with the user directly. ::: ## Importing Users The import feature lets you create multiple users at once using a CSV file. It can also be used for mass-updating existing users. 1. On the **Users** page, click the **Import** link next to the **Add user** button. 2. Follow the 3-step process: ### Step 1: Download Template Click **Download template** to download a CSV file. Open the file in any spreadsheet editor (Excel, Numbers, Google Sheets, etc.). ### Step 2: Fill In the CSV The CSV template includes the following fields: | Field | Description | |-------|-------------| | `username` | Required. The user's login name. | | `password` | The user's password. | | `name` | The user's display name. | | `email` | The user's email address. | | `uid` | Optional. A custom user identifier. | | `groups` | Optional. Group names separated by semicolons (e.g., `engineering;design`). | | `active` | Whether the user account is active. | ### Step 3: Upload and Import 1. Click **Upload template** and select your completed CSV file. 2. A preview table displays the uploaded data. Review it for accuracy. 3. Click **Import** to create the users. After the import completes, an **Import Log** appears showing per-user results, including any errors that occurred. :::info Troubleshooting On macOS, spreadsheet applications may attempt to save a CSV file in a different format (e.g., `.numbers` or `.xlsx`). Ensure you save the file as a `.csv` before uploading, as the import feature only accepts CSV files. ::: ## Editing Users Click a username in the users table to open the user detail page. The user detail page uses a two-column layout: - **Left column — User Details panel** - **Username** — Read-only, cannot be changed after creation. - **Name** — Editable display name. - **Email** — Editable email address. - **Status** — Current account status. - **Created** — Date the account was created. - **Organization** — The organization the user belongs to. - **Right column — User Activity** (platform administrators only) - Displays a graph of the user's activity over the past year. Click **Update User** to save any changes to the user details. ### Feature Previews Organization administrators can toggle feature flags for individual users in the **Feature Previews** section of the user detail page. This is useful for enabling upcoming features for testing. ### Platform Admin Settings Platform administrators have access to additional settings: - **No seat** — When enabled, the user does not consume one of the organization's allotted seats. Useful for service accounts or test accounts. - **Admin** — Grants the user platform administrator privileges. ## User Detail Sub-Pages The user detail page includes a navigation bar at the top with links to the following sub-pages: ### Groups View and manage the user's group memberships. - Use the dropdown to add the user to a group. - Click the trash icon next to a group to remove the user from it. ### Workspace Configure the user's workspace settings: | Setting | Description | |---------|-------------| | **Type** | Workspace type (Docker or Kubernetes). | | **User Host** | The host where the workspace runs. | | **Image** | The container image for the workspace. | | **CPU Min / Max** | Minimum and maximum CPU allocation. | | **Memory Min / Max** | Minimum and maximum memory allocation. | | **Ephemeral Storage Max** | Maximum ephemeral storage capacity. | | **Debug Mode** | Enable debug mode for troubleshooting. | ### External Auth View and edit external authentication mappings for each configured authentication method. Available fields depend on your organization's auth configuration and may include: - **CAC ID** - **LDAP UID** - **OIDC Sub** ### Delete A delete confirmation page that displays the resources associated with the user that will be cleaned up upon deletion. See [Deleting Users](#deleting-users) for details. ## User Actions The user detail page includes an action bar with the following options. Available actions depend on your role. ### Impersonate User *Platform administrators only.* Click **Impersonate User** to log in as the selected user. This is useful for troubleshooting issues from the user's perspective. ### Restart Workspace Click **Restart Workspace** in the action bar. A confirmation dialog will appear asking: *Are you sure you want to restart [user's] workspace?* Click **Restart** to confirm. This is useful if the user is experiencing platform errors. :::info Troubleshooting Please contact us if restarting the workspace does not resolve the user's errors. ::: ### Disable / Enable User Click **Disable User** to deactivate the account. Disabled users: - Cannot log in to ACTIVATE. - Do not consume one of the organization's allotted seats. To re-enable the account, click **Enable User** from the same action bar. :::caution A warning is displayed if the user has active resources when you attempt to disable their account. ::: ### Change Password Click **Change Password** to open a modal with two fields: - **New Password** — Enter the new password (must meet password complexity requirements). - **Confirm Password** — Re-enter the new password. ### Remove MFA *Platform administrators and organization administrators only.* Click **Remove MFA** to remove multi-factor authentication from the user's account. The user will need to set up MFA again on their next login if MFA is required by the organization's policies. ### Revoke Login Sessions Click **Revoke Login Sessions** to force the user out of all active sessions. The user will need to log in again. ### Delete User Click **Delete User** to navigate to the delete confirmation page. See [Deleting Users](#deleting-users) for details. ## Deleting Users To delete a user: 1. Navigate to the user detail page by clicking their username in the users table. 2. Click **Delete User** in the action bar, or navigate to the **Delete** sub-page. 3. The delete confirmation page displays a list of resources associated with the user, including each resource's name, type, and status. 4. Click the **Delete** button. 5. A confirmation modal appears. Confirm the deletion. :::caution If the user has active resources, an amber warning explains that those resources will be deprovisioned as part of the deletion process. ::: ## Monitoring User Status In the users table, users who have been online within the past minute display a green status dot on their avatar. This provides a quick way to see which users are currently active on the platform. # Billing Multiplier > Source: https://parallelworks.com/docs/organization-admin/partner/billing-multiplier # Billing Multiplier This page explains how to set a billing multiplier for your organization. This number is multiplied by the true cost of the instance to determine the displayed cost of the instance in the organization's billing dashboard. This feature is useful for integrating the total billing cost of both platform charges and partner charges for your customers. Please note that multipliers are a nested feature, which means that lower levels inherit the settings of higher levels. If you make changes to the multiplier at the partner level, any organizations that have their multiplier set to **Default Settings** will inherit the partner settings. You can further customize billing multipliers on the organization level by navigating to **Organization** > **OrganizationName** > **Partner**. From the **Organizations** list, select your organization. In the sidebar, under **Partner**, click **Billing**. Click the partner icon for the organization you're editing. In **Billing Multiplier**, if **Default Multiplier** is selected, users will be charged at the default cost. The checkboxes for providers are locked while **Default Multiplier** is selected. Select **Custom Multiplier** to make changes. ![Screenshot of the user selecting Custom Multiplier.](/content-images/docs/organization-admin/partner/billing-multiplier/click-custom-multiplier-partner.png) Enter a number in the field below **Custom Multiplier**. When you're done, click **Save Partner Settings**. Your changes will be applied immediately. ![Screenshot of the user clicking the button Save Partner Settings.](/content-images/docs/organization-admin/partner/billing-multiplier/click-save-partner-settings.png) # Partner Instance Limits > Source: https://parallelworks.com/docs/organization-admin/partner/instance-limits # Partner Instance Limits Restrict which instance types are available to organizations managed by this partner. :::info Note This page is only visible for organizations that have been designated as a **Partner Organization** by a platform administrator. See [Platform Administration](/docs/organization-admin/admin) for more information. ::: ## Navigation From the **Organizations** list, select your organization. In the sidebar, under **Partner**, click **Instance Types**. ## About Partner Instance Limits Partner instance limits allow you to control which cloud instance types are available across all organizations that your partner organization manages. This is useful for: - **Enforcing cost controls** by limiting access to expensive instance types - **Ensuring compliance** by restricting to specific instance families (e.g., Nitro instances on AWS) - **Standardizing infrastructure** across managed organizations ## Configuring Instance Limits The page displays available instance types organized by cloud service provider. You can: 1. Select **Default Settings** to allow all instance types (no restrictions). 2. Select **Custom Settings** to manually choose which instance types are available. When **Custom Settings** is selected: - All available instance types are listed, organized by provider. - Check or uncheck instance types to enable or disable them. - Changes affect all organizations managed by this partner. Click **Save** to apply your changes. # SCIM Provisioning > Source: https://parallelworks.com/docs/organization-admin/scim # SCIM Provisioning ACTIVATE exposes a **read-only SCIM 2.0 API** that lets external services synchronize your organization's users and groups. This is how systems outside ACTIVATE discover who your users are, what groups they belong to, and the POSIX identity and SSH keys associated with each account. :::info Direction of sync ACTIVATE is the **source** of identity, not a destination. Consuming services *read* users and groups from ACTIVATE; they cannot create, modify, or delete them through this API. Every write request (`POST`, `PUT`, `PATCH`, `DELETE`) returns `501 Not Implemented`. ::: ## Enabling SCIM 1. From the **Organizations** list, select your organization. 2. In the left sidebar, under **Settings**, click **SCIM Provisioning**. 3. Toggle **Enable SCIM provisioning**. Once enabled, the page displays your organization's **SCIM endpoint URL**. Provide this URL to the consuming service: ``` https:///api/organizations//scim/v2 ``` The endpoint is scoped to a single organization - only that organization's users and groups are returned. ## Bearer Tokens SCIM requests are authenticated with a bearer token. Tokens are scoped to the organization and are independent of any single user account. To create a token: 1. On the **SCIM Provisioning** page, find the **Bearer Tokens** section. 2. Click **Create SCIM token**. 3. Enter a descriptive **name**. Optionally set an **expiration** (in days); leave it blank for a non-expiring token. 4. Copy the generated token. :::caution Tokens are shown once The full token value is displayed only at creation time and is never shown again. Store it securely (for example in the consuming service's secret manager) before closing the dialog. If you lose it, revoke the token and create a new one. ::: The consuming service sends the token as a standard bearer credential on every request: ``` Authorization: Bearer ``` To revoke access, delete the token from the **Bearer Tokens** list. Any service using that token immediately loses access to the SCIM API. :::info Token creation requires a browser session For security, SCIM tokens can only be minted from a logged-in browser session by an organization admin - not via the API itself. ::: ## What the API Exposes The API implements the SCIM 2.0 discovery and resource endpoints: | Endpoint | Purpose | |----------|---------| | `GET /ServiceProviderConfig` | Advertises supported capabilities (filtering, bearer auth). | | `GET /ResourceTypes` | Lists the `User` and `Group` resource types. | | `GET /Schemas` | Returns the core User/Group schemas plus the CoreWeave extensions. | | `GET /Users`, `GET /Users/{id}` | List or fetch users. | | `GET /Groups`, `GET /Groups/{id}` | List or fetch groups. | ### Filtering and pagination - **Users** can be filtered by `userName`, `externalId`, or `displayName` using the `eq` operator, e.g. `?filter=userName eq "jdoe@example.com"`. - **Groups** can be filtered by `displayName eq`. - Results are paginated with `startIndex` (1-based) and `count` (default 50, maximum 200). ### CoreWeave extension attributes ACTIVATE groups map directly to SCIM groups, and ACTIVATE users to SCIM users. In addition to the standard SCIM fields, each resource carries a CoreWeave extension that exposes the POSIX identity consumers need to provision Linux accounts. The extension blocks are **omitted by default** and are only returned when explicitly requested via the `attributes` query parameter: ``` ?attributes=urn:coreweave:params:scim:schemas:extension:coreweave:2.0:CoreWeaveUser ``` **User extension** (`urn:coreweave:params:scim:schemas:extension:coreweave:2.0:CoreWeaveUser`): | Attribute | Description | |-----------|-------------| | `sunkPosixUsername` | The user's POSIX (Linux) username. | | `sunkPosixUserId` | The user's POSIX UID. | | `sunkPosixGroupId` | The user's primary POSIX GID. | | `sunkLoginShell` | Login shell (defaults to `/bin/bash`). | | `sunkPreferredHomeDirectory` | Home directory (defaults to `/home/`). | | `sunkSshKeys` | The user's registered authorized SSH public keys. | **Group extension** (`urn:coreweave:params:scim:schemas:extension:coreweave:2.0:CoreWeaveGroup`): | Attribute | Description | |-----------|-------------| | `sunkPosixGroupId` | The group's POSIX GID. | | `sunkPosixGroupName` | The group's POSIX name. | :::tip Excluding inactive users When listing groups, pass `?excludeInactiveUsers=true` to drop disabled users from each group's member list. CoreWeave's identity cache uses this so that deactivated ACTIVATE accounts stop resolving on the cluster. ::: ## Next Steps - [Connecting a CoreWeave Slurm Cluster](/docs/compute/connecting-coreweave-slurm) - the most common consumer of this API, which uses SCIM to populate Linux users, groups, and SSH keys on the cluster. # Adding Authentication > Source: https://parallelworks.com/docs/organization-admin/settings/authentication # Adding Authentication ACTIVATE allows you to configure how users authenticate to your organization. You can set up multiple authentication methods, including passwords, LDAP, and OpenID Connect (OIDC), to match your organization's security requirements. ## Navigating to Authentication Settings From the **Organizations** list, select your organization. In the sidebar, under **Settings**, click **Authentication**. The Authentication page displays a table of all configured authentication methods with the following columns: - **Name** — The display name of the method (clickable for LDAP and OIDC methods) - **Type** — The method type (`cac`, `ldap`, `oidc`, or `password`) - **Delete** — A trash icon to remove the method If no methods have been configured, the page displays: "No authentication options configured." ## Adding Authentication Methods Click the **Add method** dropdown button to see the available options: - **Password** — Creates a password-based login immediately with no additional configuration. This option is only shown if no password method already exists. - **LDAP** — Opens the LDAP configuration page. - **OIDC** — Opens the OIDC configuration page. ## Password Authentication Password authentication requires no configuration. Select **Password** from the **Add method** dropdown and the method is created immediately. Only one password method is allowed per organization. Once a password method exists, the **Password** option is hidden from the dropdown. Password methods can be deleted like any other method. ## LDAP Authentication To add a new LDAP method, select **LDAP** from the **Add method** dropdown. To edit an existing LDAP method, click its name in the authentication methods table. ### Basic Connection Settings | Field | Required | Description | |-------|----------|-------------| | **Name** | Yes | Display name shown on the login page. | | **Domain** | Yes | LDAP server domain (e.g., `example.com`). | | **Filter** | Yes | User lookup filter. Use `__USERNAME__` as a placeholder for the authenticating user's name (e.g., `(uid=__USERNAME__)`). | | **Base DN** | No | Starting point for LDAP searches (e.g., `ou=orgUnit,dc=example,dc=com`). | ### Service Account Toggle **Use Service Account** to enable or disable service account authentication. - **When enabled:** Two additional fields appear: - **Service Account Bind** — The full distinguished name (DN) of the service account. - **Service Account Password** — The password for the service account. - **When disabled:** The system attempts an anonymous bind. ### TLS / Security Toggle **Use TLS** to enable or disable Transport Layer Security when connecting to the LDAP server. - **When enabled:** Two additional fields appear: - **Client Certificate** — Paste the PEM-encoded client certificate (textarea). - **Client Key** — Paste the PEM-encoded client key (textarea). Required when creating a new LDAP method. ### User Attribute Mapping These fields control how LDAP attributes map to ACTIVATE user properties. | Field | Default | Description | |-------|---------|-------------| | **Unique Identifier** | `cn` | Attribute that uniquely identifies users. | | **Username** | `uid` | Attribute used as the username. | | **Full Name** | `cn` | Attribute used as the display name. | | **Email** | `mail` | Attribute used as the email address. | | **UID Number** | *(none)* | Unix UID used during account creation. If not set, a UID is auto-generated. | ### Test Connection Before saving, you can verify the LDAP configuration by testing a connection. 1. Enter a **Username** and **Password** for a known LDAP account. 2. Click **Test Connection**. 3. The system will attempt to authenticate using the current configuration and report the result. ## OIDC Authentication To add a new OIDC method, select **OIDC** from the **Add method** dropdown. To edit an existing OIDC method, click its name in the authentication methods table. ### Basic Information | Field | Default | Description | |-------|---------|-------------| | **Name** | `oidc` | Internal identifier. Must be lowercase alphanumeric characters and hyphens only. | | **Display Name** | `OIDC` | The label shown on the login page. | ### Endpoint Discovery Toggle **Discover Endpoints?** to control how OIDC endpoints are configured. This toggle is enabled by default. **When enabled:** Enter only the **Issuer URL**. All other endpoints (user info, token, authorization, and end session) are discovered automatically from the provider's well-known configuration. **When disabled:** Enter each endpoint manually: | Field | Required | Description | |-------|----------|-------------| | **User Info Endpoint** | Yes | URL for retrieving user profile information. | | **Token Endpoint** | Yes | URL for exchanging authorization codes for tokens. | | **Authorization Endpoint** | Yes | URL where users are redirected to authenticate. | | **End Session Endpoint** | No | URL for logging users out of the identity provider. | ### Client Configuration | Field | Default | Description | |-------|---------|-------------| | **Client ID** | *(none)* | The client ID from your identity provider. Required. | | **Scopes** | `openid profile email` | Space-separated list of OAuth scopes to request. Required. | ### Authentication Method The **Token Endpoint Auth Method** dropdown determines how the ACTIVATE platform authenticates with your identity provider's token endpoint. The available options are: - **`client_secret_post`** — The client secret is sent in the POST body of token requests. - **`client_secret_basic`** — The client secret is sent in the Authorization header as a Base64-encoded string. - **`private_key_jwt`** — A JWT signed with a private key is used for authentication. **Credentials** change based on the selected auth method: - For **`client_secret_post`** or **`client_secret_basic`**: A **Client Secret** text field is displayed. - For **`private_key_jwt`**: A **Private Key PEM** textarea is displayed where you paste the PEM-encoded private key. ### Registration Options | Option | Default | Description | |--------|---------|-------------| | **Title Case** | Off | Converts usernames to title case for normalization. | | **Skip Platform MFA Verification** | Off | Bypasses the additional MFA step after OIDC login. | | **Create account on first login** | On | Automatically creates ACTIVATE accounts for new OIDC users. When disabled, only users with existing ACTIVATE accounts can log in via OIDC. | ### Redirect URI A read-only field at the bottom of the configuration page displays the callback URL: ``` https://your-domain/api/sso/oidc/callback ``` Copy this value and configure it as an allowed redirect URI in your identity provider. ## Deleting Authentication Methods To delete any authentication method: 1. Click the trash icon next to the method in the authentication methods table. 2. A confirmation modal appears: *"Are you sure you want to delete this authentication option? Users will no longer be able to login with this option."* 3. Confirm the deletion. ## Supported Identity Providers OIDC authentication supports any standards-compliant OpenID Connect identity provider, including: - [Azure Active Directory (Entra ID)](https://www.microsoft.com/en-us/security/business/identity-access/azure-active-directory) - [Google Workspace](https://workspace.google.com/) - [Okta](https://www.okta.com/) - [Keycloak](https://www.keycloak.org/) - [Auth0](https://auth0.com/) - [Login.gov](https://login.gov/) # Organization Policies > Source: https://parallelworks.com/docs/organization-admin/settings/policies # Organization Policies ## Navigation From the Organizations list, select your organization. In the sidebar, under **Settings**, click **Policies**. ## Overview Organization policies are scoped to your organization. Any policy set at the [platform level](/docs/admin-panel/policies) takes precedence and cannot be changed for your organization; policies left unset at the platform level can be configured here. Each policy has three states controlled by a toggle: - **Enabled** -- The policy is actively enforced for your organization. - **Disabled** -- The policy is explicitly turned off for your organization. - **Not Set** -- The policy inherits the platform default behavior. ## Policies ### No Root Access Disable root access to cloud compute resources for all users, including resource owners, in your organization. Defaults to "Enable root access" if no policy is set. ### Nitro Instance Types Only Restrict compute resources to AWS Nitro instance types only, in your organization. Defaults to "Allow all AWS instance types" if no policy is set. ### No Public IP Addresses Prevent users in your organization from provisioning standalone public IP addresses. Defaults to "Allow public IP addresses" if no policy is set. When enabled, requests to provision a standalone public IP address are rejected. ### Archive Cost Data Automatically summarize and then archive cost data after a specified number of months to optimize database performance. This will not delete any data, it will only summarize older data. ### Enforce Security Key MFA :::note Feature Preview This policy is feature-flagged and may not be visible in your organization. ::: Require all users in your organization to set up and use a hardware security key (such as a YubiKey) for multi-factor authentication when logging in with a password. Users without a registered security key will be prompted to register one before accessing the platform. Users signing in through an OpenID Connect provider with **Skip Platform MFA Verification** enabled are not affected by this policy; their identity provider is trusted to perform multi-factor authentication. # Workflow Variables > Source: https://parallelworks.com/docs/organization-admin/settings/variables ## About Workflow Variables [Contexts](https://parallelworks.com/docs/run/workflows/building-workflows/inputs-and-expressions#contexts) can be a useful feature when you are building workflows on ACTIVATE. Contexts have many uses, such as setting the default values for input fields in the workflow's configuration form. The `org` context calls custom workflow variables. These variables are configured in your organization's settings. In the example below, you will see that the form for this workflow contains only one input field. Any text you enter will be output along with the value of `orgVariable`. If you run the workflow without entering an input, only the value of `orgVariable` will be output. ```YAML jobs: main: steps: - name: Run run: echo ${{ inputs.hello }} ${{ org.orgVariable }} 'on': execute: inputs: hello: label: My Input type: string default: '${{ org.orgVariable }}' ``` ![Screenshot of input entered in the workflow form.](/content-images/docs/organization-admin/settings/variables/workflow-form.png) _The workflow's input_ ![Screenshot of workflow's output.](/content-images/docs/organization-admin/settings/variables/workflow-output.png) _The workflow's output_ ## Configuring Workflow Variables From the **Organizations** list, select your organization. In the sidebar, under **Settings**, click **Variables**. In **Workflow Variables**, click **Add Key Value Pair**. Enter a **Key**, then enter a **Value**. Click **Save**. Users will immediately be able to use the new workflow variable. # Webhooks > Source: https://parallelworks.com/docs/organization-admin/settings/webhooks # Webhooks This page explains how to add webhooks to your organization. Webhooks allow external services to be notified when certain events happen. When the specified events happen, we'll send a POST request to each of the URLs you provide. ## Adding a Webhook From the **Organizations** list, select your organization. In the sidebar, under **Settings**, click **Webhooks**. Click **+ Add Webhook**. On the next page, select a **Type**. Currently, you can choose from these webhook types: - `USER_CREATED` flags when a new user logs in for the first time. - `USER_DISABLED` flags when a user has been disabled. - `USER_REMOVED_FROM_GROUP` flags when a user has been removed from a group in your organization. Add a **Webhook name** and paste the **URL** that your webhook will be sent to. **Description** is an optional field. Choose whether to **Enable** this webhook. Click **Create webhook**. You'll be taken back to the **Webhooks** page. A dialog box with the message _Webhook created successfully_ will appear in the bottom right corner of your screen. ## Deleting a Webhook From the **Organizations** list, select your organization. In the sidebar, under **Settings**, click **Webhooks**. Select the webhook you'd like to delete, then click **Delete webhooks**. A pop-up module will appear. Click **Delete**. You'll be taken back to the **Webhooks** page. A dialog box with the message _Webhook(s) deleted successfully_ will appear in the bottom right corner of your screen. ## Responding to Events When your application receives webhook events, they'll take the shapes below. All `webhook` shapes are identical, while the `payload` shape changes according to the type of event. Please also note that `organization` has a different meaning, depending on its location: - `organization` inside the `webhook` object indicates the organization that owns the webhook. - `organization` inside the `payload` object indicates the organization that the user is in. ##### `USER_CREATED` ```typescript { "type": "USER_CREATED", "webhook": { "id": "66ec434e84b4103f670cb617", "organization": "parallelworks", "name": "demo" }, "payload": { "username": "demo", "email": "demo@parallelworks.com", "userId": "66ec445884b4103f670d0c86", "organization": "parallelworks", "remainingSeats": 5 } } ``` ##### `USER_DISABLED` ```typescript { "type": "USER_DISABLED", "webhook": { "id": "66ec41b884b4103f670c5ee5", "organization": "parallelworks", "name": "test" }, "payload": { "username": "demo", "email": "demo@parallelworks.com", "userId": "653c787c8e048caa7cb4e554", "organization": "parallelworks" } } ``` ##### `USER_REMOVED_FROM_GROUP` ```typescript { "type": "USER_REMOVED_FROM_GROUP", "webhook": { "id": "66ec439584b4103f670cd3ae", "organization": "parallelworks", "name": "test" }, "payload": { "username": "demo", "email": "demo@parallelworks.com", "userId": "653c787c8e048caa7cb4e554", "organization": "parallelworks", "groupName": "Demo-Group" } } ``` # Reference > Source: https://parallelworks.com/docs/reference # Reference This section contains reference materials, support information, and compliance documentation. ## Contents ### [Logging In](/docs/reference/logging-in) Instructions for logging in to ACTIVATE for the first time. ### [Getting Support](/docs/reference/getting-support) How to get help and contact support when you need assistance. ### [Compliance](/docs/reference/compliance) Security and compliance information for ACTIVATE. # IL5/FedRAMP Compliance > Source: https://parallelworks.com/docs/reference/compliance # IL5/FedRAMP Compliance In addition to the ACTIVATE SaaS platform, we offer a solution for the US Government: the Parallel Works High-Security Platform (PWHSP). Hosted in AWS GovCloud, the PWHSP is compliant with [Federal Risk and Authorization Management Program (FedRAMP)](https://www.fedramp.gov/program-basics/) standards. ## Features and Services The PWHSP includes the same major features of ACTIVATE. Some features and services have been modified for security compliance, which are detailed in this section. At present, the PWHSP only supports connecting to on-premises clusters with an Authority to Operate (ATO) and deploying compute resources on AWS. We will be adding support for Microsoft Azure and Google Cloud Platform compute resources in the future. All AWS options are available on the PWHSP, but screenshots and page sections that mention other cloud service providers can be disregarded until further notice. ### SSH Access The PWHSP does not support SSH access from your personal computer to cloud resources. All of your work with compute resources must be conducted in your user workspace on the platform. SSH can be federated through the PWHSP using the PW CLI, see the [PW CLI documentation](/docs/cli/pw/ssh) for more information. ## Authentication Methods ### MFA Requirements On the PWHSP, users are required to have MFA enabled on their account or use an authentication method which ensures MFA, e.g. CAC, an OIDC provider with MFA. ### Password Authentication For users using the password authentication method, we support adding a YubiKey 5 FIPS model. YubiKeys plug into your computer via USB-A or USB-C and require physical touch after you enter your password. These YubiKeys are provisioned and issued by Parallel Works. ### CAC Authentication Common Access Cards (CAC) are the standard form of identification for government employees, personnel, and service members. If you use a CAC, your administrator will register your CAC with your PWHSP account before you access the PWHSP for the first time. You’ll need your CAC PIN in addition to your CAC. ### OpenID Connect OpenID Connect can use either a YubiKey or a CAC for second-step validation. With OpenID connect, the PWHSP login page is provided by the government instead of Parallel Works. The YubiKey in this case will be provisioned and issued by the government. ## FIPS 140-2 Compliance The [Federal Information Processing Standards (FIPS)](https://www.nist.gov/standardsgov/compliance-faqs-federal-information-processing-standards-fips) are globally recognized guidelines for information security. The PWHSP adheres to [FIPS 140-2](https://csrc.nist.gov/pubs/fips/140-2/upd2/final). ## CSP FIPS Endpoints When accessing Cloud Service Provider (CSP) services from within the PWHSP, you must utilize endpoints which utilize FIPS. Below are instructions for configuring common cloud SDKs to use FIPS endpoints. ### AWS For AWS SDKs, you can enforce the use of FIPS endpoints by setting the following environment variable: - `AWS_USE_FIPS_ENDPOINT=true` ### Azure For Azure, FIPS compliance involves using the Azure Government cloud. Ensure your authentication uses the correct authority host: - `AZURE_AUTHORITY_HOST=https://login.microsoftonline.us` ### Google Cloud Platform For Google Cloud, FIPS compliance is generally handled at the cryptographic library level rather than specific FIPS endpoints. Ensure your application is built and run using FIPS-validated cryptographic modules. ## Ports The PWHSP can only be accessed through port 443. Port 80 is open for redirect to port 443 only. Port 8443 is open for CAC authentication. All data is encrypted at rest and in transit using validated FIPS 140-2 cryptographic modules. # Getting Support > Source: https://parallelworks.com/docs/reference/getting-support # Getting Support If you’re experiencing problems with ACTIVATE, we’re here to help! You can check the platform status at any time by clicking **Status** on the login page or in the bottom-left corner after you log in. You can submit a help ticket by emailing us at support@parallelworks.com. # Logging In > Source: https://parallelworks.com/docs/reference/logging-in # Logging In When you navigate to [activate.parallel.works](http://activate.parallel.works)\*, you’ll see the login page. ![Screenshot of the login screen at activate.parallel.works.](/content-images/docs/reference/logging-in/nav_platform_1_oct23.png) ## Login Options If your organization requires a [Common Access Card (CAC)](https://www.cac.mil/) to verify your identity, click **CAC Login**. Your browser will display a certificate dialog box; select your certificate and click **OK**. Next, your browser will display a PIN or password dialog box; enter your PIN or password and click **OK**. You'll then be logged in to ACTIVATE. If you already have an ACTIVATE account, click **Password Login** to enter your username and password. If you don't have an ACTIVATE account but your organization supports [Azure Active Directory (AD)](https://azure.microsoft.com/en-us/products/active-directory), click the link below **Password Login**. Enter the name of your ACTIVATE organization and click **Next**. You'll be redirected to a Microsoft sign-in screen. After you enter your organization email and password, you'll be taken back to ACTIVATE. Enter your **Full Name**, **Username**, and **Email**. Click **Register** to create your account and log in to ACTIVATE. If you see the error message _Invalid username or password_ when logging in, please reach out to us at support@parallelworks.com for assistance. \*_Please note that, depending on the organization, some users log in to ACTIVATE at a different URL (e.g., org.parallel.works)._ ## Sudo Mode To keep your account secure, ACTIVATE requires you to authenticate using multi-factor authentication (MFA) when performing certain sensitive actions. Once you authenticate, you will enter **sudo mode**. In **sudo mode**, you'll be able to perform sensitive actions without having to authenticate again. You will remain in **sudo mode** for a set period of 1 hour, after which you will be required to authenticate again to perform sensitive actions. We consider these actions to be sensitive: - Resetting your password # Run > Source: https://parallelworks.com/docs/run ## About Workflows At a high level, a workflow is a series of automated steps run on one or more compute resources. More specifically, a workflow is a set of jobs and steps that run to completion whenever the workflow is executed. A workflow may have one or more jobs, and a job may have one or more steps. The jobs run in parallel, while the steps run sequentially. Workflows are defined using YAML. Below is an example of a simple workflow that prints the message `hello world` each time it is launched. ```yaml jobs: main: steps: - name: Run run: echo hello world ``` For more information about building workflows, see [Building Workflows](/docs/run/workflows/building-workflows). ## About Sessions A session is a secure, shareable connection between a cluster and a workflow. When creating a session, the user chooses a port to expose. That port is made securely available through your ACTIVATE user workspace. The port is forwarded from the cluster back to the user workspace, allowing any user to log in to ACTIVATE and access that session. Sessions add an authentication layer that only allows access through an SSH connection. Additionally, only users that are selected by the session creator have access. # About Sessions > Source: https://parallelworks.com/docs/run/sessions # About Sessions This page includes information about running, sharing, and deleting sessions. ## What is a Session? A session is a way to access an application or environment — running on a resource, or on your own machine — through the platform. ACTIVATE supports several kinds of sessions: - **VS Code** sessions give you a code editor on a resource — in your browser or connected to your local VS Code. See [**VS Code Sessions**](/docs/run/sessions/vscode). - **Desktop** sessions give you a graphical desktop on a resource, streamed to your browser. See [**Desktop Sessions**](/docs/run/sessions/desktops). - **Tunnel** sessions expose an application running on a port of a remote compute resource or user workspace. - **Link** sessions point to an application hosted outside of ACTIVATE. - **Endpoint** sessions expose an app running on **your own machine** through ACTIVATE — the `pw` CLI dials out, so no inbound access to your machine is required. See [**Endpoint Sessions**](/docs/run/sessions/endpoints). The rest of this page focuses on **tunnel** and **link** sessions. ### Tunnel Sessions A `tunnel` session is a secure tunnel that exposes an application running on a remote compute resource or user workspace to the platform. You can then access it through ACTIVATE. Sessions are created when you run a workflow that includes a `sessions` definition in its YAML file, but you can also create sessions manually. For example, if you have a simple web application running on port 3000 of a remote compute cluster, you can create a session that exposes the application to the platform. Once the session is created, you can access the application in your web browser through ACTIVATE. ### Link Sessions A **link** session is a simple URL that points to an application running outside of ACTIVATE. You can create one manually by providing a name and a URL. This is useful when the application is hosted externally but you want to link to it from ACTIVATE. ## Running a Workflow Session Any workflow can generate a session as long as its YAML file contains a `sessions` definition. Below is an example of a YAML file with a `sessions` definition, with a session named `desktop`: ```YML sessions: desktop: ``` You can check for `sessions` in the workflow's **Build** tab. For more information, please see [**Workflow Sessions**](/docs/run/workflows/building-workflows/sessions). Start your workflow. A notification will appear with the message _Executing workflow [name]_. You'll also be redirected to the **Sessions** page. ![Screenshot of a session being created.](/content-images/docs/run/sessions/creating-session.png) Once the session has been created, the page will display the session, status, local port, and remote port. ![Screenshot of running session icon in the expanded navigation bar.](/content-images/docs/run/sessions/sessions-in-nav-bar.png) When your navigation bar is expanded, your number of running sessions will appear next to **Sessions**. Click the session name to see view the exposed application. ## Running a Manual Session You can create any type of session manually, which does not require a running workflow. Manually created sessions are the same as sessions created by workflows, except they are not tied to the lifecycle of a workflow and need to be manually removed when you're done with them. To create a session manually, navigate to **Sessions**. Click **Add Sessions**. ![Screenshot of the user clicking Add Sessions on the Sessions page.](/content-images/docs/run/sessions/click-add-session.png) On the next page, select **Tunnel** or **Link**. **Link** sessions only require a **Name** and a **URL**. After setting these parameters, you can click **Add Session**. **Tunnel** sessions require a **Name**, **Remote Port**, and **Target Type**. After selecting a **Target Type**, you must select a running resource to launch the session. - Compute clusters only require one field, **Target**, which refers to the running cluster. - Kubernetes clusters require **Kubernetes Cluster** (the running cluster), the **Resource Type** (pods, deployments, or services), and a **Resource Name**. #### Advanced Options All parameters in this section are optional. The **Workspace Port** refers to the port in your workspace that the session will be forwarded to. You can leave this field blank or enter `0` to choose a random port. The **Slug** will be appended to the URL when accessing the session. This parameter is useful for applications whose basePath is not `/`. The **Remote Host** is the hostname of the application's running location. This parameter is set to `localhost` by default. **Application Uses HTTPS?** determines whether the session will use HTTPS to access the application running on the forwarded port. Please note that you should only select use HTTPS if the application you are running is using HTTPS. This does not affect encryption between your browser and ACTIVATE. **Use Custom Domain** determines whether the session's URL will use a custom domain to access the application running on the forwarded port. If you're using the SaaS version of our platform, the URL will take the form of `*.activate.pw` where `*` is the session domain. For standalone deployments of ACTIVATE, the URL will vary. After configuring these settings, click **Add Session**. ![Screenshot of the user clicking Add Sessions on the Sessions page.](/content-images/docs/run/sessions/click-add-session2.png) You will be redirected to the **Sessions** page as the session starts. When the session's status displays **running**, click its name to access the session. ## Sharing a Session On the **Sessions** page, click the share icon. On the next page, select the group(s) you want to share the session with. You'll see the message _Permission updated successfully._ :::caution About Sharing Only share a session with groups you trust. Sharing is the same as allowing users in the group to run the workflow as you. ::: ## Deleting a Session On the **Sessions** page, click the delete icon. A dialog box will appear with the message _Are you sure you want to delete this session?_ Click **Delete**. A notification will appear with the message _Session deleted_. :::info Note Please note that deleting a session does not cancel the workflow that created the session. You must cancel the workflow separately. ::: # Desktop Sessions > Source: https://parallelworks.com/docs/run/sessions/desktops # Desktop Sessions A **Desktop session** runs a graphical (VNC) desktop on a compute resource and streams it to your browser — useful for GUI applications, visualization tools, and file management. The desktop runs on the resource itself, so your data and processes stay on the cluster. Need a code editor instead? See [VS Code Sessions](/docs/run/sessions/vscode). :::info The resource must be running A resource (a compute cluster or your user workspace) must be **running** before you can launch a desktop session on it. ::: ## Launch a desktop ### From a cluster (Quick Launch) 1. Open your cluster and find the **Quick Launch** panel (_Open this cluster in your browser_). 2. On the **Remote Desktop** card, click **Launch**. 3. Click **Launch** to confirm. ### From the Sessions page 1. Go to **Sessions** and click **New Session**. 2. Choose **Desktop** as the session type. 3. Pick the **Target** resource (a compute cluster or your user workspace). 4. Click **Launch**. Once the session is running, the desktop appears in an embedded viewer on the session page. Use **Open in new tab** for a full-screen desktop. ## Desktop sessions vs. interactive sessions There are two ways to get a graphical desktop on a resource, and which one to use depends on **where** the desktop should run: - **On a controller (head node) or user workspace → use a Desktop session.** Desktop sessions launch directly through the ACTIVATE agent, which is more reliable and more general than the workflow-based approach. This is the preferred way to get a desktop on a controller. - **On a compute node → use an [interactive session](/docs/run/sessions/interactive-sessions).** Interactive sessions submit a job through the scheduler to allocate a compute node, and remain the right tool for running a desktop — or an application like MATLAB or RStudio — on compute nodes. In short: prefer **Desktop sessions** on the controller or workspace, and use **interactive sessions** when you need the desktop on a compute node. :::note Running a Desktop session directly on a **compute node** isn't available yet — it's planned for a future release. Until then, use an interactive session for compute-node desktops. ::: # Endpoint Sessions > Source: https://parallelworks.com/docs/run/sessions/endpoints # Endpoint Sessions An **endpoint session** exposes an app running on **a machine you control** — your workstation, a server, a VM, or any host that can reach the platform — through ACTIVATE, without deploying it or opening any inbound ports. The `pw` CLI dials out and registers a reverse tunnel, so **no inbound network access to that machine is required**; nothing on it has to accept incoming connections. A [tunnel session](/docs/run/sessions/) exposes an app running on a remote compute resource, where an agent on the cluster initiates the tunnel. An endpoint session is independent of any cluster or agent — the `pw` CLI dials out on its own, so you can expose an app from any machine you run it on. ## Expose a local app Run `pw endpoints http` next to an app listening on a port (or a Unix socket): ```bash # Expose a local app on port 3000 pw endpoints http 3000 ``` The CLI prints a public URL (for example `https://my-app./`) and forwards traffic to your local app until you stop it with `Ctrl+C`. Use `pw endpoints https` instead when your local app speaks TLS. A few common options: - `--name ` — give the session a stable name; re-running takes over the same endpoint. - `--subdomain