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