mirror of
				https://github.com/Telecominfraproject/ols-ucentral-schema.git
				synced 2025-10-30 01:32:26 +00:00 
			
		
		
		
	qos: update schema and renderer
Signed-off-by: John Crispin <john@phrozen.org>
This commit is contained in:
		| @@ -246,6 +246,14 @@ let ethernet = { | ||||
| 		return sort(keys(this.lookup(globs))); | ||||
| 	}, | ||||
|  | ||||
| 	lookup_by_ethernet: function(ethernets) { | ||||
| 		let result = []; | ||||
|  | ||||
| 		for (let ethernet in ethernets) | ||||
| 			result = [ ...result,  ...this.lookup_by_select_ports(ethernet.select_ports) ]; | ||||
| 		return result; | ||||
| 	}, | ||||
|  | ||||
| 	reserve_port: function(port) { | ||||
| 		delete this.ports[port]; | ||||
| 	}, | ||||
| @@ -310,6 +318,15 @@ let ethernet = { | ||||
| 			    interface.vlan.id == vid) | ||||
| 				return interface; | ||||
| 		return null; | ||||
| 	}, | ||||
|  | ||||
| 	get_speed: function(dev) { | ||||
| 		let fp = fs.open(sprintf("/sys/class/net/%s/speed", dev)); | ||||
| 		if (!fp) | ||||
| 			return 1000; | ||||
| 		let speed = fp.read("all"); | ||||
| 		fp.close(); | ||||
| 		return +speed; | ||||
| 	} | ||||
| }; | ||||
|  | ||||
| @@ -454,6 +471,18 @@ let services = { | ||||
| 		return ssids; | ||||
| 	}, | ||||
|  | ||||
| 	lookup_ethernet: function(service) { | ||||
| 		let ethernets = []; | ||||
|  | ||||
| 		for (let ethernet in state.ethernet) { | ||||
| 			if (!ethernet.services || index(ethernet.services, service) < 0) | ||||
| 				continue; | ||||
| 			push(ethernets, ethernet); | ||||
| 		} | ||||
|  | ||||
| 		return ethernets; | ||||
| 	}, | ||||
|  | ||||
| 	lookup_services: function() { | ||||
| 		let rv = []; | ||||
|  | ||||
|   | ||||
| @@ -1,5 +1,6 @@ | ||||
| {% let eth_ports = ethernet.lookup_by_select_ports(ports.select_ports) %} | ||||
| {% for (let port in eth_ports): %} | ||||
| {% if (!ports.speed && !ports.duplex) return %} | ||||
| add network device | ||||
| set network.@device[-1].name={{ s(port) }} | ||||
| set network.@device[-1].ifname={{ s(port) }} | ||||
|   | ||||
| @@ -1,12 +1,32 @@ | ||||
| {% let egress = ethernet.lookup_by_select_ports([quality_of_service.select_port]) %} | ||||
| {% let enable = length(egress) %} | ||||
| {% services.set_enabled("sqm", enable) %} | ||||
| {% if (!enable) return %} | ||||
| {% | ||||
| if (!quality_of_service) | ||||
| 	quality_of_service = {}; | ||||
| let eth = services.lookup_ethernet("quality-of-service"); | ||||
| let egress = ethernet.lookup_by_ethernet(eth); | ||||
| let enable = length(egress); | ||||
| services.set_enabled("sqm", enable); | ||||
| if (!enable) | ||||
| 	return; | ||||
|  | ||||
| add sqm queue | ||||
| set sqm.@queue[-1].interface='{{ egress[0] }}' | ||||
| set sqm.@queue[-1].download='{{quality_of_service.download_rate }}' | ||||
| set sqm.@queue[-1].upload='{{quality_of_service.upload_rate }}' | ||||
| if (!quality_of_service.upload_rate || !quality_of_service.download_rate) { | ||||
| 	quality_of_service.download_rate = 0; | ||||
| 	quality_of_service.upload_rate = 0; | ||||
| } | ||||
|  | ||||
| function get_speed(dev, speed) { | ||||
| 	if (!speed) | ||||
| 		speed = ethernet.get_speed(dev); | ||||
| 	return speed * 1000; | ||||
| } | ||||
|  | ||||
| %} | ||||
|  | ||||
| {% for (let dev in egress): %} | ||||
| set sqm.{{ dev }}=queue | ||||
| set sqm.@queue[-1].interface={{ s(dev) }} | ||||
| set sqm.@queue[-1].download='{{ get_speed(dev, quality_of_service.upload_rate) }}' | ||||
| set sqm.@queue[-1].upload='{{ get_speed(dev, quality_of_service.download_rate) }}' | ||||
| set sqm.@queue[-1].auto_rate='{{ quality_of_service.download_rate ? 0 : 1 }}' | ||||
| set sqm.@queue[-1].enabled='1' | ||||
| set sqm.@queue[-1].verbosity='5' | ||||
| set sqm.@queue[-1].qdisc_advanced='1' | ||||
| @@ -16,5 +36,9 @@ set sqm.@queue[-1].squash_ingress='0' | ||||
| set sqm.@queue[-1].ingress_ecn='ECN' | ||||
| set sqm.@queue[-1].debug_logging='1' | ||||
| set sqm.@queue[-1].qdisc='fq_codel' | ||||
| set sqm.@queue[-1].linklayer='none' | ||||
| set sqm.@queue[-1].script='layer_cake.qos' | ||||
| set sqm.@queue[-1].linklayer='ethernet' | ||||
| set sqm.@queue[-1].overhead='44' | ||||
| set sqm.@queue[-1].eqdisc_opts='diffserv4 no-split-gso' | ||||
| set sqm.@queue[-1].iqdisc_opts='diffserv4 no-split-gso' | ||||
| {% endfor %} | ||||
|   | ||||
| @@ -29,7 +29,6 @@ properties: | ||||
|     - 2500 | ||||
|     - 5000 | ||||
|     - 10000 | ||||
|     default: 1000 | ||||
|   duplex: | ||||
|     description: | ||||
|       The duplex mode that shall be forced. | ||||
| @@ -37,4 +36,11 @@ properties: | ||||
|     enum: | ||||
|     - half | ||||
|     - full | ||||
|     default: full | ||||
|   services: | ||||
|     description: | ||||
|       The services that shall be offered on this L2 interface. | ||||
|     type: array | ||||
|     items: | ||||
|       type: string | ||||
|       examples: | ||||
|       - quality-of-service | ||||
|   | ||||
| @@ -2,13 +2,6 @@ description: | ||||
|   This section describes the QoS behaviour of the unit. | ||||
| type: object | ||||
| properties: | ||||
|   select-port: | ||||
|     description: | ||||
|       The physical network devices that shall be configured as the primary egress device | ||||
|       where QoS shall be run on | ||||
|     type: string | ||||
|     examples: | ||||
|     - WAN | ||||
|   upload-rate: | ||||
|     description: | ||||
|       Defines the upload rate of this device. If it is not known or the device is | ||||
|   | ||||
| @@ -273,6 +273,28 @@ function instantiateEthernet(location, value, errors) { | ||||
| 			obj.duplex = "full"; | ||||
| 		} | ||||
|  | ||||
| 		function parseServices(location, value, errors) { | ||||
| 			if (type(value) == "array") { | ||||
| 				function parseItem(location, value, errors) { | ||||
| 					if (type(value) != "string") | ||||
| 						push(errors, [ location, "must be of type string" ]); | ||||
|  | ||||
| 					return value; | ||||
| 				} | ||||
|  | ||||
| 				return map(value, (item, i) => parseItem(location + "/" + i, item, errors)); | ||||
| 			} | ||||
|  | ||||
| 			if (type(value) != "array") | ||||
| 				push(errors, [ location, "must be of type array" ]); | ||||
|  | ||||
| 			return value; | ||||
| 		} | ||||
|  | ||||
| 		if (exists(value, "services")) { | ||||
| 			obj.services = parseServices(location + "/services", value["services"], errors); | ||||
| 		} | ||||
|  | ||||
| 		return obj; | ||||
| 	} | ||||
|  | ||||
| @@ -5057,17 +5079,6 @@ function instantiateServiceQualityOfService(location, value, errors) { | ||||
| 	if (type(value) == "object") { | ||||
| 		let obj = {}; | ||||
|  | ||||
| 		function parseSelectPort(location, value, errors) { | ||||
| 			if (type(value) != "string") | ||||
| 				push(errors, [ location, "must be of type string" ]); | ||||
|  | ||||
| 			return value; | ||||
| 		} | ||||
|  | ||||
| 		if (exists(value, "select-port")) { | ||||
| 			obj.select_port = parseSelectPort(location + "/select-port", value["select-port"], errors); | ||||
| 		} | ||||
|  | ||||
| 		function parseUploadRate(location, value, errors) { | ||||
| 			if (type(value) != "int") | ||||
| 				push(errors, [ location, "must be of type integer" ]); | ||||
|   | ||||
| @@ -148,6 +148,15 @@ | ||||
|                         "full" | ||||
|                     ], | ||||
|                     "default": "full" | ||||
|                 }, | ||||
|                 "services": { | ||||
|                     "type": "array", | ||||
|                     "items": { | ||||
|                         "type": "string", | ||||
|                         "examples": [ | ||||
|                             "quality-of-service" | ||||
|                         ] | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         }, | ||||
| @@ -1902,12 +1911,6 @@ | ||||
|         "service.quality-of-service": { | ||||
|             "type": "object", | ||||
|             "properties": { | ||||
|                 "select-port": { | ||||
|                     "type": "string", | ||||
|                     "examples": [ | ||||
|                         "WAN" | ||||
|                     ] | ||||
|                 }, | ||||
|                 "upload-rate": { | ||||
|                     "type": "integer", | ||||
|                     "default": 0 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 John Crispin
					John Crispin