joyent-portal/packages/my-joy-beta/src/components/create-instance/firewall.js

192 lines
5.1 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* eslint-disable camelcase */
import React, { Fragment } from 'react';
import { Field } from 'redux-form';
import { Margin, Padding } from 'styled-components-spacing';
import Flex, { FlexItem } from 'styled-flex-component';
import styled from 'styled-components';
import remcalc from 'remcalc';
import {
H3,
FormGroup,
Toggle,
Divider,
Row,
Col,
TagList,
P
} from 'joyent-ui-toolkit';
import Tag from '@components/instances/tags';
import Empty from './empty';
const capitalizeFirstLetter = string =>
string.charAt(0).toUpperCase() + string.slice(1);
const Box = styled.div`
display: inline-block;
background-color: ${props => props.theme.white};
border: ${remcalc(1)} solid ${props => props.theme.grey};
min-width: 100%;
`;
const Wildcards = {
vmall: 'All VMs in DC',
any: 'Any'
};
const parsePartial = (p, index) => {
if (p[0] === 'wildcard') {
return <span key={index}>{Wildcards[p[1]]}</span>;
}
if (p[0] === 'tag') {
const value = Array.isArray(p[1]) ? p[1][1] : '';
const name = Array.isArray(p[1]) ? p[1][0] : p[1];
return <Tag key={index} name={name} value={value} />;
}
};
const Rule = ({ enabled, rule_obj }) => {
const { action, protocol } = rule_obj;
const froms = rule_obj.from.map(parsePartial);
const tos = rule_obj.to.map(parsePartial);
return (
<Box disabled={!enabled}>
<Padding left={3} right={3} top={2} bottom={2}>
<Row>
<Col xs={3}>
<Flex justifyStart alignCenter contentStretch>
<Margin right={0.5}>
<FlexItem>
<b>From: </b>
</FlexItem>
</Margin>
<FlexItem grow={1}>
<TagList>{froms}</TagList>
</FlexItem>
</Flex>
</Col>
<Col xs={3}>
<Flex justifyStart alignCenter contentStretch>
<Margin right={0.5}>
<FlexItem>
<b>To: </b>
</FlexItem>
</Margin>
<FlexItem grow={1}>
<TagList>{tos}</TagList>
</FlexItem>
</Flex>
</Col>
<Col xs={2}>
<Flex justifyStart alignCenter contentStretch>
<Margin right={0.5}>
<FlexItem>
<b>Protocol: </b>
</FlexItem>
</Margin>
<FlexItem grow={1}>{protocol.name}</FlexItem>
</Flex>
</Col>
<Col xs={2}>
<Flex justifyStart alignCenter contentStretch>
<Margin right={0.5}>
<FlexItem>
<b>Ports: </b>
</FlexItem>
</Margin>
<FlexItem grow={1}>{protocol.targets.join(';')}</FlexItem>
</Flex>
</Col>
<Col xs={2}>
<Flex justifyStart alignCenter contentStretch>
<Margin right={0.5}>
<FlexItem>
<b>Action: </b>
</FlexItem>
</Margin>
<FlexItem grow={1}>{capitalizeFirstLetter(action)}</FlexItem>
</Flex>
</Col>
</Row>
</Padding>
</Box>
);
};
export default ({
defaultRules = [],
tagRules = [],
enabled = false,
handleSubmit
}) => (
<form onSubmit={handleSubmit}>
<Margin bottom={4}>
<FormGroup name="enabled" field={Field}>
<Toggle>Enable firewall rules</Toggle>
</FormGroup>
{enabled ? (
<FormGroup name="show-inactive" field={Field}>
<Toggle>Show inactive rules</Toggle>
</FormGroup>
) : null}
</Margin>
{enabled && defaultRules.length ? (
<Fragment>
<H3 noMargin>Default firewall rules</H3>
<Margin top={3}>
{defaultRules.map(rule => (
<Margin bottom={2}>
<Rule key={rule.id} {...rule} />
</Margin>
))}
</Margin>
</Fragment>
) : null}
{enabled && !defaultRules.length ? (
<Margin bottom={4}>
<Empty>Sorry, but we werent able to find any firewalls.</Empty>
</Margin>
) : null}
{enabled && tagRules.length && defaultRules.length ? (
<Divider height={remcalc(18)} transparent />
) : null}
{enabled && tagRules.length ? (
<Fragment>
<H3 noMargin>Firewall rules from instance tags</H3>
<Margin top={3}>
{tagRules.map(rule => (
<Margin bottom={2}>
<Rule key={rule.id} {...rule} />
</Margin>
))}
</Margin>
</Fragment>
) : null}
{enabled && (tagRules.length || defaultRules.length) ? (
<Divider height={remcalc(12)} transparent />
) : null}
{enabled ? (
<Margin bottom={4}>
<P>
*Other firewall rules may apply as defined by wildcard(s), IP(s),
subnet(s), tag(s) or VM(s). Please see{' '}
<a
href="https://apidocs.joyent.com/cloudapi/#firewall-rule-syntax"
target="_blank"
rel="noopener noreferrer"
>
firewall rule list
</a>{' '}
for more details.
</P>
</Margin>
) : null}
</form>
);