Last active
October 5, 2017 23:11
-
-
Save misterdjules/b393562a144c9b3d72c3646184c3b650 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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