blob: 7e0285e6b1f201d7e53f4876ff63ffec6f1634f2 [file] [log] [blame]
Hyunsun Moon60a10672016-06-12 17:39:12 -07001/*
2 * Copyright 2016-present Open Networking Laboratory
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 */
Hyunsun Moon5401aaa2016-06-12 17:40:34 -070016package org.opencord.cordvtn.impl.handler;
Hyunsun Moon60a10672016-06-12 17:39:12 -070017
18import org.apache.felix.scr.annotations.Activate;
19import org.apache.felix.scr.annotations.Component;
20import org.apache.felix.scr.annotations.Deactivate;
Hyunsun Moon5401aaa2016-06-12 17:40:34 -070021import org.apache.felix.scr.annotations.Reference;
22import org.apache.felix.scr.annotations.ReferenceCardinality;
Hyunsun Moon60a10672016-06-12 17:39:12 -070023import org.onlab.packet.Ethernet;
24import org.onosproject.net.PortNumber;
25import org.onosproject.net.flow.DefaultFlowRule;
26import org.onosproject.net.flow.DefaultTrafficSelector;
27import org.onosproject.net.flow.DefaultTrafficTreatment;
28import org.onosproject.net.flow.FlowRule;
29import org.onosproject.net.flow.TrafficSelector;
30import org.onosproject.net.flow.TrafficTreatment;
31import org.onosproject.xosclient.api.VtnService;
32import org.opencord.cordvtn.impl.AbstractInstanceHandler;
33import org.opencord.cordvtn.api.Instance;
34import org.opencord.cordvtn.api.InstanceHandler;
Hyunsun Moonc031d9b2016-08-04 13:57:22 -070035import org.opencord.cordvtn.impl.CordVtnNodeManager;
Hyunsun Moon60a10672016-06-12 17:39:12 -070036import org.opencord.cordvtn.impl.CordVtnPipeline;
37
38import java.util.Optional;
39
Hyunsun Moon60a10672016-06-12 17:39:12 -070040import static org.onosproject.xosclient.api.VtnServiceApi.ServiceType.MANAGEMENT;
41
42/**
43 * Provides network connectivity for management network connected instances.
44 */
45@Component(immediate = true)
46public class ManagementInstanceHandler extends AbstractInstanceHandler implements InstanceHandler {
47
Hyunsun Moon5401aaa2016-06-12 17:40:34 -070048 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
49 protected CordVtnPipeline pipeline;
50
Hyunsun Moonc031d9b2016-08-04 13:57:22 -070051 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
52 protected CordVtnNodeManager nodeManager;
53
Hyunsun Moon60a10672016-06-12 17:39:12 -070054 @Activate
55 protected void activate() {
56 serviceType = Optional.of(MANAGEMENT);
Hyunsun Moon60a10672016-06-12 17:39:12 -070057 super.activate();
58 }
59
60 @Deactivate
61 protected void deactivate() {
62 super.deactivate();
63 }
64
65 @Override
66 public void instanceDetected(Instance instance) {
Hyunsun Moon60a10672016-06-12 17:39:12 -070067 VtnService service = getVtnService(instance.serviceId());
68 if (service == null) {
69 log.warn("Failed to get VtnService for {}", instance);
70 return;
71 }
Hyunsun Moonc031d9b2016-08-04 13:57:22 -070072
73 switch (service.networkType()) {
74 case MANAGEMENT_LOCAL:
75 log.info("LOCAL management instance is detected {}", instance);
76 localManagementRules(instance, true);
77 break;
78 case MANAGEMENT_HOSTS:
79 log.info("HOSTS management instance is detected {}", instance);
80 hostsManagementRules(instance, true);
81 break;
82 default:
83 break;
84 }
Hyunsun Moon60a10672016-06-12 17:39:12 -070085 }
86
87 @Override
88 public void instanceRemoved(Instance instance) {
Hyunsun Moon60a10672016-06-12 17:39:12 -070089 VtnService service = getVtnService(instance.serviceId());
90 if (service == null) {
91 log.warn("Failed to get VtnService for {}", instance);
92 return;
93 }
94
Hyunsun Moonc031d9b2016-08-04 13:57:22 -070095 switch (service.networkType()) {
96 case MANAGEMENT_LOCAL:
97 log.info("LOCAL management instance removed {}", instance);
98 localManagementRules(instance, false);
99 break;
100 case MANAGEMENT_HOSTS:
101 log.info("HOSTS management instance removed {}", instance);
102 hostsManagementRules(instance, false);
103 break;
104 default:
105 break;
Hyunsun Moon60a10672016-06-12 17:39:12 -0700106 }
107 }
108
Hyunsun Moonc031d9b2016-08-04 13:57:22 -0700109 private void localManagementRules(Instance instance, boolean install) {
Hyunsun Moon60a10672016-06-12 17:39:12 -0700110 TrafficSelector selector = DefaultTrafficSelector.builder()
Hyunsun Moonc031d9b2016-08-04 13:57:22 -0700111 .matchEthType(Ethernet.TYPE_IPV4)
112 .matchIPDst(instance.ipAddress().toIpPrefix())
Hyunsun Moon60a10672016-06-12 17:39:12 -0700113 .build();
114
115 TrafficTreatment treatment = DefaultTrafficTreatment.builder()
Hyunsun Moonc031d9b2016-08-04 13:57:22 -0700116 .setEthDst(instance.mac())
Hyunsun Moon315b9a62016-06-23 14:48:04 -0700117 .setOutput(instance.portNumber())
118 .build();
119
120 FlowRule flowRule = DefaultFlowRule.builder()
121 .fromApp(appId)
122 .withSelector(selector)
123 .withTreatment(treatment)
Hyunsun Moonc031d9b2016-08-04 13:57:22 -0700124 .withPriority(CordVtnPipeline.PRIORITY_DEFAULT)
125 .forDevice(instance.deviceId())
Hyunsun Moon1e88fef2016-08-04 14:00:35 -0700126 .forTable(CordVtnPipeline.TABLE_DST)
Hyunsun Moonc031d9b2016-08-04 13:57:22 -0700127 .makePermanent()
128 .build();
129
130 pipeline.processFlowRule(install, flowRule);
131 }
132
133 private void hostsManagementRules(Instance instance, boolean install) {
134 PortNumber hostMgmtPort = nodeManager.hostManagementPort(instance.deviceId());
135 if (hostMgmtPort == null) {
136 log.warn("Can not find host management port in {}", instance.deviceId());
137 return;
138 }
139
140 TrafficSelector selector = DefaultTrafficSelector.builder()
141 .matchInPort(instance.portNumber())
142 .build();
143
144 TrafficTreatment treatment = DefaultTrafficTreatment.builder()
145 .setOutput(hostMgmtPort)
146 .build();
147
148 FlowRule flowRule = DefaultFlowRule.builder()
149 .fromApp(appId)
150 .withSelector(selector)
151 .withTreatment(treatment)
Hyunsun Moon315b9a62016-06-23 14:48:04 -0700152 .withPriority(CordVtnPipeline.PRIORITY_MANAGEMENT)
153 .forDevice(instance.deviceId())
Hyunsun Moonc031d9b2016-08-04 13:57:22 -0700154 .forTable(CordVtnPipeline.TABLE_IN_PORT)
Hyunsun Moon60a10672016-06-12 17:39:12 -0700155 .makePermanent()
156 .build();
157
158 pipeline.processFlowRule(install, flowRule);
Hyunsun Moon5401aaa2016-06-12 17:40:34 -0700159
160 selector = DefaultTrafficSelector.builder()
161 .matchEthType(Ethernet.TYPE_IPV4)
162 .matchIPDst(instance.ipAddress().toIpPrefix())
163 .build();
164
165 treatment = DefaultTrafficTreatment.builder()
166 .setEthDst(instance.mac())
167 .setOutput(instance.portNumber())
168 .build();
169
170 flowRule = DefaultFlowRule.builder()
171 .fromApp(appId)
172 .withSelector(selector)
173 .withTreatment(treatment)
174 .withPriority(CordVtnPipeline.PRIORITY_DEFAULT)
175 .forDevice(instance.deviceId())
Hyunsun Moon1e88fef2016-08-04 14:00:35 -0700176 .forTable(CordVtnPipeline.TABLE_DST)
Hyunsun Moon5401aaa2016-06-12 17:40:34 -0700177 .makePermanent()
178 .build();
179
180 pipeline.processFlowRule(install, flowRule);
Hyunsun Moon60a10672016-06-12 17:39:12 -0700181 }
182}