Compare commits

..

6 Commits

Author SHA1 Message Date
5a2a5f1248 1.0.58 2019-09-13 14:40:38 +02:00
9767b8767a fix(core): update 2019-09-13 14:40:38 +02:00
546e139b46 1.0.57 2019-09-13 13:20:01 +02:00
28d70bb49f fix(core): update 2019-09-13 13:20:01 +02:00
b71f134abd 1.0.56 2019-09-12 14:52:56 +02:00
968b3c7449 fix(core): update 2019-09-12 14:52:55 +02:00
8 changed files with 56 additions and 25 deletions

2
package-lock.json generated
View File

@ -1,6 +1,6 @@
{
"name": "@mojoio/docker",
"version": "1.0.55",
"version": "1.0.58",
"lockfileVersion": 1,
"requires": true,
"dependencies": {

View File

@ -1,6 +1,6 @@
{
"name": "@mojoio/docker",
"version": "1.0.55",
"version": "1.0.58",
"description": "easy communication with docker remote api from node, TypeScript ready",
"private": false,
"main": "dist/index.js",

View File

@ -61,6 +61,7 @@ tap.test('should return a change Observable', async tools => {
tap.test('should create a secret', async () => {
const mySecret = await docker.DockerSecret.createSecret(testDockerHost, {
name: 'testSecret',
version: '1.0.3',
contentArg: `{ "hi": "wow"}`,
labels: {}
});
@ -89,15 +90,16 @@ tap.test('should create a service', async () => {
});
const testSecret = await docker.DockerSecret.createSecret(testDockerHost, {
name: 'serviceSecret',
version: '0.0.1',
labels: {},
contentArg: '{"hi": "wow"}'
});
const testService = await DockerService.createService(testDockerHost, {
Image: 'nginx:latest',
Labels: {
image: 'nginx:latest',
labels: {
'testlabel': 'hi'
},
Name: 'testService',
name: 'testService',
networks: [testNetwork],
networkAlias: 'testService',
secrets: [testSecret]

View File

@ -15,9 +15,15 @@ export class DockerImage {
public static async findImageByName(dockerHost: DockerHost, imageNameArg: string) {
const images = await this.getImages(dockerHost);
return images.find(image => {
return image.RepoTags.includes(imageNameArg);
const result = images.find(image => {
if (image.RepoTags) {
return image.RepoTags.includes(imageNameArg);
} else {
return false;
}
});
return result;
}
public static async createFromRegistry(

View File

@ -28,9 +28,13 @@ export class DockerSecret {
}
public static async createSecret(dockerHostArg: DockerHost, secretDescriptor: interfaces.ISecretCreationDescriptor) {
const labels: interfaces.TLabels = {
...secretDescriptor.labels,
version: secretDescriptor.version
};
const response = await dockerHostArg.request('POST', '/secrets/create', {
Name: secretDescriptor.name,
Labels: secretDescriptor.labels,
Labels: labels,
Data: plugins.smartstring.base64.encode(secretDescriptor.contentArg)
});
@ -46,9 +50,9 @@ export class DockerSecret {
Name: string;
Labels: interfaces.TLabels;
};
Version: {
public Version: {
Index:string;
}
};
public dockerHost: DockerHost;
constructor(dockerHostArg: DockerHost) {
@ -70,4 +74,10 @@ export class DockerSecret {
public async remove () {
await this.dockerHost.request('DELETE', `/secrets/${this.ID}`);
}
// get things
public getVersion() {
return this.Spec.Labels.version;
}
}

View File

@ -39,14 +39,18 @@ export class DockerService {
// lets get the image
plugins.smartlog.defaultLogger.log(
'info',
`downloading image for service ${serviceCreationDescriptor.Name}`
`downloading image for service ${serviceCreationDescriptor.name}`
);
const serviceImage = await DockerImage.createFromRegistry(dockerHost, {
imageUrl: serviceCreationDescriptor.Image
imageUrl: serviceCreationDescriptor.image
});
const serviceVersion = serviceImage.Labels.version;
serviceCreationDescriptor.Labels.version = serviceVersion;
const labels: interfaces.TLabels = {
...serviceCreationDescriptor.labels,
version: serviceVersion
};
const networkArray: any[] = [];
for (const network of serviceCreationDescriptor.networks) {
@ -71,11 +75,11 @@ export class DockerService {
}
const response = await dockerHost.request('POST', '/services/create', {
Name: serviceCreationDescriptor.Name,
Name: serviceCreationDescriptor.name,
TaskTemplate: {
ContainerSpec: {
Image: serviceCreationDescriptor.Image,
Labels: serviceCreationDescriptor.Labels,
Image: serviceCreationDescriptor.image,
Labels: labels,
Secrets: secretArray
},
UpdateConfig: {
@ -87,13 +91,13 @@ export class DockerService {
},
ForceUpdate: 1
},
Labels: serviceCreationDescriptor.Labels,
Labels: serviceCreationDescriptor.labels,
Networks: networkArray
});
const createdService = await DockerService.getServiceByName(
dockerHost,
serviceCreationDescriptor.Name
serviceCreationDescriptor.name
);
return createdService;
}
@ -107,7 +111,7 @@ export class DockerService {
public UpdatedAt: string;
public Spec: {
Name: string;
Labels: interfaces.TLabels; // ZBD
Labels: interfaces.TLabels;
TaskTemplate: {
ContainerSpec: {
Image: string;
@ -142,7 +146,7 @@ export class DockerService {
const dockerData = await this.dockerHostRef.request(
'POST',
`/services/${this.ID}/update?version=${this.Version.Index + 1}`,
`/services/${this.ID}/update?version=${this.Version.Index}`,
{
Name: this.Spec.Name,
TaskTemplate: this.Spec.TaskTemplate,
@ -162,7 +166,7 @@ export class DockerService {
Object.assign(this, dockerData);
}
public async updateFromRegistry() {
public async needsUpdate(): Promise<boolean> {
// TODO: implement digest based update recognition
await this.reReadFromDockerEngine();
@ -173,7 +177,15 @@ export class DockerService {
const imageVersion = new plugins.smartversion.SmartVersion(dockerImage.Labels.version);
const serviceVersion = new plugins.smartversion.SmartVersion(this.Spec.Labels.version);
if (imageVersion.greaterThan(serviceVersion)) {
console.log('service needs to be updated');
console.log(`service ${this.Spec.Name} needs to be updated`);
return true;
} else {
console.log(`service ${this.Spec.Name} is up to date.`);
}
}
public async updateFromRegistry() {
if (await this.needsUpdate()) {
this.update();
}
}

View File

@ -2,6 +2,7 @@ import * as interfaces from './';
export interface ISecretCreationDescriptor {
name: string;
version: string;
contentArg: any;
labels: interfaces.TLabels;
}

View File

@ -3,9 +3,9 @@ import { DockerNetwork } from '../docker.classes.network';
import { DockerSecret } from '../docker.classes.secret';
export interface IServiceCreationDescriptor {
Name: string;
Image: string;
Labels: interfaces.TLabels;
name: string;
image: string;
labels: interfaces.TLabels;
networks: DockerNetwork[];
networkAlias: string;
secrets: DockerSecret[];