Skip to content

Instantly share code, notes, and snippets.

@misterdjules
Last active October 5, 2017 23:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save misterdjules/b393562a144c9b3d72c3646184c3b650 to your computer and use it in GitHub Desktop.
Save misterdjules/b393562a144c9b3d72c3646184c3b650 to your computer and use it in GitHub Desktop.
diff --git a/master:lib/networks.js b/PUBAPI-1448:lib/endpoints/networks.js
index c59d9b7..df124e3 100644
--- a/master:lib/networks.js
+++ b/PUBAPI-1448:lib/endpoints/networks.js
@@ -9,20 +9,19 @@
*/
var assert = require('assert-plus');
-var util = require('util');
-var mod_config = require('./config');
+var jsprim = require('jsprim');
var restify = require('restify');
var schemas = require('joyent-schemas').cloudapi;
-var jsprim = require('jsprim');
+var util = require('util');
var vasync = require('vasync');
-var resources = require('./resources');
-var ResourceNotFoundError = restify.ResourceNotFoundError;
+var modNetworks = require('../networks');
+var resources = require('../resources');
+
+var InternalError = restify.InternalError;
var InvalidArgumentError = restify.InvalidArgumentError;
+var ResourceNotFoundError = restify.ResourceNotFoundError;
-var EXTERNAL_NIC_TAG = 'external';
-var INTERNAL_NIC_TAG = 'internal';
-var ADMIN_NIC_TAG = 'admin';
var FABRIC_VLAN_FIELDS = ['description', 'name', 'vlan_id'];
var FABRIC_NETWORK_FIELDS = ['description', 'fabric', 'gateway',
'internet_nat', 'name', 'provision_end_ip', 'provision_start_ip',
@@ -110,7 +109,7 @@ function translateErr(err) {
// Note here "net" can be a network, fabric network or network_pool from NAPI
function translateNetwork(net) {
- assert.ok(net);
+ assert.object(net, 'net');
var obj = {
id: net.uuid,
@@ -123,7 +122,7 @@ function translateNetwork(net) {
} else if (net.fabric) {
isPublic = false;
} else {
- isPublic = (net.nic_tag === EXTERNAL_NIC_TAG);
+ isPublic = (net.nic_tag === modNetworks.EXTERNAL_NIC_TAG);
}
obj['public'] = isPublic;
@@ -149,120 +148,6 @@ function translateNetwork(net) {
// --- Functions
-function preLoadNetworks(req, res, next) {
- var method = req.method.toUpperCase();
- var pathname = req.getUrl().pathname;
-
- var napi = req.sdc.napi;
- assert.ok(napi);
-
- if (pathname === '/--ping') {
- return next();
- }
-
- assert.ok(req.account);
- var accountUuid = req.account.uuid;
- assert.ok(accountUuid);
-
- var netFilterOpts = {
- provisionable_by: accountUuid
- };
-
- if (req.query && req.query.fabric) {
- netFilterOpts = {
- fabric: true,
- owner_uuid: accountUuid
- };
- }
-
- // Skip network loading and filtering except for a few cases:
- // network endpoints
- if (!/\/networks/.test(pathname) &&
- // machine creation or nic addition (some AddNic plugins use this)
- !(method === 'POST' && /\/(?:machines|nics)$/.test(pathname)) &&
- // updating user config (requires checking network existence)
- !(method === 'PUT' && /\/config/.test(pathname))) {
- return next();
- }
-
- return napi.listNetworkPools({
- provisionable_by: accountUuid
- }, reqOpts(req), function (err, pools) {
- if (err) {
- return next(err);
- }
-
- var networks = [];
- var externalNetworks = [];
- var internalNetworks = [];
- var networksInPools = {};
-
- // Always skip admin network pools:
- pools = pools.filter(function (pool) {
- return (pool.nic_tag !== ADMIN_NIC_TAG);
- });
-
- pools.forEach(function (pool) {
- var isFabric = false;
- networks.push(pool);
-
- pool.networks.forEach(function (net) {
- networksInPools[net.uuid] = true;
- if (net.fabric === true) {
- isFabric = true;
- }
- });
-
- if (pool.nic_tag === EXTERNAL_NIC_TAG) {
- externalNetworks.push(pool.uuid);
- } else if (pool.nic_tag === INTERNAL_NIC_TAG || isFabric === true) {
- internalNetworks.push(pool.uuid);
- }
- });
-
- return napi.listNetworks(netFilterOpts, reqOpts(req),
- function (err2, nets) {
- if (err2) {
- return next(err2);
- }
-
- // Always skip admin networks, and don't add networks which are
- // already in contained pools:
- nets = nets.filter(function (net) {
- return net.nic_tag !== ADMIN_NIC_TAG &&
- !networksInPools[net.uuid];
- });
-
- networks = networks.concat(nets);
-
- networks.forEach(function (net) {
- if (net.nic_tag === EXTERNAL_NIC_TAG) {
- externalNetworks.push(net.uuid);
- } else if (net.nic_tag === INTERNAL_NIC_TAG ||
- net.fabric === true) {
- internalNetworks.push(net.uuid);
- }
- });
-
- // uuids of all publically-accessible networks accessible by user
- req.external_nets = externalNetworks;
-
- // uuids of all internally-accessible networks accessible by user
- req.internal_nets = internalNetworks;
-
- // objects of all networks accessible by user
- req.networks = networks;
-
- req.log.debug({
- external: req.external_nets,
- internal: req.internal_nets
- }, 'networks loaded');
-
- return next();
- });
- });
-}
-
function listNetworks(req, res, next) {
if (req.accountMgmt) {
@@ -477,7 +362,12 @@ function listFabricNetworks(req, res, next) {
return next(translateErr(err));
}
- res.send(networks.map(translateNetwork));
+ res.send(networks.map(function _translateNetwork(network) {
+ assert.object(network, 'network');
+
+ return translateNetwork(network);
+ }));
+
return next();
});
}
@@ -554,20 +444,34 @@ function deleteFabricNetwork(req, res, next) {
return next(schemaErr);
}
- return mod_config.get(req, function _afterGetConf(confErr, conf) {
- if (confErr) {
- return next(confErr);
+ return modNetworks.getDefaultFabricNetworkForUser(req.sdc.ufds,
+ req.config.datacenter_name, req.account, {
+ log: req.log
+ }, function _afterGetConf(getFabricNetErr, defaultFabricNet) {
+ if (getFabricNetErr) {
+ return next(getFabricNetErr);
+ }
+
+ if (!defaultFabricNet) {
+ return next(new InternalError('Could not find default fabric ' +
+ 'network ' + 'for user'));
}
- if (params.id === conf.default_network) {
+ req.log.info({
+ networkToDelete: params.id,
+ defaultNetwork: defaultFabricNet.uuid
+ }, 'Deleting default network?');
+
+ if (params.id === defaultFabricNet.uuid) {
return next(new InvalidArgumentError(
- 'cannot delete default network'));
+ 'cannot delete default network'));
}
return req.sdc.napi.deleteFabricNetwork(req.account.uuid,
params.vlan_id, params.id, {}, reqOpts(req), function (err) {
if (err) {
- return next(translateErr(err));
+ next(translateErr(err));
+ return;
}
res.send(204);
@@ -580,6 +484,7 @@ function deleteFabricNetwork(req, res, next) {
function mountNetworks(server, before, pre) {
assert.object(server, 'server');
assert.ok(before, 'before');
+ assert.optionalArrayOfFunc(pre, 'pre');
pre = pre || [];
@@ -694,6 +599,5 @@ function mountNetworks(server, before, pre) {
// --- API
module.exports = {
- loadNetworks: preLoadNetworks,
mount: mountNetworks
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment