Add MicroBadger (#1340)

This commit is contained in:
Krutov Alexander
2017-12-08 02:30:42 +04:00
committed by Paul Melnikow
parent a087b28d06
commit b1ca6391d0
3 changed files with 175 additions and 0 deletions

View File

@@ -1876,6 +1876,34 @@ const allBadgeExamples = [
'imagelayers'
]
},
{
title: 'MicroBadger Size',
previewUri: '/microbadger/image-size/_/httpd.svg',
keywords: [
'docker'
]
},
{
title: 'MicroBadger Size (tag)',
previewUri: '/microbadger/image-size/_/httpd/alpine.svg',
keywords: [
'docker'
]
},
{
title: 'MicroBadger Layers',
previewUri: '/microbadger/layers/_/httpd.svg',
keywords: [
'docker'
]
},
{
title: 'MicroBadger Layers (tag)',
previewUri: '/microbadger/layers/_/httpd/alpine.svg',
keywords: [
'docker'
]
},
{
title: 'Gitter',
previewUri: '/gitter/room/nwjs/nw.js.svg'

View File

@@ -6528,6 +6528,76 @@ cache(function(data, match, sendBadge, request) {
});
}));
// MicroBadger integration.
camp.route(/^\/microbadger\/(image-size|layers)\/([^/]+)\/([^/]+)\/?([^/]*)\.(svg|png|gif|jpg|json)$/,
cache(function(data, match, sendBadge, request) {
const type = match[1];
let user = match[2];
const repo = match[3];
const tag = match[4];
const format = match[5];
if (user === '_') {
user = 'library';
}
const url = `https://api.microbadger.com/v1/images/${user}/${repo}`;
let badgeData = getBadgeData(type, data);
if (type === 'image-size') {
badgeData.text[0] = getLabel('image size', data);
}
const options = {
method: 'GET',
uri: url,
headers: {
'Accept': 'application/json'
}
};
request(options, function(err, res, buffer) {
if (res && res.statusCode === 404) {
badgeData.text[1] = 'not found';
sendBadge(format, badgeData);
return;
}
if (err != null || !res || res.statusCode !== 200) {
badgeData.text[1] = 'inaccessible';
sendBadge(format, badgeData);
return;
}
try {
const parsedData = JSON.parse(buffer);
let image;
if (tag) {
image = parsedData.Versions && parsedData.Versions.find(v => v.Tags.some(t => t.tag === tag));
if (!image) {
badgeData.text[1] = 'not found';
sendBadge(format, badgeData);
return;
}
} else {
image = parsedData;
}
if (type === 'image-size') {
const size = prettyBytes(parseInt(image.DownloadSize));
badgeData.text[1] = size;
} else if (type === 'layers') {
badgeData.text[1] = image.LayerCount;
}
badgeData.colorscheme = null;
badgeData.colorB = '#007ec6';
sendBadge(format, badgeData);
} catch(e) {
badgeData.colorscheme = 'red';
badgeData.text[1] = 'error';
sendBadge(format, badgeData);
}
});
}));
// Gitter room integration.
camp.route(/^\/gitter\/room\/([^/]+\/[^/]+)\.(svg|png|gif|jpg|json)$/,
cache(function(data, match, sendBadge, request) {

View File

@@ -0,0 +1,77 @@
'use strict';
const Joi = require('joi');
const ServiceTester = require('./runner/service-tester');
const { isFileSize } = require('./helpers/validators')
const t = new ServiceTester({ id: 'microbadger', title: 'MicroBadger' })
module.exports = t;
t.create('image size without a specified tag')
.get('/image-size/_/hello-world.json')
.expectJSONTypes(Joi.object().keys({
name: 'image size',
value: isFileSize
}));
t.create('image size with a specified tag')
.get('/image-size/_/httpd/alpine.json')
.expectJSONTypes(Joi.object().keys({
name: 'image size',
value: isFileSize
}));
t.create('layers without a specified tag')
.get('/layers/_/hello-world.json')
.expectJSONTypes(Joi.object().keys({
name: 'layers',
value: Joi.number().integer().positive()
}));
t.create('layers with a specified tag')
.get('/layers/_/httpd/alpine.json')
.expectJSONTypes(Joi.object().keys({
name: 'layers',
value: Joi.number().integer().positive()
}));
t.create('specified tag when repository has only one')
.get('/layers/_/hello-world/wrong-tag.json')
.expectJSON({ name: 'layers', value: 'not found' });
t.create('nonexistent repository')
.get('/layers/_/unknown.json')
.intercept(nock => nock('https://api.microbadger.com')
.get('/v1/images/library/unknown')
.reply(404)
)
.expectJSON({ name: 'layers', value: 'not found' });
t.create('nonexistent tag')
.get('/layers/_/unknown/wrong-tag.json')
.intercept(nock => nock('https://api.microbadger.com')
.get('/v1/images/library/unknown')
.reply(200, { Versions: [] })
)
.expectJSON({ name: 'layers', value: 'not found' });
t.create('server error')
.get('/image-size/_/hello-world.json')
.intercept(nock => nock('https://api.microbadger.com')
.get('/v1/images/library/hello-world')
.reply(500, 'Something went wrong')
)
.expectJSON({ name: 'image size', value: 'inaccessible' });
t.create('connection error')
.get('/image-size/_/hello-world.json')
.networkOff()
.expectJSON({ name: 'image size', value: 'inaccessible' });
t.create('unexpected response')
.get('/image-size/_/hello-world.json')
.intercept(nock => nock('https://api.microbadger.com')
.get('/v1/images/library/hello-world')
.reply(200, "{{{{{invalid json}}")
)
.expectJSON({ name: 'image size', value: 'error' });