feat(my-joy-beta): make queries for dns

fixes #725
This commit is contained in:
Sara Vieira 2017-10-25 18:09:02 +01:00 committed by Sérgio Ramos
parent 2b7a7d9221
commit bff7fe704e
10 changed files with 110 additions and 21 deletions

View File

@ -6,8 +6,7 @@
"main": "src/schema/index.js", "main": "src/schema/index.js",
"scripts": { "scripts": {
"lint": "eslint . --fix --ext .js --ext .graphql", "lint": "eslint . --fix --ext .js --ext .graphql",
"fmt": "fmt": "prettier --write --single-quote src/**/*.js src/*.js src/**/*.graphql",
"prettier --write --single-quote src/**/*.js src/*.js src/**/*.graphql",
"test": "echo 0", "test": "echo 0",
"test-ci": "echo 0", "test-ci": "echo 0",
"start": "PORT=4000 node src/server.js", "start": "PORT=4000 node src/server.js",
@ -36,19 +35,22 @@
"hapi": "^16.6.2", "hapi": "^16.6.2",
"hasha": "^3.0.0", "hasha": "^3.0.0",
"inert": "^4.2.1", "inert": "^4.2.1",
"lodash.get": "^4.4.2",
"node-fetch": "^1.7.3", "node-fetch": "^1.7.3",
"smartdc-auth": "^2.5.6", "smartdc-auth": "^2.5.6",
"triton": "^5.4.0" "triton": "^5.4.0"
}, },
"devDependencies": { "devDependencies": {
"graphql-faker": "^1.4.0",
"eslint": "^4.8.0", "eslint": "^4.8.0",
"eslint-config-joyent-portal": "3.1.0", "eslint-config-joyent-portal": "3.1.0",
"eslint-plugin-graphql": "^1.4.0-1", "eslint-plugin-graphql": "^1.4.0-1",
"graphql-faker": "^1.4.0",
"nodemon": "^1.12.1", "nodemon": "^1.12.1",
"prettier": "^1.7.4" "prettier": "^1.7.4"
}, },
"nodemonConfig": { "nodemonConfig": {
"ignore": ["doc/*"] "ignore": [
"doc/*"
]
} }
} }

View File

