open-nomad/ui/mirage/config.js

164 lines
4.8 KiB
JavaScript

import Ember from 'ember';
import Response from 'ember-cli-mirage/response';
import { HOSTS } from './common';
const { copy } = Ember;
export function findLeader(schema) {
const agent = schema.agents.first();
return `${agent.address}:${agent.tags.port}`;
}
export default function() {
this.timing = 0; // delay for each request, automatically set to 0 during testing
this.namespace = 'v1';
this.get('/jobs', function({ jobs }, { queryParams }) {
const json = this.serialize(jobs.all());
return json
.filter(job => (queryParams.namespace ? job.NamespaceID === queryParams.namespace : true))
.map(job => filterKeys(job, 'TaskGroups', 'NamespaceID'));
});
this.get('/job/:id');
this.get('/job/:id/summary', function({ jobSummaries }, { params }) {
return this.serialize(jobSummaries.findBy({ jobId: params.id }));
});
this.get('/job/:id/allocations', function({ allocations }, { params }) {
return this.serialize(allocations.where({ jobId: params.id }));
});
this.get('/job/:id/versions', function({ jobVersions }, { params }) {
return this.serialize(jobVersions.where({ jobId: params.id }));
});
this.get('/job/:id/deployments', function({ deployments }, { params }) {
return this.serialize(deployments.where({ jobId: params.id }));
});
this.get('/deployment/:id');
this.get('/deployment/allocations/:id', function(schema, { params }) {
const job = schema.jobs.find(schema.deployments.find(params.id).jobId);
const allocations = schema.allocations.where({ jobId: job.id });
return this.serialize(allocations.slice(0, 3));
});
this.get('/nodes', function({ nodes }) {
const json = this.serialize(nodes.all());
return json;
});
this.get('/node/:id');
this.get('/node/:id/allocations', function({ allocations }, { params }) {
return this.serialize(allocations.where({ nodeId: params.id }));
});
this.get('/allocation/:id');
this.get('/namespaces', function({ namespaces }) {
const records = namespaces.all();
if (records.length) {
return this.serialize(records);
}
return new Response(501, {}, null);
});
this.get('/namespace/:id', function({ namespaces }, { params }) {
if (namespaces.all().length) {
return this.serialize(namespaces.find(params.id));
}
return new Response(501, {}, null);
});
this.get('/agent/members', function({ agents }) {
return {
Members: this.serialize(agents.all()),
};
});
this.get('/status/leader', function(schema) {
return JSON.stringify(findLeader(schema));
});
this.get('/acl/token/self', function({ tokens }, req) {
const secret = req.requestHeaders['X-Nomad-Token'];
const tokenForSecret = tokens.findBy({ secretId: secret });
// Return the token if it exists
if (tokenForSecret) {
return this.serialize(tokenForSecret);
}
// Client error if it doesn't
return new Response(400, {}, null);
});
this.get('/acl/token/:id', function({ tokens }, req) {
const token = tokens.find(req.params.id);
const secret = req.requestHeaders['X-Nomad-Token'];
const tokenForSecret = tokens.findBy({ secretId: secret });
// Return the token only if the request header matches the token
// or the token is of type management
if (token.secretId === secret || (tokenForSecret && tokenForSecret.type === 'management')) {
return this.serialize(token);
}
// Return not authorized otherwise
return new Response(403, {}, null);
});
this.get('/acl/policy/:id', function({ policies, tokens }, req) {
const policy = policies.find(req.params.id);
const secret = req.requestHeaders['X-Nomad-Token'];
const tokenForSecret = tokens.findBy({ secretId: secret });
// Return the policy only if the token that matches the request header
// includes the policy or if the token that matches the request header
// is of type management
if (
tokenForSecret &&
(tokenForSecret.policies.includes(policy) || tokenForSecret.type === 'management')
) {
return this.serialize(policy);
}
// Return not authorized otherwise
return new Response(403, {}, null);
});
// TODO: in the future, this hack may be replaceable with dynamic host name
// support in pretender: https://github.com/pretenderjs/pretender/issues/210
HOSTS.forEach(host => {
this.get(`http://${host}/v1/client/allocation/:id/stats`, function(
{ clientAllocationStats },
{ params }
) {
return this.serialize(clientAllocationStats.find(params.id));
});
this.get(`http://${host}/v1/client/stats`, function({ clientStats }) {
return this.serialize(clientStats.find(host));
});
});
}
function filterKeys(object, ...keys) {
const clone = copy(object, true);
keys.forEach(key => {
delete clone[key];
});
return clone;
}