blob: b397db5af58f2e23328dd18fb5e584d4d19f537a [file] [log] [blame]
jaegonkimdcf7c822019-02-06 15:00:14 +09001/*
2 * Copyright 2019-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 */
16package org.onosproject.ofoverlay.impl;
17
18import org.onosproject.net.device.DeviceService;
19import org.onosproject.workflow.api.ImmutableListWorkflow;
20import org.onosproject.workflow.api.Workflow;
21import org.onosproject.workflow.api.WorkflowExecutionService;
22import org.onosproject.workflow.api.WorkflowStore;
23import org.onosproject.workflow.api.WorkplaceStore;
m.rahil09251882019-04-15 22:58:33 +053024import org.onosproject.workflow.api.DefaultWorkletDescription;
25import org.onosproject.workflow.api.WorkflowException;
jaegonkimdcf7c822019-02-06 15:00:14 +090026import org.osgi.service.component.annotations.Activate;
27import org.osgi.service.component.annotations.Component;
28import org.osgi.service.component.annotations.Deactivate;
29import org.osgi.service.component.annotations.Reference;
30import org.osgi.service.component.annotations.ReferenceCardinality;
31import org.slf4j.Logger;
32import org.slf4j.LoggerFactory;
33
34import java.net.URI;
35import java.util.concurrent.ScheduledExecutorService;
36
37import static java.util.concurrent.Executors.newSingleThreadScheduledExecutor;
38import static org.onlab.util.Tools.groupedThreads;
39
40/**
41 * Class for Open-flow overlay configuration workflow.
42 */
43@Component(immediate = true)
44public class OfOverlayWorkflow {
45
46 private static final Logger log = LoggerFactory.getLogger(OfOverlayWorkflow.class);
47
48 @Reference(cardinality = ReferenceCardinality.MANDATORY)
49 protected WorkflowStore workflowStore;
50
51 @Reference(cardinality = ReferenceCardinality.MANDATORY)
52 protected WorkplaceStore workplaceStore;
53
54 @Reference(cardinality = ReferenceCardinality.MANDATORY)
55 protected WorkflowExecutionService workflowExecutionService;
56
57 @Reference(cardinality = ReferenceCardinality.MANDATORY)
58 protected DeviceService deviceService;
59
60 private ScheduledExecutorService eventMapTriggerExecutor;
61
m.rahil09251882019-04-15 22:58:33 +053062 private static final String BRIDGE_NAME = "/bridgeName";
63
jaegonkimdcf7c822019-02-06 15:00:14 +090064 @Activate
65 public void activate() {
66 log.info("Activated");
67
68 eventMapTriggerExecutor = newSingleThreadScheduledExecutor(
69 groupedThreads("onos/of-overlay", "eventmap-trigger-executor"));
70
71 registerWorkflows();
72
73 }
74
75 @Deactivate
76 public void deactivate() {
77 log.info("Deactivated");
78 }
79
80 /**
81 * Registers workflows.
82 */
83 private void registerWorkflows() {
m.rahil09251882019-04-15 22:58:33 +053084 try {
85 // registering class-loader
86 workflowStore.registerLocal(this.getClass().getClassLoader());
jaegonkimdcf7c822019-02-06 15:00:14 +090087
m.rahil09251882019-04-15 22:58:33 +053088 // registering new workflow definition
89 URI uri = URI.create("of-overlay.workflow-nova");
90 Workflow workflow = ImmutableListWorkflow.builder()
91 .id(uri)
92 //.attribute(WorkflowAttribute.REMOVE_AFTER_COMPLETE)
93 .chain(Ovs.CreateOvsdbDevice.class.getName())
94 .chain(Ovs.UpdateOvsVersion.class.getName())
m.rahilfaf04d72019-05-24 21:11:22 +053095 .chain(Ovs.UpdateBridgeId.class.getName())
m.rahil09251882019-04-15 22:58:33 +053096 .chain(DefaultWorkletDescription.builder().name(Ovs.CreateBridge.class.getName())
97 .staticDataModel(BRIDGE_NAME, "br-int")
98 .build())
m.rahil09251882019-04-15 22:58:33 +053099 .chain(DefaultWorkletDescription.builder().name(Ovs.CreateBridge.class.getName())
100 .staticDataModel(BRIDGE_NAME, "br-phy")
101 .build())
102 .chain(Ovs.CreateOverlayBridgeVxlanPort.class.getName())
103 .chain(Ovs.AddPhysicalPortsOnUnderlayBridge.class.getName())
104 .chain(Ovs.ConfigureUnderlayBridgeLocalIp.class.getName())
105 .build();
jaegonkimdcf7c822019-02-06 15:00:14 +0900106
m.rahil09251882019-04-15 22:58:33 +0530107 workflowStore.register(workflow);
nitinanand2a5c8fd2019-03-20 10:26:08 +0530108
m.rahil09251882019-04-15 22:58:33 +0530109 // registering new workflow definition based on multi-event handling
110 uri = URI.create("of-overlay.workflow-nova-multiEvent-test");
111 workflow = ImmutableListWorkflow.builder()
112 .id(uri)
113 //.attribute(WorkflowAttribute.REMOVE_AFTER_COMPLETE)
114 .chain(Ovs.CreateOvsdbDevice.class.getName())
115 .chain(Ovs.UpdateOvsVersion.class.getName())
m.rahilfaf04d72019-05-24 21:11:22 +0530116 .chain(Ovs.UpdateBridgeId.class.getName())
m.rahil09251882019-04-15 22:58:33 +0530117 .chain(Ovs.CreateOverlayBridgeMultiEvent.class.getName())
m.rahilfaf04d72019-05-24 21:11:22 +0530118 .chain(Ovs.UpdateBridgeId.class.getName())
119 .chain(DefaultWorkletDescription.builder().name(Ovs.CreateBridge.class.getName())
120 .staticDataModel(BRIDGE_NAME, "br-phy")
121 .build())
m.rahil09251882019-04-15 22:58:33 +0530122 .chain(Ovs.CreateOverlayBridgeVxlanPort.class.getName())
123 .chain(Ovs.AddPhysicalPortsOnUnderlayBridge.class.getName())
124 .chain(Ovs.ConfigureUnderlayBridgeLocalIp.class.getName())
125 .build();
126 workflowStore.register(workflow);
jaegonkimdcf7c822019-02-06 15:00:14 +0900127
m.rahil09251882019-04-15 22:58:33 +0530128 uri = URI.create("of-overlay.clean-workflow-nova");
129 workflow = ImmutableListWorkflow.builder()
130 .id(uri)
131 //.attribute(WorkflowAttribute.REMOVE_AFTER_COMPLETE)
132 .chain(Ovs.DeleteOverlayBridgeConfig.class.getName())
133 .chain(Ovs.RemoveOverlayBridgeOfDevice.class.getName())
134 .chain(Ovs.DeleteUnderlayBridgeConfig.class.getName())
135 .chain(Ovs.RemoveUnderlayBridgeOfDevice.class.getName())
136 .chain(Ovs.RemoveOvsdbDevice.class.getName())
137 .build();
138 workflowStore.register(workflow);
nitinanand0a15a162019-03-27 15:38:09 +0530139
m.rahil09251882019-04-15 22:58:33 +0530140 uri = URI.create("of-overlay.clean-workflow-nova-waitAll-Bridge-Del");
141 workflow = ImmutableListWorkflow.builder()
142 .id(uri)
143 //.attribute(WorkflowAttribute.REMOVE_AFTER_COMPLETE)
144 .chain(Ovs.DeleteOverlayBridgeConfig.class.getName())
145 .chain(Ovs.DeleteUnderlayBridgeConfig.class.getName())
146 .chain(Ovs.RemoveBridgeOfDevice.class.getName())
147 .chain(Ovs.RemoveOvsdbDevice.class.getName())
148 .build();
149 workflowStore.register(workflow);
jaegonkimdcf7c822019-02-06 15:00:14 +0900150
m.rahil09251882019-04-15 22:58:33 +0530151 uri = URI.create("of-overlay.workflow-ovs-leaf");
152 workflow = ImmutableListWorkflow.builder()
153 .id(uri)
154 .chain(Ovs.CreateOvsdbDevice.class.getName())
155 .chain(Ovs.UpdateOvsVersion.class.getName())
m.rahilfaf04d72019-05-24 21:11:22 +0530156 .chain(Ovs.UpdateBridgeId.class.getName())
157 .chain(DefaultWorkletDescription.builder().name(Ovs.CreateBridge.class.getName())
158 .staticDataModel(BRIDGE_NAME, "br-phy")
159 .build())
m.rahil09251882019-04-15 22:58:33 +0530160 .chain(Ovs.AddPhysicalPortsOnUnderlayBridge.class.getName())
161 .build();
162 workflowStore.register(workflow);
jaegonkimdcf7c822019-02-06 15:00:14 +0900163
m.rahil09251882019-04-15 22:58:33 +0530164 uri = URI.create("of-overlay.workflow-ovs-spine");
165 workflow = ImmutableListWorkflow.builder()
166 .id(uri)
167 .chain(Ovs.CreateOvsdbDevice.class.getName())
168 .chain(Ovs.UpdateOvsVersion.class.getName())
m.rahilfaf04d72019-05-24 21:11:22 +0530169 .chain(Ovs.UpdateBridgeId.class.getName())
170 .chain(DefaultWorkletDescription.builder().name(Ovs.CreateBridge.class.getName())
171 .staticDataModel(BRIDGE_NAME, "br-phy")
172 .build())
m.rahil09251882019-04-15 22:58:33 +0530173 .chain(Ovs.AddPhysicalPortsOnUnderlayBridge.class.getName())
174 .build();
175 workflowStore.register(workflow);
176
177 deviceService.addListener(
178 event -> {
179 // trigger EventTask for DeviceEvent
180 eventMapTriggerExecutor.submit(
181 () -> workflowExecutionService.eventMapTrigger(
182 event,
183 // event hint supplier
184 (ev) -> {
185 if (ev == null || ev.subject() == null) {
186 return null;
187 }
188 String hint = event.subject().id().toString();
189 log.debug("hint: {}", hint);
190 return hint;
jaegonkimdcf7c822019-02-06 15:00:14 +0900191 }
m.rahil09251882019-04-15 22:58:33 +0530192 )
193 );
194 }
195 );
jaegonkimdcf7c822019-02-06 15:00:14 +0900196
m.rahil09251882019-04-15 22:58:33 +0530197 } catch (WorkflowException e) {
198 e.printStackTrace();
199 }
jaegonkimdcf7c822019-02-06 15:00:14 +0900200 }
201
202}