parent
52d651a598
commit
31d88baf44
@ -10,7 +10,7 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"apr-main": "^4.0.2",
|
"apr-main": "^4.0.2",
|
||||||
"brule": "^3.1.0",
|
"brule": "^3.1.0",
|
||||||
"cloudapi-gql": "^4.3.1",
|
"cloudapi-gql": "^4.5.0",
|
||||||
"hapi": "^17.2.0",
|
"hapi": "^17.2.0",
|
||||||
"inert": "^5.1.0",
|
"inert": "^5.1.0",
|
||||||
"joyent-navigation": "^1.0.0",
|
"joyent-navigation": "^1.0.0",
|
||||||
|
@ -39,9 +39,10 @@ const fullTheme = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
spacing: {
|
spacing: {
|
||||||
0.5: remcalc(4),
|
|
||||||
0: remcalc(0),
|
0: remcalc(0),
|
||||||
|
0.5: remcalc(3),
|
||||||
1: remcalc(6),
|
1: remcalc(6),
|
||||||
|
1.5: remcalc(9),
|
||||||
2: remcalc(12),
|
2: remcalc(12),
|
||||||
3: remcalc(18),
|
3: remcalc(18),
|
||||||
4: remcalc(24),
|
4: remcalc(24),
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -2082,7 +2082,7 @@ exports[`renders <Tag /> without throwing 1`] = `
|
|||||||
border-radius: 0.1875rem;
|
border-radius: 0.1875rem;
|
||||||
font-size: 0.8125rem;
|
font-size: 0.8125rem;
|
||||||
line-height: 1.125rem;
|
line-height: 1.125rem;
|
||||||
padding: 0.375rem 0.75rem;
|
padding: 0.3125rem 0.75rem;
|
||||||
display: -webkit-box;
|
display: -webkit-box;
|
||||||
display: -webkit-flex;
|
display: -webkit-flex;
|
||||||
display: -ms-flexbox;
|
display: -ms-flexbox;
|
||||||
@ -2138,7 +2138,7 @@ exports[`renders <Tag name value/> without throwing 1`] = `
|
|||||||
border-radius: 0.1875rem;
|
border-radius: 0.1875rem;
|
||||||
font-size: 0.8125rem;
|
font-size: 0.8125rem;
|
||||||
line-height: 1.125rem;
|
line-height: 1.125rem;
|
||||||
padding: 0.375rem 0.75rem;
|
padding: 0.3125rem 0.75rem;
|
||||||
display: -webkit-box;
|
display: -webkit-box;
|
||||||
display: -webkit-flex;
|
display: -webkit-flex;
|
||||||
display: -ms-flexbox;
|
display: -ms-flexbox;
|
||||||
|
275
packages/my-joy-beta/src/components/__tests__/firewall.spec.js
Normal file
275
packages/my-joy-beta/src/components/__tests__/firewall.spec.js
Normal file
@ -0,0 +1,275 @@
|
|||||||
|
import React, { Fragment } from 'react';
|
||||||
|
import renderer from 'react-test-renderer';
|
||||||
|
import 'jest-styled-components';
|
||||||
|
|
||||||
|
import Firewall, { Rules, TagRules, DefaultRules, ToggleFirewallForm, ToggleInactiveForm } from '../firewall';
|
||||||
|
import Theme from '@mocks/theme';
|
||||||
|
|
||||||
|
const rules = [
|
||||||
|
{
|
||||||
|
id: '3473327e-6d0c-4747-97c5-ced1260a7e42',
|
||||||
|
enabled: true,
|
||||||
|
rule_str: 'FROM any TO all vms ALLOW icmp TYPE 8 CODE 0',
|
||||||
|
rule_obj: {
|
||||||
|
from: [['wildcard', 'any']],
|
||||||
|
to: [['wildcard', 'vmall']],
|
||||||
|
action: 'allow',
|
||||||
|
protocol: {
|
||||||
|
name: 'icmp',
|
||||||
|
targets: ['8:0']
|
||||||
|
},
|
||||||
|
isWildcard: true,
|
||||||
|
tags: []
|
||||||
|
},
|
||||||
|
global: true,
|
||||||
|
description: null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: '24d55d2f-12ba-4935-9de9-ac305b8a40a5',
|
||||||
|
enabled: true,
|
||||||
|
rule_str: 'FROM any TO all vms ALLOW icmp6 TYPE all',
|
||||||
|
rule_obj: {
|
||||||
|
from: [['wildcard', 'any']],
|
||||||
|
to: [['wildcard', 'vmall']],
|
||||||
|
action: 'allow',
|
||||||
|
protocol: {
|
||||||
|
name: 'icmp6',
|
||||||
|
targets: ['all']
|
||||||
|
},
|
||||||
|
isWildcard: true,
|
||||||
|
tags: []
|
||||||
|
},
|
||||||
|
global: true,
|
||||||
|
description: 'allow all ICMPv6 types'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: '4bd8b2e2-981b-474b-9b8b-0b53fecb4b71',
|
||||||
|
enabled: false,
|
||||||
|
rule_str: 'FROM all vms TO all vms ALLOW tcp PORT all',
|
||||||
|
rule_obj: {
|
||||||
|
from: [['wildcard', 'vmall']],
|
||||||
|
to: [['wildcard', 'vmall']],
|
||||||
|
action: 'allow',
|
||||||
|
protocol: {
|
||||||
|
name: 'tcp',
|
||||||
|
targets: ['all']
|
||||||
|
},
|
||||||
|
isWildcard: true,
|
||||||
|
tags: []
|
||||||
|
},
|
||||||
|
global: null,
|
||||||
|
description: null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'af549024-b3b1-43bf-8a66-49c2b2dc5640',
|
||||||
|
enabled: false,
|
||||||
|
rule_str: 'FROM all vms TO all vms ALLOW tcp PORT all',
|
||||||
|
rule_obj: {
|
||||||
|
from: [['wildcard', 'vmall']],
|
||||||
|
to: [['wildcard', 'vmall']],
|
||||||
|
action: 'allow',
|
||||||
|
protocol: {
|
||||||
|
name: 'tcp',
|
||||||
|
targets: ['all']
|
||||||
|
},
|
||||||
|
isWildcard: true,
|
||||||
|
tags: []
|
||||||
|
},
|
||||||
|
global: null,
|
||||||
|
description: null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: '9e5a152a-582b-4525-909e-f9c55deb7f03',
|
||||||
|
enabled: false,
|
||||||
|
rule_str: 'FROM any TO tag "wat" ALLOW tcp PORT all',
|
||||||
|
rule_obj: {
|
||||||
|
from: [['wildcard', 'any']],
|
||||||
|
to: [['tag', 'wat']],
|
||||||
|
action: 'allow',
|
||||||
|
protocol: {
|
||||||
|
name: 'tcp',
|
||||||
|
targets: ['all']
|
||||||
|
},
|
||||||
|
isWildcard: false,
|
||||||
|
tags: ['wat']
|
||||||
|
},
|
||||||
|
global: null,
|
||||||
|
description: null
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
it('renders <Rules/> without throwing', () => {
|
||||||
|
expect(
|
||||||
|
renderer
|
||||||
|
.create(
|
||||||
|
<Theme>
|
||||||
|
<Rules />
|
||||||
|
</Theme>
|
||||||
|
)
|
||||||
|
.toJSON()
|
||||||
|
).toMatchSnapshot();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('renders <Rules rules /> without throwing', () => {
|
||||||
|
expect(
|
||||||
|
renderer
|
||||||
|
.create(
|
||||||
|
<Theme>
|
||||||
|
<Rules rules={rules} />
|
||||||
|
</Theme>
|
||||||
|
)
|
||||||
|
.toJSON()
|
||||||
|
).toMatchSnapshot();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('renders <DefaultRules /> without throwing', () => {
|
||||||
|
expect(
|
||||||
|
renderer
|
||||||
|
.create(
|
||||||
|
<Theme>
|
||||||
|
<DefaultRules />
|
||||||
|
</Theme>
|
||||||
|
)
|
||||||
|
.toJSON()
|
||||||
|
).toMatchSnapshot();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('renders <DefaultRules rules /> without throwing', () => {
|
||||||
|
expect(
|
||||||
|
renderer
|
||||||
|
.create(
|
||||||
|
<Theme>
|
||||||
|
<DefaultRules rules={rules} />
|
||||||
|
</Theme>
|
||||||
|
)
|
||||||
|
.toJSON()
|
||||||
|
).toMatchSnapshot();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('renders <TagRules /> without throwing', () => {
|
||||||
|
expect(
|
||||||
|
renderer
|
||||||
|
.create(
|
||||||
|
<Theme>
|
||||||
|
<TagRules />
|
||||||
|
</Theme>
|
||||||
|
)
|
||||||
|
.toJSON()
|
||||||
|
).toMatchSnapshot();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('renders <TagRules rules /> without throwing', () => {
|
||||||
|
expect(
|
||||||
|
renderer
|
||||||
|
.create(
|
||||||
|
<Theme>
|
||||||
|
<TagRules rules={rules} />
|
||||||
|
</Theme>
|
||||||
|
)
|
||||||
|
.toJSON()
|
||||||
|
).toMatchSnapshot();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('renders <ToggleFirewallForm /> without throwing', () => {
|
||||||
|
expect(
|
||||||
|
renderer
|
||||||
|
.create(
|
||||||
|
<Theme>
|
||||||
|
<ToggleFirewallForm />
|
||||||
|
</Theme>
|
||||||
|
)
|
||||||
|
.toJSON()
|
||||||
|
).toMatchSnapshot();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('renders <ToggleFirewallForm submitting /> without throwing', () => {
|
||||||
|
expect(
|
||||||
|
renderer
|
||||||
|
.create(
|
||||||
|
<Theme>
|
||||||
|
<ToggleFirewallForm submitting />
|
||||||
|
</Theme>
|
||||||
|
)
|
||||||
|
.toJSON()
|
||||||
|
).toMatchSnapshot();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('renders <ToggleInactiveForm /> without throwing', () => {
|
||||||
|
expect(
|
||||||
|
renderer
|
||||||
|
.create(
|
||||||
|
<Theme>
|
||||||
|
<ToggleInactiveForm />
|
||||||
|
</Theme>
|
||||||
|
)
|
||||||
|
.toJSON()
|
||||||
|
).toMatchSnapshot();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('renders <Firewall /> without throwing', () => {
|
||||||
|
expect(
|
||||||
|
renderer
|
||||||
|
.create(
|
||||||
|
<Theme>
|
||||||
|
<Firewall />
|
||||||
|
</Theme>
|
||||||
|
)
|
||||||
|
.toJSON()
|
||||||
|
).toMatchSnapshot();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('renders <Firewall defaultRules /> without throwing', () => {
|
||||||
|
expect(
|
||||||
|
renderer
|
||||||
|
.create(
|
||||||
|
<Theme>
|
||||||
|
<Fragment>
|
||||||
|
<Firewall
|
||||||
|
defaultRules={rules.filter(
|
||||||
|
({ rule_obj }) => !rule_obj.tags.length
|
||||||
|
)}
|
||||||
|
enabled
|
||||||
|
/>
|
||||||
|
<Firewall
|
||||||
|
defaultRules={rules.filter(
|
||||||
|
({ rule_obj }) => !rule_obj.tags.length
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
</Fragment>
|
||||||
|
</Theme>
|
||||||
|
)
|
||||||
|
.toJSON()
|
||||||
|
).toMatchSnapshot();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('renders <Firewall tagRules /> without throwing', () => {
|
||||||
|
expect(
|
||||||
|
renderer
|
||||||
|
.create(
|
||||||
|
<Theme>
|
||||||
|
<Fragment>
|
||||||
|
<Firewall
|
||||||
|
tagRules={rules.filter(({ rule_obj }) => rule_obj.tags.length)}
|
||||||
|
enabled
|
||||||
|
/>
|
||||||
|
<Firewall
|
||||||
|
tagRules={rules.filter(({ rule_obj }) => rule_obj.tags.length)}
|
||||||
|
/>
|
||||||
|
</Fragment>
|
||||||
|
</Theme>
|
||||||
|
)
|
||||||
|
.toJSON()
|
||||||
|
).toMatchSnapshot();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('renders <Firewall enabled /> without throwing', () => {
|
||||||
|
expect(
|
||||||
|
renderer
|
||||||
|
.create(
|
||||||
|
<Theme>
|
||||||
|
<Firewall enabled />
|
||||||
|
</Theme>
|
||||||
|
)
|
||||||
|
.toJSON()
|
||||||
|
).toMatchSnapshot();
|
||||||
|
});
|
@ -1923,7 +1923,6 @@ exports[`renders <Packages expanded /> without throwing 1`] = `
|
|||||||
className="c10"
|
className="c10"
|
||||||
>
|
>
|
||||||
<img
|
<img
|
||||||
alt="No packages were found"
|
|
||||||
src="no-packages.svg"
|
src="no-packages.svg"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
@ -2369,7 +2368,6 @@ exports[`renders <Packages isVmSelected /> without throwing 1`] = `
|
|||||||
className="c10"
|
className="c10"
|
||||||
>
|
>
|
||||||
<img
|
<img
|
||||||
alt="No packages were found"
|
|
||||||
src="no-packages.svg"
|
src="no-packages.svg"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
@ -2815,7 +2813,6 @@ exports[`renders <Packages loading /> without throwing 1`] = `
|
|||||||
className="c10"
|
className="c10"
|
||||||
>
|
>
|
||||||
<img
|
<img
|
||||||
alt="No packages were found"
|
|
||||||
src="no-packages.svg"
|
src="no-packages.svg"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
@ -3594,7 +3591,6 @@ exports[`renders <Packages pristine={false} /> without throwing 1`] = `
|
|||||||
className="c10"
|
className="c10"
|
||||||
>
|
>
|
||||||
<img
|
<img
|
||||||
alt="No packages were found"
|
|
||||||
src="no-packages.svg"
|
src="no-packages.svg"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
@ -26,7 +26,7 @@ import {
|
|||||||
MemoryIcon
|
MemoryIcon
|
||||||
} from 'joyent-ui-toolkit';
|
} from 'joyent-ui-toolkit';
|
||||||
|
|
||||||
import Empty from './empty';
|
import Empty from '@components/empty';
|
||||||
|
|
||||||
const GroupIcons = {
|
const GroupIcons = {
|
||||||
MEMORY: <MemoryIcon fill="#32ABCF" />,
|
MEMORY: <MemoryIcon fill="#32ABCF" />,
|
||||||
|
@ -15,7 +15,7 @@ export default ({ children }) => (
|
|||||||
<Padding all={6}>
|
<Padding all={6}>
|
||||||
<Flex alignCenter justifyCenter column>
|
<Flex alignCenter justifyCenter column>
|
||||||
<Margin bottom={2}>
|
<Margin bottom={2}>
|
||||||
<img src={NoPackagesImage} alt="No packages were found" />
|
<img src={NoPackagesImage} />
|
||||||
</Margin>
|
</Margin>
|
||||||
<NoPackagesTitle>{children}</NoPackagesTitle>
|
<NoPackagesTitle>{children}</NoPackagesTitle>
|
||||||
</Flex>
|
</Flex>
|
@ -9,6 +9,7 @@ import is from 'styled-is';
|
|||||||
import {
|
import {
|
||||||
H3,
|
H3,
|
||||||
FormGroup,
|
FormGroup,
|
||||||
|
FormLabel,
|
||||||
Toggle,
|
Toggle,
|
||||||
Divider,
|
Divider,
|
||||||
Row,
|
Row,
|
||||||
@ -18,7 +19,7 @@ import {
|
|||||||
} from 'joyent-ui-toolkit';
|
} from 'joyent-ui-toolkit';
|
||||||
|
|
||||||
import Tag from '@components/tags';
|
import Tag from '@components/tags';
|
||||||
import Empty from './empty';
|
import Empty from '@components/empty';
|
||||||
|
|
||||||
const capitalizeFirstLetter = string =>
|
const capitalizeFirstLetter = string =>
|
||||||
string.charAt(0).toUpperCase() + string.slice(1);
|
string.charAt(0).toUpperCase() + string.slice(1);
|
||||||
@ -41,7 +42,11 @@ const Wildcards = {
|
|||||||
|
|
||||||
const parsePartial = (p, index) => {
|
const parsePartial = (p, index) => {
|
||||||
if (p[0] === 'wildcard') {
|
if (p[0] === 'wildcard') {
|
||||||
return <span key={index}>{Wildcards[p[1]]}</span>;
|
return (
|
||||||
|
<Margin top={1} bottom={1}>
|
||||||
|
<span key={index}>{Wildcards[p[1]]}</span>
|
||||||
|
</Margin>
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (p[0] === 'tag') {
|
if (p[0] === 'tag') {
|
||||||
@ -64,7 +69,7 @@ const Rule = ({ enabled, rule_obj }) => {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<Box disabled={!enabled}>
|
<Box disabled={!enabled}>
|
||||||
<Padding left={3} right={3} top={2} bottom={2}>
|
<Padding left={3} right={3} top={1.5} bottom={1.5}>
|
||||||
<Row>
|
<Row>
|
||||||
<Col xs={3}>
|
<Col xs={3}>
|
||||||
<Flex justifyStart alignCenter contentStretch full>
|
<Flex justifyStart alignCenter contentStretch full>
|
||||||
@ -126,6 +131,55 @@ const Rule = ({ enabled, rule_obj }) => {
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const Rules = ({ rules = [] }) => (
|
||||||
|
<Fragment>
|
||||||
|
{rules.map(rule => (
|
||||||
|
<Margin key={rule.id} bottom={2}>
|
||||||
|
<Rule {...rule} />
|
||||||
|
</Margin>
|
||||||
|
))}
|
||||||
|
</Fragment>
|
||||||
|
);
|
||||||
|
|
||||||
|
export const DefaultRules = ({ rules = [] }) => (
|
||||||
|
<Fragment>
|
||||||
|
<H3 noMargin>Default firewall rules</H3>
|
||||||
|
<Margin top={3}>
|
||||||
|
<Rules rules={rules} />
|
||||||
|
</Margin>
|
||||||
|
</Fragment>
|
||||||
|
);
|
||||||
|
|
||||||
|
export const TagRules = ({ rules = [] }) => (
|
||||||
|
<Fragment>
|
||||||
|
<H3 noMargin>Firewall rules from instance tags</H3>
|
||||||
|
<Margin top={3}>
|
||||||
|
<Rules rules={rules} />
|
||||||
|
</Margin>
|
||||||
|
</Fragment>
|
||||||
|
);
|
||||||
|
|
||||||
|
export const ToggleFirewallForm = ({ handleSubmit, submitting }) => (
|
||||||
|
<form onChange={(...args) => setTimeout(() => handleSubmit(...args), 16)}>
|
||||||
|
<FormGroup name="enabled" type="checkbox" field={Field}>
|
||||||
|
<Flex alignCenter>
|
||||||
|
<FormLabel>Enable Firewall</FormLabel>
|
||||||
|
<Toggle disabled={submitting} />
|
||||||
|
</Flex>
|
||||||
|
</FormGroup>
|
||||||
|
</form>
|
||||||
|
);
|
||||||
|
|
||||||
|
export const ToggleInactiveForm = () => (
|
||||||
|
<form>
|
||||||
|
<FormGroup name="inactive" type="checkbox" field={Field}>
|
||||||
|
<Flex alignCenter>
|
||||||
|
<Toggle>Show inactive rules</Toggle>
|
||||||
|
</Flex>
|
||||||
|
</FormGroup>
|
||||||
|
</form>
|
||||||
|
);
|
||||||
|
|
||||||
export default ({
|
export default ({
|
||||||
defaultRules = [],
|
defaultRules = [],
|
||||||
tagRules = [],
|
tagRules = [],
|
||||||
@ -143,38 +197,16 @@ export default ({
|
|||||||
</FormGroup>
|
</FormGroup>
|
||||||
) : null}
|
) : null}
|
||||||
</Margin>
|
</Margin>
|
||||||
{enabled && defaultRules.length ? (
|
{enabled ? <DefaultRules rules={defaultRules} /> : null}
|
||||||
<Fragment>
|
{enabled && !tagRules.length && !defaultRules.length ? (
|
||||||
<H3 noMargin>Default firewall rules</H3>
|
<Margin top={5}>
|
||||||
<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 weren’t able to find any firewall rules.</Empty>
|
<Empty>Sorry, but we weren’t able to find any firewall rules.</Empty>
|
||||||
</Margin>
|
</Margin>
|
||||||
) : null}
|
) : null}
|
||||||
{enabled && tagRules.length && defaultRules.length ? (
|
{enabled && tagRules.length && defaultRules.length ? (
|
||||||
<Divider height={remcalc(18)} transparent />
|
<Divider height={remcalc(18)} transparent />
|
||||||
) : null}
|
) : null}
|
||||||
{enabled && tagRules.length ? (
|
{enabled && tagRules.length ? <TagRules rules={tagRules} /> : null}
|
||||||
<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) ? (
|
{enabled && (tagRules.length || defaultRules.length) ? (
|
||||||
<Divider height={remcalc(12)} transparent />
|
<Divider height={remcalc(12)} transparent />
|
||||||
) : null}
|
) : null}
|
@ -13,7 +13,7 @@ import { StatusLoader, FirewallIcon, H3, Button } from 'joyent-ui-toolkit';
|
|||||||
|
|
||||||
import Title from '@components/create-instance/title';
|
import Title from '@components/create-instance/title';
|
||||||
import Description from '@components/description';
|
import Description from '@components/description';
|
||||||
import FirewallForm from '@components/create-instance/firewall';
|
import FirewallForm from '@components/firewall';
|
||||||
import ListFwRules from '@graphql/list-fw-rules.gql';
|
import ListFwRules from '@graphql/list-fw-rules.gql';
|
||||||
|
|
||||||
const FORM_NAME = 'CREATE-INSTANCE-FIREWALL';
|
const FORM_NAME = 'CREATE-INSTANCE-FIREWALL';
|
||||||
@ -132,20 +132,13 @@ export default compose(
|
|||||||
refetch
|
refetch
|
||||||
} = data;
|
} = data;
|
||||||
|
|
||||||
const rules = forceArray(firewall_rules_create_machine)
|
const rules = forceArray(firewall_rules_create_machine).filter(
|
||||||
.filter(({ enabled }) => enabled || showInactive)
|
({ enabled }) => enabled || showInactive
|
||||||
.map(({ rule_obj, ...rule }) => ({
|
);
|
||||||
...rule,
|
|
||||||
rule_obj: {
|
|
||||||
...rule_obj,
|
|
||||||
from: forceArray(rule_obj.from).map(f => forceArray(f)),
|
|
||||||
to: forceArray(rule_obj.to).map(t => forceArray(t))
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
defaultRules: rules.filter(({ tag }) => !tag),
|
defaultRules: rules.filter(({ rule_obj = {} }) => rule_obj.isWildcard),
|
||||||
tagRules: rules.filter(({ tag }) => tag),
|
tagRules: rules.filter(({ rule_obj = {} }) => rule_obj.tags.length),
|
||||||
loading,
|
loading,
|
||||||
error,
|
error,
|
||||||
refetch
|
refetch
|
||||||
|
@ -3864,7 +3864,7 @@ exports[`renders <Cns mutating /> without throwing 1`] = `
|
|||||||
border-radius: 0.1875rem;
|
border-radius: 0.1875rem;
|
||||||
font-size: 0.8125rem;
|
font-size: 0.8125rem;
|
||||||
line-height: 1.125rem;
|
line-height: 1.125rem;
|
||||||
padding: 0.375rem 0.75rem;
|
padding: 0.3125rem 0.75rem;
|
||||||
display: -webkit-box;
|
display: -webkit-box;
|
||||||
display: -webkit-flex;
|
display: -webkit-flex;
|
||||||
display: -ms-flexbox;
|
display: -ms-flexbox;
|
||||||
@ -5871,7 +5871,7 @@ exports[`renders <Cns services /> without throwing 1`] = `
|
|||||||
border-radius: 0.1875rem;
|
border-radius: 0.1875rem;
|
||||||
font-size: 0.8125rem;
|
font-size: 0.8125rem;
|
||||||
line-height: 1.125rem;
|
line-height: 1.125rem;
|
||||||
padding: 0.375rem 0.75rem;
|
padding: 0.3125rem 0.75rem;
|
||||||
display: -webkit-box;
|
display: -webkit-box;
|
||||||
display: -webkit-flex;
|
display: -webkit-flex;
|
||||||
display: -ms-flexbox;
|
display: -ms-flexbox;
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -7059,7 +7059,7 @@ exports[`renders <Tags tags /> without throwing 1`] = `
|
|||||||
border-radius: 0.1875rem;
|
border-radius: 0.1875rem;
|
||||||
font-size: 0.8125rem;
|
font-size: 0.8125rem;
|
||||||
line-height: 1.125rem;
|
line-height: 1.125rem;
|
||||||
padding: 0.375rem 0.75rem;
|
padding: 0.3125rem 0.75rem;
|
||||||
display: -webkit-box;
|
display: -webkit-box;
|
||||||
display: -webkit-flex;
|
display: -webkit-flex;
|
||||||
display: -ms-flexbox;
|
display: -ms-flexbox;
|
||||||
|
@ -5,13 +5,6 @@ import 'jest-styled-components';
|
|||||||
import { Cns } from '../cns';
|
import { Cns } from '../cns';
|
||||||
import Theme from '@mocks/theme';
|
import Theme from '@mocks/theme';
|
||||||
|
|
||||||
// services = [],
|
|
||||||
// hostnames = [],
|
|
||||||
// disabled = false,
|
|
||||||
// loading = false,
|
|
||||||
// mutationError = false,
|
|
||||||
// loadingError = null
|
|
||||||
|
|
||||||
it('renders <Cns /> without throwing', () => {
|
it('renders <Cns /> without throwing', () => {
|
||||||
expect(
|
expect(
|
||||||
renderer
|
renderer
|
||||||
|
@ -0,0 +1,224 @@
|
|||||||
|
import React, { Fragment } from 'react';
|
||||||
|
import renderer from 'react-test-renderer';
|
||||||
|
import 'jest-styled-components';
|
||||||
|
|
||||||
|
import { Firewall } from '../firewall';
|
||||||
|
import Theme from '@mocks/theme';
|
||||||
|
|
||||||
|
const rules = [
|
||||||
|
{
|
||||||
|
id: '3473327e-6d0c-4747-97c5-ced1260a7e42',
|
||||||
|
enabled: true,
|
||||||
|
rule_str: 'FROM any TO all vms ALLOW icmp TYPE 8 CODE 0',
|
||||||
|
rule_obj: {
|
||||||
|
from: [['wildcard', 'any']],
|
||||||
|
to: [['wildcard', 'vmall']],
|
||||||
|
action: 'allow',
|
||||||
|
protocol: {
|
||||||
|
name: 'icmp',
|
||||||
|
targets: ['8:0']
|
||||||
|
},
|
||||||
|
isWildcard: true,
|
||||||
|
tags: []
|
||||||
|
},
|
||||||
|
global: true,
|
||||||
|
description: null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: '24d55d2f-12ba-4935-9de9-ac305b8a40a5',
|
||||||
|
enabled: true,
|
||||||
|
rule_str: 'FROM any TO all vms ALLOW icmp6 TYPE all',
|
||||||
|
rule_obj: {
|
||||||
|
from: [['wildcard', 'any']],
|
||||||
|
to: [['wildcard', 'vmall']],
|
||||||
|
action: 'allow',
|
||||||
|
protocol: {
|
||||||
|
name: 'icmp6',
|
||||||
|
targets: ['all']
|
||||||
|
},
|
||||||
|
isWildcard: true,
|
||||||
|
tags: []
|
||||||
|
},
|
||||||
|
global: true,
|
||||||
|
description: 'allow all ICMPv6 types'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: '4bd8b2e2-981b-474b-9b8b-0b53fecb4b71',
|
||||||
|
enabled: false,
|
||||||
|
rule_str: 'FROM all vms TO all vms ALLOW tcp PORT all',
|
||||||
|
rule_obj: {
|
||||||
|
from: [['wildcard', 'vmall']],
|
||||||
|
to: [['wildcard', 'vmall']],
|
||||||
|
action: 'allow',
|
||||||
|
protocol: {
|
||||||
|
name: 'tcp',
|
||||||
|
targets: ['all']
|
||||||
|
},
|
||||||
|
isWildcard: true,
|
||||||
|
tags: []
|
||||||
|
},
|
||||||
|
global: null,
|
||||||
|
description: null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'af549024-b3b1-43bf-8a66-49c2b2dc5640',
|
||||||
|
enabled: false,
|
||||||
|
rule_str: 'FROM all vms TO all vms ALLOW tcp PORT all',
|
||||||
|
rule_obj: {
|
||||||
|
from: [['wildcard', 'vmall']],
|
||||||
|
to: [['wildcard', 'vmall']],
|
||||||
|
action: 'allow',
|
||||||
|
protocol: {
|
||||||
|
name: 'tcp',
|
||||||
|
targets: ['all']
|
||||||
|
},
|
||||||
|
isWildcard: true,
|
||||||
|
tags: []
|
||||||
|
},
|
||||||
|
global: null,
|
||||||
|
description: null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: '9e5a152a-582b-4525-909e-f9c55deb7f03',
|
||||||
|
enabled: false,
|
||||||
|
rule_str: 'FROM any TO tag "wat" ALLOW tcp PORT all',
|
||||||
|
rule_obj: {
|
||||||
|
from: [['wildcard', 'any']],
|
||||||
|
to: [['tag', 'wat']],
|
||||||
|
action: 'allow',
|
||||||
|
protocol: {
|
||||||
|
name: 'tcp',
|
||||||
|
targets: ['all']
|
||||||
|
},
|
||||||
|
isWildcard: false,
|
||||||
|
tags: ['wat']
|
||||||
|
},
|
||||||
|
global: null,
|
||||||
|
description: null
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
it('renders <Firewall /> without throwing', () => {
|
||||||
|
expect(
|
||||||
|
renderer
|
||||||
|
.create(
|
||||||
|
<Theme>
|
||||||
|
<Fragment>
|
||||||
|
<Firewall />
|
||||||
|
<Firewall enabled />
|
||||||
|
</Fragment>
|
||||||
|
</Theme>
|
||||||
|
)
|
||||||
|
.toJSON()
|
||||||
|
).toMatchSnapshot();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('renders <Firewall loading /> without throwing', () => {
|
||||||
|
expect(
|
||||||
|
renderer
|
||||||
|
.create(
|
||||||
|
<Theme>
|
||||||
|
<Fragment>
|
||||||
|
<Firewall loading />
|
||||||
|
<Firewall loading enabled />
|
||||||
|
</Fragment>
|
||||||
|
</Theme>
|
||||||
|
)
|
||||||
|
.toJSON()
|
||||||
|
).toMatchSnapshot();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('renders <Firewall inactive /> without throwing', () => {
|
||||||
|
expect(
|
||||||
|
renderer
|
||||||
|
.create(
|
||||||
|
<Theme>
|
||||||
|
<Fragment>
|
||||||
|
<Firewall inactive />
|
||||||
|
<Firewall inactive enabled />
|
||||||
|
</Fragment>
|
||||||
|
</Theme>
|
||||||
|
)
|
||||||
|
.toJSON()
|
||||||
|
).toMatchSnapshot();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('renders <Firewall loadingError /> without throwing', () => {
|
||||||
|
expect(
|
||||||
|
renderer
|
||||||
|
.create(
|
||||||
|
<Theme>
|
||||||
|
<Firewall loadingError />
|
||||||
|
</Theme>
|
||||||
|
)
|
||||||
|
.toJSON()
|
||||||
|
).toMatchSnapshot();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('renders <Firewall mutationError /> without throwing', () => {
|
||||||
|
expect(
|
||||||
|
renderer
|
||||||
|
.create(
|
||||||
|
<Theme>
|
||||||
|
<Firewall mutationError="error" />
|
||||||
|
</Theme>
|
||||||
|
)
|
||||||
|
.toJSON()
|
||||||
|
).toMatchSnapshot();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('renders <Firewall tagRules /> without throwing', () => {
|
||||||
|
expect(
|
||||||
|
renderer
|
||||||
|
.create(
|
||||||
|
<Theme>
|
||||||
|
<Fragment>
|
||||||
|
<Firewall
|
||||||
|
tagRules={rules.filter(({ rule_obj }) => rule_obj.tags.length)}
|
||||||
|
/>
|
||||||
|
<Firewall
|
||||||
|
tagRules={rules.filter(({ rule_obj }) => rule_obj.tags.length)}
|
||||||
|
inactive
|
||||||
|
/>
|
||||||
|
<Firewall
|
||||||
|
tagRules={rules.filter(({ rule_obj }) => rule_obj.tags.length)}
|
||||||
|
enabled
|
||||||
|
inactive
|
||||||
|
/>
|
||||||
|
</Fragment>
|
||||||
|
</Theme>
|
||||||
|
)
|
||||||
|
.toJSON()
|
||||||
|
).toMatchSnapshot();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('renders <Firewall tagRules /> without throwing', () => {
|
||||||
|
expect(
|
||||||
|
renderer
|
||||||
|
.create(
|
||||||
|
<Theme>
|
||||||
|
<Fragment>
|
||||||
|
<Firewall
|
||||||
|
defaultRules={rules.filter(
|
||||||
|
({ rule_obj }) => rule_obj.tags.length
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
<Firewall
|
||||||
|
defaultRules={rules.filter(
|
||||||
|
({ rule_obj }) => rule_obj.tags.length
|
||||||
|
)}
|
||||||
|
inactive
|
||||||
|
/>
|
||||||
|
<Firewall
|
||||||
|
defaultRules={rules.filter(
|
||||||
|
({ rule_obj }) => rule_obj.tags.length
|
||||||
|
)}
|
||||||
|
enabled
|
||||||
|
inactive
|
||||||
|
/>
|
||||||
|
</Fragment>
|
||||||
|
</Theme>
|
||||||
|
)
|
||||||
|
.toJSON()
|
||||||
|
).toMatchSnapshot();
|
||||||
|
});
|
@ -26,7 +26,7 @@ import UpdateTags from '@graphql/update-tags.gql';
|
|||||||
import GetTags from '@graphql/list-tags.gql';
|
import GetTags from '@graphql/list-tags.gql';
|
||||||
import parseError from '@state/parse-error';
|
import parseError from '@state/parse-error';
|
||||||
|
|
||||||
const CNS_FORM = 'cns-new-service';
|
const FORM_NAME = 'cns-new-service';
|
||||||
|
|
||||||
const CnsContainer = ({
|
const CnsContainer = ({
|
||||||
services = [],
|
services = [],
|
||||||
@ -79,7 +79,7 @@ const CnsContainer = ({
|
|||||||
}
|
}
|
||||||
>
|
>
|
||||||
<ReduxForm
|
<ReduxForm
|
||||||
form={CNS_FORM}
|
form={FORM_NAME}
|
||||||
destroyOnUnmount={false}
|
destroyOnUnmount={false}
|
||||||
forceUnregisterOnUnmount={true}
|
forceUnregisterOnUnmount={true}
|
||||||
onSubmit={val => handleAddService(val, services)}
|
onSubmit={val => handleAddService(val, services)}
|
||||||
@ -155,7 +155,7 @@ export default compose(
|
|||||||
let disabled = JSON.parse(cnsDisable.value || 'false');
|
let disabled = JSON.parse(cnsDisable.value || 'false');
|
||||||
let services = (cnsServices.value || '').split(/,/gi).filter(Boolean);
|
let services = (cnsServices.value || '').split(/,/gi).filter(Boolean);
|
||||||
|
|
||||||
const adding = get(form, `${CNS_FORM}.submitting`, false);
|
const adding = get(form, `${FORM_NAME}.submitting`, false);
|
||||||
const toggling = get(values, `cns-${instance.id}-toggling`, false);
|
const toggling = get(values, `cns-${instance.id}-toggling`, false);
|
||||||
const removing = get(values, `cns-${instance.id}-removing`, false);
|
const removing = get(values, `cns-${instance.id}-removing`, false);
|
||||||
const enabled = get(values, `cns-${instance.id}-enabled`, undefined);
|
const enabled = get(values, `cns-${instance.id}-enabled`, undefined);
|
||||||
@ -343,7 +343,7 @@ export default compose(
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
return dispatch(destroy(CNS_FORM));
|
return dispatch(destroy(FORM_NAME));
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
|
@ -1,104 +1,192 @@
|
|||||||
import React from 'react';
|
import React, { Fragment } from 'react';
|
||||||
|
import intercept from 'apr-intercept';
|
||||||
|
import { connect } from 'react-redux';
|
||||||
|
import { compose, graphql } from 'react-apollo';
|
||||||
|
import ReduxForm from 'declarative-redux-form';
|
||||||
|
import { SubmissionError } from 'redux-form';
|
||||||
|
import { Margin } from 'styled-components-spacing';
|
||||||
|
import remcalc from 'remcalc';
|
||||||
|
import find from 'lodash.find';
|
||||||
|
import get from 'lodash.get';
|
||||||
|
|
||||||
export default () => <p>firewalls</p>;
|
import {
|
||||||
|
ViewContainer,
|
||||||
|
Message,
|
||||||
|
MessageTitle,
|
||||||
|
MessageDescription,
|
||||||
|
StatusLoader,
|
||||||
|
Divider
|
||||||
|
} from 'joyent-ui-toolkit';
|
||||||
|
|
||||||
//
|
import {
|
||||||
// import PropTypes from 'prop-types';
|
ToggleFirewallForm,
|
||||||
// import forceArray from 'force-array';
|
ToggleInactiveForm,
|
||||||
// import { compose, graphql } from 'react-apollo';
|
DefaultRules,
|
||||||
// import find from 'lodash.find';
|
TagRules
|
||||||
// import get from 'lodash.get';
|
} from '@components/firewall';
|
||||||
//
|
|
||||||
// import {
|
import Description from '@components/description';
|
||||||
// ViewContainer,
|
import Empty from '@components/empty';
|
||||||
// StatusLoader,
|
import GetFirewallRules from '@graphql/list-instance-fw-rules.gql';
|
||||||
// Message,
|
import EnableFirewall from '@graphql/enable-instance-fw.gql';
|
||||||
// MessageDescription,
|
import DisableFirewall from '@graphql/disable-instance-fw.gql';
|
||||||
// MessageTitle,
|
import parseError from '@state/parse-error';
|
||||||
// Table,
|
|
||||||
// TableThead,
|
export const Firewall = ({
|
||||||
// TableTr,
|
defaultRules = [],
|
||||||
// TableTh,
|
tagRules = [],
|
||||||
// TableTbody,
|
enabled = false,
|
||||||
// P
|
inactive = false,
|
||||||
// } from 'joyent-ui-toolkit';
|
loading = false,
|
||||||
//
|
loadingError = null,
|
||||||
// import GetFirewallRules from '@graphql/list-firewall-rules.gql';
|
mutationError = null,
|
||||||
// import { FirewallRule as InstanceFirewallRule } from '@components/instances';
|
handleEnabledToggle
|
||||||
//
|
}) => (
|
||||||
// const Firewall = ({
|
<ViewContainer main>
|
||||||
// // eslint-disable-next-line camelcase
|
<Margin bottom={1}>
|
||||||
// firewallEnabled = false,
|
<Description>
|
||||||
// firewallRules = [],
|
Cloud Firewall rules control traffic across instances. Enabling the
|
||||||
// loading,
|
firewall adds a default set of rules and rules defined by your chosen
|
||||||
// error
|
tags.{' '}
|
||||||
// }) => {
|
<a
|
||||||
// const values = forceArray(firewallRules);
|
href="https://docs.joyent.com/private-cloud/install/cns"
|
||||||
// const _loading = !(loading && !values.length) ? null : <StatusLoader />;
|
target="_blank"
|
||||||
//
|
rel="noopener noreferrer"
|
||||||
// const _firewall =
|
>
|
||||||
// _loading && !values.length ? null : (
|
Read the docs
|
||||||
// <Table>
|
</a>
|
||||||
// <TableThead>
|
</Description>
|
||||||
// <TableTr>
|
</Margin>
|
||||||
// <TableTh left bottom>
|
{loading ? <StatusLoader /> : null}
|
||||||
// <P>Rule</P>
|
{!loading && loadingError ? (
|
||||||
// </TableTh>
|
<Message error>
|
||||||
// <TableTh xs="63" center bottom>
|
<MessageTitle>Ooops!</MessageTitle>
|
||||||
// <P>Global</P>
|
<MessageDescription>
|
||||||
// </TableTh>
|
An error occurred while loading your firewall rules
|
||||||
// <TableTh xs="75" center bottom>
|
</MessageDescription>
|
||||||
// <P>Enabled</P>
|
</Message>
|
||||||
// </TableTh>
|
) : null}
|
||||||
// </TableTr>
|
{!loading && mutationError ? (
|
||||||
// </TableThead>
|
<Message error>
|
||||||
// <TableTbody>
|
<MessageTitle>Ooops!</MessageTitle>
|
||||||
// {values.map(network => (
|
<MessageDescription>{mutationError}</MessageDescription>
|
||||||
// <InstanceFirewallRule key={network.id} {...network} />
|
</Message>
|
||||||
// ))}
|
) : null}
|
||||||
// </TableTbody>
|
<ReduxForm
|
||||||
// </Table>
|
form="fw-enabled"
|
||||||
// );
|
destroyOnUnmount={false}
|
||||||
//
|
forceUnregisterOnUnmount={true}
|
||||||
// const _error =
|
initialValues={{ enabled }}
|
||||||
// error && !values.length && !_loading ? (
|
onSubmit={handleEnabledToggle}
|
||||||
// <Message error>
|
>
|
||||||
// <MessageTitle>Ooops!</MessageTitle>
|
{props =>
|
||||||
// <MessageDescription>
|
loading ? null : (
|
||||||
// An error occurred while loading your instance firewall rules
|
<Fragment>
|
||||||
// </MessageDescription>
|
<Margin bottom={7}>
|
||||||
// </Message>
|
<ToggleFirewallForm {...props} />
|
||||||
// ) : null;
|
</Margin>
|
||||||
//
|
<Divider height={remcalc(1)} />
|
||||||
// return (
|
</Fragment>
|
||||||
// <ViewContainer center={Boolean(_loading)} main>
|
)
|
||||||
// {_loading}
|
}
|
||||||
// {_error}
|
</ReduxForm>
|
||||||
// {_firewall}
|
<ReduxForm
|
||||||
// </ViewContainer>
|
form="fw-inactive"
|
||||||
// );
|
destroyOnUnmount={false}
|
||||||
// };
|
forceUnregisterOnUnmount={true}
|
||||||
//
|
initialValues={{ inactive }}
|
||||||
// Firewall.propTypes = {
|
>
|
||||||
// loading: PropTypes.bool
|
{props =>
|
||||||
// };
|
!enabled || loading ? null : (
|
||||||
//
|
<Margin top={4}>
|
||||||
// export default compose(
|
<ToggleInactiveForm {...props} />
|
||||||
// graphql(GetFirewallRules, {
|
</Margin>
|
||||||
// options: ({ match }) => ({
|
)
|
||||||
// pollInterval: 1000,
|
}
|
||||||
// variables: {
|
</ReduxForm>
|
||||||
// name: get(match, 'params.instance')
|
{!loading && !defaultRules.length && !tagRules.length ? (
|
||||||
// }
|
<Margin top={5}>
|
||||||
// }),
|
<Empty>Sorry, but we weren’t able to find any firewall rules.</Empty>
|
||||||
// props: ({ data: { loading, error, variables, ...rest } }) => {
|
</Margin>
|
||||||
// const machine = find(get(rest, 'machines', []), ['name', variables.name]);
|
) : null}
|
||||||
// // eslint-disable-next-line camelcase
|
{!loading && enabled && defaultRules.length ? (
|
||||||
// const firewallEnabled = get(machine, 'firewall_enabled', false);
|
<Margin top={5}>
|
||||||
// const firewallRules = get(machine, 'firewall_rules', []);
|
<DefaultRules rules={defaultRules} />
|
||||||
//
|
</Margin>
|
||||||
// // eslint-disable-next-line camelcase
|
) : null}
|
||||||
// return { firewallEnabled, firewallRules, loading, error };
|
{!loading && enabled && tagRules.length ? (
|
||||||
// }
|
<Margin top={8}>
|
||||||
// })
|
<TagRules rules={tagRules} />
|
||||||
// )(Firewall);
|
</Margin>
|
||||||
|
) : null}
|
||||||
|
</ViewContainer>
|
||||||
|
);
|
||||||
|
|
||||||
|
export default compose(
|
||||||
|
graphql(EnableFirewall, { name: 'enableFirewall' }),
|
||||||
|
graphql(DisableFirewall, { name: 'disableFirewall' }),
|
||||||
|
graphql(GetFirewallRules, {
|
||||||
|
options: ({ match }) => ({
|
||||||
|
variables: {
|
||||||
|
fetchPolicy: 'network-only',
|
||||||
|
name: get(match, 'params.instance')
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
props: ({ data }) => {
|
||||||
|
const { loading, error, variables, refetch, ...rest } = data;
|
||||||
|
const { name } = variables;
|
||||||
|
|
||||||
|
const instance = find(get(rest, 'machines', []), ['name', name]);
|
||||||
|
const enabled = get(instance, 'firewall_enabled', false);
|
||||||
|
const rules = get(instance, 'firewall_rules', []);
|
||||||
|
|
||||||
|
return {
|
||||||
|
enabled,
|
||||||
|
defaultRules: rules.filter(({ rule_obj = {} }) => rule_obj.isWildcard),
|
||||||
|
tagRules: rules.filter(({ rule_obj = {} }) => rule_obj.tags.length),
|
||||||
|
instance,
|
||||||
|
loading,
|
||||||
|
loadingError: error
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
connect(
|
||||||
|
(state, ownProps) => {
|
||||||
|
const { form } = state;
|
||||||
|
const { enabled, defaultRules, tagRules } = ownProps;
|
||||||
|
|
||||||
|
const inactive = get(form, `fw-inactive.values.inactive`, false);
|
||||||
|
|
||||||
|
return {
|
||||||
|
inactive,
|
||||||
|
mutationError: get(form, `fw-enabled.error`, null),
|
||||||
|
enabled: get(form, `fw-enabled.values.enabled`, enabled),
|
||||||
|
defaultRules: defaultRules.filter(({ enabled }) => enabled || inactive),
|
||||||
|
tagRules: tagRules.filter(({ enabled }) => enabled || inactive)
|
||||||
|
};
|
||||||
|
},
|
||||||
|
(dispatch, ownProps) => {
|
||||||
|
const { instance, enableFirewall, disableFirewall } = ownProps;
|
||||||
|
|
||||||
|
return {
|
||||||
|
handleEnabledToggle: async ({ enabled }) => {
|
||||||
|
const mutation = enabled ? enableFirewall : disableFirewall;
|
||||||
|
|
||||||
|
const [err] = await intercept(
|
||||||
|
mutation({
|
||||||
|
variables: {
|
||||||
|
id: instance.id
|
||||||
|
}
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
if (err) {
|
||||||
|
throw new SubmissionError({
|
||||||
|
_error: parseError(err)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
)
|
||||||
|
)(Firewall);
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
mutation disableMachineFirewall($id: ID!) {
|
mutation disableMachineFirewall($id: ID!) {
|
||||||
disableMachineFirewall(id: $id)
|
disableMachineFirewall(id: $id) {
|
||||||
|
id
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
mutation enableMachineFirewall($id: ID!) {
|
mutation enableMachineFirewall($id: ID!) {
|
||||||
enableMachineFirewall(id: $id)
|
enableMachineFirewall(id: $id) {
|
||||||
|
id
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,9 +6,10 @@ query instance($name: String!) {
|
|||||||
firewall_rules {
|
firewall_rules {
|
||||||
id
|
id
|
||||||
enabled
|
enabled
|
||||||
|
rule_str
|
||||||
|
rule_obj
|
||||||
global
|
global
|
||||||
description
|
description
|
||||||
rule
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -29,7 +29,8 @@ const initialState = {
|
|||||||
'Snapshots',
|
'Snapshots',
|
||||||
'Tags',
|
'Tags',
|
||||||
'Metadata',
|
'Metadata',
|
||||||
'Networks'
|
'Networks',
|
||||||
|
'Firewall'
|
||||||
].map(name => ({
|
].map(name => ({
|
||||||
pathname: paramCase(name),
|
pathname: paramCase(name),
|
||||||
name
|
name
|
||||||
|
@ -25,7 +25,7 @@ const Tag = styled.li`
|
|||||||
border-radius: ${remcalc(3)};
|
border-radius: ${remcalc(3)};
|
||||||
font-size: ${remcalc(13)};
|
font-size: ${remcalc(13)};
|
||||||
line-height: ${remcalc(18)};
|
line-height: ${remcalc(18)};
|
||||||
padding: ${remcalc(6)} ${remcalc(12)};
|
padding: ${remcalc(5)} ${remcalc(12)};
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
flex-grow: 1;
|
flex-grow: 1;
|
||||||
|
239
yarn.lock
239
yarn.lock
@ -296,11 +296,11 @@ ammo@3.x.x:
|
|||||||
boom "6.x.x"
|
boom "6.x.x"
|
||||||
hoek "5.x.x"
|
hoek "5.x.x"
|
||||||
|
|
||||||
ansi-align@^1.1.0:
|
ansi-align@^2.0.0:
|
||||||
version "1.1.0"
|
version "2.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-1.1.0.tgz#2f0c1658829739add5ebb15e6b0c6e3423f016ba"
|
resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f"
|
||||||
dependencies:
|
dependencies:
|
||||||
string-width "^1.0.1"
|
string-width "^2.0.0"
|
||||||
|
|
||||||
ansi-escapes@^1.0.0, ansi-escapes@^1.1.0, ansi-escapes@^1.4.0:
|
ansi-escapes@^1.0.0, ansi-escapes@^1.1.0, ansi-escapes@^1.4.0:
|
||||||
version "1.4.0"
|
version "1.4.0"
|
||||||
@ -1878,19 +1878,17 @@ bounce@1.2.x, bounce@1.x.x, bounce@^1.2.0:
|
|||||||
boom "7.x.x"
|
boom "7.x.x"
|
||||||
hoek "5.x.x"
|
hoek "5.x.x"
|
||||||
|
|
||||||
boxen@^0.6.0:
|
boxen@^1.2.1:
|
||||||
version "0.6.0"
|
version "1.3.0"
|
||||||
resolved "https://registry.yarnpkg.com/boxen/-/boxen-0.6.0.tgz#8364d4248ac34ff0ef1b2f2bf49a6c60ce0d81b6"
|
resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b"
|
||||||
dependencies:
|
dependencies:
|
||||||
ansi-align "^1.1.0"
|
ansi-align "^2.0.0"
|
||||||
camelcase "^2.1.0"
|
camelcase "^4.0.0"
|
||||||
chalk "^1.1.1"
|
chalk "^2.0.1"
|
||||||
cli-boxes "^1.0.0"
|
cli-boxes "^1.0.0"
|
||||||
filled-array "^1.0.0"
|
string-width "^2.0.0"
|
||||||
object-assign "^4.0.1"
|
term-size "^1.2.0"
|
||||||
repeating "^2.0.0"
|
widest-line "^2.0.0"
|
||||||
string-width "^1.0.1"
|
|
||||||
widest-line "^1.0.0"
|
|
||||||
|
|
||||||
brace-expansion@^1.0.0, brace-expansion@^1.1.7:
|
brace-expansion@^1.0.0, brace-expansion@^1.1.7:
|
||||||
version "1.1.8"
|
version "1.1.8"
|
||||||
@ -2158,7 +2156,7 @@ camelcase@^1.0.2:
|
|||||||
version "1.2.1"
|
version "1.2.1"
|
||||||
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39"
|
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39"
|
||||||
|
|
||||||
camelcase@^2.0.0, camelcase@^2.1.0:
|
camelcase@^2.0.0:
|
||||||
version "2.1.1"
|
version "2.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f"
|
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f"
|
||||||
|
|
||||||
@ -2166,7 +2164,7 @@ camelcase@^3.0.0:
|
|||||||
version "3.0.0"
|
version "3.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a"
|
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a"
|
||||||
|
|
||||||
camelcase@^4.1.0:
|
camelcase@^4.0.0, camelcase@^4.1.0:
|
||||||
version "4.1.0"
|
version "4.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
|
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
|
||||||
|
|
||||||
@ -2427,9 +2425,9 @@ clone@^1.0.2:
|
|||||||
version "1.0.3"
|
version "1.0.3"
|
||||||
resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.3.tgz#298d7e2231660f40c003c2ed3140decf3f53085f"
|
resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.3.tgz#298d7e2231660f40c003c2ed3140decf3f53085f"
|
||||||
|
|
||||||
cloudapi-gql@^4.3.1:
|
cloudapi-gql@^4.5.0:
|
||||||
version "4.4.0"
|
version "4.5.0"
|
||||||
resolved "https://registry.yarnpkg.com/cloudapi-gql/-/cloudapi-gql-4.4.0.tgz#285233dd48c92d7d760e74c4b46b11f54c1a8f00"
|
resolved "https://registry.yarnpkg.com/cloudapi-gql/-/cloudapi-gql-4.5.0.tgz#af2d6c49d108256049c63e761eb5af74390011e2"
|
||||||
dependencies:
|
dependencies:
|
||||||
apr-map "^1.0.5"
|
apr-map "^1.0.5"
|
||||||
boom "^7.1.1"
|
boom "^7.1.1"
|
||||||
@ -2440,6 +2438,8 @@ cloudapi-gql@^4.3.1:
|
|||||||
graphi "^5.2.0"
|
graphi "^5.2.0"
|
||||||
graphql-tools "^2.6.1"
|
graphql-tools "^2.6.1"
|
||||||
hasha "^3.0.0"
|
hasha "^3.0.0"
|
||||||
|
lodash.isundefined "^3.0.1"
|
||||||
|
lodash.uniq "^4.5.0"
|
||||||
random-int "^1.0.0"
|
random-int "^1.0.0"
|
||||||
reach "^1.0.0"
|
reach "^1.0.0"
|
||||||
sentiment "^4.2.0"
|
sentiment "^4.2.0"
|
||||||
@ -2617,19 +2617,16 @@ concat-stream@^1.4.10, concat-stream@^1.5.0, concat-stream@^1.6.0:
|
|||||||
readable-stream "^2.2.2"
|
readable-stream "^2.2.2"
|
||||||
typedarray "^0.0.6"
|
typedarray "^0.0.6"
|
||||||
|
|
||||||
configstore@^2.0.0:
|
configstore@^3.0.0:
|
||||||
version "2.1.0"
|
version "3.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/configstore/-/configstore-2.1.0.tgz#737a3a7036e9886102aa6099e47bb33ab1aba1a1"
|
resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.1.tgz#094ee662ab83fad9917678de114faaea8fcdca90"
|
||||||
dependencies:
|
dependencies:
|
||||||
dot-prop "^3.0.0"
|
dot-prop "^4.1.0"
|
||||||
graceful-fs "^4.1.2"
|
graceful-fs "^4.1.2"
|
||||||
mkdirp "^0.5.0"
|
make-dir "^1.0.0"
|
||||||
object-assign "^4.0.1"
|
unique-string "^1.0.0"
|
||||||
os-tmpdir "^1.0.0"
|
write-file-atomic "^2.0.0"
|
||||||
osenv "^0.1.0"
|
xdg-basedir "^3.0.0"
|
||||||
uuid "^2.0.1"
|
|
||||||
write-file-atomic "^1.1.2"
|
|
||||||
xdg-basedir "^2.0.0"
|
|
||||||
|
|
||||||
connect-history-api-fallback@^1.3.0:
|
connect-history-api-fallback@^1.3.0:
|
||||||
version "1.5.0"
|
version "1.5.0"
|
||||||
@ -2909,7 +2906,7 @@ create-ecdh@^4.0.0:
|
|||||||
bn.js "^4.1.0"
|
bn.js "^4.1.0"
|
||||||
elliptic "^6.0.0"
|
elliptic "^6.0.0"
|
||||||
|
|
||||||
create-error-class@^3.0.0, create-error-class@^3.0.1:
|
create-error-class@^3.0.0:
|
||||||
version "3.0.2"
|
version "3.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6"
|
resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6"
|
||||||
dependencies:
|
dependencies:
|
||||||
@ -2999,6 +2996,10 @@ crypto-browserify@^3.11.0:
|
|||||||
randombytes "^2.0.0"
|
randombytes "^2.0.0"
|
||||||
randomfill "^1.0.3"
|
randomfill "^1.0.3"
|
||||||
|
|
||||||
|
crypto-random-string@^1.0.0:
|
||||||
|
version "1.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e"
|
||||||
|
|
||||||
css-color-keywords@^1.0.0:
|
css-color-keywords@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05"
|
resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05"
|
||||||
@ -3507,6 +3508,12 @@ dot-prop@^3.0.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
is-obj "^1.0.0"
|
is-obj "^1.0.0"
|
||||||
|
|
||||||
|
dot-prop@^4.1.0:
|
||||||
|
version "4.2.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57"
|
||||||
|
dependencies:
|
||||||
|
is-obj "^1.0.0"
|
||||||
|
|
||||||
dotenv-expand@4.0.1:
|
dotenv-expand@4.0.1:
|
||||||
version "4.0.1"
|
version "4.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-4.0.1.tgz#68fddc1561814e0a10964111057ff138ced7d7a8"
|
resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-4.0.1.tgz#68fddc1561814e0a10964111057ff138ced7d7a8"
|
||||||
@ -3521,12 +3528,6 @@ drip@1.1.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
tea-concat "0.1.0"
|
tea-concat "0.1.0"
|
||||||
|
|
||||||
duplexer2@^0.1.4:
|
|
||||||
version "0.1.4"
|
|
||||||
resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1"
|
|
||||||
dependencies:
|
|
||||||
readable-stream "^2.0.2"
|
|
||||||
|
|
||||||
duplexer3@^0.1.4:
|
duplexer3@^0.1.4:
|
||||||
version "0.1.4"
|
version "0.1.4"
|
||||||
resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
|
resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
|
||||||
@ -4385,10 +4386,6 @@ fill-range@^4.0.0:
|
|||||||
repeat-string "^1.6.1"
|
repeat-string "^1.6.1"
|
||||||
to-regex-range "^2.1.0"
|
to-regex-range "^2.1.0"
|
||||||
|
|
||||||
filled-array@^1.0.0:
|
|
||||||
version "1.1.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/filled-array/-/filled-array-1.1.0.tgz#c3c4f6c663b923459a9aa29912d2d031f1507f84"
|
|
||||||
|
|
||||||
fillers@^1.0.0:
|
fillers@^1.0.0:
|
||||||
version "1.1.2"
|
version "1.1.2"
|
||||||
resolved "https://registry.yarnpkg.com/fillers/-/fillers-1.1.2.tgz#f57387731e716c3e9f37027952574d211955406a"
|
resolved "https://registry.yarnpkg.com/fillers/-/fillers-1.1.2.tgz#f57387731e716c3e9f37027952574d211955406a"
|
||||||
@ -4773,6 +4770,12 @@ glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2:
|
|||||||
once "^1.3.0"
|
once "^1.3.0"
|
||||||
path-is-absolute "^1.0.0"
|
path-is-absolute "^1.0.0"
|
||||||
|
|
||||||
|
global-dirs@^0.1.0:
|
||||||
|
version "0.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445"
|
||||||
|
dependencies:
|
||||||
|
ini "^1.3.4"
|
||||||
|
|
||||||
global-modules@1.0.0, global-modules@^1.0.0:
|
global-modules@1.0.0, global-modules@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea"
|
resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea"
|
||||||
@ -4837,26 +4840,6 @@ glogg@^1.0.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
sparkles "^1.0.0"
|
sparkles "^1.0.0"
|
||||||
|
|
||||||
got@^5.0.0:
|
|
||||||
version "5.7.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/got/-/got-5.7.1.tgz#5f81635a61e4a6589f180569ea4e381680a51f35"
|
|
||||||
dependencies:
|
|
||||||
create-error-class "^3.0.1"
|
|
||||||
duplexer2 "^0.1.4"
|
|
||||||
is-redirect "^1.0.0"
|
|
||||||
is-retry-allowed "^1.0.0"
|
|
||||||
is-stream "^1.0.0"
|
|
||||||
lowercase-keys "^1.0.0"
|
|
||||||
node-status-codes "^1.0.0"
|
|
||||||
object-assign "^4.0.1"
|
|
||||||
parse-json "^2.1.0"
|
|
||||||
pinkie-promise "^2.0.0"
|
|
||||||
read-all-stream "^3.0.0"
|
|
||||||
readable-stream "^2.0.5"
|
|
||||||
timed-out "^3.0.0"
|
|
||||||
unzip-response "^1.0.2"
|
|
||||||
url-parse-lax "^1.0.0"
|
|
||||||
|
|
||||||
got@^6.7.1:
|
got@^6.7.1:
|
||||||
version "6.7.1"
|
version "6.7.1"
|
||||||
resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0"
|
resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0"
|
||||||
@ -5355,6 +5338,10 @@ immutability-helper@^2.1.2:
|
|||||||
dependencies:
|
dependencies:
|
||||||
invariant "^2.2.0"
|
invariant "^2.2.0"
|
||||||
|
|
||||||
|
import-lazy@^2.1.0:
|
||||||
|
version "2.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43"
|
||||||
|
|
||||||
import-local@^0.1.1:
|
import-local@^0.1.1:
|
||||||
version "0.1.1"
|
version "0.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/import-local/-/import-local-0.1.1.tgz#b1179572aacdc11c6a91009fb430dbcab5f668a8"
|
resolved "https://registry.yarnpkg.com/import-local/-/import-local-0.1.1.tgz#b1179572aacdc11c6a91009fb430dbcab5f668a8"
|
||||||
@ -5678,6 +5665,13 @@ is-in-browser@^1.1.3:
|
|||||||
version "1.1.3"
|
version "1.1.3"
|
||||||
resolved "https://registry.yarnpkg.com/is-in-browser/-/is-in-browser-1.1.3.tgz#56ff4db683a078c6082eb95dad7dc62e1d04f835"
|
resolved "https://registry.yarnpkg.com/is-in-browser/-/is-in-browser-1.1.3.tgz#56ff4db683a078c6082eb95dad7dc62e1d04f835"
|
||||||
|
|
||||||
|
is-installed-globally@^0.1.0:
|
||||||
|
version "0.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80"
|
||||||
|
dependencies:
|
||||||
|
global-dirs "^0.1.0"
|
||||||
|
is-path-inside "^1.0.0"
|
||||||
|
|
||||||
is-nil@^1.0.0:
|
is-nil@^1.0.0:
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/is-nil/-/is-nil-1.0.1.tgz#2daba29e0b585063875e7b539d071f5b15937969"
|
resolved "https://registry.yarnpkg.com/is-nil/-/is-nil-1.0.1.tgz#2daba29e0b585063875e7b539d071f5b15937969"
|
||||||
@ -6425,11 +6419,11 @@ klaw@^1.0.0:
|
|||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
graceful-fs "^4.1.9"
|
graceful-fs "^4.1.9"
|
||||||
|
|
||||||
latest-version@^2.0.0:
|
latest-version@^3.0.0:
|
||||||
version "2.0.0"
|
version "3.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-2.0.0.tgz#56f8d6139620847b8017f8f1f4d78e211324168b"
|
resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15"
|
||||||
dependencies:
|
dependencies:
|
||||||
package-json "^2.0.0"
|
package-json "^4.0.0"
|
||||||
|
|
||||||
lazy-cache@^1.0.3:
|
lazy-cache@^1.0.3:
|
||||||
version "1.0.4"
|
version "1.0.4"
|
||||||
@ -6441,10 +6435,6 @@ lazy-cache@^2.0.2:
|
|||||||
dependencies:
|
dependencies:
|
||||||
set-getter "^0.1.0"
|
set-getter "^0.1.0"
|
||||||
|
|
||||||
lazy-req@^1.1.0:
|
|
||||||
version "1.1.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/lazy-req/-/lazy-req-1.1.0.tgz#bdaebead30f8d824039ce0ce149d4daa07ba1fac"
|
|
||||||
|
|
||||||
lcid@^1.0.0:
|
lcid@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
|
resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
|
||||||
@ -7085,8 +7075,8 @@ minio-proto-auth@^1.1.0:
|
|||||||
wreck "14.0.x"
|
wreck "14.0.x"
|
||||||
|
|
||||||
mississippi@^1.3.0:
|
mississippi@^1.3.0:
|
||||||
version "1.3.0"
|
version "1.3.1"
|
||||||
resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-1.3.0.tgz#d201583eb12327e3c5c1642a404a9cacf94e34f5"
|
resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-1.3.1.tgz#2a8bb465e86550ac8b36a7b6f45599171d78671e"
|
||||||
dependencies:
|
dependencies:
|
||||||
concat-stream "^1.5.0"
|
concat-stream "^1.5.0"
|
||||||
duplexify "^3.4.2"
|
duplexify "^3.4.2"
|
||||||
@ -7106,7 +7096,7 @@ mixin-deep@^1.2.0:
|
|||||||
for-in "^1.0.2"
|
for-in "^1.0.2"
|
||||||
is-extendable "^1.0.1"
|
is-extendable "^1.0.1"
|
||||||
|
|
||||||
mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1:
|
mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1:
|
||||||
version "0.5.1"
|
version "0.5.1"
|
||||||
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
|
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
|
||||||
dependencies:
|
dependencies:
|
||||||
@ -7315,10 +7305,6 @@ node-pre-gyp@^0.6.36, node-pre-gyp@^0.6.39:
|
|||||||
tar "^2.2.1"
|
tar "^2.2.1"
|
||||||
tar-pack "^3.4.0"
|
tar-pack "^3.4.0"
|
||||||
|
|
||||||
node-status-codes@^1.0.0:
|
|
||||||
version "1.0.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/node-status-codes/-/node-status-codes-1.0.0.tgz#5ae5541d024645d32a58fcddc9ceecea7ae3ac2f"
|
|
||||||
|
|
||||||
node-uuid@1.2.0:
|
node-uuid@1.2.0:
|
||||||
version "1.2.0"
|
version "1.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.2.0.tgz#81a9fe32934719852499b58b2523d2cd5fdfd65b"
|
resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.2.0.tgz#81a9fe32934719852499b58b2523d2cd5fdfd65b"
|
||||||
@ -7574,7 +7560,7 @@ os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2:
|
|||||||
version "1.0.2"
|
version "1.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
|
resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
|
||||||
|
|
||||||
osenv@^0.1.0, osenv@^0.1.4:
|
osenv@^0.1.4:
|
||||||
version "0.1.4"
|
version "0.1.4"
|
||||||
resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644"
|
resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644"
|
||||||
dependencies:
|
dependencies:
|
||||||
@ -7617,16 +7603,7 @@ p-try@^1.0.0:
|
|||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
|
resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
|
||||||
|
|
||||||
package-json@^2.0.0:
|
package-json@^4.0.0, package-json@^4.0.1:
|
||||||
version "2.4.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/package-json/-/package-json-2.4.0.tgz#0d15bd67d1cbbddbb2ca222ff2edb86bcb31a8bb"
|
|
||||||
dependencies:
|
|
||||||
got "^5.0.0"
|
|
||||||
registry-auth-token "^3.0.1"
|
|
||||||
registry-url "^3.0.3"
|
|
||||||
semver "^5.1.0"
|
|
||||||
|
|
||||||
package-json@^4.0.1:
|
|
||||||
version "4.0.1"
|
version "4.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed"
|
resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed"
|
||||||
dependencies:
|
dependencies:
|
||||||
@ -7687,7 +7664,7 @@ parse-glob@^3.0.4:
|
|||||||
is-extglob "^1.0.0"
|
is-extglob "^1.0.0"
|
||||||
is-glob "^2.0.0"
|
is-glob "^2.0.0"
|
||||||
|
|
||||||
parse-json@^2.1.0, parse-json@^2.2.0:
|
parse-json@^2.2.0:
|
||||||
version "2.2.0"
|
version "2.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
|
resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
|
||||||
dependencies:
|
dependencies:
|
||||||
@ -8829,13 +8806,6 @@ react@16.2.0, react@^0.14.0, react@^15.5.4, react@^16.2.0:
|
|||||||
object-assign "^4.1.1"
|
object-assign "^4.1.1"
|
||||||
prop-types "^15.6.0"
|
prop-types "^15.6.0"
|
||||||
|
|
||||||
read-all-stream@^3.0.0:
|
|
||||||
version "3.1.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/read-all-stream/-/read-all-stream-3.1.0.tgz#35c3e177f2078ef789ee4bfafa4373074eaef4fa"
|
|
||||||
dependencies:
|
|
||||||
pinkie-promise "^2.0.0"
|
|
||||||
readable-stream "^2.0.0"
|
|
||||||
|
|
||||||
read-cmd-shim@^1.0.1:
|
read-cmd-shim@^1.0.1:
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-1.0.1.tgz#2d5d157786a37c055d22077c32c53f8329e91c7b"
|
resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-1.0.1.tgz#2d5d157786a37c055d22077c32c53f8329e91c7b"
|
||||||
@ -8904,7 +8874,7 @@ read-pkg@^3.0.0:
|
|||||||
normalize-package-data "^2.3.2"
|
normalize-package-data "^2.3.2"
|
||||||
path-type "^3.0.0"
|
path-type "^3.0.0"
|
||||||
|
|
||||||
"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.9, readable-stream@^2.3.3:
|
"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.9, readable-stream@^2.3.3:
|
||||||
version "2.3.3"
|
version "2.3.3"
|
||||||
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c"
|
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c"
|
||||||
dependencies:
|
dependencies:
|
||||||
@ -9801,7 +9771,7 @@ slice-ansi@1.0.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
is-fullwidth-code-point "^2.0.0"
|
is-fullwidth-code-point "^2.0.0"
|
||||||
|
|
||||||
slide@^1.1.5, slide@~1.1.3:
|
slide@~1.1.3:
|
||||||
version "1.1.6"
|
version "1.1.6"
|
||||||
resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707"
|
resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707"
|
||||||
|
|
||||||
@ -10340,8 +10310,8 @@ sw-precache-webpack-plugin@0.11.4, sw-precache-webpack-plugin@^0.11.4:
|
|||||||
uglify-js "^3.0.13"
|
uglify-js "^3.0.13"
|
||||||
|
|
||||||
sw-precache@^5.1.1:
|
sw-precache@^5.1.1:
|
||||||
version "5.2.0"
|
version "5.2.1"
|
||||||
resolved "https://registry.yarnpkg.com/sw-precache/-/sw-precache-5.2.0.tgz#eb6225ce580ceaae148194578a0ad01ab7ea199c"
|
resolved "https://registry.yarnpkg.com/sw-precache/-/sw-precache-5.2.1.tgz#06134f319eec68f3b9583ce9a7036b1c119f7179"
|
||||||
dependencies:
|
dependencies:
|
||||||
dom-urls "^1.1.0"
|
dom-urls "^1.1.0"
|
||||||
es6-promise "^4.0.5"
|
es6-promise "^4.0.5"
|
||||||
@ -10352,7 +10322,7 @@ sw-precache@^5.1.1:
|
|||||||
mkdirp "^0.5.1"
|
mkdirp "^0.5.1"
|
||||||
pretty-bytes "^4.0.2"
|
pretty-bytes "^4.0.2"
|
||||||
sw-toolbox "^3.4.0"
|
sw-toolbox "^3.4.0"
|
||||||
update-notifier "^1.0.3"
|
update-notifier "^2.3.0"
|
||||||
|
|
||||||
sw-toolbox@^3.4.0:
|
sw-toolbox@^3.4.0:
|
||||||
version "3.6.0"
|
version "3.6.0"
|
||||||
@ -10459,6 +10429,12 @@ tempfile@^1.1.1:
|
|||||||
os-tmpdir "^1.0.0"
|
os-tmpdir "^1.0.0"
|
||||||
uuid "^2.0.1"
|
uuid "^2.0.1"
|
||||||
|
|
||||||
|
term-size@^1.2.0:
|
||||||
|
version "1.2.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69"
|
||||||
|
dependencies:
|
||||||
|
execa "^0.7.0"
|
||||||
|
|
||||||
test-exclude@^4.1.1:
|
test-exclude@^4.1.1:
|
||||||
version "4.1.1"
|
version "4.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.1.1.tgz#4d84964b0966b0087ecc334a2ce002d3d9341e26"
|
resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.1.1.tgz#4d84964b0966b0087ecc334a2ce002d3d9341e26"
|
||||||
@ -10516,17 +10492,13 @@ time-stamp@^2.0.0:
|
|||||||
version "2.0.0"
|
version "2.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-2.0.0.tgz#95c6a44530e15ba8d6f4a3ecb8c3a3fac46da357"
|
resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-2.0.0.tgz#95c6a44530e15ba8d6f4a3ecb8c3a3fac46da357"
|
||||||
|
|
||||||
timed-out@^3.0.0:
|
|
||||||
version "3.1.3"
|
|
||||||
resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-3.1.3.tgz#95860bfcc5c76c277f8f8326fd0f5b2e20eba217"
|
|
||||||
|
|
||||||
timed-out@^4.0.0:
|
timed-out@^4.0.0:
|
||||||
version "4.0.1"
|
version "4.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f"
|
resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f"
|
||||||
|
|
||||||
timers-browserify@^2.0.4:
|
timers-browserify@^2.0.4:
|
||||||
version "2.0.5"
|
version "2.0.6"
|
||||||
resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.5.tgz#04878fb12a155a159c9d1e59faa1f77bf4ecc44c"
|
resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.6.tgz#241e76927d9ca05f4d959819022f5b3664b64bae"
|
||||||
dependencies:
|
dependencies:
|
||||||
setimmediate "^1.0.4"
|
setimmediate "^1.0.4"
|
||||||
|
|
||||||
@ -10827,6 +10799,12 @@ unique-slug@^2.0.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
imurmurhash "^0.1.4"
|
imurmurhash "^0.1.4"
|
||||||
|
|
||||||
|
unique-string@^1.0.0:
|
||||||
|
version "1.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a"
|
||||||
|
dependencies:
|
||||||
|
crypto-random-string "^1.0.0"
|
||||||
|
|
||||||
unist-util-is@^2.1.1:
|
unist-util-is@^2.1.1:
|
||||||
version "2.1.1"
|
version "2.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-2.1.1.tgz#0c312629e3f960c66e931e812d3d80e77010947b"
|
resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-2.1.1.tgz#0c312629e3f960c66e931e812d3d80e77010947b"
|
||||||
@ -10888,26 +10866,23 @@ unset-value@^1.0.0:
|
|||||||
has-value "^0.3.1"
|
has-value "^0.3.1"
|
||||||
isobject "^3.0.0"
|
isobject "^3.0.0"
|
||||||
|
|
||||||
unzip-response@^1.0.2:
|
|
||||||
version "1.0.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-1.0.2.tgz#b984f0877fc0a89c2c773cc1ef7b5b232b5b06fe"
|
|
||||||
|
|
||||||
unzip-response@^2.0.1:
|
unzip-response@^2.0.1:
|
||||||
version "2.0.1"
|
version "2.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97"
|
resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97"
|
||||||
|
|
||||||
update-notifier@^1.0.3:
|
update-notifier@^2.3.0:
|
||||||
version "1.0.3"
|
version "2.3.0"
|
||||||
resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-1.0.3.tgz#8f92c515482bd6831b7c93013e70f87552c7cf5a"
|
resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.3.0.tgz#4e8827a6bb915140ab093559d7014e3ebb837451"
|
||||||
dependencies:
|
dependencies:
|
||||||
boxen "^0.6.0"
|
boxen "^1.2.1"
|
||||||
chalk "^1.0.0"
|
chalk "^2.0.1"
|
||||||
configstore "^2.0.0"
|
configstore "^3.0.0"
|
||||||
|
import-lazy "^2.1.0"
|
||||||
|
is-installed-globally "^0.1.0"
|
||||||
is-npm "^1.0.0"
|
is-npm "^1.0.0"
|
||||||
latest-version "^2.0.0"
|
latest-version "^3.0.0"
|
||||||
lazy-req "^1.1.0"
|
|
||||||
semver-diff "^2.0.0"
|
semver-diff "^2.0.0"
|
||||||
xdg-basedir "^2.0.0"
|
xdg-basedir "^3.0.0"
|
||||||
|
|
||||||
upper-case-first@^1.1.0:
|
upper-case-first@^1.1.0:
|
||||||
version "1.1.2"
|
version "1.1.2"
|
||||||
@ -11381,11 +11356,11 @@ wide-align@^1.1.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
string-width "^1.0.2"
|
string-width "^1.0.2"
|
||||||
|
|
||||||
widest-line@^1.0.0:
|
widest-line@^2.0.0:
|
||||||
version "1.0.0"
|
version "2.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-1.0.0.tgz#0c09c85c2a94683d0d7eaf8ee097d564bf0e105c"
|
resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.0.tgz#0142a4e8a243f8882c0233aa0e0281aa76152273"
|
||||||
dependencies:
|
dependencies:
|
||||||
string-width "^1.0.1"
|
string-width "^2.1.1"
|
||||||
|
|
||||||
window-size@0.1.0:
|
window-size@0.1.0:
|
||||||
version "0.1.0"
|
version "0.1.0"
|
||||||
@ -11428,14 +11403,6 @@ wreck@14.0.x, wreck@14.x.x, wreck@^14.0.2:
|
|||||||
boom "7.x.x"
|
boom "7.x.x"
|
||||||
hoek "5.x.x"
|
hoek "5.x.x"
|
||||||
|
|
||||||
write-file-atomic@^1.1.2:
|
|
||||||
version "1.3.4"
|
|
||||||
resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.4.tgz#f807a4f0b1d9e913ae7a48112e6cc3af1991b45f"
|
|
||||||
dependencies:
|
|
||||||
graceful-fs "^4.1.11"
|
|
||||||
imurmurhash "^0.1.4"
|
|
||||||
slide "^1.1.5"
|
|
||||||
|
|
||||||
write-file-atomic@^2.0.0, write-file-atomic@^2.3.0:
|
write-file-atomic@^2.0.0, write-file-atomic@^2.3.0:
|
||||||
version "2.3.0"
|
version "2.3.0"
|
||||||
resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab"
|
resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab"
|
||||||
@ -11476,11 +11443,9 @@ x-is-string@^0.1.0:
|
|||||||
version "0.1.0"
|
version "0.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/x-is-string/-/x-is-string-0.1.0.tgz#474b50865af3a49a9c4657f05acd145458f77d82"
|
resolved "https://registry.yarnpkg.com/x-is-string/-/x-is-string-0.1.0.tgz#474b50865af3a49a9c4657f05acd145458f77d82"
|
||||||
|
|
||||||
xdg-basedir@^2.0.0:
|
xdg-basedir@^3.0.0:
|
||||||
version "2.0.0"
|
version "3.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-2.0.0.tgz#edbc903cc385fc04523d966a335504b5504d1bd2"
|
resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4"
|
||||||
dependencies:
|
|
||||||
os-homedir "^1.0.0"
|
|
||||||
|
|
||||||
xml-char-classes@^1.0.0:
|
xml-char-classes@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
|
Loading…
Reference in New Issue
Block a user