Skip to content

Commit

Permalink
feat(Deployment): Support for additional Deployment operations (#103)
Browse files Browse the repository at this point in the history
Fixes #47
  • Loading branch information
silasbw committed May 23, 2017
1 parent b8d8dac commit d802180
Show file tree
Hide file tree
Showing 4 changed files with 167 additions and 90 deletions.
27 changes: 27 additions & 0 deletions lib/deployments.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
'use strict';

const BaseObject = require('./base');
const ContainerBaseObject = require('./container-base-object');

class NamedDeployments extends ContainerBaseObject {
constructor(options) {
super(Object.assign({
resources: ['status', 'scale', 'rollback']
}, options));
}
}

class Deployments extends BaseObject {
constructor(options) {
super(Object.assign({}, options, {
fn: name => new NamedDeployments({
api: options.api,
name: name,
parentPath: this.path
}),
name: options.name || 'deployments'
}));
}
}

module.exports = Deployments;
14 changes: 10 additions & 4 deletions lib/extensions.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
'use strict';

const ApiGroup = require('./api-group');
const Deployments = require('./deployments');

class Extensions extends ApiGroup {
constructor(options) {
const resources = [
const commonResources = [
'daemonsets',
'deployments',
'horizontalpodautoscalers',
'ingresses',
'jobs',
Expand All @@ -16,8 +16,14 @@ class Extensions extends ApiGroup {
options = Object.assign({}, options, {
path: 'apis/extensions',
version: options.version || 'v1beta1',
groupResources: resources,
namespaceResources: resources
groupResources: commonResources.concat(['deployments']),
//
// The custom Deployments objects implement functionality available only
// in namespaces.
//
namespaceResources: commonResources.concat([
{ name: 'deployments', Constructor: Deployments }
])
});
super(options);
}
Expand Down
130 changes: 130 additions & 0 deletions test/deployments.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
'use strict';

const assume = require('assume');
const async = require('async');
const nock = require('nock');

const common = require('./common');
const beforeTesting = common.beforeTesting;

const resourceName = 'test';

describe('lib.deployments', () => {
const path = `/apis/extensions/v1beta1/namespaces/${ common.currentName }/deployments`;
const resourcePath = `${ path }/${ resourceName }`;
const deploymentObj = {
kind: 'Deployment',
metadata: {
name: resourceName
},
spec: {
selector: [
{ app: 'test' }
],
template: {
metadata: {
labels: {
app: 'test'
}
},
spec: {
containers: [{
name: 'test',
imagePullPolicy: 'Never',
image: 'test.com:5000/test:v0'
}]
}
}
}
};

beforeTesting('int', common.changeName);
beforeTesting('unit', () => {
const mockDeployment = {
kind: 'Deployment',
metadata: {
name: resourceName
}
};
nock(common.extensions.url)
.post(path)
.reply(201, mockDeployment)
.get(resourcePath)
.reply(200, mockDeployment)
.delete(resourcePath)
.reply(200, mockDeployment);
});

it('POSTs, GETs, and DELETEs', done => {
async.series([
next => {
common.extensions.ns.deployments.post({ body: deploymentObj }, next);
},
next => common.extensions.ns.deployments.get(resourceName, next),
next => common.extensions.ns.deployments.delete(resourceName, next)
], (err, results) => {
assume(err).is.falsy();
const deployments = results[0];
assume(deployments.metadata.name).is.equal(resourceName);
done();
});
});

describe('lists', () => {
beforeTesting('int', common.changeName);
beforeTesting('unit', () => {
const mockDeploymentList = {
kind: 'DeploymentList',
items: []
};
nock(common.extensions.url)
.get(path)
.reply(200, mockDeploymentList);
});

it('returns DeploymentList', done => {
async.series([
next => common.extensions.ns.deployments.get(next)
], (err, results) => {
assume(err).is.falsy();
const deploymentList = results[0];
assume(deploymentList.kind).is.equal('DeploymentList');
done();
});
});
});

describe('.status', () => {
beforeTesting('unit', () => {
const mockStatus = {
kind: 'Deployment',
status: {
observedGeneration: 1,
replicas: 2
}
};
nock(common.extensions.url)
.get(`${ resourcePath }/status`)
.reply(200, mockStatus);
});

beforeTesting('int', done => {
common.changeName(err => {
assume(err).is.falsy();
common.extensions.ns.deployments.post({ body: deploymentObj }, postErr => {
assume(postErr).is.falsy();
done();
});
});
});

it('returns Deployment with status', done => {
common.extensions.ns.deployments(resourceName).status.get((err, deployment) => {
assume(err).is.falsy();
assume(deployment.kind).is.equal('Deployment');
assume(deployment.status).is.a('object');
done();
});
});
});
});
86 changes: 0 additions & 86 deletions test/extensions.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,92 +9,6 @@ const beforeTesting = common.beforeTesting;
const resourceName = 'test';

describe('lib.extensions', () => {
describe('.deployments', () => {
const path = `/apis/extensions/v1beta1/namespaces/${ common.currentName }/deployments`;
const resourcePath = `${ path }/${ resourceName }`;
const deploymentObj = {
kind: 'Deployment',
metadata: {
name: resourceName
},
spec: {
selector: [
{ app: 'test' }
],
template: {
metadata: {
labels: {
app: 'test'
}
},
spec: {
containers: [{
name: 'test',
imagePullPolicy: 'Never',
image: 'test.com:5000/test:v0'
}]
}
}
}
};

beforeTesting('int', common.changeName);
beforeTesting('unit', () => {
const mockDeployment = {
kind: 'Deployment',
metadata: {
name: resourceName
}
};
nock(common.extensions.url)
.post(path)
.reply(201, mockDeployment)
.get(resourcePath)
.reply(200, mockDeployment)
.delete(resourcePath)
.reply(200, mockDeployment);
});

it('POSTs, GETs, and DELETEs', done => {
async.series([
next => {
common.extensions.ns.deployments.post({ body: deploymentObj }, next);
},
next => common.extensions.ns.deployments.get(resourceName, next),
next => common.extensions.ns.deployments.delete(resourceName, next)
], (err, results) => {
assume(err).is.falsy();
const deployments = results[0];
assume(deployments.metadata.name).is.equal(resourceName);
done();
});
});

describe('lists', () => {
beforeTesting('int', common.changeName);
beforeTesting('unit', () => {
const mockDeploymentList = {
kind: 'DeploymentList',
items: []
};
nock(common.extensions.url)
.get(path)
.reply(200, mockDeploymentList);
});

it('returns DeploymentList', done => {
async.series([
next => common.extensions.ns.deployments.get(next)
], (err, results) => {
assume(err).is.falsy();
const deploymentList = results[0];
assume(deploymentList.kind).is.equal('DeploymentList');
done();
});
});
});
});

describe('.ds', () => {
const path = `/apis/extensions/v1beta1/namespaces/${ common.currentName }/daemonsets`;
const resourcePath = `${ path }/${ resourceName }`;
Expand Down

0 comments on commit d802180

Please sign in to comment.