import React, { Fragment } from 'react'; import { compose } 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 remcalc from 'remcalc'; import { CnsIcon, P, Card, H3, Button, FormGroup, FormLabel, Toggle, Divider, TagList } from 'joyent-ui-toolkit'; 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 }) => ( }>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 ? (
{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 are indicative and will be confirmed after deployment.

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

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

{cnsEnabled ? ( Existing CNS service name(s) {serviceNames.map((value, index) => ( ))} ) : null}
) : null}
); export default compose( connect(({ form, values }, ownProps) => { const instanceName = get( form, 'create-instance-name.values.name', '' ); const serviceNames = get(values, `${CNS_FORM}-services`, []); // REPLACE WITH USER ID AND DATA CENTER const userID = '10703e3c-ada6-478d-c757-e5bcad0ea74c'; const dataCenter = 'us-east-1'; const hostnames = [ { values: [`${instanceName}.inst.${userID}.${dataCenter}.triton.zone`], public: true }, { values: [`${instanceName}.inst.${userID}.${dataCenter}.cns.joyent.com`] }, { values: [], public: true, service: true }, { values: [], service: true } ]; hostnames.map(hostname => { if (!hostname.service) { return hostname; } return serviceNames.map(name => { const postfix = hostname.public ? '.triton.zone' : '.cns.joyent.com'; const value = `${name}.svc.${userID}.${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 }) => { dispatch([ destroy(`${CNS_FORM}-new-service`), set({ name: `${CNS_FORM}-services`, value: serviceNames.concat(name.toLowerCase()) }) ]); }, handleRemoveService: index => { serviceNames.splice(index, 1); return dispatch( set({ name: `${CNS_FORM}-services`, value: serviceNames.slice() }) ); } })) )(CNSContainer);