import React, { Fragment } from 'react'; import { compose, graphql } from 'react-apollo'; import ReduxForm from 'declarative-redux-form'; import { destroy } from 'redux-form'; import { connect } from 'react-redux'; import get from 'lodash.get'; import { Margin, Padding } from 'styled-components-spacing'; import Flex from 'styled-flex-component'; import { set } from 'react-redux-values'; import punycode from 'punycode'; import remcalc from 'remcalc'; import { CnsIcon, P, Card, H3, Button, FormGroup, FormLabel, Toggle, Divider, TagList, StatusLoader } from 'joyent-ui-toolkit'; import getAccount from '../../graphql/get-account.gql'; import { Hostname, Header, AddServiceForm, HostnamesHeader } from '@components/create-instance/cns'; import Title from '@components/create-instance/title'; import Tag from '@components/instances/tags'; import Description from '@components/create-instance/description'; const CNS_FORM = 'create-instance-cns'; const CNSContainer = ({ submitted, expanded, proceeded, serviceNames = [], instanceName, cnsEnabled = true, hostnames = [], handleNext, handleEdit, handleToggleCnsEnabled, handleAddService, handleRemoveService, loading }) => ( }> Container Name Service {expanded ? ( Triton CNS is used to automatically update hostnames for your instances*. You can serve multiple instances (with multiple IP addresses) under the same hostname by matching the CNS service names.{' '} Read the docs ) : null}
{expanded && cnsEnabled ? (
{loading ? ( {' '} ) : ( {hostnames .filter(({ service }) => !service) .map(({ value, ...hostname }) => ( ))} )} {serviceNames.length ? ( Existing CNS service name(s) {serviceNames.map((value, index) => ( handleRemoveService(index)} /> ))} ) : null} {props => } {hostnames .filter(({ service }) => service) .map(({ value, ...hostname }) => ( ))} ) : null} {expanded ? ( Disabled CNS Enabled CNS

*All hostnames listed here will be confirmed after deployment.

) : null} {proceeded && !expanded ? (

{cnsEnabled ? 'CNS Enabled' : 'CNS Not Enabled'}

{cnsEnabled && serviceNames.length ? ( Existing CNS service name(s) {serviceNames.map((value, index) => ( ))} ) : null}
) : null}
); export default compose( graphql(getAccount, { props: ({ data: { loading, account: { id } = [] } }) => ({ loading, id }) }), connect(({ form, values }, { id }) => { const instanceName = get( form, 'create-instance-name.values.name', '' ); const serviceNames = get(values, `${CNS_FORM}-services`, []); // REPLACE WITH DATA CENTER const dataCenter = 'us-east-1'; const hostnames = [ { values: [`${instanceName}.inst.${id}.${dataCenter}.triton.zone`], public: true }, { values: [`${instanceName}.inst.${id}.${dataCenter}.cns.joyent.com`] }, { values: [], public: true, service: true }, { values: [], service: true } ]; hostnames.forEach(hostname => { if (!hostname.service) { return hostname; } serviceNames.forEach(name => { const postfix = hostname.public ? '.triton.zone' : '.cns.joyent.com'; const value = `${name}.svc.${id}.${dataCenter}${postfix}`; hostname.values.push(value); }); }); return { cnsEnabled: get(values, `${CNS_FORM}-enabled`, true), instanceName, proceeded: get(values, `${CNS_FORM}-proceeded`, false), hostnames, serviceNames }; }), connect(null, (dispatch, { history, cnsEnabled, serviceNames = [] }) => ({ handleNext: () => { dispatch(set({ name: `${CNS_FORM}-proceeded`, value: true })); return history.push(`/instances/~create/affinity`); }, handleEdit: () => history.push(`/instances/~create/cns`), handleToggleCnsEnabled: ({ target }) => dispatch(set({ name: `${CNS_FORM}-enabled`, value: !cnsEnabled })), handleAddService: ({ name }) => { const serviceName = punycode .encode(name.toLowerCase().replace(/\s/g, '-')) .replace(/\-$/, ''); dispatch([ destroy(`${CNS_FORM}-new-service`), set({ name: `${CNS_FORM}-services`, value: serviceNames.concat(serviceName) }) ]); }, handleRemoveService: index => { serviceNames.splice(index, 1); return dispatch( set({ name: `${CNS_FORM}-services`, value: serviceNames.slice() }) ); } })) )(CNSContainer);