@ -1,5 +1,7 @@
const { toKeyValue, fromKeyValue } = require('../api/key-value'); const { toKeyValue, fromKeyValue } = require('../api/key-value');
const api = require('../api'); const api = require('../api');
const forceArray = require('force-array');
const get = require('lodash.get');
const resolvers = { const resolvers = {
Query: { Query: {
@ -57,16 +59,34 @@ const resolvers = {
package: (root, { id, name }) => api.packages.get({ id, name }), package: (root, { id, name }) => api.packages.get({ id, name }),
machines: (root, { id, brand, state, tags, ...rest }) => machines: (root, { id, brand, state, tags, ...rest }, _, ctx) =>
id id ? api.machines.get({ id }).then(machine => [machine])
? api.machines.get({ id }).then(machine => [machine])
: api.machines.list( : api.machines.list(
Object.assign(rest, { Object.assign(rest, {
brand: brand ? brand.toLowerCase() : brand, brand: brand ? brand.toLowerCase() : brand,
state: state ? state.toLowerCase() : state, state: state ? state.toLowerCase() : state,
tags: fromKeyValue(tags) tags: fromKeyValue(tags)
}) })
), )
.then(machines => {
const field = forceArray(ctx.fieldNodes)
.filter(({ name }) => name.value === 'machines')
.shift();
if (!field) {
return machines;
}
const prop = get(field, 'selectionSet.selections', [])
.filter(({ name }) => name.value === 'dns_names')
.shift();
if (!prop) {
return machines;
}
return machines.map(({ id }) => api.machines.get({ id }));
}),
machine: (root, { id }) => api.machines.get({ id }), machine: (root, { id }) => api.machines.get({ id }),

View File

@ -199,6 +199,8 @@ type Machine {
compute_node: ID compute_node: ID
# The id or name of the package used to create this instance # The id or name of the package used to create this instance
package: Package package: Package
# DNS names of the instance (if the instance is using CNS)
dns_names: [String]
# The snapshots based on this instance # The snapshots based on this instance
snapshots( snapshots(
# Snapshot name # Snapshot name

View File

@ -6,8 +6,7 @@
"repository": "github:yldio/joyent-portal", "repository": "github:yldio/joyent-portal",
"main": "build/", "main": "build/",
"scripts": { "scripts": {
"dev": "dev": "REACT_APP_GQL_PORT=4000 PORT=3069 REACT_APP_GQL_PROTOCOL=http joyent-react-scripts start",
"REACT_APP_GQL_PORT=4000 PORT=3069 REACT_APP_GQL_PROTOCOL=http joyent-react-scripts start",
"start": "PORT=3069 joyent-react-scripts start", "start": "PORT=3069 joyent-react-scripts start",
"build": "NODE_ENV=production joyent-react-scripts build", "build": "NODE_ENV=production joyent-react-scripts build",
"lint:css": "stylelint './src/**/*.js'", "lint:css": "stylelint './src/**/*.js'",
@ -20,6 +19,7 @@
"dependencies": { "dependencies": {
"@manaflair/redux-batch": "^0.1.0", "@manaflair/redux-batch": "^0.1.0",
"apollo": "^0.2.2", "apollo": "^0.2.2",
"eslint-plugin-markdown": "^1.0.0-beta.6",
"joyent-ui-toolkit": "^2.0.0", "joyent-ui-toolkit": "^2.0.0",
"lodash.find": "^4.6.0", "lodash.find": "^4.6.0",
"lodash.get": "^4.4.2", "lodash.get": "^4.4.2",

View File

@ -0,0 +1,63 @@
import React from 'react';
import ReactJson from 'react-json-view';
import PropTypes from 'prop-types';
import { compose, graphql } from 'react-apollo';
import find from 'lodash.find';
import get from 'lodash.get';
import {
ViewContainer,
Title,
StatusLoader,
Message,
MessageDescription,
MessageTitle
} from 'joyent-ui-toolkit';
import ListDNS from '@graphql/list-dns.gql';
const DNS = ({ instance, loading, error }) => {
const { name, dns_names } = instance || {};
const _title = <Title>DNS</Title>;
const _loading = loading && !name && !dns_names && <StatusLoader />;
const _summary = !_loading && instance && <ReactJson src={dns_names} />;
const _error = error &&
!_loading &&
!instance && (
<Message error>
<MessageTitle>Ooops!</MessageTitle>
<MessageDescription>
An error occurred while loading your instance DNS
</MessageDescription>
</Message>
);
return (
<ViewContainer center={Boolean(_loading)} main>
{_title}
{_loading}
{_error}
{_summary}
</ViewContainer>
);
};
DNS.propTypes = {
loading: PropTypes.bool
};
export default compose(
graphql(ListDNS, {
options: ({ match }) => ({
variables: {
name: get(match, 'params.instance')
}
}),
props: ({ data: { loading, error, variables, ...rest } }) => ({
instance: find(get(rest, 'machines', []), ['name', variables.name]),
loading,
error
})
})
)(DNS);

View File

@ -4,6 +4,7 @@ export { default as Tags } from './tags';
export { default as Metadata } from './metadata'; export { default as Metadata } from './metadata';
export { default as Networks } from './networks'; export { default as Networks } from './networks';
export { default as Firewall } from './firewall'; export { default as Firewall } from './firewall';
export { default as Dns } from './dns';
export { default as Snapshots } from './snapshots'; export { default as Snapshots } from './snapshots';
export { default as Resize } from './resize'; export { default as Resize } from './resize';
export { default as CreateSnapshot } from './create-snapshot'; export { default as CreateSnapshot } from './create-snapshot';

View File

@ -1,15 +1,6 @@
query instance($name: String) { query instance($name: String) {
machines(name: $name) { machines(name: $name) {
id id,
name dns_names
state
memory
disk
created
updated
firewall_enabled
package {
name
}
} }
} }

View File

@ -0,0 +1,7 @@
query instance($name: String!) {
machines(name: $name) {
id,
name,
dns_names
}
}

View File

@ -14,6 +14,7 @@ import {
Metadata as InstanceMetadata, Metadata as InstanceMetadata,
Networks as InstanceNetworks, Networks as InstanceNetworks,
Firewall as InstanceFirewall, Firewall as InstanceFirewall,
Dns as InstanceDns,
Snapshots as InstanceSnapshots, Snapshots as InstanceSnapshots,
Resize as InstanceResize, Resize as InstanceResize,
CreateSnapshot as InstanceCreateSnapshot CreateSnapshot as InstanceCreateSnapshot
@ -78,6 +79,7 @@ export default () => (
exact exact
component={InstanceFirewall} component={InstanceFirewall}
/> />
<Route path="/instances/:instance/dns" exact component={InstanceDns} />
<Route <Route
path="/instances/:instance/snapshots" path="/instances/:instance/snapshots"
exact exact

View File

@ -8,6 +8,7 @@ export default {
'metadata', 'metadata',
'networks', 'networks',
'firewall', 'firewall',
'dns',
'snapshots' 'snapshots'
] ]
} }