Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import React, { useState } from 'react';
import { Select, SelectOption } from '@patternfly/react-core';

export type EdgeState = 'active' | 'extraneous';
type EdgeStateSelectProps = {
edgeState: EdgeState;
setEdgeState: (state) => void;
};

function EdgeStateSelect({ edgeState, setEdgeState }: EdgeStateSelectProps) {
const [isOpen, setIsOpen] = useState(false);

function onToggle() {
setIsOpen(!isOpen);
}

function onSelect() {
const newEdgeState = edgeState === 'active' ? 'extraneous' : 'active';
setEdgeState(newEdgeState);
}

return (
<Select
variant="single"
isOpen={isOpen}
onToggle={onToggle}
onSelect={onSelect}
selections={edgeState}
>
<SelectOption
value="active"
description="Traffic observed in your selected time window."
>
Active traffic
</SelectOption>
<SelectOption
value="extraneous"
description="Inactive flows allowed by your network policies in your selected time window."
>
Extraneous flows
</SelectOption>
</Select>
);
}

export default EdgeStateSelect;
Original file line number Diff line number Diff line change
@@ -1,11 +1,25 @@
import React, { useEffect, useState } from 'react';
import { PageSection, Title, Flex, FlexItem, Bullseye, Spinner } from '@patternfly/react-core';
import {
PageSection,
Title,
Flex,
FlexItem,
Bullseye,
Spinner,
Button,
Divider,
Toolbar,
ToolbarContent,
ToolbarGroup,
ToolbarItem,
} from '@patternfly/react-core';
import { Model } from '@patternfly/react-topology';

import { fetchNetworkFlowGraph } from 'services/NetworkService';
import { fetchClustersAsArray, Cluster } from 'services/ClustersService';

import PageTitle from 'Components/PageTitle';
import EdgeStateSelect, { EdgeState } from './EdgeStateSelect';
import NetworkGraph from './NetworkGraph';
import { transformData, graphModel } from './utils';

Expand All @@ -16,6 +30,7 @@ const emptyModel = {
};

function NetworkGraphPage() {
const [edgeState, setEdgeState] = useState<EdgeState>('active');
const [model, setModel] = useState<Model>(emptyModel);
const [isLoading, setIsLoading] = useState(false);
const [clusters, setClusters] = useState<Cluster[]>([]);
Expand Down Expand Up @@ -53,9 +68,34 @@ function NetworkGraphPage() {
<FlexItem flex={{ default: 'flex_1' }}>
<Title headingLevel="h1">Network Graph</Title>
</FlexItem>
<Button variant="secondary">Manage CIDR blocks</Button>
<Button variant="secondary">Simulate network policy</Button>
</Flex>
</PageSection>
<PageSection className="network-graph no-padding">
<Divider component="div" />
<PageSection className="network-graph" padding={{ default: 'noPadding' }}>
<Toolbar data-testid="network-graph-toolbar">
<ToolbarContent>
<ToolbarGroup variant="filter-group">
<ToolbarItem>
<EdgeStateSelect
edgeState={edgeState}
setEdgeState={setEdgeState}
/>
</ToolbarItem>
<ToolbarItem>in the past hour</ToolbarItem>
</ToolbarGroup>
<ToolbarGroup>
<ToolbarItem>Add one or more deployment filters</ToolbarItem>
<ToolbarItem>Display options</ToolbarItem>
</ToolbarGroup>
<ToolbarGroup alignment={{ default: 'alignRight' }}>
<Divider component="div" isVertical />
<ToolbarItem>Last updated at 12:34PM</ToolbarItem>
</ToolbarGroup>
</ToolbarContent>
</Toolbar>
<Divider component="div" />
{model.nodes && <NetworkGraph model={model} />}
{isLoading && (
<Bullseye>
Expand Down