gluon-core: make interface roles exclusive in site config
This commit is contained in:
		
							parent
							
								
									e7da501442
								
							
						
					
					
						commit
						abd6d6415d
					
				@ -29,6 +29,7 @@ files["package/**/check_site.lua"] = {
 | 
			
		||||
		"need",
 | 
			
		||||
		"need_alphanumeric_key",
 | 
			
		||||
		"need_array",
 | 
			
		||||
		"need_array_elements_exclusive",
 | 
			
		||||
		"need_array_of",
 | 
			
		||||
		"need_boolean",
 | 
			
		||||
		"need_chanlist",
 | 
			
		||||
 | 
			
		||||
@ -77,7 +77,11 @@ need_boolean(in_domain({'mesh', 'vxlan'}), false)
 | 
			
		||||
 | 
			
		||||
local interfaces_roles = {'client', 'uplink', 'mesh'}
 | 
			
		||||
for _, config in ipairs({'wan', 'lan', 'single'}) do
 | 
			
		||||
	need_array_of(in_site({'interfaces', config, 'default_roles'}), interfaces_roles, false)
 | 
			
		||||
	local default_roles = in_site({'interfaces', config, 'default_roles'})
 | 
			
		||||
 | 
			
		||||
	need_array_of(default_roles, interfaces_roles, false)
 | 
			
		||||
	need_array_elements_exclusive(default_roles, 'client', 'mesh', false)
 | 
			
		||||
	need_array_elements_exclusive(default_roles, 'client', 'uplink', false)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
obsolete({'mesh_on_wan'}, 'Use interfaces.wan.default_roles.')
 | 
			
		||||
 | 
			
		||||
@ -55,6 +55,14 @@ local function merge(a, b)
 | 
			
		||||
	return m
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
local function contains(table, val)
 | 
			
		||||
	for i=1,#table do
 | 
			
		||||
		if table[i] == val then
 | 
			
		||||
			return true
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
	return false
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
local function path_to_string(path)
 | 
			
		||||
	if path.is_value then
 | 
			
		||||
@ -370,6 +378,21 @@ function M.need_array_of(path, array, required)
 | 
			
		||||
	return M.need_array(path, function(e) M.need_one_of(e, array) end, required)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function M.need_array_elements_exclusive(path, a, b, required)
 | 
			
		||||
	local val = need_type(path, 'table', required, 'be an array')
 | 
			
		||||
	if not val then
 | 
			
		||||
		return nil
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	if contains(val, a) and contains(val, b) then
 | 
			
		||||
		config_error(conf_src(path),
 | 
			
		||||
			'expected %s to contain only one of the elements %s and %s, but not both.',
 | 
			
		||||
			path_to_string(path), format(a), format(b))
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	return val
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function M.need_chanlist(path, channels, required)
 | 
			
		||||
	local valid_chanlist = check_chanlist(channels)
 | 
			
		||||
	return M.need(path, valid_chanlist, required,
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user