blob: 2ccdbac663afd5918b4715967bb7bbdddbee64d1 [file] [log] [blame]
Luca Preteb601c382018-04-30 16:10:43 -07001
2# Copyright 2017-present Open Networking Foundation
3#
4# Licensed under the Apache License, Version 2.0 (the "License");
5# you may not use this file except in compliance with the License.
6# You may obtain a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS,
12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13# See the License for the specific language governing permissions and
14# limitations under the License.
15
16import requests
Matteo Scandolodb7adc32018-06-15 16:05:19 -070017import urllib
Luca Preteb601c382018-04-30 16:10:43 -070018from requests.auth import HTTPBasicAuth
Scott Baker382366d2019-02-04 10:58:43 -080019from xossynchronizer.steps.syncstep import SyncStep, DeferredException
20from xossynchronizer.modelaccessor import FabricService, SwitchPort, PortInterface, FabricIpAddress, model_accessor
Luca Preteb601c382018-04-30 16:10:43 -070021
22from xosconfig import Config
23from multistructlog import create_logger
24
Matteo Scandolo04e5e122018-05-04 16:21:53 -070025from helpers import Helpers
26
Luca Preteb601c382018-04-30 16:10:43 -070027log = create_logger(Config().get('logging'))
28
29class SyncFabricPort(SyncStep):
30 provides = [SwitchPort]
Luca Prete15377872018-09-11 17:32:55 -070031 observes = [SwitchPort, PortInterface, FabricIpAddress]
Luca Preteb601c382018-04-30 16:10:43 -070032
Luca Preteb601c382018-04-30 16:10:43 -070033 def sync_record(self, model):
Matteo Scandolodb7adc32018-06-15 16:05:19 -070034
35 if model.leaf_model_name == "PortInterface":
Luca Prete15377872018-09-11 17:32:55 -070036 log.info("Receivent update for PortInterface", port=model.port.portId, interface=model)
Matteo Scandolodb7adc32018-06-15 16:05:19 -070037 return self.sync_record(model.port)
38
Luca Prete15377872018-09-11 17:32:55 -070039 if model.leaf_model_name == "FabricIpAddress":
40 log.info("Receivent update for FabricIpAddress", port=model.interface.port.portId, interface=model.interface.name, ip=model.ip)
41 return self.sync_record(model.interface.port)
42
Matteo Scandolo6739b512018-05-30 18:55:29 -070043 log.info("Adding port %s/%s to onos-fabric" % (model.switch.ofId, model.portId))
Luca Preteb601c382018-04-30 16:10:43 -070044 interfaces = []
45 for intf in model.interfaces.all():
46 i = {
47 "name" : intf.name,
Luca Prete15377872018-09-11 17:32:55 -070048 "ips" : [ i.ip for i in intf.ips.all() ]
Luca Preteb601c382018-04-30 16:10:43 -070049 }
50 if intf.vlanUntagged:
51 i["vlan-untagged"] = intf.vlanUntagged
52 interfaces.append(i)
53
54 # Send port config to onos-fabric netcfg
55 data = {
Matteo Scandolodfe75ff2018-06-15 10:52:09 -070056 "ports": {
57 "%s/%s" % (model.switch.ofId, model.portId) : {
58 "interfaces": interfaces,
59 "hostLearning": {
60 "enabled": model.host_learning
61 }
62 }
Luca Preteb601c382018-04-30 16:10:43 -070063 }
Luca Preteb601c382018-04-30 16:10:43 -070064 }
65
Matteo Scandolodfe75ff2018-06-15 10:52:09 -070066 log.debug("Port %s/%s data" % (model.switch.ofId, model.portId), data=data)
67
Scott Baker382366d2019-02-04 10:58:43 -080068 onos = Helpers.get_onos_fabric_service(self.model_accessor)
Luca Preteb601c382018-04-30 16:10:43 -070069
70 url = 'http://%s:%s/onos/v1/network/configuration/' % (onos.rest_hostname, onos.rest_port)
Matteo Scandolo6739b512018-05-30 18:55:29 -070071
Luca Preteb601c382018-04-30 16:10:43 -070072 r = requests.post(url, json=data, auth=HTTPBasicAuth(onos.rest_username, onos.rest_password))
73
74 if r.status_code != 200:
75 log.error(r.text)
Matteo Scandolodb7adc32018-06-15 16:05:19 -070076 raise Exception("Failed to add port %s/%s into ONOS" % (model.switch.ofId, model.portId))
Luca Preteb601c382018-04-30 16:10:43 -070077 else:
78 try:
Matteo Scandolodfe75ff2018-06-15 10:52:09 -070079 log.info("Port %s/%s response" % (model.switch.ofId, model.portId), json=r.json())
Luca Preteb601c382018-04-30 16:10:43 -070080 except Exception:
Matteo Scandolodfe75ff2018-06-15 10:52:09 -070081 log.info("Port %s/%s response" % (model.switch.ofId, model.portId), text=r.text)
Luca Preteb601c382018-04-30 16:10:43 -070082
Matteo Scandolodb7adc32018-06-15 16:05:19 -070083 def delete_netcfg_item(self, partial_url):
Scott Baker382366d2019-02-04 10:58:43 -080084 onos = Helpers.get_onos_fabric_service(self.model_accessor)
Matteo Scandolodb7adc32018-06-15 16:05:19 -070085 url = 'http://%s:%s/onos/v1/network/configuration/ports/%s' % (onos.rest_hostname, onos.rest_port, partial_url)
Matteo Scandolo6739b512018-05-30 18:55:29 -070086
87 r = requests.delete(url, auth=HTTPBasicAuth(onos.rest_username, onos.rest_password))
88
89 if r.status_code != 204:
90 log.error(r.text)
Matteo Scandolodb7adc32018-06-15 16:05:19 -070091 raise Exception("Failed to %s port %s from ONOS" % url)
92
93 def delete_record(self, model):
Matteo Scandolodb7adc32018-06-15 16:05:19 -070094 if model.leaf_model_name == "PortInterface":
Luca Prete15377872018-09-11 17:32:55 -070095 log.info("Received update for PortInterface", port=model.port.portId, interface=model.name)
Matteo Scandolodb7adc32018-06-15 16:05:19 -070096 log.info("Removing port interface %s from port %s/%s in onos-fabric" % (model.name, model.port.switch.ofId, model.port.portId))
97
Matteo Scandolodb7adc32018-06-15 16:05:19 -070098 # resync the existing interfaces
99 return self.sync_record(model.port)
100
Luca Prete15377872018-09-11 17:32:55 -0700101 if model.leaf_model_name == "FabricIpAddress":
102 # TODO add unit tests
103 log.info("Received update for FabricIpAddress", port=model.interface.port.portId, interface=model.interface.name, ip=model.ip)
104 log.info("Removing IP %s from interface %s, on port %s/%s in onos-fabric" % (model.ip, model.interface.name, model.interface.port.switch.ofId, model.interface.port.portId))
105
106 # resync the existing interfaces
107 return self.sync_record(model.interface.port)
108
Matteo Scandolodb7adc32018-06-15 16:05:19 -0700109 log.info("Removing port %s/%s from onos-fabric" % (model.switch.ofId, model.portId))
110
111 key = "%s/%s" % (model.switch.ofId, model.portId)
112 key = urllib.quote(key, safe='')
113
114 # deleting the port
115 self.delete_netcfg_item(key)