If you would like to learn more about the ${feature} feature, check out the [APP] documentation for detailed guides and information.
`
}
`;
+
+export const CryostatIcon = withThemedIcon(cryostatLogoIcon, cryostatLogoIconDark, 'Cryostat Icon');
diff --git a/src/app/QuickStarts/quickstarts/automated-rules-quickstart.tsx b/src/app/QuickStarts/quickstarts/automated-rules-quickstart.tsx
index bb1e38ccff..d8e1013e3f 100644
--- a/src/app/QuickStarts/quickstarts/automated-rules-quickstart.tsx
+++ b/src/app/QuickStarts/quickstarts/automated-rules-quickstart.tsx
@@ -35,16 +35,10 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
-import cryostatLogoIcon from '@app/assets/cryostat_icon_rgb_default.svg';
-import cryostatLogoIconDark from '@app/assets/cryostat_icon_rgb_reverse.svg';
-import build from '@app/build.json';
import { FeatureLevel } from '@app/Shared/Services/Settings.service';
-import { withThemedIcon } from '@app/utils/withThemedIcon';
import { QuickStart } from '@patternfly/quickstarts';
import React from 'react';
-import { conclusion } from '../quickstart-utils';
-
-const Icon = withThemedIcon(cryostatLogoIcon, cryostatLogoIconDark, 'Cryostat Icon');
+import { CryostatIcon, conclusion } from '../quickstart-utils';
const displayName = 'Get started with Automated Rules';
@@ -58,7 +52,7 @@ const AutomatedRulesQuickStart: QuickStart = {
version: 2.3,
displayName: displayName,
durationMinutes: 5,
- icon: ,
+ icon: ,
description: `Learn about automated rules in **[APP]** and how to create one.`,
prerequisites: ['Start a Recording'],
introduction: `
@@ -97,7 +91,7 @@ To create a new rule, use the Automated Rule creation form to fill in the requir
The [Match Expression]{{highlight rule-matchexpr}} field is a Java-like code snippet that is matched against each target JVM. This allows you to create rules that run on specific target JVMs. For example, you can create a rule that runs on all target JVMs with the match expression: \`true\`{{copy}}. You can also match targets more specifically with a match expression like \`target.annotations.cryostat['PORT'] == 9091\`{{copy}}, which will match targets that are connected to [APP] on port 9091.
-**To create a new rule, you must fill out the following required fields:**
+To create a new rule, you must fill out the following required fields:
1. Enter a name for the rule in the [Name]{{highlight rule-name}} field.
2. Enter an expression in the [Match Expression]{{highlight rule-matchexpr}} field. To see an example match expression, click the [match hint]{{highlight rule-matchexpr-help}}.
[Use the [Match Expression Visualizer]{{highlight match-expr-card}} to test your match expression against the target JVMs currently discovered by [APP]. Any matched targets will appear unfaded in the Graph view and will be listed in the List view.]{{admonition tip}}
diff --git a/src/app/QuickStarts/quickstarts/cryostat-link-quickstart.tsx b/src/app/QuickStarts/quickstarts/cryostat-link-quickstart.tsx
deleted file mode 100644
index ebf81a59f2..0000000000
--- a/src/app/QuickStarts/quickstarts/cryostat-link-quickstart.tsx
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright The Cryostat Authors
- *
- * The Universal Permissive License (UPL), Version 1.0
- *
- * Subject to the condition set forth below, permission is hereby granted to any
- * person obtaining a copy of this software, associated documentation and/or data
- * (collectively the "Software"), free of charge and under any and all copyright
- * rights in the Software, and any and all patent rights owned or freely
- * licensable by each licensor hereunder covering either (i) the unmodified
- * Software as contributed to or provided by such licensor, or (ii) the Larger
- * Works (as defined below), to deal in both
- *
- * (a) the Software, and
- * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if
- * one is included with the Software (each a "Larger Work" to which the Software
- * is contributed by such licensors),
- *
- * without restriction, including without limitation the rights to copy, create
- * derivative works of, display, perform, and distribute the Software and make,
- * use, sell, offer for sale, import, export, have made, and have sold the
- * Software and the Larger Work(s), and to sublicense the foregoing rights on
- * either these or other terms.
- *
- * This license is subject to the following condition:
- * The above copyright notice and either this complete permission notice or at
- * a minimum a reference to the UPL must be included in all copies or
- * substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-import cryostatLogo from '@app/assets/cryostat_icon_rgb_default.svg';
-import build from '@app/build.json';
-import { QuickStart } from '@patternfly/quickstarts';
-
-// TODO: Put link quickstarts in a separate QuickStartCatalogSection
-const CryostatLinkQuickStart: QuickStart = {
- metadata: {
- name: 'cryostat-link-quickstart',
- instructional: true,
- },
- spec: {
- version: 2.3,
- displayName: 'Cryostat Upstream Documentation',
- durationMinutes: 1,
- icon: cryostatLogo,
- description: `Link to Cryostat's upstream documentation.`,
- prerequisites: [''],
- introduction: '### This is a generic quickstart.',
- link: {
- href: build.homePageUrl,
- text: 'cryostat.io',
- },
- type: {
- text: 'External',
- color: 'purple',
- },
- },
-};
-
-export default CryostatLinkQuickStart;
diff --git a/src/app/QuickStarts/quickstarts/dashboard-quickstart.tsx b/src/app/QuickStarts/quickstarts/dashboard-quickstart.tsx
index ae8f55c536..47eb6917d0 100644
--- a/src/app/QuickStarts/quickstarts/dashboard-quickstart.tsx
+++ b/src/app/QuickStarts/quickstarts/dashboard-quickstart.tsx
@@ -35,16 +35,11 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
-import cryostatLogoIcon from '@app/assets/cryostat_icon_rgb_default.svg';
-import cryostatLogoIconDark from '@app/assets/cryostat_icon_rgb_reverse.svg';
import build from '@app/build.json';
import { FeatureLevel } from '@app/Shared/Services/Settings.service';
-import { withThemedIcon } from '@app/utils/withThemedIcon';
import { QuickStart } from '@patternfly/quickstarts';
import React from 'react';
-import { conclusion } from '../quickstart-utils';
-
-const Icon = withThemedIcon(cryostatLogoIcon, cryostatLogoIconDark, 'Cryostat Logo');
+import { CryostatIcon, conclusion } from '../quickstart-utils';
const displayName = 'Get started with the Dashboard';
@@ -60,7 +55,7 @@ const DashboardQuickStart: QuickStart = {
version: 2.3,
displayName: displayName,
durationMinutes: 10,
- icon: ,
+ icon: ,
description: `Learn about what you can do with the **[APP]** Dashboard.`,
prerequisites: [''],
introduction: `
diff --git a/src/app/QuickStarts/quickstarts/generic-quickstart.tsx b/src/app/QuickStarts/quickstarts/generic-quickstart.tsx
index 46fb4e9c7f..b35aad43fb 100644
--- a/src/app/QuickStarts/quickstarts/generic-quickstart.tsx
+++ b/src/app/QuickStarts/quickstarts/generic-quickstart.tsx
@@ -39,9 +39,9 @@ import cryostatLogo from '@app/assets/cryostat_icon_rgb_default.svg';
import build from '@app/build.json';
import { FeatureLevel } from '@app/Shared/Services/Settings.service';
import { QuickStart } from '@patternfly/quickstarts';
-import { conclusion } from '../quickstart-utils';
import { PficonTemplateIcon } from '@patternfly/react-icons';
import React from 'react';
+import { conclusion } from '../quickstart-utils';
// Quick start name (currently cannot use [APP], there is a bug with how the title gets rendered in the quick start panel)
const displayName = 'Getting started with quick starts in Cryostat';
@@ -71,7 +71,6 @@ const GenericQuickStart: QuickStart = {
# - If set to null (icon: ~) will not show an icon
*/
icon: ,
- // icon: 'cryostatLogo' || '',
prerequisites: [
'You can optionally list prerequisites',
'Another prerequisite',
diff --git a/src/app/QuickStarts/quickstarts/settings-quickstart.tsx b/src/app/QuickStarts/quickstarts/settings-quickstart.tsx
index f5d5ae2d72..38bea7e0fe 100644
--- a/src/app/QuickStarts/quickstarts/settings-quickstart.tsx
+++ b/src/app/QuickStarts/quickstarts/settings-quickstart.tsx
@@ -35,7 +35,6 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
-import build from '@app/build.json';
import { FeatureLevel } from '@app/Shared/Services/Settings.service';
import { QuickStart } from '@patternfly/quickstarts';
import { CogIcon } from '@patternfly/react-icons';
diff --git a/src/app/QuickStarts/quickstarts/start-a-recording.tsx b/src/app/QuickStarts/quickstarts/start-a-recording.tsx
index 12b816cae4..05e732b64c 100644
--- a/src/app/QuickStarts/quickstarts/start-a-recording.tsx
+++ b/src/app/QuickStarts/quickstarts/start-a-recording.tsx
@@ -35,16 +35,11 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
-import cryostatLogoIcon from '@app/assets/cryostat_icon_rgb_default.svg';
-import cryostatLogoIconDark from '@app/assets/cryostat_icon_rgb_reverse.svg';
import build from '@app/build.json';
import { FeatureLevel } from '@app/Shared/Services/Settings.service';
-import { withThemedIcon } from '@app/utils/withThemedIcon';
import { QuickStart } from '@patternfly/quickstarts';
import React from 'react';
-import { conclusion } from '../quickstart-utils';
-
-const Icon = withThemedIcon(cryostatLogoIcon, cryostatLogoIconDark, 'Cryostat Icon');
+import { CryostatIcon, conclusion } from '../quickstart-utils';
const displayName = 'Start a Recording';
@@ -58,7 +53,7 @@ const RecordingQuickStart: QuickStart = {
version: 2.3,
displayName: displayName,
durationMinutes: 10,
- icon: ,
+ icon: ,
description: `Learn how to start a recording with Java Flight Recorder (JFR) with **[APP]**.`,
prerequisites: [''],
introduction: `
@@ -79,7 +74,7 @@ const RecordingQuickStart: QuickStart = {
`,
tasks: [
{
- title: 'Go to the Recordings tab',
+ title: 'Go to the Recordings page',
description: '1. In the [APP] console navigation bar, click [Recordings]{{highlight nav-recordings-tab}}.',
review: {
instructions: '#### Verify that you see the Recordings page.',
@@ -111,7 +106,7 @@ There are two tabs within the Recordings page:
**Active recordings** are recordings that only exist only within the target JVM. **Archived recordings** are recordings that have been saved from the target JVM and copied to [APP]'s storage volume.
-Start an active recording:
+To start an active recording:
1. Click [Create]{{highlight recordings-create-btn}} to open the **Custom Flight Recording Form**.
[If you have a smaller viewport, the \`Create\` button may not be immediately visible. In this case, you can click on the kebab button (three vertical dots) to reveal additional options, including \`Create\`."]{{admonition note}}
diff --git a/src/app/QuickStarts/quickstarts/topology/custom-target-quickstart.tsx b/src/app/QuickStarts/quickstarts/topology/custom-target-quickstart.tsx
new file mode 100644
index 0000000000..43688d1134
--- /dev/null
+++ b/src/app/QuickStarts/quickstarts/topology/custom-target-quickstart.tsx
@@ -0,0 +1,159 @@
+/*
+ * Copyright The Cryostat Authors
+ *
+ * The Universal Permissive License (UPL), Version 1.0
+ *
+ * Subject to the condition set forth below, permission is hereby granted to any
+ * person obtaining a copy of this software, associated documentation and/or data
+ * (collectively the "Software"), free of charge and under any and all copyright
+ * rights in the Software, and any and all patent rights owned or freely
+ * licensable by each licensor hereunder covering either (i) the unmodified
+ * Software as contributed to or provided by such licensor, or (ii) the Larger
+ * Works (as defined below), to deal in both
+ *
+ * (a) the Software, and
+ * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if
+ * one is included with the Software (each a "Larger Work" to which the Software
+ * is contributed by such licensors),
+ *
+ * without restriction, including without limitation the rights to copy, create
+ * derivative works of, display, perform, and distribute the Software and make,
+ * use, sell, offer for sale, import, export, have made, and have sold the
+ * Software and the Larger Work(s), and to sublicense the foregoing rights on
+ * either these or other terms.
+ *
+ * This license is subject to the following condition:
+ * The above copyright notice and either this complete permission notice or at
+ * a minimum a reference to the UPL must be included in all copies or
+ * substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+import { conclusion, CryostatIcon } from '@app/QuickStarts/quickstart-utils';
+import { FeatureLevel } from '@app/Shared/Services/Settings.service';
+import { QuickStart } from '@patternfly/quickstarts';
+import * as React from 'react';
+
+const CustomTargetQuickstart: QuickStart = {
+ metadata: {
+ name: 'topology/create-custom-target-quickstart',
+ featureLevel: FeatureLevel.PRODUCTION,
+ },
+ spec: {
+ version: 2.3,
+ displayName: 'Create a Custom Target',
+ durationMinutes: 10,
+ icon: ,
+ description: `Don't see your applications? Use Custom Targets to tell Cryostat about them!`,
+ introduction: `
+## Custom Targets
+By default, target JVMs are automatically discovered over remote Java Management Extensions (JMX) by **Cryostat**, using various mechanisms (e.g. **Kubernetes API**, **JDP**).
+However, in some cases (e.g. JMX port is not 9091 and port name is not jfr-jmx), Cryostat might not see your applications. Fortunately, you can tell Cryostat about them by specifying **Custom Targets**.
+
+### What you'll learn
+- How to test and create a Custom Target definition
+
+### What you'll need
+
+- A Java application that Cryostat cannot automatically discover
+- The connection URL and JMX credentials, if required, for that application
+`,
+ tasks: [
+ {
+ title: 'Go to the Topology page',
+ description: `1. In the [APP] console navigation bar, click the [Topology]{{highlight nav-topology-tab}}.`,
+ review: {
+ instructions: '#### Verify that you see the Topology page.',
+ failedTaskHelp:
+ 'If you do not see the navigation bar, click the [menu button]{{highlight nav-toggle-btn}} on the masthead.',
+ },
+ },
+ {
+ title: 'Open Custom Target Creation Form',
+ description: `
+
+1. From the toolbar, click on the [catalog icon]{{highlight topology-catalog-btn}}.
+
+ This will open a modal containing the **Topology Entity Catalog**.
+
+[Alternatively, press Ctrl + Space or righ click the topology view (this will open a mini catalog for quick access).]{{admonition tip}}
+
+2. Find and select the **Custom Target** option. To aid you search, use the search bar.
+3. Click on the **Create** button to open the **Custom Target Creation Form**.
+`,
+ review: {
+ instructions: '#### Verify that you can open the catalog and select Custom Target.',
+ failedTaskHelp: 'If you do not see the Custom Target option, use the search bar to find it.',
+ },
+ },
+ {
+ title: 'Fill out the Custom Target form',
+ description: `
+1. Enter the **Connection URL** for the target into the [Connection URL]{{highlight ct-connecturl-input}} field.
+2. Optionally assign an **Alias** to the target by using the [Alias]{{highlight ct-alias-input}} field.
+3. If the target has **JMX authentication** enabled, click the [JMX Credential Option]{{highlight ct-credential-expand}} to expand the form.
+4. Use the [Username]{{highlight ct-username-input}} and [Password]{{highlight ct-password-input}} fields to enter the username and password.
+`,
+ review: {
+ instructions: '#### Verify that you have filled out the form.',
+ failedTaskHelp:
+ 'Click the [JMX Credential Option]{{highlight ct-credential-expand}} to expand the form to reveal the username and password fields.',
+ },
+ },
+ {
+ title: 'Test the custom target definition.',
+ description: `
+After form is filled, the [sample node]{{highlight ct-sample-testnode}} will be populated with those information.
+
+To test the **Custom Target** definition:
+
+1. Click on the [sample node icon]{{highlight ct-sample-testnode-icon}} to test your custom target definition. **Cryostat** will attempt a connection to the target defined by the form data.
+2. If the attempt succeeds, a **Checkmark** icon is shown. Otherwise, an **Exclaimation** icon along with an alert banner that describes the error.
+3. Re-enter the form and repeat step 1-2 until you have a valid definition.
+`,
+ review: {
+ instructions: '#### Verify that you can test the custom target definition.',
+ failedTaskHelp: 'You must provide a valid **Connection URL** to enable testing.',
+ },
+ },
+ {
+ title: 'Create the Custom Target.',
+ description: `
+To create the **Custom Target** definition:
+
+1. Click [Create]{{highlight ct-create-btn}}.
+2. If the submission is successful, the view will automatically be directed to the **Topology** page. Otherwise, revise your form inputs.
+`,
+ review: {
+ instructions: '#### Verify that you can create the custom target and redirected to Topology View.',
+ failedTaskHelp: 'Revise your **Custom Target** definition to ensure it is valid.',
+ },
+ },
+ {
+ title: 'View the Custom Target.',
+ description: `
+The **Custom Target** will appear under **Custom Targets Realm**.
+[In Graph View, use the toolbar to filter out the **Custom Targets Realm** and the control bar to fit graph into screen, if needed.]{{admonition tip}}
+`,
+ review: {
+ instructions: '#### Verify that you can can see the Custom Target.',
+ failedTaskHelp: 'In a clustered graph, use the filter and control bar to adjust the view.',
+ },
+ },
+ ],
+ conclusion: conclusion('Create a Custom Target', 'Custom Targets'),
+ type: {
+ text: 'Featured',
+ color: 'blue',
+ },
+ },
+};
+
+export default CustomTargetQuickstart;
diff --git a/src/app/QuickStarts/quickstarts/topology/group-start-recordings.tsx b/src/app/QuickStarts/quickstarts/topology/group-start-recordings.tsx
new file mode 100644
index 0000000000..942d6089df
--- /dev/null
+++ b/src/app/QuickStarts/quickstarts/topology/group-start-recordings.tsx
@@ -0,0 +1,139 @@
+/*
+ * Copyright The Cryostat Authors
+ *
+ * The Universal Permissive License (UPL), Version 1.0
+ *
+ * Subject to the condition set forth below, permission is hereby granted to any
+ * person obtaining a copy of this software, associated documentation and/or data
+ * (collectively the "Software"), free of charge and under any and all copyright
+ * rights in the Software, and any and all patent rights owned or freely
+ * licensable by each licensor hereunder covering either (i) the unmodified
+ * Software as contributed to or provided by such licensor, or (ii) the Larger
+ * Works (as defined below), to deal in both
+ *
+ * (a) the Software, and
+ * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if
+ * one is included with the Software (each a "Larger Work" to which the Software
+ * is contributed by such licensors),
+ *
+ * without restriction, including without limitation the rights to copy, create
+ * derivative works of, display, perform, and distribute the Software and make,
+ * use, sell, offer for sale, import, export, have made, and have sold the
+ * Software and the Larger Work(s), and to sublicense the foregoing rights on
+ * either these or other terms.
+ *
+ * This license is subject to the following condition:
+ * The above copyright notice and either this complete permission notice or at
+ * a minimum a reference to the UPL must be included in all copies or
+ * substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+import { conclusion, CryostatIcon } from '@app/QuickStarts/quickstart-utils';
+import { FeatureLevel } from '@app/Shared/Services/Settings.service';
+import { QuickStart } from '@patternfly/quickstarts';
+import * as React from 'react';
+
+const GroupStartRecordingQuickStart: QuickStart = {
+ apiVersion: 'v2.3.0',
+ metadata: {
+ name: 'topology/start-group-recording',
+ featureLevel: FeatureLevel.PRODUCTION,
+ },
+ spec: {
+ version: 2.3,
+ displayName: 'Start recording on multiple target JVMs',
+ durationMinutes: 5,
+ icon: ,
+ description: 'Learn how to start recordings on multiple targets at once.',
+ introduction: `
+## Topology View
+The **Cryostat Topology** provides a visual presentation of all targets discovered by **Cryostat**, using various mechanisms (e.g. **Kubernetes API**, **JDP**) that represent **Realms**.
+
+With **Topology** view, you can perform actions (i.e. start recording) on an individual target or a group of targets, using either **Graph View** or **List View**.
+
+### What you'll learn
+- How to start recording on a group of targets
+
+### What you'll need
+
+- A running instance of Cryostat which has discovered at least one target JVM
+- JMX auth credentials for the target JVM (if required)
+`,
+ tasks: [
+ {
+ title: 'Go to the Topology page',
+ description: `1. In the [APP] console navigation bar, click the [Topology]{{highlight nav-topology-tab}}.`,
+ review: {
+ instructions: '#### Verify that you see the Topology page.',
+ failedTaskHelp:
+ 'If you do not see the navigation bar, click the [menu button]{{highlight nav-toggle-btn}} on the masthead.',
+ },
+ },
+ {
+ title: 'Open action menu for a group',
+ description: `
+To open the action menu for a target group:
+
+- *Graph View*: Right-click a target group to display the **Action** menu.
+
+- *List View*: Click the **Action** dropdown menu next to the group name.
+`,
+ review: {
+ instructions: '#### Verify that you see action menu.',
+ failedTaskHelp: `
+In *Graph View*, the line surronding the targets represents the group.
+
+In *List View*, to reveal nested groups, click on list rows.`,
+ },
+ },
+ {
+ title: 'Start recording for a group of targets.',
+ description: `
+To start recording for targets under the selected group, select \`Start recording\` option.
+
+On each descendant target, **Cryostat** will create an active recording, named \`cryostat_topology_action\` with a label
+\`cryostat.io.topology-group=\` that represents the group the action is invoked on.
+
+[In some cases (e.g. missing JMX Credentials), **Cryostat** will fail to start recording on some targets.]{{admonition warning}}
+`,
+ review: {
+ instructions: '#### Verify that you can start recording on a group of targets.',
+ failedTaskHelp: `If you do not see the **Action** menu, follow the previous steps again.`,
+ },
+ },
+ {
+ title: 'Check the started recordings.',
+ description: `
+To check the started recordings in the previous step:
+
+1. In the [APP] console navigation bar, click [Recordings]{{highlight nav-recordings-tab}} to go to **Recording** page.
+2. Click the [Target Select]{{highlight target-select}} dropdown menu.
+3. Select a target that belong to the selected group.
+4. The recording will be displayed with name \`cryostat_topology_action\` and a label \`cryostat.io.topology-group=\`
+
+[In **Topology Graph View**, targets (i.e. nodes) that have any \`RUNNING\` active recordings, will have an decorator on its top-right corner to indicate so.]{{admonition tip}}
+`,
+ review: {
+ instructions: '#### Verify that you can start recording on a group of targets.',
+ failedTaskHelp: `If you do not see the recording, follow the previous steps again.`,
+ },
+ },
+ ],
+ conclusion: conclusion('Start recording on multiple target JVMs', 'Topology'),
+ type: {
+ text: 'Featured',
+ color: 'blue',
+ },
+ nextQuickStart: ['custom-target-quickstart'],
+ },
+};
+
+export default GroupStartRecordingQuickStart;
diff --git a/src/app/Topology/Actions/CreateTarget.tsx b/src/app/Topology/Actions/CreateTarget.tsx
index 382cbdb3e7..14691e7c88 100644
--- a/src/app/Topology/Actions/CreateTarget.tsx
+++ b/src/app/Topology/Actions/CreateTarget.tsx
@@ -343,6 +343,7 @@ export const CreateTarget: React.FC = ({ prefilled, ..._props
onChange={handleConnectUrlChange}
isDisabled={loading || testing}
validated={validConnectUrl}
+ data-quickstart-id="ct-connecturl-input"
/>
= ({ prefilled, ..._props
id="alias"
onChange={handleAliasChange}
isDisabled={loading || testing}
+ data-quickstart-id="ct-alias-input"
/>
-
+ = ({ prefilled, ..._props
id="username"
onChange={handleUsernameChange}
isDisabled={loading || testing}
+ data-quickstart-id="ct-username-input"
/>
= ({ prefilled, ..._props
type="password"
id="password"
onChange={handlePasswordChange}
+ data-quickstart-id="ct-password-input"
/>
@@ -427,6 +431,7 @@ export const CreateTarget: React.FC = ({ prefilled, ..._props
isDisabled={!connectUrl || validConnectUrl !== ValidatedOptions.success || loading}
onClick={handleSubmit}
{...createButtonLoadingProps}
+ data-quickstart-id="ct-create-btn"
>
{loading ? t('CREATING', { ns: 'common' }) : t('CREATE', { ns: 'common' })}
@@ -494,39 +499,46 @@ export const SampleNodeDonut: React.FC = ({
)}
-
-
-
+
+
- {testing ? : }
+
+ {testing ? : }
+
+
{statusIcon.icon}
-
{statusIcon.icon}
-
-
-
-
-
-
- {'CT'}
- {_transformedTarget.alias || ''}
-
-
+
+
+
+
+ {'CT'}
+
+ {_transformedTarget.alias || ''}
+
+
+ Click on the sample node above to test custom target definition.
diff --git a/src/app/Topology/Toolbar/QuickSearchButton.tsx b/src/app/Topology/Toolbar/QuickSearchButton.tsx
index 8e70dafc59..eec3742dd9 100644
--- a/src/app/Topology/Toolbar/QuickSearchButton.tsx
+++ b/src/app/Topology/Toolbar/QuickSearchButton.tsx
@@ -48,7 +48,12 @@ export interface QuickSearchButtonProps {
export const QuickSearchButton: React.FC = ({ onClick, tooltipContent, ...props }) => {
return (
-