mirror of
https://github.com/yldio/copilot.git
synced 2024-12-29 05:10:05 +02:00
style: lint
This commit is contained in:
parent
e8600b2c0d
commit
b865a1d118
@ -1,17 +1,24 @@
|
||||
import React from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import styled from 'styled-components';
|
||||
import { ModalHeading, ModalText, Button } from 'joyent-ui-toolkit';
|
||||
|
||||
const DeploymentGroupDelete = ({ deploymentGroup, onCancelClick, onConfirmClick }) =>
|
||||
const DeploymentGroupDelete = ({
|
||||
deploymentGroup,
|
||||
onCancelClick,
|
||||
onConfirmClick
|
||||
}) =>
|
||||
<div>
|
||||
<ModalHeading>
|
||||
Deleting a deployment group: <br /> {deploymentGroup.name}
|
||||
</ModalHeading>
|
||||
<ModalText marginBottom="3">
|
||||
Deleting a deployment group will also remove all of the services and instances associated with that deployment group. Are you sure you want to continue?
|
||||
Deleting a deployment group will also remove all of the services and
|
||||
instances associated with that deployment group. Are you sure you want to
|
||||
continue?
|
||||
</ModalText>
|
||||
<Button onClick={onCancelClick} secondary>Cancel</Button>
|
||||
<Button onClick={onCancelClick} secondary>
|
||||
Cancel
|
||||
</Button>
|
||||
<Button onClick={onConfirmClick}>Delete deployment group</Button>
|
||||
</div>;
|
||||
|
||||
|
@ -109,7 +109,9 @@ const InstanceCard = ({
|
||||
<StyledCard collapsed={true} key={instance.uuid}>
|
||||
<CardView>
|
||||
<CardMeta onClick={toggleCollapsed}>
|
||||
<CardTitle>{instance.name}</CardTitle>
|
||||
<CardTitle>
|
||||
{instance.name}
|
||||
</CardTitle>
|
||||
<CardDescription>
|
||||
<StatusBadge status={instance.status} />
|
||||
</CardDescription>
|
||||
|
@ -135,8 +135,12 @@ export const Name = ({ handleSubmit, onCancel, dirty }) =>
|
||||
</Col>
|
||||
</Row>
|
||||
<ButtonsRow>
|
||||
<Button onClick={onCancel} secondary>Cancel</Button>
|
||||
<Button type="submit" disabled={!dirty}>Next</Button>
|
||||
<Button onClick={onCancel} secondary>
|
||||
Cancel
|
||||
</Button>
|
||||
<Button type="submit" disabled={!dirty}>
|
||||
Next
|
||||
</Button>
|
||||
</ButtonsRow>
|
||||
</form>;
|
||||
|
||||
@ -150,7 +154,9 @@ export const Manifest = ({
|
||||
<form onSubmit={handleSubmit}>
|
||||
<Field name="manifest" defaultValue={defaultValue} component={MEditor} />
|
||||
<ButtonsRow>
|
||||
<Button onClick={onCancel} secondary>Cancel</Button>
|
||||
<Button onClick={onCancel} secondary>
|
||||
Cancel
|
||||
</Button>
|
||||
<Button
|
||||
disabled={!(dirty || !loading || defaultValue.length)}
|
||||
type="submit"
|
||||
@ -213,8 +219,12 @@ export const Environment = ({
|
||||
<Field name="environment" defaultValue={defaultValue} component={EEditor} />
|
||||
<Files files={files} onRemoveFile={onRemoveFile} loading={loading} />
|
||||
<ButtonsRow>
|
||||
<Button onClick={onCancel} secondary>Cancel</Button>
|
||||
<Button type="button" onClick={onAddFile} secondary>Add File</Button>
|
||||
<Button onClick={onCancel} secondary>
|
||||
Cancel
|
||||
</Button>
|
||||
<Button type="button" onClick={onAddFile} secondary>
|
||||
Add File
|
||||
</Button>
|
||||
<Button
|
||||
disabled={!(dirty || !loading || defaultValue.length)}
|
||||
type="submit"
|
||||
@ -228,10 +238,18 @@ export const Review = ({ handleSubmit, onCancel, dirty, ...state }) => {
|
||||
const serviceList = forceArray(state.services).map(({ name, config }) =>
|
||||
<ServiceCard key={name}>
|
||||
<Dl>
|
||||
<dt><ServiceName>{name}</ServiceName></dt>
|
||||
<dt><ImageTitle>Image:</ImageTitle> <Image>{config.image}</Image></dt>
|
||||
<dt>
|
||||
<ServiceName>
|
||||
{name}
|
||||
</ServiceName>
|
||||
</dt>
|
||||
<dt>
|
||||
<ImageTitle>Image:</ImageTitle> <Image>{config.image}</Image>
|
||||
</dt>
|
||||
{config.environment.length
|
||||
? <dt><ImageTitle>Environment:</ImageTitle></dt>
|
||||
? <dt>
|
||||
<ImageTitle>Environment:</ImageTitle>
|
||||
</dt>
|
||||
: undefined}
|
||||
{config.environment.length
|
||||
? <SimpleTable
|
||||
|
@ -4,7 +4,11 @@ import PropTypes from 'prop-types';
|
||||
import { P } from 'joyent-ui-toolkit';
|
||||
|
||||
const ErrorMessage = ({ message = "Ooops, there's been an error!!!" }) => {
|
||||
return <P>{message}</P>;
|
||||
return (
|
||||
<P>
|
||||
{message}
|
||||
</P>
|
||||
);
|
||||
};
|
||||
|
||||
ErrorMessage.propTypes = {
|
||||
|
@ -23,11 +23,18 @@ const BreadcrumbContainer = styled.div`
|
||||
|
||||
const getBreadcrumbItems = (...links) =>
|
||||
forceArray(links).map(({ pathname, name }, i) => {
|
||||
const item = i + 1 >= links.length
|
||||
? name
|
||||
: <BreadcrumbLink to={pathname}>{name}</BreadcrumbLink>;
|
||||
const item =
|
||||
i + 1 >= links.length
|
||||
? name
|
||||
: <BreadcrumbLink to={pathname}>
|
||||
{name}
|
||||
</BreadcrumbLink>;
|
||||
|
||||
return <BreadcrumbItem key={name}>{item}</BreadcrumbItem>;
|
||||
return (
|
||||
<BreadcrumbItem key={name}>
|
||||
{item}
|
||||
</BreadcrumbItem>
|
||||
);
|
||||
});
|
||||
|
||||
const NavBreadcrumb = ({ links = [] }) =>
|
||||
|
@ -19,8 +19,12 @@ const NavHeader = ({ datacenter, username }) =>
|
||||
<StyledLogo src={Logo} />
|
||||
</Link>
|
||||
</HeaderBrand>
|
||||
<HeaderItem>{datacenter}</HeaderItem>
|
||||
<HeaderItem>{username}</HeaderItem>
|
||||
<HeaderItem>
|
||||
{datacenter}
|
||||
</HeaderItem>
|
||||
<HeaderItem>
|
||||
{username}
|
||||
</HeaderItem>
|
||||
</Header>;
|
||||
|
||||
NavHeader.propTypes = {
|
||||
|
@ -1,6 +1,5 @@
|
||||
import React from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import styled from 'styled-components';
|
||||
import { ModalHeading, ModalText, Button } from 'joyent-ui-toolkit';
|
||||
|
||||
const propTypes = {
|
||||
@ -15,10 +14,12 @@ const ServiceDelete = ({ service, onCancelClick, onConfirmClick }) =>
|
||||
Deleting a service: <br /> {service.name}
|
||||
</ModalHeading>
|
||||
<ModalText marginBottom="3">
|
||||
Deleting a service can lead to irreverasable loss of data and failures
|
||||
in your application. Are you sure you want to continue?
|
||||
Deleting a service can lead to irreverasable loss of data and failures in
|
||||
your application. Are you sure you want to continue?
|
||||
</ModalText>
|
||||
<Button onClick={onCancelClick} secondary>Cancel</Button>
|
||||
<Button onClick={onCancelClick} secondary>
|
||||
Cancel
|
||||
</Button>
|
||||
<Button onClick={onConfirmClick}>Delete service</Button>
|
||||
</div>;
|
||||
|
||||
|
@ -1,7 +1,5 @@
|
||||
import React from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import styled from 'styled-components';
|
||||
import unitcalc from 'unitcalc';
|
||||
|
||||
import { ModalHeading, ModalText, Button } from 'joyent-ui-toolkit';
|
||||
import {
|
||||
@ -19,8 +17,13 @@ const ServiceScale = ({
|
||||
pristine
|
||||
}) =>
|
||||
<form onSubmit={handleSubmit}>
|
||||
<ModalHeading>Scaling a service: <br />{service.name}</ModalHeading>
|
||||
<ModalText>Choose how many instances of a service you want to have running.</ModalText>
|
||||
<ModalHeading>
|
||||
Scaling a service: <br />
|
||||
{service.name}
|
||||
</ModalHeading>
|
||||
<ModalText>
|
||||
Choose how many instances of a service you want to have running.
|
||||
</ModalText>
|
||||
<FormGroup
|
||||
name="replicas"
|
||||
normalize={NumberInputNormalize({ minValue: 1 })}
|
||||
@ -29,7 +32,9 @@ const ServiceScale = ({
|
||||
<FormMeta />
|
||||
<NumberInput minValue={1} />
|
||||
</FormGroup>
|
||||
<Button secondary onClick={onCancelClick}>Cancel</Button>
|
||||
<Button secondary onClick={onCancelClick}>
|
||||
Cancel
|
||||
</Button>
|
||||
<Button type="submit" disabled={pristine || invalid} secondary>
|
||||
Scale
|
||||
</Button>
|
||||
|
@ -5,7 +5,6 @@ import styled from 'styled-components';
|
||||
import {
|
||||
Card,
|
||||
CardView,
|
||||
CardMeta,
|
||||
CardTitle,
|
||||
CardSubTitle,
|
||||
CardDescription,
|
||||
@ -16,7 +15,11 @@ import {
|
||||
Anchor
|
||||
} from 'joyent-ui-toolkit';
|
||||
|
||||
import { InstancesIcon, HealthyIcon, UnhealthyIcon, P } from 'joyent-ui-toolkit';
|
||||
import {
|
||||
InstancesIcon,
|
||||
HealthyIcon,
|
||||
UnhealthyIcon
|
||||
} from 'joyent-ui-toolkit';
|
||||
|
||||
import Status from './status';
|
||||
|
||||
@ -37,7 +40,6 @@ const ServiceListItem = ({
|
||||
service = {},
|
||||
isChild = false
|
||||
}) => {
|
||||
|
||||
const children = service.children
|
||||
? service.children.map(service =>
|
||||
<ServiceListItem
|
||||
@ -101,16 +103,16 @@ const ServiceListItem = ({
|
||||
const healthyInfo = service.instancesHealthy
|
||||
? <CardInfo
|
||||
icon={<HealthyIcon />}
|
||||
iconPosition='left'
|
||||
label='Healthy'
|
||||
color='dark'
|
||||
iconPosition="left"
|
||||
label="Healthy"
|
||||
color="dark"
|
||||
/>
|
||||
: <CardInfo
|
||||
icon={<UnhealthyIcon />}
|
||||
iconPosition='left'
|
||||
label='Unhealthy'
|
||||
color='dark'
|
||||
/>
|
||||
iconPosition="left"
|
||||
label="Unhealthy"
|
||||
color="dark"
|
||||
/>;
|
||||
|
||||
const view = children
|
||||
? <CardGroupView>
|
||||
|
@ -55,22 +55,34 @@ const ServicesQuickActions = ({
|
||||
: instance.status;
|
||||
}, null);
|
||||
|
||||
const startService = status === 'RUNNING'
|
||||
? null
|
||||
: <TooltipButton onClick={handleStartClick} disabled={disabled}>Start</TooltipButton>;
|
||||
const startService =
|
||||
status === 'RUNNING'
|
||||
? null
|
||||
: <TooltipButton onClick={handleStartClick} disabled={disabled}>
|
||||
Start
|
||||
</TooltipButton>;
|
||||
|
||||
const stopService = status === 'STOPPED'
|
||||
? null
|
||||
: <TooltipButton onClick={handleStopClick} disabled={disabled}>Stop</TooltipButton>;
|
||||
const stopService =
|
||||
status === 'STOPPED'
|
||||
? null
|
||||
: <TooltipButton onClick={handleStopClick} disabled={disabled}>
|
||||
Stop
|
||||
</TooltipButton>;
|
||||
|
||||
return (
|
||||
<Tooltip {...p} onBlur={onBlur}>
|
||||
<TooltipButton onClick={handleScaleClick} disabled={disabled}>Scale</TooltipButton>
|
||||
<TooltipButton onClick={handleRestartClick} disabled={disabled}>Restart</TooltipButton>
|
||||
<TooltipButton onClick={handleScaleClick} disabled={disabled}>
|
||||
Scale
|
||||
</TooltipButton>
|
||||
<TooltipButton onClick={handleRestartClick} disabled={disabled}>
|
||||
Restart
|
||||
</TooltipButton>
|
||||
{startService}
|
||||
{stopService}
|
||||
<TooltipDivider />
|
||||
<TooltipButton onClick={handleDeleteClick} disabled={disabled}>Delete</TooltipButton>
|
||||
<TooltipButton onClick={handleDeleteClick} disabled={disabled}>
|
||||
Delete
|
||||
</TooltipButton>
|
||||
</Tooltip>
|
||||
);
|
||||
};
|
||||
|
@ -24,8 +24,7 @@ const StyledTransitionalStatus = StyledStatus.extend`
|
||||
`;
|
||||
|
||||
const ServiceStatus = ({ service }) => {
|
||||
|
||||
const getInstanceStatuses = (instanceStatuses) =>
|
||||
const getInstanceStatuses = instanceStatuses =>
|
||||
instanceStatuses.map((instanceStatus, index) => {
|
||||
const { status, count } = instanceStatus;
|
||||
|
||||
@ -39,19 +38,15 @@ const ServiceStatus = ({ service }) => {
|
||||
});
|
||||
|
||||
return service.transitionalStatus
|
||||
? (
|
||||
<StyledStatusContainer>
|
||||
? <StyledStatusContainer>
|
||||
<StatusLoader />
|
||||
<StyledTransitionalStatus>
|
||||
{ service.status ? service.status.toLowerCase() : '' }
|
||||
{service.status ? service.status.toLowerCase() : ''}
|
||||
</StyledTransitionalStatus>
|
||||
</StyledStatusContainer>
|
||||
)
|
||||
: (
|
||||
<StyledStatusContainer>
|
||||
: <StyledStatusContainer>
|
||||
{getInstanceStatuses(service.instanceStatuses)}
|
||||
</StyledStatusContainer>
|
||||
);
|
||||
</StyledStatusContainer>;
|
||||
};
|
||||
|
||||
ServiceStatus.propTypes = {
|
||||
|
@ -19,7 +19,10 @@ export default ({
|
||||
<LayoutContainer>
|
||||
<H2>Creating deployment group</H2>
|
||||
{loading && <DeploymentGroupsLoading />}
|
||||
{error && <span>{error.toString()}</span>}
|
||||
{error &&
|
||||
<span>
|
||||
{error.toString()}
|
||||
</span>}
|
||||
<Progress stage={stage} create />
|
||||
<ManifestEditOrCreate
|
||||
manifest={manifest}
|
||||
|
@ -44,7 +44,10 @@ class DeploymentGroupImport extends Component {
|
||||
<LayoutContainer>
|
||||
<H2>Importing deployment group</H2>
|
||||
{loading && <DeploymentGroupsLoading />}
|
||||
{error && <span>{error.toString()}</span>}
|
||||
{error &&
|
||||
<span>
|
||||
{error.toString()}
|
||||
</span>}
|
||||
</LayoutContainer>
|
||||
);
|
||||
}
|
||||
|
@ -12,7 +12,7 @@ import { ErrorMessage } from '@components/messaging';
|
||||
import { DeploymentGroupsLoading } from '@components/deployment-groups';
|
||||
import DeploymentGroupsQuery from '@graphql/DeploymentGroups.gql';
|
||||
import DeploymentGroupsImportableQuery from '@graphql/DeploymentGroupsImportable.gql';
|
||||
import { H2, H3, Small, IconButton, BinIcon, Button } from 'joyent-ui-toolkit';
|
||||
import { H2, H3, Small, IconButton, BinIcon } from 'joyent-ui-toolkit';
|
||||
|
||||
const Title = H2.extend`
|
||||
margin-top: ${remcalc(2)};
|
||||
@ -122,7 +122,9 @@ const DeploymentGroupList = ({
|
||||
<Col xs={12} sm={4} md={3} lg={3} key={slug}>
|
||||
<Box>
|
||||
<StyledLink to={`${match.path}/${slug}`}>
|
||||
<ServiceTitle>{name}</ServiceTitle>
|
||||
<ServiceTitle>
|
||||
{name}
|
||||
</ServiceTitle>
|
||||
</StyledLink>
|
||||
<StyledIconButton to={`${match.url}/${slug}/delete`}>
|
||||
<BinIcon />
|
||||
@ -146,7 +148,9 @@ const DeploymentGroupList = ({
|
||||
<BoxCreate>
|
||||
<StyledCreateLink to={`${match.path}/~import/${slug}`}>
|
||||
<Oval>⤵</Oval>
|
||||
<CreateTitle>{name}</CreateTitle>
|
||||
<CreateTitle>
|
||||
{name}
|
||||
</CreateTitle>
|
||||
</StyledCreateLink>
|
||||
</BoxCreate>
|
||||
</Col>
|
||||
@ -181,9 +185,10 @@ export default compose(
|
||||
pollInterval: 1000
|
||||
},
|
||||
props: ({ data: { deploymentGroups, loading, error } }) => ({
|
||||
deploymentGroups: deploymentGroups && deploymentGroups.length
|
||||
? deploymentGroups.filter(dg => dg.status !== 'DELETED')
|
||||
: null,
|
||||
deploymentGroups:
|
||||
deploymentGroups && deploymentGroups.length
|
||||
? deploymentGroups.filter(dg => dg.status !== 'DELETED')
|
||||
: null,
|
||||
loading,
|
||||
error
|
||||
})
|
||||
|
@ -63,12 +63,13 @@ const InstanceListGql = graphql(InstancesQuery, {
|
||||
};
|
||||
},
|
||||
props: ({ data: { deploymentGroup, loading, error } }) => ({
|
||||
instances: deploymentGroup && deploymentGroup.services
|
||||
? deploymentGroup.services.reduce(
|
||||
(instances, service) => instances.concat(service.instances),
|
||||
[]
|
||||
)
|
||||
: null,
|
||||
instances:
|
||||
deploymentGroup && deploymentGroup.services
|
||||
? deploymentGroup.services.reduce(
|
||||
(instances, service) => instances.concat(service.instances),
|
||||
[]
|
||||
)
|
||||
: null,
|
||||
loading,
|
||||
error
|
||||
})
|
||||
|
@ -357,7 +357,11 @@ class DeploymentGroupEditOrCreate extends Component {
|
||||
const { error, defaultStage, manifestStage } = this.state;
|
||||
|
||||
if (error) {
|
||||
return <span>{error}</span>;
|
||||
return (
|
||||
<span>
|
||||
{error}
|
||||
</span>
|
||||
);
|
||||
}
|
||||
|
||||
const { match, create } = this.props;
|
||||
|
@ -22,28 +22,33 @@ const Manifest = ({
|
||||
}) => {
|
||||
const stage = match.params.stage;
|
||||
const _loading = !loading ? null : <DeploymentGroupsLoading />;
|
||||
const _error = !error ? null : <span>{error.toString()}</span>;
|
||||
|
||||
const _view = loading || !deploymentGroup
|
||||
const _error = !error
|
||||
? null
|
||||
: <ManifestEditOrCreate
|
||||
manifest={manifest}
|
||||
environment={environment}
|
||||
deploymentGroup={deploymentGroup}
|
||||
edit
|
||||
/>;
|
||||
: <span>
|
||||
{error.toString()}
|
||||
</span>;
|
||||
|
||||
const _notice = !error &&
|
||||
const _view =
|
||||
loading || !deploymentGroup
|
||||
? null
|
||||
: <ManifestEditOrCreate
|
||||
manifest={manifest}
|
||||
environment={environment}
|
||||
deploymentGroup={deploymentGroup}
|
||||
edit
|
||||
/>;
|
||||
|
||||
const _notice =
|
||||
!error &&
|
||||
!loading &&
|
||||
deploymentGroup &&
|
||||
deploymentGroup.imported &&
|
||||
!manifest
|
||||
? <span>
|
||||
Since this DeploymentGroup was imported, it doesn't have the
|
||||
initial
|
||||
manifest
|
||||
</span>
|
||||
: null;
|
||||
? <span>
|
||||
Since this DeploymentGroup was imported, it doesn't have the
|
||||
initial manifest
|
||||
</span>
|
||||
: null;
|
||||
|
||||
return (
|
||||
<LayoutContainer>
|
||||
@ -78,7 +83,9 @@ export default compose(
|
||||
slug: props.match.params.deploymentGroup
|
||||
}
|
||||
}),
|
||||
props: ({ data: { deploymentGroups, loading, error, startPolling, stopPolling } }) => {
|
||||
props: ({
|
||||
data: { deploymentGroups, loading, error, startPolling, stopPolling }
|
||||
}) => {
|
||||
const dgs = forceArray(deploymentGroups);
|
||||
|
||||
if (!dgs.length) {
|
||||
|
@ -2,8 +2,8 @@ import React from 'react';
|
||||
import { connect } from 'react-redux';
|
||||
import { Menu as MenuComponent } from '@components/navigation';
|
||||
|
||||
const Menu = ({match, sections}) => {
|
||||
if(!sections || !sections.length) {
|
||||
const Menu = ({ match, sections }) => {
|
||||
if (!sections || !sections.length) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@ -13,8 +13,8 @@ const Menu = ({match, sections}) => {
|
||||
pathname: `${match.url}/${section.pathname}`
|
||||
};
|
||||
});
|
||||
return <MenuComponent links={sectionsWithPathnames} /> ;
|
||||
}
|
||||
return <MenuComponent links={sectionsWithPathnames} />;
|
||||
};
|
||||
|
||||
const ConnectedMenu = connect(
|
||||
(state, ownProps) => {
|
||||
|
@ -14,11 +14,12 @@ export default graphql(InstancesQuery, {
|
||||
};
|
||||
},
|
||||
props: ({ data: { deploymentGroup, loading, error } }) => ({
|
||||
service: deploymentGroup &&
|
||||
service:
|
||||
deploymentGroup &&
|
||||
deploymentGroup.services &&
|
||||
deploymentGroup.services.length
|
||||
? deploymentGroup.services[0]
|
||||
: null,
|
||||
? deploymentGroup.services[0]
|
||||
: null,
|
||||
loading,
|
||||
error
|
||||
})
|
||||
|
@ -70,8 +70,8 @@ class ServiceList extends Component {
|
||||
const position = {
|
||||
left:
|
||||
buttonRect.left -
|
||||
listRect.left +
|
||||
(buttonRect.right - buttonRect.left) / 2,
|
||||
listRect.left +
|
||||
(buttonRect.right - buttonRect.left) / 2,
|
||||
top: buttonRect.bottom - listRect.top
|
||||
};
|
||||
|
||||
|
@ -1,16 +1,13 @@
|
||||
import React from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import { Col, Row } from 'react-styled-flexboxgrid';
|
||||
import styled from 'styled-components';
|
||||
import remcalc from 'remcalc';
|
||||
import unitcalc from 'unitcalc';
|
||||
import { LayoutContainer } from '@components/layout';
|
||||
|
||||
import {
|
||||
Button,
|
||||
H2,
|
||||
FormGroup,
|
||||
Input,
|
||||
Toggle,
|
||||
ToggleList,
|
||||
Legend
|
||||
@ -26,18 +23,6 @@ const PaddedRow = Row.extend`
|
||||
margin-bottom: ${remcalc(18)}
|
||||
`;
|
||||
|
||||
const StyledForm = FormGroup.extend`
|
||||
width: 60%;
|
||||
float: left;
|
||||
margin: 0;
|
||||
`;
|
||||
|
||||
const StyledFilter = styled(Input)`
|
||||
margin: 0;
|
||||
`;
|
||||
|
||||
const handleAddService = () => console.log('Adding a service...');
|
||||
|
||||
const ServicesMenu = ({ location, history: { push } }) => {
|
||||
const toggleValue = location.pathname.split('-').pop();
|
||||
|
||||
@ -58,8 +43,12 @@ const ServicesMenu = ({ location, history: { push } }) => {
|
||||
<FormGroup name="service-view" value={toggleValue}>
|
||||
<StyledLegend>View</StyledLegend>
|
||||
<ToggleList>
|
||||
<Toggle value="list" onChange={handleToggle}>List</Toggle>
|
||||
<Toggle value="topology" onChange={handleToggle}>Topology</Toggle>
|
||||
<Toggle value="list" onChange={handleToggle}>
|
||||
List
|
||||
</Toggle>
|
||||
<Toggle value="topology" onChange={handleToggle}>
|
||||
Topology
|
||||
</Toggle>
|
||||
</ToggleList>
|
||||
</FormGroup>
|
||||
</Col>
|
||||
|
@ -1,7 +1,21 @@
|
||||
#import "./ServiceInfo.gql"
|
||||
|
||||
query config($deploymentGroupName: String!, $type: ManifestType!, $format: ManifestFormat!, $environment: String!, $files: [KeyValueInput]!, $raw: String!) {
|
||||
config(deploymentGroupName: $deploymentGroupName, type: $type, format: $format, environment: $environment, files: $files, raw: $raw) {
|
||||
query config(
|
||||
$deploymentGroupName: String!
|
||||
$type: ManifestType!
|
||||
$format: ManifestFormat!
|
||||
$environment: String!
|
||||
$files: [KeyValueInput]!
|
||||
$raw: String!
|
||||
) {
|
||||
config(
|
||||
deploymentGroupName: $deploymentGroupName
|
||||
type: $type
|
||||
format: $format
|
||||
environment: $environment
|
||||
files: $files
|
||||
raw: $raw
|
||||
) {
|
||||
...ServiceInfo
|
||||
config {
|
||||
id
|
||||
|
@ -1,5 +1,19 @@
|
||||
mutation provisionManifest($deploymentGroupId: ID!, $type: ManifestType!, $format: ManifestFormat!, $environment: String!, $files: [KeyValueInput]!, $raw: String!) {
|
||||
provisionManifest(deploymentGroupId: $deploymentGroupId, type: $type, format: $format, environment: $environment, files: $files, raw: $raw) {
|
||||
mutation provisionManifest(
|
||||
$deploymentGroupId: ID!
|
||||
$type: ManifestType!
|
||||
$format: ManifestFormat!
|
||||
$environment: String!
|
||||
$files: [KeyValueInput]!
|
||||
$raw: String!
|
||||
) {
|
||||
provisionManifest(
|
||||
deploymentGroupId: $deploymentGroupId
|
||||
type: $type
|
||||
format: $format
|
||||
environment: $environment
|
||||
files: $files
|
||||
raw: $raw
|
||||
) {
|
||||
scale {
|
||||
serviceName
|
||||
replicas
|
||||
|
@ -1,7 +1,7 @@
|
||||
#import "./DeploymentGroupInfo.gql"
|
||||
#import "./ServiceInfo.gql"
|
||||
|
||||
query Services($deploymentGroupSlug: String!){
|
||||
query Services($deploymentGroupSlug: String!) {
|
||||
deploymentGroup(slug: $deploymentGroupSlug) {
|
||||
...DeploymentGroupInfo
|
||||
services {
|
||||
|
@ -19,9 +19,7 @@ import {
|
||||
ServicesMenu
|
||||
} from '@containers/services';
|
||||
|
||||
import {
|
||||
DeploymentGroupDelete
|
||||
} from '@containers/deployment-group';
|
||||
import { DeploymentGroupDelete } from '@containers/deployment-group';
|
||||
|
||||
const Container = styled.div`
|
||||
display: flex;
|
||||
@ -46,7 +44,6 @@ const serviceRedirect = p =>
|
||||
const Router = (
|
||||
<BrowserRouter>
|
||||
<Container>
|
||||
|
||||
<Route path="/" component={Header} />
|
||||
|
||||
<Switch>
|
||||
@ -70,12 +67,16 @@ const Router = (
|
||||
path="/deployment-groups/:deploymentGroup/services/:service"
|
||||
component={Menu}
|
||||
/>
|
||||
<Route path="/deployment-groups/:deploymentGroup" component={Menu} />
|
||||
<Route path="/deployment-groups/:deploymentGroup" component={Menu} />
|
||||
</Switch>
|
||||
|
||||
<Route path="/" exact component={rootRedirect} />
|
||||
<Route path="/deployment-groups" exact component={DeploymentGroupList} />
|
||||
<Route path="/deployment-groups/:deploymentGroup/delete" exact component={DeploymentGroupList} />
|
||||
<Route
|
||||
path="/deployment-groups/:deploymentGroup/delete"
|
||||
exact
|
||||
component={DeploymentGroupList}
|
||||
/>
|
||||
|
||||
<Route
|
||||
path="/deployment-groups/:deploymentGroup"
|
||||
@ -168,7 +169,6 @@ const Router = (
|
||||
exact
|
||||
component={ServiceDelete}
|
||||
/>
|
||||
|
||||
</Container>
|
||||
</BrowserRouter>
|
||||
);
|
||||
|
@ -6,10 +6,11 @@ export default handleActions(
|
||||
[toggleServicesQuickActions.toString()]: (state, action) => {
|
||||
const { position, service, show } = action.payload;
|
||||
|
||||
const s = show === undefined
|
||||
? !state.services.quickActions.service ||
|
||||
const s =
|
||||
show === undefined
|
||||
? !state.services.quickActions.service ||
|
||||
service.id !== state.services.quickActions.service.id
|
||||
: show;
|
||||
: show;
|
||||
|
||||
const quickActions = s
|
||||
? {
|
||||
|
@ -13,7 +13,7 @@ const deploymentGroupBySlug = deploymentGroupSlug =>
|
||||
? Object.keys(apollo.data).reduce(
|
||||
(dg, k) =>
|
||||
apollo.data[k].__typename === 'DeploymentGroup' &&
|
||||
apollo.data[k].slug === deploymentGroupSlug
|
||||
apollo.data[k].slug === deploymentGroupSlug
|
||||
? apollo.data[k]
|
||||
: dg,
|
||||
null
|
||||
@ -29,7 +29,7 @@ const serviceBySlug = serviceSlug =>
|
||||
? Object.keys(apollo.data).reduce(
|
||||
(s, k) =>
|
||||
apollo.data[k].__typename === 'Service' &&
|
||||
apollo.data[k].slug === serviceSlug
|
||||
apollo.data[k].slug === serviceSlug
|
||||
? apollo.data[k]
|
||||
: s,
|
||||
null
|
||||
@ -56,9 +56,6 @@ const instancesByServiceId = serviceId =>
|
||||
|
||||
// Apollo gql utils //
|
||||
|
||||
const findService = (services, uuid) =>
|
||||
services.reduce((service, s) => (s.uuid === uuid ? s : service), null);
|
||||
|
||||
const activeInstanceStatuses = [
|
||||
'PROVISIONING',
|
||||
'READY',
|
||||
@ -77,7 +74,6 @@ const transitionalServiceStatuses = [
|
||||
];
|
||||
|
||||
const getInstanceStatuses = service => {
|
||||
|
||||
const instanceStatuses = service.instances.reduce((statuses, instance) => {
|
||||
// if (instance.status !== 'RUNNING') {
|
||||
if (statuses[instance.status]) {
|
||||
@ -107,36 +103,34 @@ const getInstancesActive = instanceStatuses => {
|
||||
|
||||
const getInstancesHealthy = instances => {
|
||||
return instances.reduce(
|
||||
(healthy, instance) =>
|
||||
instance.healthy === 'HEALTHY' ? healthy : false,
|
||||
true
|
||||
(healthy, instance) => (instance.healthy === 'HEALTHY' ? healthy : false),
|
||||
true
|
||||
);
|
||||
};
|
||||
|
||||
const getService = (service, index) => {
|
||||
|
||||
const instanceStatuses = getInstanceStatuses(service);
|
||||
const instancesActive = getInstancesActive(instanceStatuses);
|
||||
const instancesHealthy = getInstancesHealthy(service.instances);
|
||||
const transitionalStatus = transitionalServiceStatuses.indexOf(service.status) !== -1;
|
||||
return ({
|
||||
index,
|
||||
...service,
|
||||
instanceStatuses,
|
||||
instancesActive,
|
||||
instancesHealthy,
|
||||
transitionalStatus,
|
||||
isConsul: service.slug === 'consul'
|
||||
});
|
||||
const transitionalStatus =
|
||||
transitionalServiceStatuses.indexOf(service.status) !== -1;
|
||||
return {
|
||||
index,
|
||||
...service,
|
||||
instanceStatuses,
|
||||
instancesActive,
|
||||
instancesHealthy,
|
||||
transitionalStatus,
|
||||
isConsul: service.slug === 'consul'
|
||||
};
|
||||
};
|
||||
|
||||
const processServices = services => {
|
||||
return forceArray(services).reduce((ss, s, i) => {
|
||||
|
||||
if(s.status !== 'DELETED') {
|
||||
if (s.status !== 'DELETED') {
|
||||
const service = getService(s, i);
|
||||
if(s.branches && s.branches.length) {
|
||||
service.children = processServices(s.branches)
|
||||
if (s.branches && s.branches.length) {
|
||||
service.children = processServices(s.branches);
|
||||
}
|
||||
ss.push(service);
|
||||
}
|
||||
@ -148,24 +142,28 @@ const processServices = services => {
|
||||
const processServicesForTopology = services => {
|
||||
const processedServices = processServices(services);
|
||||
|
||||
const connectedServices = processedServices.reduce(
|
||||
(connections, service) => {
|
||||
if(!service.connections || !service.connections.length) {
|
||||
return connections;
|
||||
}
|
||||
const connectedServices = processedServices.reduce((connections, service) => {
|
||||
if (!service.connections || !service.connections.length) {
|
||||
return connections;
|
||||
}
|
||||
|
||||
const existingConnections = service.connections.reduce((connections, connection) => {
|
||||
const connectionExists = processedServices.filter(ps => ps.id === connection).length;
|
||||
if(connectionExists) {
|
||||
const existingConnections = service.connections.reduce(
|
||||
(connections, connection) => {
|
||||
const connectionExists = processedServices.filter(
|
||||
ps => ps.id === connection
|
||||
).length;
|
||||
if (connectionExists) {
|
||||
connections.push(connection);
|
||||
}
|
||||
return connections;
|
||||
}, []);
|
||||
},
|
||||
[]
|
||||
);
|
||||
|
||||
return existingConnections.length
|
||||
? connections.concat(existingConnections).concat(service.id)
|
||||
: connections
|
||||
}, []);
|
||||
return existingConnections.length
|
||||
? connections.concat(existingConnections).concat(service.id)
|
||||
: connections;
|
||||
}, []);
|
||||
|
||||
return processedServices.map(service => ({
|
||||
...service,
|
||||
|
@ -4,13 +4,14 @@ import { ApolloClient, createNetworkInterface } from 'react-apollo';
|
||||
import state from './state';
|
||||
import { ui } from './reducers';
|
||||
|
||||
const GLOBAL = typeof window === 'object'
|
||||
? window
|
||||
: {
|
||||
location: {
|
||||
hostname: '0.0.0.0'
|
||||
}
|
||||
};
|
||||
const GLOBAL =
|
||||
typeof window === 'object'
|
||||
? window
|
||||
: {
|
||||
location: {
|
||||
hostname: '0.0.0.0'
|
||||
}
|
||||
};
|
||||
|
||||
const GQL_PORT = process.env.REACT_APP_GQL_PORT || 80;
|
||||
const GQL_HOSTNAME =
|
||||
|
@ -10,6 +10,12 @@ import Header from '@components/navigation/header';
|
||||
import { Router } from './mocks';
|
||||
|
||||
it('renders <Header /> without throwing', () => {
|
||||
const tree = renderer.create(<Router><Header /></Router>).toJSON();
|
||||
const tree = renderer
|
||||
.create(
|
||||
<Router>
|
||||
<Header />
|
||||
</Router>
|
||||
)
|
||||
.toJSON();
|
||||
expect(tree).toMatchStyledComponentsSnapshot();
|
||||
});
|
||||
|
@ -1,4 +1,7 @@
|
||||
import React from 'react';
|
||||
import { MemoryRouter } from 'react-router-dom';
|
||||
|
||||
export default ({ children }) => <MemoryRouter>{children}</MemoryRouter>;
|
||||
export default ({ children }) =>
|
||||
<MemoryRouter>
|
||||
{children}
|
||||
</MemoryRouter>;
|
||||
|
@ -3,4 +3,6 @@ import { client, store } from '@state/store';
|
||||
import { ApolloProvider } from 'react-apollo';
|
||||
|
||||
export default ({ children }) =>
|
||||
<ApolloProvider client={client} store={store}>{children}</ApolloProvider>;
|
||||
<ApolloProvider client={client} store={store}>
|
||||
{children}
|
||||
</ApolloProvider>;
|
||||
|
@ -3,4 +3,6 @@ import { ThemeProvider } from 'styled-components';
|
||||
import { theme } from 'joyent-ui-toolkit';
|
||||
|
||||
export default ({ children }) =>
|
||||
<ThemeProvider theme={theme}>{children}</ThemeProvider>;
|
||||
<ThemeProvider theme={theme}>
|
||||
{children}
|
||||
</ThemeProvider>;
|
||||
|
@ -46,12 +46,8 @@
|
||||
"tap-xunit": "^1.7.0"
|
||||
},
|
||||
"ava": {
|
||||
"files": [
|
||||
"test/*.js"
|
||||
],
|
||||
"source": [
|
||||
"src/*.js"
|
||||
],
|
||||
"files": ["test/*.js"],
|
||||
"source": ["src/*.js"],
|
||||
"failFast": true
|
||||
}
|
||||
}
|
||||
|
@ -156,20 +156,17 @@ const deleteDeploymentGroup = options => {
|
||||
)
|
||||
)
|
||||
)
|
||||
.then(() => {
|
||||
const deploymentGroup = deploymentGroups
|
||||
.filter(dg => dg.id === dgId)
|
||||
.shift();
|
||||
deploymentGroup.status = 'DELETING';
|
||||
return deploymentGroup;
|
||||
return { deploymentGroupId: dgId };
|
||||
return getDeploymentGroups({ id: dgId });
|
||||
});
|
||||
.then(() =>
|
||||
Object.assign({}, deploymentGroups.filter(dg => dg.id === dgId).shift(), {
|
||||
status: 'DELETING'
|
||||
})
|
||||
);
|
||||
|
||||
const timeout = setTimeout(() => {
|
||||
setTimeout(() => {
|
||||
const deploymentGroup = deploymentGroups
|
||||
.filter(dg => dg.id === dgId)
|
||||
.shift();
|
||||
|
||||
deploymentGroup.status = 'DELETED';
|
||||
}, 5000);
|
||||
|
||||
@ -328,9 +325,10 @@ const handleStatusUpdateRequest = (
|
||||
instancesStatus
|
||||
) => {
|
||||
// this is what we need to delay
|
||||
const timeout = setTimeout(() => {
|
||||
setTimeout(() => {
|
||||
updateServiceAndInstancesStatus(serviceId, serviceStatus, instancesStatus);
|
||||
}, 5000);
|
||||
|
||||
// this is what we'll need to return
|
||||
return updateServiceAndInstancesStatus(
|
||||
serviceId,
|
||||
|
@ -31,10 +31,6 @@ const getClient = () =>
|
||||
})
|
||||
});
|
||||
|
||||
const close = () => {
|
||||
client.resetStore();
|
||||
};
|
||||
|
||||
server.stdout.on('data', d => {
|
||||
if (/server started at /.test(d)) {
|
||||
resolve(client);
|
||||
@ -281,7 +277,7 @@ test('should delete DeploymentGroup', async t => {
|
||||
t.snapshot(JSON.stringify(fDgsBefore.data, null, 2));
|
||||
t.snapshot(JSON.stringify(fDgsDirectBefore.data, null, 2));
|
||||
|
||||
const deleted = await client.mutate({
|
||||
await client.mutate({
|
||||
fetchPolicy: 'network-only',
|
||||
mutation: gql(await fetchTag('delete-deployment-group')),
|
||||
variables: {
|
||||
@ -396,7 +392,7 @@ test('should scale up', async t => {
|
||||
}
|
||||
});
|
||||
|
||||
const scale = await client.mutate({
|
||||
await client.mutate({
|
||||
fetchPolicy: 'network-only',
|
||||
mutation: gql(await fetchTag('scale')),
|
||||
variables: {
|
||||
@ -456,7 +452,7 @@ test('should scale down', async t => {
|
||||
}
|
||||
});
|
||||
|
||||
const scaleUp = await client.mutate({
|
||||
await client.mutate({
|
||||
fetchPolicy: 'network-only',
|
||||
mutation: gql(await fetchTag('scale')),
|
||||
variables: {
|
||||
@ -475,7 +471,7 @@ test('should scale down', async t => {
|
||||
}
|
||||
});
|
||||
|
||||
const scaleDown = await client.mutate({
|
||||
await client.mutate({
|
||||
fetchPolicy: 'network-only',
|
||||
mutation: gql(await fetchTag('scale')),
|
||||
variables: {
|
||||
@ -520,7 +516,7 @@ test("should delete Service's", async t => {
|
||||
}
|
||||
});
|
||||
|
||||
const provision = await client.mutate({
|
||||
await client.mutate({
|
||||
fetchPolicy: 'network-only',
|
||||
mutation: gql(await fetchTag('provision-manifest')),
|
||||
variables: {
|
||||
@ -590,7 +586,7 @@ test("should restart Service's", async t => {
|
||||
}
|
||||
});
|
||||
|
||||
const provision = await client.mutate({
|
||||
await client.mutate({
|
||||
fetchPolicy: 'network-only',
|
||||
mutation: gql(await fetchTag('provision-manifest')),
|
||||
variables: {
|
||||
@ -669,7 +665,7 @@ test("should stop Service's", async t => {
|
||||
}
|
||||
});
|
||||
|
||||
const provision = await client.mutate({
|
||||
await client.mutate({
|
||||
fetchPolicy: 'network-only',
|
||||
mutation: gql(await fetchTag('provision-manifest')),
|
||||
variables: {
|
||||
@ -748,7 +744,7 @@ test("should start Service's", async t => {
|
||||
}
|
||||
});
|
||||
|
||||
const provision = await client.mutate({
|
||||
await client.mutate({
|
||||
fetchPolicy: 'network-only',
|
||||
mutation: gql(await fetchTag('provision-manifest')),
|
||||
variables: {
|
||||
|
@ -1,11 +1,5 @@
|
||||
mutation scale(
|
||||
$serviceId: ID!
|
||||
$replicas: Int!
|
||||
) {
|
||||
scale(
|
||||
serviceId: $serviceId
|
||||
replicas: $replicas
|
||||
) {
|
||||
mutation scale($serviceId: ID!, $replicas: Int!) {
|
||||
scale(serviceId: $serviceId, replicas: $replicas) {
|
||||
id
|
||||
}
|
||||
}
|
||||
|
@ -23,12 +23,17 @@ module.exports = class DockerComposeClient extends EventEmitter {
|
||||
}
|
||||
|
||||
provision({ projectName, environment, manifest, files }, cb) {
|
||||
this._invoke('up', {
|
||||
// eslint-disable-next-line camelcase
|
||||
project_name: projectName,
|
||||
files,
|
||||
environment
|
||||
}, manifest, cb);
|
||||
this._invoke(
|
||||
'up',
|
||||
{
|
||||
// eslint-disable-next-line camelcase
|
||||
project_name: projectName,
|
||||
files,
|
||||
environment
|
||||
},
|
||||
manifest,
|
||||
cb
|
||||
);
|
||||
}
|
||||
|
||||
scale({ projectName, services, environment, manifest, files }, cb) {
|
||||
|
@ -1,6 +1,6 @@
|
||||
import React from 'react';
|
||||
import renderer from 'react-test-renderer';
|
||||
import ManifestEditor from '../src/index';
|
||||
// import React from 'react';
|
||||
// import renderer from 'react-test-renderer';
|
||||
// import ManifestEditor from '../src/index';
|
||||
|
||||
// It('renders <ManifestEditor /> correctly', () => {
|
||||
// const tree = renderer.create(<ManifestEditor />).toJSON();
|
||||
|
@ -63,17 +63,13 @@
|
||||
"jest": {
|
||||
"testEnvironment": "jsdom",
|
||||
"testRegex": "test/index.js",
|
||||
"setupFiles": [
|
||||
"<rootDir>/node_modules/react-scripts/config/polyfills.js"
|
||||
],
|
||||
"setupFiles": ["<rootDir>/node_modules/react-scripts/config/polyfills.js"],
|
||||
"testEnvironment": "node",
|
||||
"transform": {
|
||||
"^.+\\.(js|jsx)$": "<rootDir>/node_modules/react-scripts/config/jest/babelTransform.js",
|
||||
"^(?!.*\\.(js|jsx|css|json)$)": "<rootDir>/node_modules/react-scripts/config/jest/fileTransform.js"
|
||||
},
|
||||
"transformIgnorePatterns": [
|
||||
"[/\\\\]node_modules[/\\\\].+\\.(js|jsx)$"
|
||||
],
|
||||
"transformIgnorePatterns": ["[/\\\\]node_modules[/\\\\].+\\.(js|jsx)$"],
|
||||
"rootDir": "."
|
||||
}
|
||||
}
|
||||
|
@ -18,9 +18,7 @@
|
||||
"jsnext:main": "dist/pseudo-json-ast.es.js",
|
||||
"module": "dist/pseudo-json-ast.es.js",
|
||||
"entry": "src/index.js",
|
||||
"files": [
|
||||
"dist"
|
||||
],
|
||||
"files": ["dist"],
|
||||
"scripts": {
|
||||
"lint": "eslint . --fix",
|
||||
"lint-ci": "eslint . --format junit --output-file $CIRCLE_TEST_REPORTS/lint/pseudo-json-ast.xml",
|
||||
@ -56,9 +54,7 @@
|
||||
},
|
||||
"ava": {
|
||||
"tap": true,
|
||||
"require": [
|
||||
"babel-register"
|
||||
],
|
||||
"require": ["babel-register"],
|
||||
"babel": "inherit"
|
||||
}
|
||||
}
|
||||
|
@ -20,9 +20,7 @@
|
||||
"jsnext:main": "dist/pseudo-yaml-ast.es.js",
|
||||
"module": "dist/pseudo-yaml-ast.es.js",
|
||||
"entry": "src/index.js",
|
||||
"files": [
|
||||
"dist"
|
||||
],
|
||||
"files": ["dist"],
|
||||
"scripts": {
|
||||
"lint": "eslint . --fix",
|
||||
"lint-ci": "eslint . --format junit --output-file $CIRCLE_TEST_REPORTS/lint/pseudo-yaml-ast.xml",
|
||||
@ -58,9 +56,7 @@
|
||||
},
|
||||
"ava": {
|
||||
"tap": true,
|
||||
"require": [
|
||||
"babel-register"
|
||||
],
|
||||
"require": ["babel-register"],
|
||||
"babel": "inherit"
|
||||
}
|
||||
}
|
||||
|
@ -3,14 +3,7 @@
|
||||
"version": "1.0.8",
|
||||
"license": "MPL-2.0",
|
||||
"description": "Calculate the `rem`'s from `px` values",
|
||||
"keywords": [
|
||||
"calc",
|
||||
"rem",
|
||||
"em",
|
||||
"px",
|
||||
"pixels",
|
||||
"pixel"
|
||||
],
|
||||
"keywords": ["calc", "rem", "em", "px", "pixels", "pixel"],
|
||||
"repository": "github:yldio/joyent-portal",
|
||||
"main": "dist/remcalc.umd.js",
|
||||
"jsnext:main": "dist/remcalc.es.js",
|
||||
@ -56,17 +49,13 @@
|
||||
],
|
||||
"env": {
|
||||
"test": {
|
||||
"plugins": [
|
||||
"istanbul"
|
||||
]
|
||||
"plugins": ["istanbul"]
|
||||
}
|
||||
}
|
||||
},
|
||||
"ava": {
|
||||
"tap": true,
|
||||
"require": [
|
||||
"babel-register"
|
||||
],
|
||||
"require": ["babel-register"],
|
||||
"babel": "inherit"
|
||||
}
|
||||
}
|
||||
|
@ -3,10 +3,7 @@
|
||||
"version": "1.0.8",
|
||||
"license": "MPL-2.0",
|
||||
"description": "Generate a random alpha string",
|
||||
"keywords": [
|
||||
"random",
|
||||
"alphabetical"
|
||||
],
|
||||
"keywords": ["random", "alphabetical"],
|
||||
"repository": "github:yldio/joyent-portal",
|
||||
"main": "dist/rnd-id.umd.js",
|
||||
"jsnext:main": "dist/rnd-id.es.js",
|
||||
@ -49,17 +46,13 @@
|
||||
],
|
||||
"env": {
|
||||
"test": {
|
||||
"plugins": [
|
||||
"istanbul"
|
||||
]
|
||||
"plugins": ["istanbul"]
|
||||
}
|
||||
}
|
||||
},
|
||||
"ava": {
|
||||
"tap": true,
|
||||
"require": [
|
||||
"babel-register"
|
||||
],
|
||||
"require": ["babel-register"],
|
||||
"babel": "inherit"
|
||||
}
|
||||
}
|
||||
|
@ -62,17 +62,13 @@
|
||||
],
|
||||
"env": {
|
||||
"test": {
|
||||
"plugins": [
|
||||
"istanbul"
|
||||
]
|
||||
"plugins": ["istanbul"]
|
||||
}
|
||||
}
|
||||
},
|
||||
"ava": {
|
||||
"tap": true,
|
||||
"require": [
|
||||
"babel-register"
|
||||
],
|
||||
"require": ["babel-register"],
|
||||
"babel": "inherit"
|
||||
}
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,118 +1,147 @@
|
||||
[{
|
||||
"uuid": "081a792c-47e0-4439-924b-2efa9788ae9e",
|
||||
"id": "nginx",
|
||||
"name": "Nginx",
|
||||
"project": "e0ea0c02-55cc-45fe-8064-3e5176a59401",
|
||||
"instances": [""],
|
||||
"metrics": [{
|
||||
"name": "CPU",
|
||||
"value": "50%"
|
||||
}, {
|
||||
"name": "Memory",
|
||||
"value": "20%"
|
||||
}, {
|
||||
"name": "Network",
|
||||
"value": "2.9Kb/sec"
|
||||
}],
|
||||
"connections": [
|
||||
"be227788-74f1-4e5b-a85f-b5c71cbae8d8"
|
||||
],
|
||||
"healthy": true,
|
||||
"datacentres": 1
|
||||
}, {
|
||||
"uuid": "be227788-74f1-4e5b-a85f-b5c71cbae8d8",
|
||||
"id": "wordpress",
|
||||
"name": "Wordpress",
|
||||
"project": "e0ea0c02-55cc-45fe-8064-3e5176a59401",
|
||||
"instances": ["", ""],
|
||||
"metrics": [{
|
||||
"name": "CPU",
|
||||
"value": "50%"
|
||||
}, {
|
||||
"name": "Memory",
|
||||
"value": "20%"
|
||||
}, {
|
||||
"name": "Network",
|
||||
"value": "2.9Kb/sec"
|
||||
}],
|
||||
"connections": [
|
||||
"6a0eee76-c019-413b-9d5f-44712b55b993",
|
||||
"6d31aff4-de1e-4042-a983-fbd23d5c530c",
|
||||
"4ee4103e-1a52-4099-a48e-01588f597c70"
|
||||
],
|
||||
"healthy": true,
|
||||
"datacentres": 2
|
||||
}, {
|
||||
"uuid": "6a0eee76-c019-413b-9d5f-44712b55b993",
|
||||
"id": "nfs",
|
||||
"name": "NFS",
|
||||
"project": "e0ea0c02-55cc-45fe-8064-3e5176a59401",
|
||||
"instances": ["", ""],
|
||||
"metrics": [{
|
||||
"name": "CPU",
|
||||
"value": "50%"
|
||||
}, {
|
||||
"name": "Memory",
|
||||
"value": "20%"
|
||||
}, {
|
||||
"name": "Network",
|
||||
"value": "2.9Kb/sec"
|
||||
}],
|
||||
"healthy": true,
|
||||
"datacentres": 2
|
||||
}, {
|
||||
"uuid": "6d31aff4-de1e-4042-a983-fbd23d5c530c",
|
||||
"id": "memcached",
|
||||
"name": "Memcached",
|
||||
"project": "e0ea0c02-55cc-45fe-8064-3e5176a59401",
|
||||
"instances": ["", ""],
|
||||
"metrics": [{
|
||||
"name": "CPU",
|
||||
"value": "50%"
|
||||
}, {
|
||||
"name": "Memory",
|
||||
"value": "20%"
|
||||
}, {
|
||||
"name": "Network",
|
||||
"value": "2.9Kb/sec"
|
||||
}],
|
||||
"healthy": true,
|
||||
"datacentres": 2
|
||||
}, {
|
||||
"uuid": "4ee4103e-1a52-4099-a48e-01588f597c70",
|
||||
"id": "percona",
|
||||
"name": "Percona",
|
||||
"project": "e0ea0c02-55cc-45fe-8064-3e5176a59401",
|
||||
"instances": ["", ""],
|
||||
"metrics": [{
|
||||
"name": "CPU",
|
||||
"value": "50%"
|
||||
}, {
|
||||
"name": "Memory",
|
||||
"value": "20%"
|
||||
}, {
|
||||
"name": "Network",
|
||||
"value": "2.9Kb/sec"
|
||||
}],
|
||||
"healthy": true,
|
||||
"datacentres": 1
|
||||
}, {
|
||||
"uuid": "97c68055-db88-45c9-ad49-f26da4264777",
|
||||
"id": "consul",
|
||||
"name": "Consul",
|
||||
"project": "e0ea0c02-55cc-45fe-8064-3e5176a59401",
|
||||
"instances": ["", ""],
|
||||
"isConsul": true,
|
||||
"metrics": [{
|
||||
"name": "CPU",
|
||||
"value": "50%"
|
||||
}, {
|
||||
"name": "Memory",
|
||||
"value": "20%"
|
||||
}, {
|
||||
"name": "Network",
|
||||
"value": "2.9Kb/sec"
|
||||
}],
|
||||
"healthy": true,
|
||||
"datacentres": 2
|
||||
}]
|
||||
[
|
||||
{
|
||||
"uuid": "081a792c-47e0-4439-924b-2efa9788ae9e",
|
||||
"id": "nginx",
|
||||
"name": "Nginx",
|
||||
"project": "e0ea0c02-55cc-45fe-8064-3e5176a59401",
|
||||
"instances": [""],
|
||||
"metrics": [
|
||||
{
|
||||
"name": "CPU",
|
||||
"value": "50%"
|
||||
},
|
||||
{
|
||||
"name": "Memory",
|
||||
"value": "20%"
|
||||
},
|
||||
{
|
||||
"name": "Network",
|
||||
"value": "2.9Kb/sec"
|
||||
}
|
||||
],
|
||||
"connections": ["be227788-74f1-4e5b-a85f-b5c71cbae8d8"],
|
||||
"healthy": true,
|
||||
"datacentres": 1
|
||||
},
|
||||
{
|
||||
"uuid": "be227788-74f1-4e5b-a85f-b5c71cbae8d8",
|
||||
"id": "wordpress",
|
||||
"name": "Wordpress",
|
||||
"project": "e0ea0c02-55cc-45fe-8064-3e5176a59401",
|
||||
"instances": ["", ""],
|
||||
"metrics": [
|
||||
{
|
||||
"name": "CPU",
|
||||
"value": "50%"
|
||||
},
|
||||
{
|
||||
"name": "Memory",
|
||||
"value": "20%"
|
||||
},
|
||||
{
|
||||
"name": "Network",
|
||||
"value": "2.9Kb/sec"
|
||||
}
|
||||
],
|
||||
"connections": [
|
||||
"6a0eee76-c019-413b-9d5f-44712b55b993",
|
||||
"6d31aff4-de1e-4042-a983-fbd23d5c530c",
|
||||
"4ee4103e-1a52-4099-a48e-01588f597c70"
|
||||
],
|
||||
"healthy": true,
|
||||
"datacentres": 2
|
||||
},
|
||||
{
|
||||
"uuid": "6a0eee76-c019-413b-9d5f-44712b55b993",
|
||||
"id": "nfs",
|
||||
"name": "NFS",
|
||||
"project": "e0ea0c02-55cc-45fe-8064-3e5176a59401",
|
||||
"instances": ["", ""],
|
||||
"metrics": [
|
||||
{
|
||||
"name": "CPU",
|
||||
"value": "50%"
|
||||
},
|
||||
{
|
||||
"name": "Memory",
|
||||
"value": "20%"
|
||||
},
|
||||
{
|
||||
"name": "Network",
|
||||
"value": "2.9Kb/sec"
|
||||
}
|
||||
],
|
||||
"healthy": true,
|
||||
"datacentres": 2
|
||||
},
|
||||
{
|
||||
"uuid": "6d31aff4-de1e-4042-a983-fbd23d5c530c",
|
||||
"id": "memcached",
|
||||
"name": "Memcached",
|
||||
"project": "e0ea0c02-55cc-45fe-8064-3e5176a59401",
|
||||
"instances": ["", ""],
|
||||
"metrics": [
|
||||
{
|
||||
"name": "CPU",
|
||||
"value": "50%"
|
||||
},
|
||||
{
|
||||
"name": "Memory",
|
||||
"value": "20%"
|
||||
},
|
||||
{
|
||||
"name": "Network",
|
||||
"value": "2.9Kb/sec"
|
||||
}
|
||||
],
|
||||
"healthy": true,
|
||||
"datacentres": 2
|
||||
},
|
||||
{
|
||||
"uuid": "4ee4103e-1a52-4099-a48e-01588f597c70",
|
||||
"id": "percona",
|
||||
"name": "Percona",
|
||||
"project": "e0ea0c02-55cc-45fe-8064-3e5176a59401",
|
||||
"instances": ["", ""],
|
||||
"metrics": [
|
||||
{
|
||||
"name": "CPU",
|
||||
"value": "50%"
|
||||
},
|
||||
{
|
||||
"name": "Memory",
|
||||
"value": "20%"
|
||||
},
|
||||
{
|
||||
"name": "Network",
|
||||
"value": "2.9Kb/sec"
|
||||
}
|
||||
],
|
||||
"healthy": true,
|
||||
"datacentres": 1
|
||||
},
|
||||
{
|
||||
"uuid": "97c68055-db88-45c9-ad49-f26da4264777",
|
||||
"id": "consul",
|
||||
"name": "Consul",
|
||||
"project": "e0ea0c02-55cc-45fe-8064-3e5176a59401",
|
||||
"instances": ["", ""],
|
||||
"isConsul": true,
|
||||
"metrics": [
|
||||
{
|
||||
"name": "CPU",
|
||||
"value": "50%"
|
||||
},
|
||||
{
|
||||
"name": "Memory",
|
||||
"value": "20%"
|
||||
},
|
||||
{
|
||||
"name": "Network",
|
||||
"value": "2.9Kb/sec"
|
||||
}
|
||||
],
|
||||
"healthy": true,
|
||||
"datacentres": 2
|
||||
}
|
||||
]
|
||||
|
@ -57,17 +57,13 @@
|
||||
],
|
||||
"env": {
|
||||
"test": {
|
||||
"plugins": [
|
||||
"istanbul"
|
||||
]
|
||||
"plugins": ["istanbul"]
|
||||
}
|
||||
}
|
||||
},
|
||||
"ava": {
|
||||
"tap": true,
|
||||
"require": [
|
||||
"babel-register"
|
||||
],
|
||||
"require": ["babel-register"],
|
||||
"babel": "inherit"
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user