Merge branch 'master' of ssh://gerrit.onlab.us:29418/onos-next
Showing
56 changed files
with
1061 additions
and
63 deletions
1 | <?xml version="1.0" encoding="UTF-8"?> | 1 | <?xml version="1.0" encoding="UTF-8"?> |
2 | +<!-- | ||
3 | + ~ Licensed to the Apache Software Foundation (ASF) under one | ||
4 | + ~ or more contributor license agreements. See the NOTICE file | ||
5 | + ~ distributed with this work for additional information | ||
6 | + ~ regarding copyright ownership. The ASF licenses this file | ||
7 | + ~ to you under the Apache License, Version 2.0 (the | ||
8 | + ~ "License"); you may not use this file except in compliance | ||
9 | + ~ with the License. You may obtain a copy of the License at | ||
10 | + ~ | ||
11 | + ~ http://www.apache.org/licenses/LICENSE-2.0 | ||
12 | + ~ | ||
13 | + ~ Unless required by applicable law or agreed to in writing, | ||
14 | + ~ software distributed under the License is distributed on an | ||
15 | + ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||
16 | + ~ KIND, either express or implied. See the License for the | ||
17 | + ~ specific language governing permissions and limitations | ||
18 | + ~ under the License. | ||
19 | + --> | ||
2 | <project xmlns="http://maven.apache.org/POM/4.0.0" | 20 | <project xmlns="http://maven.apache.org/POM/4.0.0" |
3 | xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | 21 | xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
4 | xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> | 22 | xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> | ... | ... |
1 | +/* | ||
2 | + * Licensed to the Apache Software Foundation (ASF) under one | ||
3 | + * or more contributor license agreements. See the NOTICE file | ||
4 | + * distributed with this work for additional information | ||
5 | + * regarding copyright ownership. The ASF licenses this file | ||
6 | + * to you under the Apache License, Version 2.0 (the | ||
7 | + * "License"); you may not use this file except in compliance | ||
8 | + * with the License. You may obtain a copy of the License at | ||
9 | + * | ||
10 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
11 | + * | ||
12 | + * Unless required by applicable law or agreed to in writing, | ||
13 | + * software distributed under the License is distributed on an | ||
14 | + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||
15 | + * KIND, either express or implied. See the License for the | ||
16 | + * specific language governing permissions and limitations | ||
17 | + * under the License. | ||
18 | + */ | ||
1 | package org.onlab.onos.cli; | 19 | package org.onlab.onos.cli; |
2 | 20 | ||
3 | import org.apache.karaf.shell.commands.Option; | 21 | import org.apache.karaf.shell.commands.Option; | ... | ... |
1 | +/* | ||
2 | + * Licensed to the Apache Software Foundation (ASF) under one | ||
3 | + * or more contributor license agreements. See the NOTICE file | ||
4 | + * distributed with this work for additional information | ||
5 | + * regarding copyright ownership. The ASF licenses this file | ||
6 | + * to you under the Apache License, Version 2.0 (the | ||
7 | + * "License"); you may not use this file except in compliance | ||
8 | + * with the License. You may obtain a copy of the License at | ||
9 | + * | ||
10 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
11 | + * | ||
12 | + * Unless required by applicable law or agreed to in writing, | ||
13 | + * software distributed under the License is distributed on an | ||
14 | + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||
15 | + * KIND, either express or implied. See the License for the | ||
16 | + * specific language governing permissions and limitations | ||
17 | + * under the License. | ||
18 | + */ | ||
1 | package org.onlab.onos.cli; | 19 | package org.onlab.onos.cli; |
2 | 20 | ||
3 | import org.onlab.onos.cluster.ControllerNode; | 21 | import org.onlab.onos.cluster.ControllerNode; | ... | ... |
1 | +/* | ||
2 | + * Licensed to the Apache Software Foundation (ASF) under one | ||
3 | + * or more contributor license agreements. See the NOTICE file | ||
4 | + * distributed with this work for additional information | ||
5 | + * regarding copyright ownership. The ASF licenses this file | ||
6 | + * to you under the Apache License, Version 2.0 (the | ||
7 | + * "License"); you may not use this file except in compliance | ||
8 | + * with the License. You may obtain a copy of the License at | ||
9 | + * | ||
10 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
11 | + * | ||
12 | + * Unless required by applicable law or agreed to in writing, | ||
13 | + * software distributed under the License is distributed on an | ||
14 | + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||
15 | + * KIND, either express or implied. See the License for the | ||
16 | + * specific language governing permissions and limitations | ||
17 | + * under the License. | ||
18 | + */ | ||
1 | package org.onlab.onos.cli; | 19 | package org.onlab.onos.cli; |
2 | 20 | ||
3 | import com.fasterxml.jackson.databind.JsonNode; | 21 | import com.fasterxml.jackson.databind.JsonNode; | ... | ... |
1 | +/* | ||
2 | + * Licensed to the Apache Software Foundation (ASF) under one | ||
3 | + * or more contributor license agreements. See the NOTICE file | ||
4 | + * distributed with this work for additional information | ||
5 | + * regarding copyright ownership. The ASF licenses this file | ||
6 | + * to you under the Apache License, Version 2.0 (the | ||
7 | + * "License"); you may not use this file except in compliance | ||
8 | + * with the License. You may obtain a copy of the License at | ||
9 | + * | ||
10 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
11 | + * | ||
12 | + * Unless required by applicable law or agreed to in writing, | ||
13 | + * software distributed under the License is distributed on an | ||
14 | + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||
15 | + * KIND, either express or implied. See the License for the | ||
16 | + * specific language governing permissions and limitations | ||
17 | + * under the License. | ||
18 | + */ | ||
1 | package org.onlab.onos.cli; | 19 | package org.onlab.onos.cli; |
2 | 20 | ||
3 | import org.apache.karaf.shell.commands.Argument; | 21 | import org.apache.karaf.shell.commands.Argument; | ... | ... |
1 | +/* | ||
2 | + * Licensed to the Apache Software Foundation (ASF) under one | ||
3 | + * or more contributor license agreements. See the NOTICE file | ||
4 | + * distributed with this work for additional information | ||
5 | + * regarding copyright ownership. The ASF licenses this file | ||
6 | + * to you under the Apache License, Version 2.0 (the | ||
7 | + * "License"); you may not use this file except in compliance | ||
8 | + * with the License. You may obtain a copy of the License at | ||
9 | + * | ||
10 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
11 | + * | ||
12 | + * Unless required by applicable law or agreed to in writing, | ||
13 | + * software distributed under the License is distributed on an | ||
14 | + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||
15 | + * KIND, either express or implied. See the License for the | ||
16 | + * specific language governing permissions and limitations | ||
17 | + * under the License. | ||
18 | + */ | ||
1 | package org.onlab.onos.cli; | 19 | package org.onlab.onos.cli; |
2 | 20 | ||
3 | import org.apache.karaf.shell.console.Completer; | 21 | import org.apache.karaf.shell.console.Completer; | ... | ... |
1 | +/* | ||
2 | + * Licensed to the Apache Software Foundation (ASF) under one | ||
3 | + * or more contributor license agreements. See the NOTICE file | ||
4 | + * distributed with this work for additional information | ||
5 | + * regarding copyright ownership. The ASF licenses this file | ||
6 | + * to you under the Apache License, Version 2.0 (the | ||
7 | + * "License"); you may not use this file except in compliance | ||
8 | + * with the License. You may obtain a copy of the License at | ||
9 | + * | ||
10 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
11 | + * | ||
12 | + * Unless required by applicable law or agreed to in writing, | ||
13 | + * software distributed under the License is distributed on an | ||
14 | + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||
15 | + * KIND, either express or implied. See the License for the | ||
16 | + * specific language governing permissions and limitations | ||
17 | + * under the License. | ||
18 | + */ | ||
1 | package org.onlab.onos.cli; | 19 | package org.onlab.onos.cli; |
2 | 20 | ||
3 | import org.apache.karaf.shell.commands.Argument; | 21 | import org.apache.karaf.shell.commands.Argument; | ... | ... |
1 | +/* | ||
2 | + * Licensed to the Apache Software Foundation (ASF) under one | ||
3 | + * or more contributor license agreements. See the NOTICE file | ||
4 | + * distributed with this work for additional information | ||
5 | + * regarding copyright ownership. The ASF licenses this file | ||
6 | + * to you under the Apache License, Version 2.0 (the | ||
7 | + * "License"); you may not use this file except in compliance | ||
8 | + * with the License. You may obtain a copy of the License at | ||
9 | + * | ||
10 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
11 | + * | ||
12 | + * Unless required by applicable law or agreed to in writing, | ||
13 | + * software distributed under the License is distributed on an | ||
14 | + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||
15 | + * KIND, either express or implied. See the License for the | ||
16 | + * specific language governing permissions and limitations | ||
17 | + * under the License. | ||
18 | + */ | ||
1 | package org.onlab.onos.cli; | 19 | package org.onlab.onos.cli; |
2 | 20 | ||
3 | import com.fasterxml.jackson.databind.JsonNode; | 21 | import com.fasterxml.jackson.databind.JsonNode; | ... | ... |
1 | +/* | ||
2 | + * Licensed to the Apache Software Foundation (ASF) under one | ||
3 | + * or more contributor license agreements. See the NOTICE file | ||
4 | + * distributed with this work for additional information | ||
5 | + * regarding copyright ownership. The ASF licenses this file | ||
6 | + * to you under the Apache License, Version 2.0 (the | ||
7 | + * "License"); you may not use this file except in compliance | ||
8 | + * with the License. You may obtain a copy of the License at | ||
9 | + * | ||
10 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
11 | + * | ||
12 | + * Unless required by applicable law or agreed to in writing, | ||
13 | + * software distributed under the License is distributed on an | ||
14 | + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||
15 | + * KIND, either express or implied. See the License for the | ||
16 | + * specific language governing permissions and limitations | ||
17 | + * under the License. | ||
18 | + */ | ||
1 | package org.onlab.onos.cli; | 19 | package org.onlab.onos.cli; |
2 | 20 | ||
3 | import static com.google.common.collect.Lists.newArrayList; | 21 | import static com.google.common.collect.Lists.newArrayList; | ... | ... |
1 | +/* | ||
2 | + * Licensed to the Apache Software Foundation (ASF) under one | ||
3 | + * or more contributor license agreements. See the NOTICE file | ||
4 | + * distributed with this work for additional information | ||
5 | + * regarding copyright ownership. The ASF licenses this file | ||
6 | + * to you under the Apache License, Version 2.0 (the | ||
7 | + * "License"); you may not use this file except in compliance | ||
8 | + * with the License. You may obtain a copy of the License at | ||
9 | + * | ||
10 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
11 | + * | ||
12 | + * Unless required by applicable law or agreed to in writing, | ||
13 | + * software distributed under the License is distributed on an | ||
14 | + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||
15 | + * KIND, either express or implied. See the License for the | ||
16 | + * specific language governing permissions and limitations | ||
17 | + * under the License. | ||
18 | + */ | ||
1 | package org.onlab.onos.cli; | 19 | package org.onlab.onos.cli; |
2 | 20 | ||
3 | import com.fasterxml.jackson.databind.ObjectMapper; | 21 | import com.fasterxml.jackson.databind.ObjectMapper; | ... | ... |
1 | +/* | ||
2 | + * Licensed to the Apache Software Foundation (ASF) under one | ||
3 | + * or more contributor license agreements. See the NOTICE file | ||
4 | + * distributed with this work for additional information | ||
5 | + * regarding copyright ownership. The ASF licenses this file | ||
6 | + * to you under the Apache License, Version 2.0 (the | ||
7 | + * "License"); you may not use this file except in compliance | ||
8 | + * with the License. You may obtain a copy of the License at | ||
9 | + * | ||
10 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
11 | + * | ||
12 | + * Unless required by applicable law or agreed to in writing, | ||
13 | + * software distributed under the License is distributed on an | ||
14 | + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||
15 | + * KIND, either express or implied. See the License for the | ||
16 | + * specific language governing permissions and limitations | ||
17 | + * under the License. | ||
18 | + */ | ||
1 | package org.onlab.onos.cli.net; | 19 | package org.onlab.onos.cli.net; |
2 | 20 | ||
3 | import org.apache.karaf.shell.commands.Argument; | 21 | import org.apache.karaf.shell.commands.Argument; | ... | ... |
1 | +/* | ||
2 | + * Licensed to the Apache Software Foundation (ASF) under one | ||
3 | + * or more contributor license agreements. See the NOTICE file | ||
4 | + * distributed with this work for additional information | ||
5 | + * regarding copyright ownership. The ASF licenses this file | ||
6 | + * to you under the Apache License, Version 2.0 (the | ||
7 | + * "License"); you may not use this file except in compliance | ||
8 | + * with the License. You may obtain a copy of the License at | ||
9 | + * | ||
10 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
11 | + * | ||
12 | + * Unless required by applicable law or agreed to in writing, | ||
13 | + * software distributed under the License is distributed on an | ||
14 | + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||
15 | + * KIND, either express or implied. See the License for the | ||
16 | + * specific language governing permissions and limitations | ||
17 | + * under the License. | ||
18 | + */ | ||
1 | package org.onlab.onos.cli.net; | 19 | package org.onlab.onos.cli.net; |
2 | 20 | ||
3 | import org.apache.karaf.shell.commands.Argument; | 21 | import org.apache.karaf.shell.commands.Argument; |
4 | import org.apache.karaf.shell.commands.Command; | 22 | import org.apache.karaf.shell.commands.Command; |
5 | -import org.onlab.onos.cli.AbstractShellCommand; | ||
6 | import org.onlab.onos.net.ConnectPoint; | 23 | import org.onlab.onos.net.ConnectPoint; |
7 | import org.onlab.onos.net.DeviceId; | 24 | import org.onlab.onos.net.DeviceId; |
8 | import org.onlab.onos.net.PortNumber; | 25 | import org.onlab.onos.net.PortNumber; |
9 | -import org.onlab.onos.net.flow.DefaultTrafficSelector; | ||
10 | import org.onlab.onos.net.flow.DefaultTrafficTreatment; | 26 | import org.onlab.onos.net.flow.DefaultTrafficTreatment; |
11 | import org.onlab.onos.net.flow.TrafficSelector; | 27 | import org.onlab.onos.net.flow.TrafficSelector; |
12 | import org.onlab.onos.net.flow.TrafficTreatment; | 28 | import org.onlab.onos.net.flow.TrafficTreatment; |
13 | import org.onlab.onos.net.intent.Intent; | 29 | import org.onlab.onos.net.intent.Intent; |
14 | import org.onlab.onos.net.intent.IntentService; | 30 | import org.onlab.onos.net.intent.IntentService; |
15 | import org.onlab.onos.net.intent.MultiPointToSinglePointIntent; | 31 | import org.onlab.onos.net.intent.MultiPointToSinglePointIntent; |
16 | -import org.onlab.packet.Ethernet; | ||
17 | 32 | ||
18 | import java.util.HashSet; | 33 | import java.util.HashSet; |
19 | import java.util.Set; | 34 | import java.util.Set; |
... | @@ -26,7 +41,7 @@ import static org.onlab.onos.net.PortNumber.portNumber; | ... | @@ -26,7 +41,7 @@ import static org.onlab.onos.net.PortNumber.portNumber; |
26 | */ | 41 | */ |
27 | @Command(scope = "onos", name = "add-multi-to-single-intent", | 42 | @Command(scope = "onos", name = "add-multi-to-single-intent", |
28 | description = "Installs point-to-point connectivity intent") | 43 | description = "Installs point-to-point connectivity intent") |
29 | -public class AddMultiPointToSinglePointIntentCommand extends AbstractShellCommand { | 44 | +public class AddMultiPointToSinglePointIntentCommand extends ConnectivityIntentCommand { |
30 | 45 | ||
31 | @Argument(index = 0, name = "ingressDevices", | 46 | @Argument(index = 0, name = "ingressDevices", |
32 | description = "Ingress Device/Port Description", | 47 | description = "Ingress Device/Port Description", |
... | @@ -55,9 +70,7 @@ public class AddMultiPointToSinglePointIntentCommand extends AbstractShellComman | ... | @@ -55,9 +70,7 @@ public class AddMultiPointToSinglePointIntentCommand extends AbstractShellComman |
55 | ingressPoints.add(ingress); | 70 | ingressPoints.add(ingress); |
56 | } | 71 | } |
57 | 72 | ||
58 | - TrafficSelector selector = DefaultTrafficSelector.builder() | 73 | + TrafficSelector selector = buildTrafficSelector(); |
59 | - .matchEthType(Ethernet.TYPE_IPV4) | ||
60 | - .build(); | ||
61 | TrafficTreatment treatment = DefaultTrafficTreatment.builder().build(); | 74 | TrafficTreatment treatment = DefaultTrafficTreatment.builder().build(); |
62 | 75 | ||
63 | Intent intent = new MultiPointToSinglePointIntent(appId(), selector, treatment, | 76 | Intent intent = new MultiPointToSinglePointIntent(appId(), selector, treatment, | ... | ... |
1 | +/* | ||
2 | + * Licensed to the Apache Software Foundation (ASF) under one | ||
3 | + * or more contributor license agreements. See the NOTICE file | ||
4 | + * distributed with this work for additional information | ||
5 | + * regarding copyright ownership. The ASF licenses this file | ||
6 | + * to you under the Apache License, Version 2.0 (the | ||
7 | + * "License"); you may not use this file except in compliance | ||
8 | + * with the License. You may obtain a copy of the License at | ||
9 | + * | ||
10 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
11 | + * | ||
12 | + * Unless required by applicable law or agreed to in writing, | ||
13 | + * software distributed under the License is distributed on an | ||
14 | + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||
15 | + * KIND, either express or implied. See the License for the | ||
16 | + * specific language governing permissions and limitations | ||
17 | + * under the License. | ||
18 | + */ | ||
1 | package org.onlab.onos.cli.net; | 19 | package org.onlab.onos.cli.net; |
2 | 20 | ||
3 | import org.apache.karaf.shell.commands.Argument; | 21 | import org.apache.karaf.shell.commands.Argument; |
4 | import org.apache.karaf.shell.commands.Command; | 22 | import org.apache.karaf.shell.commands.Command; |
5 | -import org.onlab.onos.cli.AbstractShellCommand; | ||
6 | import org.onlab.onos.net.ConnectPoint; | 23 | import org.onlab.onos.net.ConnectPoint; |
7 | import org.onlab.onos.net.DeviceId; | 24 | import org.onlab.onos.net.DeviceId; |
8 | import org.onlab.onos.net.PortNumber; | 25 | import org.onlab.onos.net.PortNumber; |
9 | -import org.onlab.onos.net.flow.DefaultTrafficSelector; | ||
10 | -import org.onlab.onos.net.flow.DefaultTrafficTreatment; | ||
11 | import org.onlab.onos.net.flow.TrafficSelector; | 26 | import org.onlab.onos.net.flow.TrafficSelector; |
12 | import org.onlab.onos.net.flow.TrafficTreatment; | 27 | import org.onlab.onos.net.flow.TrafficTreatment; |
13 | import org.onlab.onos.net.intent.Intent; | 28 | import org.onlab.onos.net.intent.Intent; |
14 | import org.onlab.onos.net.intent.IntentService; | 29 | import org.onlab.onos.net.intent.IntentService; |
15 | import org.onlab.onos.net.intent.PointToPointIntent; | 30 | import org.onlab.onos.net.intent.PointToPointIntent; |
16 | -import org.onlab.packet.Ethernet; | 31 | + |
32 | +import static org.onlab.onos.net.flow.DefaultTrafficTreatment.builder; | ||
17 | 33 | ||
18 | import static org.onlab.onos.net.DeviceId.deviceId; | 34 | import static org.onlab.onos.net.DeviceId.deviceId; |
19 | import static org.onlab.onos.net.PortNumber.portNumber; | 35 | import static org.onlab.onos.net.PortNumber.portNumber; |
... | @@ -23,7 +39,7 @@ import static org.onlab.onos.net.PortNumber.portNumber; | ... | @@ -23,7 +39,7 @@ import static org.onlab.onos.net.PortNumber.portNumber; |
23 | */ | 39 | */ |
24 | @Command(scope = "onos", name = "add-point-intent", | 40 | @Command(scope = "onos", name = "add-point-intent", |
25 | description = "Installs point-to-point connectivity intent") | 41 | description = "Installs point-to-point connectivity intent") |
26 | -public class AddPointToPointIntentCommand extends AbstractShellCommand { | 42 | +public class AddPointToPointIntentCommand extends ConnectivityIntentCommand { |
27 | 43 | ||
28 | @Argument(index = 0, name = "ingressDevice", | 44 | @Argument(index = 0, name = "ingressDevice", |
29 | description = "Ingress Device/Port Description", | 45 | description = "Ingress Device/Port Description", |
... | @@ -47,10 +63,8 @@ public class AddPointToPointIntentCommand extends AbstractShellCommand { | ... | @@ -47,10 +63,8 @@ public class AddPointToPointIntentCommand extends AbstractShellCommand { |
47 | PortNumber egressPortNumber = portNumber(getPortNumber(egressDeviceString)); | 63 | PortNumber egressPortNumber = portNumber(getPortNumber(egressDeviceString)); |
48 | ConnectPoint egress = new ConnectPoint(egressDeviceId, egressPortNumber); | 64 | ConnectPoint egress = new ConnectPoint(egressDeviceId, egressPortNumber); |
49 | 65 | ||
50 | - TrafficSelector selector = DefaultTrafficSelector.builder() | 66 | + TrafficSelector selector = buildTrafficSelector(); |
51 | - .matchEthType(Ethernet.TYPE_IPV4) | 67 | + TrafficTreatment treatment = builder().build(); |
52 | - .build(); | ||
53 | - TrafficTreatment treatment = DefaultTrafficTreatment.builder().build(); | ||
54 | 68 | ||
55 | Intent intent = new PointToPointIntent(appId(), selector, treatment, | 69 | Intent intent = new PointToPointIntent(appId(), selector, treatment, |
56 | ingress, egress); | 70 | ingress, egress); | ... | ... |
1 | +/* | ||
2 | + * Licensed to the Apache Software Foundation (ASF) under one | ||
3 | + * or more contributor license agreements. See the NOTICE file | ||
4 | + * distributed with this work for additional information | ||
5 | + * regarding copyright ownership. The ASF licenses this file | ||
6 | + * to you under the Apache License, Version 2.0 (the | ||
7 | + * "License"); you may not use this file except in compliance | ||
8 | + * with the License. You may obtain a copy of the License at | ||
9 | + * | ||
10 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
11 | + * | ||
12 | + * Unless required by applicable law or agreed to in writing, | ||
13 | + * software distributed under the License is distributed on an | ||
14 | + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||
15 | + * KIND, either express or implied. See the License for the | ||
16 | + * specific language governing permissions and limitations | ||
17 | + * under the License. | ||
18 | + */ | ||
1 | package org.onlab.onos.cli.net; | 19 | package org.onlab.onos.cli.net; |
2 | 20 | ||
3 | import com.fasterxml.jackson.databind.ObjectMapper; | 21 | import com.fasterxml.jackson.databind.ObjectMapper; | ... | ... |
1 | +/* | ||
2 | + * Licensed to the Apache Software Foundation (ASF) under one | ||
3 | + * or more contributor license agreements. See the NOTICE file | ||
4 | + * distributed with this work for additional information | ||
5 | + * regarding copyright ownership. The ASF licenses this file | ||
6 | + * to you under the Apache License, Version 2.0 (the | ||
7 | + * "License"); you may not use this file except in compliance | ||
8 | + * with the License. You may obtain a copy of the License at | ||
9 | + * | ||
10 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
11 | + * | ||
12 | + * Unless required by applicable law or agreed to in writing, | ||
13 | + * software distributed under the License is distributed on an | ||
14 | + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||
15 | + * KIND, either express or implied. See the License for the | ||
16 | + * specific language governing permissions and limitations | ||
17 | + * under the License. | ||
18 | + */ | ||
1 | package org.onlab.onos.cli.net; | 19 | package org.onlab.onos.cli.net; |
2 | 20 | ||
3 | import org.apache.karaf.shell.console.Completer; | 21 | import org.apache.karaf.shell.console.Completer; | ... | ... |
1 | +/* | ||
2 | + * Licensed to the Apache Software Foundation (ASF) under one | ||
3 | + * or more contributor license agreements. See the NOTICE file | ||
4 | + * distributed with this work for additional information | ||
5 | + * regarding copyright ownership. The ASF licenses this file | ||
6 | + * to you under the Apache License, Version 2.0 (the | ||
7 | + * "License"); you may not use this file except in compliance | ||
8 | + * with the License. You may obtain a copy of the License at | ||
9 | + * | ||
10 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
11 | + * | ||
12 | + * Unless required by applicable law or agreed to in writing, | ||
13 | + * software distributed under the License is distributed on an | ||
14 | + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||
15 | + * KIND, either express or implied. See the License for the | ||
16 | + * specific language governing permissions and limitations | ||
17 | + * under the License. | ||
18 | + */ | ||
1 | package org.onlab.onos.cli.net; | 19 | package org.onlab.onos.cli.net; |
2 | 20 | ||
3 | import org.apache.karaf.shell.commands.Argument; | 21 | import org.apache.karaf.shell.commands.Argument; | ... | ... |
1 | +/* | ||
2 | + * Licensed to the Apache Software Foundation (ASF) under one | ||
3 | + * or more contributor license agreements. See the NOTICE file | ||
4 | + * distributed with this work for additional information | ||
5 | + * regarding copyright ownership. The ASF licenses this file | ||
6 | + * to you under the Apache License, Version 2.0 (the | ||
7 | + * "License"); you may not use this file except in compliance | ||
8 | + * with the License. You may obtain a copy of the License at | ||
9 | + * | ||
10 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
11 | + * | ||
12 | + * Unless required by applicable law or agreed to in writing, | ||
13 | + * software distributed under the License is distributed on an | ||
14 | + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||
15 | + * KIND, either express or implied. See the License for the | ||
16 | + * specific language governing permissions and limitations | ||
17 | + * under the License. | ||
18 | + */ | ||
1 | package org.onlab.onos.cli.net; | 19 | package org.onlab.onos.cli.net; |
2 | 20 | ||
3 | import com.fasterxml.jackson.databind.JsonNode; | 21 | import com.fasterxml.jackson.databind.JsonNode; | ... | ... |
1 | +/* | ||
2 | + * Licensed to the Apache Software Foundation (ASF) under one | ||
3 | + * or more contributor license agreements. See the NOTICE file | ||
4 | + * distributed with this work for additional information | ||
5 | + * regarding copyright ownership. The ASF licenses this file | ||
6 | + * to you under the Apache License, Version 2.0 (the | ||
7 | + * "License"); you may not use this file except in compliance | ||
8 | + * with the License. You may obtain a copy of the License at | ||
9 | + * | ||
10 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
11 | + * | ||
12 | + * Unless required by applicable law or agreed to in writing, | ||
13 | + * software distributed under the License is distributed on an | ||
14 | + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||
15 | + * KIND, either express or implied. See the License for the | ||
16 | + * specific language governing permissions and limitations | ||
17 | + * under the License. | ||
18 | + */ | ||
1 | package org.onlab.onos.cli.net; | 19 | package org.onlab.onos.cli.net; |
2 | 20 | ||
3 | import java.util.List; | 21 | import java.util.List; | ... | ... |
1 | +/* | ||
2 | + * Licensed to the Apache Software Foundation (ASF) under one | ||
3 | + * or more contributor license agreements. See the NOTICE file | ||
4 | + * distributed with this work for additional information | ||
5 | + * regarding copyright ownership. The ASF licenses this file | ||
6 | + * to you under the Apache License, Version 2.0 (the | ||
7 | + * "License"); you may not use this file except in compliance | ||
8 | + * with the License. You may obtain a copy of the License at | ||
9 | + * | ||
10 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
11 | + * | ||
12 | + * Unless required by applicable law or agreed to in writing, | ||
13 | + * software distributed under the License is distributed on an | ||
14 | + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||
15 | + * KIND, either express or implied. See the License for the | ||
16 | + * specific language governing permissions and limitations | ||
17 | + * under the License. | ||
18 | + */ | ||
19 | +package org.onlab.onos.cli.net; | ||
20 | + | ||
21 | +import org.apache.karaf.shell.commands.Option; | ||
22 | +import org.onlab.onos.cli.AbstractShellCommand; | ||
23 | +import org.onlab.onos.net.flow.DefaultTrafficSelector; | ||
24 | +import org.onlab.onos.net.flow.TrafficSelector; | ||
25 | +import org.onlab.packet.Ethernet; | ||
26 | +import org.onlab.packet.MacAddress; | ||
27 | + | ||
28 | +import com.google.common.base.Strings; | ||
29 | + | ||
30 | +/** | ||
31 | + * Base class for command line operations for connectivity based intents. | ||
32 | + */ | ||
33 | +public abstract class ConnectivityIntentCommand extends AbstractShellCommand { | ||
34 | + | ||
35 | + @Option(name = "-s", aliases = "--ethSrc", description = "Source MAC Address", | ||
36 | + required = false, multiValued = false) | ||
37 | + private String srcMacString = null; | ||
38 | + | ||
39 | + @Option(name = "-d", aliases = "--ethDst", description = "Destination MAC Address", | ||
40 | + required = false, multiValued = false) | ||
41 | + private String dstMacString = null; | ||
42 | + | ||
43 | + @Option(name = "-t", aliases = "--ethType", description = "Ethernet Type", | ||
44 | + required = false, multiValued = false) | ||
45 | + private String ethTypeString = ""; | ||
46 | + | ||
47 | + /** | ||
48 | + * Constructs a traffic selector based on the command line arguments | ||
49 | + * presented to the command. | ||
50 | + */ | ||
51 | + protected TrafficSelector buildTrafficSelector() { | ||
52 | + TrafficSelector.Builder selectorBuilder = DefaultTrafficSelector.builder(); | ||
53 | + | ||
54 | + Short ethType = Ethernet.TYPE_IPV4; | ||
55 | + if (!Strings.isNullOrEmpty(ethTypeString)) { | ||
56 | + EthType ethTypeParameter = EthType.valueOf(ethTypeString); | ||
57 | + ethType = ethTypeParameter.value(); | ||
58 | + } | ||
59 | + selectorBuilder.matchEthType(ethType); | ||
60 | + | ||
61 | + if (!Strings.isNullOrEmpty(srcMacString)) { | ||
62 | + selectorBuilder.matchEthSrc(MacAddress.valueOf(srcMacString)); | ||
63 | + } | ||
64 | + | ||
65 | + if (!Strings.isNullOrEmpty(dstMacString)) { | ||
66 | + selectorBuilder.matchEthDst(MacAddress.valueOf(dstMacString)); | ||
67 | + } | ||
68 | + | ||
69 | + return selectorBuilder.build(); | ||
70 | + } | ||
71 | + | ||
72 | +} |
1 | +/* | ||
2 | + * Licensed to the Apache Software Foundation (ASF) under one | ||
3 | + * or more contributor license agreements. See the NOTICE file | ||
4 | + * distributed with this work for additional information | ||
5 | + * regarding copyright ownership. The ASF licenses this file | ||
6 | + * to you under the Apache License, Version 2.0 (the | ||
7 | + * "License"); you may not use this file except in compliance | ||
8 | + * with the License. You may obtain a copy of the License at | ||
9 | + * | ||
10 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
11 | + * | ||
12 | + * Unless required by applicable law or agreed to in writing, | ||
13 | + * software distributed under the License is distributed on an | ||
14 | + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||
15 | + * KIND, either express or implied. See the License for the | ||
16 | + * specific language governing permissions and limitations | ||
17 | + * under the License. | ||
18 | + */ | ||
1 | package org.onlab.onos.cli.net; | 19 | package org.onlab.onos.cli.net; |
2 | 20 | ||
3 | import org.apache.karaf.shell.console.Completer; | 21 | import org.apache.karaf.shell.console.Completer; | ... | ... |
1 | +/* | ||
2 | + * Licensed to the Apache Software Foundation (ASF) under one | ||
3 | + * or more contributor license agreements. See the NOTICE file | ||
4 | + * distributed with this work for additional information | ||
5 | + * regarding copyright ownership. The ASF licenses this file | ||
6 | + * to you under the Apache License, Version 2.0 (the | ||
7 | + * "License"); you may not use this file except in compliance | ||
8 | + * with the License. You may obtain a copy of the License at | ||
9 | + * | ||
10 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
11 | + * | ||
12 | + * Unless required by applicable law or agreed to in writing, | ||
13 | + * software distributed under the License is distributed on an | ||
14 | + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||
15 | + * KIND, either express or implied. See the License for the | ||
16 | + * specific language governing permissions and limitations | ||
17 | + * under the License. | ||
18 | + */ | ||
1 | package org.onlab.onos.cli.net; | 19 | package org.onlab.onos.cli.net; |
2 | 20 | ||
3 | import com.fasterxml.jackson.databind.JsonNode; | 21 | import com.fasterxml.jackson.databind.JsonNode; | ... | ... |
1 | +/* | ||
2 | + * Licensed to the Apache Software Foundation (ASF) under one | ||
3 | + * or more contributor license agreements. See the NOTICE file | ||
4 | + * distributed with this work for additional information | ||
5 | + * regarding copyright ownership. The ASF licenses this file | ||
6 | + * to you under the Apache License, Version 2.0 (the | ||
7 | + * "License"); you may not use this file except in compliance | ||
8 | + * with the License. You may obtain a copy of the License at | ||
9 | + * | ||
10 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
11 | + * | ||
12 | + * Unless required by applicable law or agreed to in writing, | ||
13 | + * software distributed under the License is distributed on an | ||
14 | + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||
15 | + * KIND, either express or implied. See the License for the | ||
16 | + * specific language governing permissions and limitations | ||
17 | + * under the License. | ||
18 | + */ | ||
1 | package org.onlab.onos.cli.net; | 19 | package org.onlab.onos.cli.net; |
2 | 20 | ||
3 | import org.apache.karaf.shell.commands.Argument; | 21 | import org.apache.karaf.shell.commands.Argument; | ... | ... |
1 | +/* | ||
2 | + * Licensed to the Apache Software Foundation (ASF) under one | ||
3 | + * or more contributor license agreements. See the NOTICE file | ||
4 | + * distributed with this work for additional information | ||
5 | + * regarding copyright ownership. The ASF licenses this file | ||
6 | + * to you under the Apache License, Version 2.0 (the | ||
7 | + * "License"); you may not use this file except in compliance | ||
8 | + * with the License. You may obtain a copy of the License at | ||
9 | + * | ||
10 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
11 | + * | ||
12 | + * Unless required by applicable law or agreed to in writing, | ||
13 | + * software distributed under the License is distributed on an | ||
14 | + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||
15 | + * KIND, either express or implied. See the License for the | ||
16 | + * specific language governing permissions and limitations | ||
17 | + * under the License. | ||
18 | + */ | ||
1 | package org.onlab.onos.cli.net; | 19 | package org.onlab.onos.cli.net; |
2 | 20 | ||
3 | import org.apache.karaf.shell.commands.Argument; | 21 | import org.apache.karaf.shell.commands.Argument; | ... | ... |
1 | +/* | ||
2 | + * Licensed to the Apache Software Foundation (ASF) under one | ||
3 | + * or more contributor license agreements. See the NOTICE file | ||
4 | + * distributed with this work for additional information | ||
5 | + * regarding copyright ownership. The ASF licenses this file | ||
6 | + * to you under the Apache License, Version 2.0 (the | ||
7 | + * "License"); you may not use this file except in compliance | ||
8 | + * with the License. You may obtain a copy of the License at | ||
9 | + * | ||
10 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
11 | + * | ||
12 | + * Unless required by applicable law or agreed to in writing, | ||
13 | + * software distributed under the License is distributed on an | ||
14 | + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||
15 | + * KIND, either express or implied. See the License for the | ||
16 | + * specific language governing permissions and limitations | ||
17 | + * under the License. | ||
18 | + */ | ||
1 | package org.onlab.onos.cli.net; | 19 | package org.onlab.onos.cli.net; |
2 | 20 | ||
3 | import com.fasterxml.jackson.databind.JsonNode; | 21 | import com.fasterxml.jackson.databind.JsonNode; | ... | ... |
1 | +/* | ||
2 | + * Licensed to the Apache Software Foundation (ASF) under one | ||
3 | + * or more contributor license agreements. See the NOTICE file | ||
4 | + * distributed with this work for additional information | ||
5 | + * regarding copyright ownership. The ASF licenses this file | ||
6 | + * to you under the Apache License, Version 2.0 (the | ||
7 | + * "License"); you may not use this file except in compliance | ||
8 | + * with the License. You may obtain a copy of the License at | ||
9 | + * | ||
10 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
11 | + * | ||
12 | + * Unless required by applicable law or agreed to in writing, | ||
13 | + * software distributed under the License is distributed on an | ||
14 | + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||
15 | + * KIND, either express or implied. See the License for the | ||
16 | + * specific language governing permissions and limitations | ||
17 | + * under the License. | ||
18 | + */ | ||
19 | +package org.onlab.onos.cli.net; | ||
20 | + | ||
21 | +import org.onlab.packet.Ethernet; | ||
22 | + | ||
23 | +/** | ||
24 | + * Allowed values for Ethernet types. Used by the CLI completer for | ||
25 | + * connectivity based intent L2 parameters. | ||
26 | + */ | ||
27 | +public enum EthType { | ||
28 | + /** ARP. */ | ||
29 | + ARP(Ethernet.TYPE_ARP), | ||
30 | + /** RARP. */ | ||
31 | + RARP(Ethernet.TYPE_RARP), | ||
32 | + /** IPV4. */ | ||
33 | + IPV4(Ethernet.TYPE_IPV4), | ||
34 | + /** LLDP. */ | ||
35 | + LLDP(Ethernet.TYPE_LLDP), | ||
36 | + /** BSN. */ | ||
37 | + BSN(Ethernet.TYPE_BSN); | ||
38 | + | ||
39 | + private short value; | ||
40 | + | ||
41 | + /** | ||
42 | + * Constructs an EthType with the given value. | ||
43 | + * | ||
44 | + * @param value value to use when this EthType is seen. | ||
45 | + */ | ||
46 | + private EthType(short value) { | ||
47 | + this.value = value; | ||
48 | + } | ||
49 | + | ||
50 | + /** | ||
51 | + * Gets the value to use for this EthType. | ||
52 | + * | ||
53 | + * @return short value to use for this EthType | ||
54 | + */ | ||
55 | + public short value() { | ||
56 | + return this.value; | ||
57 | + } | ||
58 | +} |
1 | +/* | ||
2 | + * Licensed to the Apache Software Foundation (ASF) under one | ||
3 | + * or more contributor license agreements. See the NOTICE file | ||
4 | + * distributed with this work for additional information | ||
5 | + * regarding copyright ownership. The ASF licenses this file | ||
6 | + * to you under the Apache License, Version 2.0 (the | ||
7 | + * "License"); you may not use this file except in compliance | ||
8 | + * with the License. You may obtain a copy of the License at | ||
9 | + * | ||
10 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
11 | + * | ||
12 | + * Unless required by applicable law or agreed to in writing, | ||
13 | + * software distributed under the License is distributed on an | ||
14 | + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||
15 | + * KIND, either express or implied. See the License for the | ||
16 | + * specific language governing permissions and limitations | ||
17 | + * under the License. | ||
18 | + */ | ||
19 | +package org.onlab.onos.cli.net; | ||
20 | + | ||
21 | +import java.util.List; | ||
22 | +import java.util.SortedSet; | ||
23 | + | ||
24 | +import org.apache.karaf.shell.console.Completer; | ||
25 | +import org.apache.karaf.shell.console.completer.StringsCompleter; | ||
26 | + | ||
27 | +/** | ||
28 | + * Ethernet type completer. | ||
29 | + */ | ||
30 | +public class EthTypeCompleter implements Completer { | ||
31 | + @Override | ||
32 | + public int complete(String buffer, int cursor, List<String> candidates) { | ||
33 | + // Delegate string completer | ||
34 | + StringsCompleter delegate = new StringsCompleter(); | ||
35 | + SortedSet<String> strings = delegate.getStrings(); | ||
36 | + strings.add(EthType.ARP.toString()); | ||
37 | + strings.add(EthType.BSN.toString()); | ||
38 | + strings.add(EthType.IPV4.toString()); | ||
39 | + strings.add(EthType.LLDP.toString()); | ||
40 | + strings.add(EthType.RARP.toString()); | ||
41 | + | ||
42 | + // Now let the completer do the work for figuring out what to offer. | ||
43 | + return delegate.complete(buffer, cursor, candidates); | ||
44 | + } | ||
45 | + | ||
46 | +} |
1 | +/* | ||
2 | + * Licensed to the Apache Software Foundation (ASF) under one | ||
3 | + * or more contributor license agreements. See the NOTICE file | ||
4 | + * distributed with this work for additional information | ||
5 | + * regarding copyright ownership. The ASF licenses this file | ||
6 | + * to you under the Apache License, Version 2.0 (the | ||
7 | + * "License"); you may not use this file except in compliance | ||
8 | + * with the License. You may obtain a copy of the License at | ||
9 | + * | ||
10 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
11 | + * | ||
12 | + * Unless required by applicable law or agreed to in writing, | ||
13 | + * software distributed under the License is distributed on an | ||
14 | + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||
15 | + * KIND, either express or implied. See the License for the | ||
16 | + * specific language governing permissions and limitations | ||
17 | + * under the License. | ||
18 | + */ | ||
1 | package org.onlab.onos.cli.net; | 19 | package org.onlab.onos.cli.net; |
2 | 20 | ||
3 | import java.util.List; | 21 | import java.util.List; | ... | ... |
1 | +/* | ||
2 | + * Licensed to the Apache Software Foundation (ASF) under one | ||
3 | + * or more contributor license agreements. See the NOTICE file | ||
4 | + * distributed with this work for additional information | ||
5 | + * regarding copyright ownership. The ASF licenses this file | ||
6 | + * to you under the Apache License, Version 2.0 (the | ||
7 | + * "License"); you may not use this file except in compliance | ||
8 | + * with the License. You may obtain a copy of the License at | ||
9 | + * | ||
10 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
11 | + * | ||
12 | + * Unless required by applicable law or agreed to in writing, | ||
13 | + * software distributed under the License is distributed on an | ||
14 | + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||
15 | + * KIND, either express or implied. See the License for the | ||
16 | + * specific language governing permissions and limitations | ||
17 | + * under the License. | ||
18 | + */ | ||
1 | package org.onlab.onos.cli.net; | 19 | package org.onlab.onos.cli.net; |
2 | 20 | ||
3 | import com.fasterxml.jackson.databind.JsonNode; | 21 | import com.fasterxml.jackson.databind.JsonNode; | ... | ... |
1 | +/* | ||
2 | + * Licensed to the Apache Software Foundation (ASF) under one | ||
3 | + * or more contributor license agreements. See the NOTICE file | ||
4 | + * distributed with this work for additional information | ||
5 | + * regarding copyright ownership. The ASF licenses this file | ||
6 | + * to you under the Apache License, Version 2.0 (the | ||
7 | + * "License"); you may not use this file except in compliance | ||
8 | + * with the License. You may obtain a copy of the License at | ||
9 | + * | ||
10 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
11 | + * | ||
12 | + * Unless required by applicable law or agreed to in writing, | ||
13 | + * software distributed under the License is distributed on an | ||
14 | + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||
15 | + * KIND, either express or implied. See the License for the | ||
16 | + * specific language governing permissions and limitations | ||
17 | + * under the License. | ||
18 | + */ | ||
1 | package org.onlab.onos.cli.net; | 19 | package org.onlab.onos.cli.net; |
2 | 20 | ||
3 | import java.util.Iterator; | 21 | import java.util.Iterator; | ... | ... |
1 | +/* | ||
2 | + * Licensed to the Apache Software Foundation (ASF) under one | ||
3 | + * or more contributor license agreements. See the NOTICE file | ||
4 | + * distributed with this work for additional information | ||
5 | + * regarding copyright ownership. The ASF licenses this file | ||
6 | + * to you under the Apache License, Version 2.0 (the | ||
7 | + * "License"); you may not use this file except in compliance | ||
8 | + * with the License. You may obtain a copy of the License at | ||
9 | + * | ||
10 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
11 | + * | ||
12 | + * Unless required by applicable law or agreed to in writing, | ||
13 | + * software distributed under the License is distributed on an | ||
14 | + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||
15 | + * KIND, either express or implied. See the License for the | ||
16 | + * specific language governing permissions and limitations | ||
17 | + * under the License. | ||
18 | + */ | ||
1 | package org.onlab.onos.cli.net; | 19 | package org.onlab.onos.cli.net; |
2 | 20 | ||
3 | import com.fasterxml.jackson.databind.JsonNode; | 21 | import com.fasterxml.jackson.databind.JsonNode; | ... | ... |
1 | +/* | ||
2 | + * Licensed to the Apache Software Foundation (ASF) under one | ||
3 | + * or more contributor license agreements. See the NOTICE file | ||
4 | + * distributed with this work for additional information | ||
5 | + * regarding copyright ownership. The ASF licenses this file | ||
6 | + * to you under the Apache License, Version 2.0 (the | ||
7 | + * "License"); you may not use this file except in compliance | ||
8 | + * with the License. You may obtain a copy of the License at | ||
9 | + * | ||
10 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
11 | + * | ||
12 | + * Unless required by applicable law or agreed to in writing, | ||
13 | + * software distributed under the License is distributed on an | ||
14 | + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||
15 | + * KIND, either express or implied. See the License for the | ||
16 | + * specific language governing permissions and limitations | ||
17 | + * under the License. | ||
18 | + */ | ||
1 | package org.onlab.onos.cli.net; | 19 | package org.onlab.onos.cli.net; |
2 | 20 | ||
3 | import org.apache.karaf.shell.console.Completer; | 21 | import org.apache.karaf.shell.console.Completer; | ... | ... |
1 | +/* | ||
2 | + * Licensed to the Apache Software Foundation (ASF) under one | ||
3 | + * or more contributor license agreements. See the NOTICE file | ||
4 | + * distributed with this work for additional information | ||
5 | + * regarding copyright ownership. The ASF licenses this file | ||
6 | + * to you under the Apache License, Version 2.0 (the | ||
7 | + * "License"); you may not use this file except in compliance | ||
8 | + * with the License. You may obtain a copy of the License at | ||
9 | + * | ||
10 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
11 | + * | ||
12 | + * Unless required by applicable law or agreed to in writing, | ||
13 | + * software distributed under the License is distributed on an | ||
14 | + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||
15 | + * KIND, either express or implied. See the License for the | ||
16 | + * specific language governing permissions and limitations | ||
17 | + * under the License. | ||
18 | + */ | ||
1 | package org.onlab.onos.cli.net; | 19 | package org.onlab.onos.cli.net; |
2 | 20 | ||
3 | import org.apache.karaf.shell.commands.Argument; | 21 | import org.apache.karaf.shell.commands.Argument; | ... | ... |
1 | +/* | ||
2 | + * Licensed to the Apache Software Foundation (ASF) under one | ||
3 | + * or more contributor license agreements. See the NOTICE file | ||
4 | + * distributed with this work for additional information | ||
5 | + * regarding copyright ownership. The ASF licenses this file | ||
6 | + * to you under the Apache License, Version 2.0 (the | ||
7 | + * "License"); you may not use this file except in compliance | ||
8 | + * with the License. You may obtain a copy of the License at | ||
9 | + * | ||
10 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
11 | + * | ||
12 | + * Unless required by applicable law or agreed to in writing, | ||
13 | + * software distributed under the License is distributed on an | ||
14 | + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||
15 | + * KIND, either express or implied. See the License for the | ||
16 | + * specific language governing permissions and limitations | ||
17 | + * under the License. | ||
18 | + */ | ||
1 | package org.onlab.onos.cli.net; | 19 | package org.onlab.onos.cli.net; |
2 | 20 | ||
3 | import org.apache.karaf.shell.commands.Argument; | 21 | import org.apache.karaf.shell.commands.Argument; | ... | ... |
1 | +/* | ||
2 | + * Licensed to the Apache Software Foundation (ASF) under one | ||
3 | + * or more contributor license agreements. See the NOTICE file | ||
4 | + * distributed with this work for additional information | ||
5 | + * regarding copyright ownership. The ASF licenses this file | ||
6 | + * to you under the Apache License, Version 2.0 (the | ||
7 | + * "License"); you may not use this file except in compliance | ||
8 | + * with the License. You may obtain a copy of the License at | ||
9 | + * | ||
10 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
11 | + * | ||
12 | + * Unless required by applicable law or agreed to in writing, | ||
13 | + * software distributed under the License is distributed on an | ||
14 | + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||
15 | + * KIND, either express or implied. See the License for the | ||
16 | + * specific language governing permissions and limitations | ||
17 | + * under the License. | ||
18 | + */ | ||
1 | package org.onlab.onos.cli.net; | 19 | package org.onlab.onos.cli.net; |
2 | 20 | ||
3 | import com.fasterxml.jackson.databind.JsonNode; | 21 | import com.fasterxml.jackson.databind.JsonNode; | ... | ... |
1 | +/* | ||
2 | + * Licensed to the Apache Software Foundation (ASF) under one | ||
3 | + * or more contributor license agreements. See the NOTICE file | ||
4 | + * distributed with this work for additional information | ||
5 | + * regarding copyright ownership. The ASF licenses this file | ||
6 | + * to you under the Apache License, Version 2.0 (the | ||
7 | + * "License"); you may not use this file except in compliance | ||
8 | + * with the License. You may obtain a copy of the License at | ||
9 | + * | ||
10 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
11 | + * | ||
12 | + * Unless required by applicable law or agreed to in writing, | ||
13 | + * software distributed under the License is distributed on an | ||
14 | + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||
15 | + * KIND, either express or implied. See the License for the | ||
16 | + * specific language governing permissions and limitations | ||
17 | + * under the License. | ||
18 | + */ | ||
1 | package org.onlab.onos.cli.net; | 19 | package org.onlab.onos.cli.net; |
2 | 20 | ||
3 | import com.fasterxml.jackson.databind.JsonNode; | 21 | import com.fasterxml.jackson.databind.JsonNode; | ... | ... |
1 | +/* | ||
2 | + * Licensed to the Apache Software Foundation (ASF) under one | ||
3 | + * or more contributor license agreements. See the NOTICE file | ||
4 | + * distributed with this work for additional information | ||
5 | + * regarding copyright ownership. The ASF licenses this file | ||
6 | + * to you under the Apache License, Version 2.0 (the | ||
7 | + * "License"); you may not use this file except in compliance | ||
8 | + * with the License. You may obtain a copy of the License at | ||
9 | + * | ||
10 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
11 | + * | ||
12 | + * Unless required by applicable law or agreed to in writing, | ||
13 | + * software distributed under the License is distributed on an | ||
14 | + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||
15 | + * KIND, either express or implied. See the License for the | ||
16 | + * specific language governing permissions and limitations | ||
17 | + * under the License. | ||
18 | + */ | ||
1 | package org.onlab.onos.cli.net; | 19 | package org.onlab.onos.cli.net; |
2 | 20 | ||
3 | import com.fasterxml.jackson.databind.JsonNode; | 21 | import com.fasterxml.jackson.databind.JsonNode; | ... | ... |
1 | +/* | ||
2 | + * Licensed to the Apache Software Foundation (ASF) under one | ||
3 | + * or more contributor license agreements. See the NOTICE file | ||
4 | + * distributed with this work for additional information | ||
5 | + * regarding copyright ownership. The ASF licenses this file | ||
6 | + * to you under the Apache License, Version 2.0 (the | ||
7 | + * "License"); you may not use this file except in compliance | ||
8 | + * with the License. You may obtain a copy of the License at | ||
9 | + * | ||
10 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
11 | + * | ||
12 | + * Unless required by applicable law or agreed to in writing, | ||
13 | + * software distributed under the License is distributed on an | ||
14 | + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||
15 | + * KIND, either express or implied. See the License for the | ||
16 | + * specific language governing permissions and limitations | ||
17 | + * under the License. | ||
18 | + */ | ||
1 | package org.onlab.onos.cli.net; | 19 | package org.onlab.onos.cli.net; |
2 | 20 | ||
3 | import org.apache.karaf.shell.console.Completer; | 21 | import org.apache.karaf.shell.console.Completer; | ... | ... |
1 | +/* | ||
2 | + * Licensed to the Apache Software Foundation (ASF) under one | ||
3 | + * or more contributor license agreements. See the NOTICE file | ||
4 | + * distributed with this work for additional information | ||
5 | + * regarding copyright ownership. The ASF licenses this file | ||
6 | + * to you under the Apache License, Version 2.0 (the | ||
7 | + * "License"); you may not use this file except in compliance | ||
8 | + * with the License. You may obtain a copy of the License at | ||
9 | + * | ||
10 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
11 | + * | ||
12 | + * Unless required by applicable law or agreed to in writing, | ||
13 | + * software distributed under the License is distributed on an | ||
14 | + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||
15 | + * KIND, either express or implied. See the License for the | ||
16 | + * specific language governing permissions and limitations | ||
17 | + * under the License. | ||
18 | + */ | ||
1 | package org.onlab.onos.cli.net; | 19 | package org.onlab.onos.cli.net; |
2 | 20 | ||
3 | import com.fasterxml.jackson.databind.ObjectMapper; | 21 | import com.fasterxml.jackson.databind.ObjectMapper; | ... | ... |
1 | +/* | ||
2 | + * Licensed to the Apache Software Foundation (ASF) under one | ||
3 | + * or more contributor license agreements. See the NOTICE file | ||
4 | + * distributed with this work for additional information | ||
5 | + * regarding copyright ownership. The ASF licenses this file | ||
6 | + * to you under the Apache License, Version 2.0 (the | ||
7 | + * "License"); you may not use this file except in compliance | ||
8 | + * with the License. You may obtain a copy of the License at | ||
9 | + * | ||
10 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
11 | + * | ||
12 | + * Unless required by applicable law or agreed to in writing, | ||
13 | + * software distributed under the License is distributed on an | ||
14 | + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||
15 | + * KIND, either express or implied. See the License for the | ||
16 | + * specific language governing permissions and limitations | ||
17 | + * under the License. | ||
18 | + */ | ||
1 | package org.onlab.onos.cli.net; | 19 | package org.onlab.onos.cli.net; |
2 | 20 | ||
3 | import org.apache.karaf.shell.commands.Argument; | 21 | import org.apache.karaf.shell.commands.Argument; | ... | ... |
1 | +/* | ||
2 | + * Licensed to the Apache Software Foundation (ASF) under one | ||
3 | + * or more contributor license agreements. See the NOTICE file | ||
4 | + * distributed with this work for additional information | ||
5 | + * regarding copyright ownership. The ASF licenses this file | ||
6 | + * to you under the Apache License, Version 2.0 (the | ||
7 | + * "License"); you may not use this file except in compliance | ||
8 | + * with the License. You may obtain a copy of the License at | ||
9 | + * | ||
10 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
11 | + * | ||
12 | + * Unless required by applicable law or agreed to in writing, | ||
13 | + * software distributed under the License is distributed on an | ||
14 | + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||
15 | + * KIND, either express or implied. See the License for the | ||
16 | + * specific language governing permissions and limitations | ||
17 | + * under the License. | ||
18 | + */ | ||
19 | + | ||
1 | /** | 20 | /** |
2 | * Administrative console command-line extensions for interacting with the | 21 | * Administrative console command-line extensions for interacting with the |
3 | * network model & services. | 22 | * network model & services. | ... | ... |
1 | +/* | ||
2 | + * Licensed to the Apache Software Foundation (ASF) under one | ||
3 | + * or more contributor license agreements. See the NOTICE file | ||
4 | + * distributed with this work for additional information | ||
5 | + * regarding copyright ownership. The ASF licenses this file | ||
6 | + * to you under the Apache License, Version 2.0 (the | ||
7 | + * "License"); you may not use this file except in compliance | ||
8 | + * with the License. You may obtain a copy of the License at | ||
9 | + * | ||
10 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
11 | + * | ||
12 | + * Unless required by applicable law or agreed to in writing, | ||
13 | + * software distributed under the License is distributed on an | ||
14 | + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||
15 | + * KIND, either express or implied. See the License for the | ||
16 | + * specific language governing permissions and limitations | ||
17 | + * under the License. | ||
18 | + */ | ||
19 | + | ||
1 | /** | 20 | /** |
2 | * Administrative console command-line extensions. | 21 | * Administrative console command-line extensions. |
3 | */ | 22 | */ | ... | ... |
1 | +<!-- | ||
2 | + ~ Licensed to the Apache Software Foundation (ASF) under one | ||
3 | + ~ or more contributor license agreements. See the NOTICE file | ||
4 | + ~ distributed with this work for additional information | ||
5 | + ~ regarding copyright ownership. The ASF licenses this file | ||
6 | + ~ to you under the Apache License, Version 2.0 (the | ||
7 | + ~ "License"); you may not use this file except in compliance | ||
8 | + ~ with the License. You may obtain a copy of the License at | ||
9 | + ~ | ||
10 | + ~ http://www.apache.org/licenses/LICENSE-2.0 | ||
11 | + ~ | ||
12 | + ~ Unless required by applicable law or agreed to in writing, | ||
13 | + ~ software distributed under the License is distributed on an | ||
14 | + ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||
15 | + ~ KIND, either express or implied. See the License for the | ||
16 | + ~ specific language governing permissions and limitations | ||
17 | + ~ under the License. | ||
18 | + --> | ||
1 | <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"> | 19 | <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"> |
2 | 20 | ||
3 | <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0"> | 21 | <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0"> |
... | @@ -96,12 +114,18 @@ | ... | @@ -96,12 +114,18 @@ |
96 | <ref component-id="connectPointCompleter"/> | 114 | <ref component-id="connectPointCompleter"/> |
97 | <null/> | 115 | <null/> |
98 | </completers> | 116 | </completers> |
117 | + <optional-completers> | ||
118 | + <entry key="-t" value-ref="ethTypeCompleter"/> | ||
119 | + </optional-completers> | ||
99 | </command> | 120 | </command> |
100 | <command> | 121 | <command> |
101 | <action class="org.onlab.onos.cli.net.AddMultiPointToSinglePointIntentCommand"/> | 122 | <action class="org.onlab.onos.cli.net.AddMultiPointToSinglePointIntentCommand"/> |
102 | <completers> | 123 | <completers> |
103 | <ref component-id="connectPointCompleter"/> | 124 | <ref component-id="connectPointCompleter"/> |
104 | </completers> | 125 | </completers> |
126 | + <optional-completers> | ||
127 | + <entry key="-t" value-ref="ethTypeCompleter"/> | ||
128 | + </optional-completers> | ||
105 | </command> | 129 | </command> |
106 | <command> | 130 | <command> |
107 | <action class="org.onlab.onos.cli.net.IntentPushTestCommand"/> | 131 | <action class="org.onlab.onos.cli.net.IntentPushTestCommand"/> |
... | @@ -158,5 +182,6 @@ | ... | @@ -158,5 +182,6 @@ |
158 | <bean id="flowRuleStatusCompleter" class="org.onlab.onos.cli.net.FlowRuleStatusCompleter"/> | 182 | <bean id="flowRuleStatusCompleter" class="org.onlab.onos.cli.net.FlowRuleStatusCompleter"/> |
159 | <bean id="connectPointCompleter" class="org.onlab.onos.cli.net.ConnectPointCompleter"/> | 183 | <bean id="connectPointCompleter" class="org.onlab.onos.cli.net.ConnectPointCompleter"/> |
160 | <bean id="nullCompleter" class="org.apache.karaf.shell.console.completer.NullCompleter"/> | 184 | <bean id="nullCompleter" class="org.apache.karaf.shell.console.completer.NullCompleter"/> |
185 | + <bean id="ethTypeCompleter" class="org.onlab.onos.cli.net.EthTypeCompleter"/> | ||
161 | 186 | ||
162 | </blueprint> | 187 | </blueprint> | ... | ... |
... | @@ -19,6 +19,7 @@ public class AbstractListenerRegistry<E extends Event, L extends EventListener<E | ... | @@ -19,6 +19,7 @@ public class AbstractListenerRegistry<E extends Event, L extends EventListener<E |
19 | private final Logger log = getLogger(getClass()); | 19 | private final Logger log = getLogger(getClass()); |
20 | 20 | ||
21 | private final Set<L> listeners = new CopyOnWriteArraySet<>(); | 21 | private final Set<L> listeners = new CopyOnWriteArraySet<>(); |
22 | + private volatile boolean shutdown = false; | ||
22 | 23 | ||
23 | /** | 24 | /** |
24 | * Adds the specified listener. | 25 | * Adds the specified listener. |
... | @@ -58,7 +59,24 @@ public class AbstractListenerRegistry<E extends Event, L extends EventListener<E | ... | @@ -58,7 +59,24 @@ public class AbstractListenerRegistry<E extends Event, L extends EventListener<E |
58 | * @param error error encountered while processing | 59 | * @param error error encountered while processing |
59 | */ | 60 | */ |
60 | protected void reportProblem(E event, Throwable error) { | 61 | protected void reportProblem(E event, Throwable error) { |
62 | + if (!shutdown) { | ||
61 | log.warn("Exception encountered while processing event " + event, error); | 63 | log.warn("Exception encountered while processing event " + event, error); |
62 | } | 64 | } |
65 | + } | ||
66 | + | ||
67 | + /** | ||
68 | + * Prepares the registry for normal operation. | ||
69 | + */ | ||
70 | + public void activate() { | ||
71 | + shutdown = false; | ||
72 | + } | ||
73 | + | ||
74 | + /** | ||
75 | + * Prepares the registry for shutdown. | ||
76 | + */ | ||
77 | + public void deactivate() { | ||
78 | + shutdown = true; | ||
79 | + } | ||
80 | + | ||
63 | 81 | ||
64 | } | 82 | } | ... | ... |
... | @@ -44,6 +44,16 @@ public final class DefaultTrafficTreatment implements TrafficTreatment { | ... | @@ -44,6 +44,16 @@ public final class DefaultTrafficTreatment implements TrafficTreatment { |
44 | return new Builder(); | 44 | return new Builder(); |
45 | } | 45 | } |
46 | 46 | ||
47 | + /** | ||
48 | + * Returns a new traffic treatment builder primed to produce entities | ||
49 | + * patterned after the supplied treatment. | ||
50 | + * | ||
51 | + * @return traffic treatment builder | ||
52 | + */ | ||
53 | + public static TrafficTreatment.Builder builder(TrafficTreatment treatment) { | ||
54 | + return new Builder(treatment); | ||
55 | + } | ||
56 | + | ||
47 | //FIXME: Order of instructions may affect hashcode | 57 | //FIXME: Order of instructions may affect hashcode |
48 | @Override | 58 | @Override |
49 | public int hashCode() { | 59 | public int hashCode() { |
... | @@ -90,6 +100,13 @@ public final class DefaultTrafficTreatment implements TrafficTreatment { | ... | @@ -90,6 +100,13 @@ public final class DefaultTrafficTreatment implements TrafficTreatment { |
90 | private Builder() { | 100 | private Builder() { |
91 | } | 101 | } |
92 | 102 | ||
103 | + // Creates a new builder based off an existing treatment | ||
104 | + private Builder(TrafficTreatment treatment) { | ||
105 | + for (Instruction instruction : treatment.instructions()) { | ||
106 | + add(instruction); | ||
107 | + } | ||
108 | + } | ||
109 | + | ||
93 | @Override | 110 | @Override |
94 | public Builder add(Instruction instruction) { | 111 | public Builder add(Instruction instruction) { |
95 | if (drop) { | 112 | if (drop) { | ... | ... |
... | @@ -41,7 +41,7 @@ public final class HostToHostIntent extends ConnectivityIntent { | ... | @@ -41,7 +41,7 @@ public final class HostToHostIntent extends ConnectivityIntent { |
41 | } | 41 | } |
42 | 42 | ||
43 | private static HostId max(HostId one, HostId two) { | 43 | private static HostId max(HostId one, HostId two) { |
44 | - return one.hashCode() > two.hashCode() ? one : two; | 44 | + return one.hashCode() >= two.hashCode() ? one : two; |
45 | } | 45 | } |
46 | 46 | ||
47 | /** | 47 | /** | ... | ... |
... | @@ -37,8 +37,8 @@ public abstract class Intent implements BatchOperationTarget { | ... | @@ -37,8 +37,8 @@ public abstract class Intent implements BatchOperationTarget { |
37 | */ | 37 | */ |
38 | protected Intent(IntentId id, ApplicationId appId, | 38 | protected Intent(IntentId id, ApplicationId appId, |
39 | Collection<NetworkResource> resources) { | 39 | Collection<NetworkResource> resources) { |
40 | + this.id = checkNotNull(id, "Intent ID cannot be null"); | ||
40 | this.appId = checkNotNull(appId, "Application ID cannot be null"); | 41 | this.appId = checkNotNull(appId, "Application ID cannot be null"); |
41 | - this.id = checkNotNull(id, "Fingerprint cannot be null"); | ||
42 | this.resources = resources; | 42 | this.resources = resources; |
43 | } | 43 | } |
44 | 44 | ||
... | @@ -77,6 +77,7 @@ public abstract class Intent implements BatchOperationTarget { | ... | @@ -77,6 +77,7 @@ public abstract class Intent implements BatchOperationTarget { |
77 | * @return intent identifier | 77 | * @return intent identifier |
78 | */ | 78 | */ |
79 | protected static IntentId id(Object... fields) { | 79 | protected static IntentId id(Object... fields) { |
80 | + // FIXME: spread the bits across the full long spectrum | ||
80 | return IntentId.valueOf(Objects.hash(fields)); | 81 | return IntentId.valueOf(Objects.hash(fields)); |
81 | } | 82 | } |
82 | 83 | ||
... | @@ -90,12 +91,12 @@ public abstract class Intent implements BatchOperationTarget { | ... | @@ -90,12 +91,12 @@ public abstract class Intent implements BatchOperationTarget { |
90 | } | 91 | } |
91 | 92 | ||
92 | @Override | 93 | @Override |
93 | - public int hashCode() { | 94 | + public final int hashCode() { |
94 | return Objects.hash(id); | 95 | return Objects.hash(id); |
95 | } | 96 | } |
96 | 97 | ||
97 | @Override | 98 | @Override |
98 | - public boolean equals(Object obj) { | 99 | + public final boolean equals(Object obj) { |
99 | if (this == obj) { | 100 | if (this == obj) { |
100 | return true; | 101 | return true; |
101 | } | 102 | } | ... | ... |
1 | package org.onlab.onos.net.intent.impl; | 1 | package org.onlab.onos.net.intent.impl; |
2 | 2 | ||
3 | -import static org.onlab.onos.net.flow.DefaultTrafficTreatment.builder; | ||
4 | import static org.slf4j.LoggerFactory.getLogger; | 3 | import static org.slf4j.LoggerFactory.getLogger; |
5 | 4 | ||
6 | import java.util.List; | 5 | import java.util.List; |
... | @@ -17,6 +16,7 @@ import org.onlab.onos.net.Link; | ... | @@ -17,6 +16,7 @@ import org.onlab.onos.net.Link; |
17 | import org.onlab.onos.net.PortNumber; | 16 | import org.onlab.onos.net.PortNumber; |
18 | import org.onlab.onos.net.flow.DefaultFlowRule; | 17 | import org.onlab.onos.net.flow.DefaultFlowRule; |
19 | import org.onlab.onos.net.flow.DefaultTrafficSelector; | 18 | import org.onlab.onos.net.flow.DefaultTrafficSelector; |
19 | +import org.onlab.onos.net.flow.DefaultTrafficTreatment; | ||
20 | import org.onlab.onos.net.flow.FlowRule; | 20 | import org.onlab.onos.net.flow.FlowRule; |
21 | import org.onlab.onos.net.flow.FlowRuleBatchEntry; | 21 | import org.onlab.onos.net.flow.FlowRuleBatchEntry; |
22 | import org.onlab.onos.net.flow.FlowRuleBatchEntry.FlowRuleOperation; | 22 | import org.onlab.onos.net.flow.FlowRuleBatchEntry.FlowRuleOperation; |
... | @@ -61,18 +61,16 @@ public class LinkCollectionIntentInstaller implements IntentInstaller<LinkCollec | ... | @@ -61,18 +61,16 @@ public class LinkCollectionIntentInstaller implements IntentInstaller<LinkCollec |
61 | 61 | ||
62 | @Override | 62 | @Override |
63 | public List<FlowRuleBatchOperation> install(LinkCollectionIntent intent) { | 63 | public List<FlowRuleBatchOperation> install(LinkCollectionIntent intent) { |
64 | - TrafficSelector.Builder builder = | ||
65 | - DefaultTrafficSelector.builder(intent.selector()); | ||
66 | List<FlowRuleBatchEntry> rules = Lists.newLinkedList(); | 64 | List<FlowRuleBatchEntry> rules = Lists.newLinkedList(); |
67 | for (Link link : intent.links()) { | 65 | for (Link link : intent.links()) { |
68 | rules.add(createBatchEntry(FlowRuleOperation.ADD, | 66 | rules.add(createBatchEntry(FlowRuleOperation.ADD, |
69 | - builder.build(), | 67 | + intent, |
70 | link.src().deviceId(), | 68 | link.src().deviceId(), |
71 | link.src().port())); | 69 | link.src().port())); |
72 | } | 70 | } |
73 | 71 | ||
74 | rules.add(createBatchEntry(FlowRuleOperation.ADD, | 72 | rules.add(createBatchEntry(FlowRuleOperation.ADD, |
75 | - builder.build(), | 73 | + intent, |
76 | intent.egressPoint().deviceId(), | 74 | intent.egressPoint().deviceId(), |
77 | intent.egressPoint().port())); | 75 | intent.egressPoint().port())); |
78 | 76 | ||
... | @@ -81,19 +79,17 @@ public class LinkCollectionIntentInstaller implements IntentInstaller<LinkCollec | ... | @@ -81,19 +79,17 @@ public class LinkCollectionIntentInstaller implements IntentInstaller<LinkCollec |
81 | 79 | ||
82 | @Override | 80 | @Override |
83 | public List<FlowRuleBatchOperation> uninstall(LinkCollectionIntent intent) { | 81 | public List<FlowRuleBatchOperation> uninstall(LinkCollectionIntent intent) { |
84 | - TrafficSelector.Builder builder = | ||
85 | - DefaultTrafficSelector.builder(intent.selector()); | ||
86 | List<FlowRuleBatchEntry> rules = Lists.newLinkedList(); | 82 | List<FlowRuleBatchEntry> rules = Lists.newLinkedList(); |
87 | 83 | ||
88 | for (Link link : intent.links()) { | 84 | for (Link link : intent.links()) { |
89 | rules.add(createBatchEntry(FlowRuleOperation.REMOVE, | 85 | rules.add(createBatchEntry(FlowRuleOperation.REMOVE, |
90 | - builder.build(), | 86 | + intent, |
91 | link.src().deviceId(), | 87 | link.src().deviceId(), |
92 | link.src().port())); | 88 | link.src().port())); |
93 | } | 89 | } |
94 | 90 | ||
95 | rules.add(createBatchEntry(FlowRuleOperation.REMOVE, | 91 | rules.add(createBatchEntry(FlowRuleOperation.REMOVE, |
96 | - builder.build(), | 92 | + intent, |
97 | intent.egressPoint().deviceId(), | 93 | intent.egressPoint().deviceId(), |
98 | intent.egressPoint().port())); | 94 | intent.egressPoint().port())); |
99 | 95 | ||
... | @@ -104,17 +100,23 @@ public class LinkCollectionIntentInstaller implements IntentInstaller<LinkCollec | ... | @@ -104,17 +100,23 @@ public class LinkCollectionIntentInstaller implements IntentInstaller<LinkCollec |
104 | * Creates a FlowRuleBatchEntry based on the provided parameters. | 100 | * Creates a FlowRuleBatchEntry based on the provided parameters. |
105 | * | 101 | * |
106 | * @param operation the FlowRuleOperation to use | 102 | * @param operation the FlowRuleOperation to use |
107 | - * @param selector the traffic selector | 103 | + * @param intent the link collection intent |
108 | * @param deviceId the device ID for the flow rule | 104 | * @param deviceId the device ID for the flow rule |
109 | * @param outPort the output port of the flow rule | 105 | * @param outPort the output port of the flow rule |
110 | * @return the new flow rule batch entry | 106 | * @return the new flow rule batch entry |
111 | */ | 107 | */ |
112 | private FlowRuleBatchEntry createBatchEntry(FlowRuleOperation operation, | 108 | private FlowRuleBatchEntry createBatchEntry(FlowRuleOperation operation, |
113 | - TrafficSelector selector, | 109 | + LinkCollectionIntent intent, |
114 | DeviceId deviceId, | 110 | DeviceId deviceId, |
115 | PortNumber outPort) { | 111 | PortNumber outPort) { |
116 | 112 | ||
117 | - TrafficTreatment treatment = builder().setOutput(outPort).build(); | 113 | + TrafficTreatment.Builder treatmentBuilder = |
114 | + DefaultTrafficTreatment.builder(intent.treatment()); | ||
115 | + | ||
116 | + TrafficTreatment treatment = treatmentBuilder.setOutput(outPort).build(); | ||
117 | + | ||
118 | + TrafficSelector selector = DefaultTrafficSelector.builder(intent.selector()) | ||
119 | + .build(); | ||
118 | 120 | ||
119 | FlowRule rule = new DefaultFlowRule(deviceId, | 121 | FlowRule rule = new DefaultFlowRule(deviceId, |
120 | selector, treatment, 123, appId, 0, true); | 122 | selector, treatment, 123, appId, 0, true); | ... | ... |
... | @@ -67,7 +67,7 @@ public class ClusterCommunicationManager | ... | @@ -67,7 +67,7 @@ public class ClusterCommunicationManager |
67 | @Activate | 67 | @Activate |
68 | public void activate() { | 68 | public void activate() { |
69 | ControllerNode localNode = clusterService.getLocalNode(); | 69 | ControllerNode localNode = clusterService.getLocalNode(); |
70 | - NettyMessagingService netty = new NettyMessagingService(localNode.tcpPort()); | 70 | + NettyMessagingService netty = new NettyMessagingService(localNode.ip().toString(), localNode.tcpPort()); |
71 | // FIXME: workaround until it becomes a service. | 71 | // FIXME: workaround until it becomes a service. |
72 | try { | 72 | try { |
73 | netty.activate(); | 73 | netty.activate(); | ... | ... |
... | @@ -23,9 +23,9 @@ import org.onlab.onos.net.DefaultAnnotations; | ... | @@ -23,9 +23,9 @@ import org.onlab.onos.net.DefaultAnnotations; |
23 | import org.onlab.onos.net.DefaultLink; | 23 | import org.onlab.onos.net.DefaultLink; |
24 | import org.onlab.onos.net.DeviceId; | 24 | import org.onlab.onos.net.DeviceId; |
25 | import org.onlab.onos.net.Link; | 25 | import org.onlab.onos.net.Link; |
26 | -import org.onlab.onos.net.SparseAnnotations; | ||
27 | import org.onlab.onos.net.Link.Type; | 26 | import org.onlab.onos.net.Link.Type; |
28 | import org.onlab.onos.net.LinkKey; | 27 | import org.onlab.onos.net.LinkKey; |
28 | +import org.onlab.onos.net.SparseAnnotations; | ||
29 | import org.onlab.onos.net.device.DeviceClockService; | 29 | import org.onlab.onos.net.device.DeviceClockService; |
30 | import org.onlab.onos.net.link.DefaultLinkDescription; | 30 | import org.onlab.onos.net.link.DefaultLinkDescription; |
31 | import org.onlab.onos.net.link.LinkDescription; | 31 | import org.onlab.onos.net.link.LinkDescription; |
... | @@ -266,7 +266,7 @@ public class GossipLinkStore | ... | @@ -266,7 +266,7 @@ public class GossipLinkStore |
266 | ProviderId providerId, | 266 | ProviderId providerId, |
267 | Timestamped<LinkDescription> linkDescription) { | 267 | Timestamped<LinkDescription> linkDescription) { |
268 | 268 | ||
269 | - LinkKey key = linkKey(linkDescription.value().src(), | 269 | + final LinkKey key = linkKey(linkDescription.value().src(), |
270 | linkDescription.value().dst()); | 270 | linkDescription.value().dst()); |
271 | Map<ProviderId, Timestamped<LinkDescription>> descs = getOrCreateLinkDescriptions(key); | 271 | Map<ProviderId, Timestamped<LinkDescription>> descs = getOrCreateLinkDescriptions(key); |
272 | 272 | ||
... | @@ -278,6 +278,7 @@ public class GossipLinkStore | ... | @@ -278,6 +278,7 @@ public class GossipLinkStore |
278 | if (linkDescription.isNewer(linkRemovedTimestamp)) { | 278 | if (linkDescription.isNewer(linkRemovedTimestamp)) { |
279 | removedLinks.remove(key); | 279 | removedLinks.remove(key); |
280 | } else { | 280 | } else { |
281 | + log.trace("Link {} was already removed ignoring.", key); | ||
281 | return null; | 282 | return null; |
282 | } | 283 | } |
283 | } | 284 | } |
... | @@ -302,17 +303,25 @@ public class GossipLinkStore | ... | @@ -302,17 +303,25 @@ public class GossipLinkStore |
302 | // merge existing annotations | 303 | // merge existing annotations |
303 | Timestamped<LinkDescription> existingLinkDescription = descs.get(providerId); | 304 | Timestamped<LinkDescription> existingLinkDescription = descs.get(providerId); |
304 | if (existingLinkDescription != null && existingLinkDescription.isNewer(linkDescription)) { | 305 | if (existingLinkDescription != null && existingLinkDescription.isNewer(linkDescription)) { |
306 | + log.trace("local info is more up-to-date, ignoring {}.", linkDescription); | ||
305 | return null; | 307 | return null; |
306 | } | 308 | } |
307 | Timestamped<LinkDescription> newLinkDescription = linkDescription; | 309 | Timestamped<LinkDescription> newLinkDescription = linkDescription; |
308 | if (existingLinkDescription != null) { | 310 | if (existingLinkDescription != null) { |
311 | + // we only allow transition from INDIRECT -> DIRECT | ||
312 | + final Type newType; | ||
313 | + if (existingLinkDescription.value().type() == DIRECT) { | ||
314 | + newType = DIRECT; | ||
315 | + } else { | ||
316 | + newType = linkDescription.value().type(); | ||
317 | + } | ||
309 | SparseAnnotations merged = union(existingLinkDescription.value().annotations(), | 318 | SparseAnnotations merged = union(existingLinkDescription.value().annotations(), |
310 | linkDescription.value().annotations()); | 319 | linkDescription.value().annotations()); |
311 | newLinkDescription = new Timestamped<LinkDescription>( | 320 | newLinkDescription = new Timestamped<LinkDescription>( |
312 | new DefaultLinkDescription( | 321 | new DefaultLinkDescription( |
313 | linkDescription.value().src(), | 322 | linkDescription.value().src(), |
314 | linkDescription.value().dst(), | 323 | linkDescription.value().dst(), |
315 | - linkDescription.value().type(), merged), | 324 | + newType, merged), |
316 | linkDescription.timestamp()); | 325 | linkDescription.timestamp()); |
317 | } | 326 | } |
318 | return descs.put(providerId, newLinkDescription); | 327 | return descs.put(providerId, newLinkDescription); |
... | @@ -346,6 +355,8 @@ public class GossipLinkStore | ... | @@ -346,6 +355,8 @@ public class GossipLinkStore |
346 | return null; | 355 | return null; |
347 | } | 356 | } |
348 | 357 | ||
358 | + // Note: INDIRECT -> DIRECT transition only | ||
359 | + // so that BDDP discovered Link will not overwrite LDDP Link | ||
349 | if ((oldLink.type() == INDIRECT && newLink.type() == DIRECT) || | 360 | if ((oldLink.type() == INDIRECT && newLink.type() == DIRECT) || |
350 | !AnnotationsUtil.isEqual(oldLink.annotations(), newLink.annotations())) { | 361 | !AnnotationsUtil.isEqual(oldLink.annotations(), newLink.annotations())) { |
351 | 362 | ... | ... |
... | @@ -172,12 +172,19 @@ public class SimpleLinkStore | ... | @@ -172,12 +172,19 @@ public class SimpleLinkStore |
172 | LinkDescription oldDesc = descs.get(providerId); | 172 | LinkDescription oldDesc = descs.get(providerId); |
173 | LinkDescription newDesc = linkDescription; | 173 | LinkDescription newDesc = linkDescription; |
174 | if (oldDesc != null) { | 174 | if (oldDesc != null) { |
175 | + // we only allow transition from INDIRECT -> DIRECT | ||
176 | + final Type newType; | ||
177 | + if (oldDesc.type() == DIRECT) { | ||
178 | + newType = DIRECT; | ||
179 | + } else { | ||
180 | + newType = linkDescription.type(); | ||
181 | + } | ||
175 | SparseAnnotations merged = union(oldDesc.annotations(), | 182 | SparseAnnotations merged = union(oldDesc.annotations(), |
176 | linkDescription.annotations()); | 183 | linkDescription.annotations()); |
177 | newDesc = new DefaultLinkDescription( | 184 | newDesc = new DefaultLinkDescription( |
178 | linkDescription.src(), | 185 | linkDescription.src(), |
179 | linkDescription.dst(), | 186 | linkDescription.dst(), |
180 | - linkDescription.type(), merged); | 187 | + newType, merged); |
181 | } | 188 | } |
182 | return descs.put(providerId, newDesc); | 189 | return descs.put(providerId, newDesc); |
183 | } | 190 | } | ... | ... |
1 | <?xml version="1.0" encoding="UTF-8" standalone="yes"?> | 1 | <?xml version="1.0" encoding="UTF-8" standalone="yes"?> |
2 | +<!-- | ||
3 | + ~ Licensed to the Apache Software Foundation (ASF) under one | ||
4 | + ~ or more contributor license agreements. See the NOTICE file | ||
5 | + ~ distributed with this work for additional information | ||
6 | + ~ regarding copyright ownership. The ASF licenses this file | ||
7 | + ~ to you under the Apache License, Version 2.0 (the | ||
8 | + ~ "License"); you may not use this file except in compliance | ||
9 | + ~ with the License. You may obtain a copy of the License at | ||
10 | + ~ | ||
11 | + ~ http://www.apache.org/licenses/LICENSE-2.0 | ||
12 | + ~ | ||
13 | + ~ Unless required by applicable law or agreed to in writing, | ||
14 | + ~ software distributed under the License is distributed on an | ||
15 | + ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||
16 | + ~ KIND, either express or implied. See the License for the | ||
17 | + ~ specific language governing permissions and limitations | ||
18 | + ~ under the License. | ||
19 | + --> | ||
2 | <features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" | 20 | <features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" |
3 | name="onos-1.0.0"> | 21 | name="onos-1.0.0"> |
4 | - <repository>mvn:org.onlab.onos/onos-features/1.0.0-SNAPSHOT/xml/features | 22 | + <repository>mvn:org.onlab.onos/onos-features/1.0.0-SNAPSHOT/xml/features</repository> |
5 | - </repository> | ||
6 | 23 | ||
7 | <feature name="onos-thirdparty-base" version="1.0.0" | 24 | <feature name="onos-thirdparty-base" version="1.0.0" |
8 | description="ONOS 3rd party dependencies"> | 25 | description="ONOS 3rd party dependencies"> |
... | @@ -15,6 +32,7 @@ | ... | @@ -15,6 +32,7 @@ |
15 | <bundle>mvn:io.netty/netty-transport/4.0.23.Final</bundle> | 32 | <bundle>mvn:io.netty/netty-transport/4.0.23.Final</bundle> |
16 | <bundle>mvn:io.netty/netty-handler/4.0.23.Final</bundle> | 33 | <bundle>mvn:io.netty/netty-handler/4.0.23.Final</bundle> |
17 | <bundle>mvn:io.netty/netty-codec/4.0.23.Final</bundle> | 34 | <bundle>mvn:io.netty/netty-codec/4.0.23.Final</bundle> |
35 | + <bundle>mvn:io.netty/netty-transport-native-epoll/4.0.23.Final</bundle> | ||
18 | <bundle>mvn:commons-pool/commons-pool/1.6</bundle> | 36 | <bundle>mvn:commons-pool/commons-pool/1.6</bundle> |
19 | 37 | ||
20 | <bundle>mvn:com.hazelcast/hazelcast/3.3</bundle> | 38 | <bundle>mvn:com.hazelcast/hazelcast/3.3</bundle> | ... | ... |
... | @@ -312,6 +312,11 @@ | ... | @@ -312,6 +312,11 @@ |
312 | <artifactId>netty-codec</artifactId> | 312 | <artifactId>netty-codec</artifactId> |
313 | <version>${netty4.version}</version> | 313 | <version>${netty4.version}</version> |
314 | </dependency> | 314 | </dependency> |
315 | + <dependency> | ||
316 | + <groupId>io.netty</groupId> | ||
317 | + <artifactId>netty-transport-native-epoll</artifactId> | ||
318 | + <version>${netty4.version}</version> | ||
319 | + </dependency> | ||
315 | </dependencies> | 320 | </dependencies> |
316 | </dependencyManagement> | 321 | </dependencyManagement> |
317 | 322 | ... | ... |
... | @@ -6,8 +6,17 @@ | ... | @@ -6,8 +6,17 @@ |
6 | [ ! -d "$ONOS_ROOT" ] && echo "ONOS_ROOT is not defined" >&2 && exit 1 | 6 | [ ! -d "$ONOS_ROOT" ] && echo "ONOS_ROOT is not defined" >&2 && exit 1 |
7 | . $ONOS_ROOT/tools/build/envDefaults | 7 | . $ONOS_ROOT/tools/build/envDefaults |
8 | 8 | ||
9 | -# If the first option is -f attempt uninstall first. | 9 | +while getopts fn o; do |
10 | -[ "$1" = "-f" ] && shift && onos-uninstall ${1:-$OCI} | 10 | + case "$o" in |
11 | + f) uninstall=true;; | ||
12 | + n) nostart=true;; | ||
13 | + esac | ||
14 | +done | ||
15 | +let OPC=$OPTIND-1 | ||
16 | +shift $OPC | ||
17 | + | ||
18 | +# If the -f was given, attempt uninstall first. | ||
19 | +[ -n "$uninstall" ] && onos-uninstall ${1:-$OCI} | ||
11 | 20 | ||
12 | node=${1:-$OCI} | 21 | node=${1:-$OCI} |
13 | remote=$ONOS_USER@$node | 22 | remote=$ONOS_USER@$node |
... | @@ -27,19 +36,20 @@ ssh $remote " | ... | @@ -27,19 +36,20 @@ ssh $remote " |
27 | mkdir $ONOS_INSTALL_DIR/config | 36 | mkdir $ONOS_INSTALL_DIR/config |
28 | 37 | ||
29 | # Install the upstart configuration file and setup options for debugging | 38 | # Install the upstart configuration file and setup options for debugging |
30 | - sudo cp $ONOS_INSTALL_DIR/debian/onos.conf /etc/init/onos.conf | 39 | + [ -z "$nostart" ] && sudo cp $ONOS_INSTALL_DIR/debian/onos.conf /etc/init/onos.conf |
31 | echo 'export ONOS_OPTS=debug' > $ONOS_INSTALL_DIR/options | 40 | echo 'export ONOS_OPTS=debug' > $ONOS_INSTALL_DIR/options |
32 | 41 | ||
33 | # Remove any previous ON.Lab bits from ~/.m2 repo | 42 | # Remove any previous ON.Lab bits from ~/.m2 repo |
34 | rm -fr ~/.m2/repository/org/onlab | 43 | rm -fr ~/.m2/repository/org/onlab |
35 | 44 | ||
36 | # Drop log level for the console | 45 | # Drop log level for the console |
37 | - echo "log4j.logger.org.apache.sshd = WARN" >> $ONOS_INSTALL_DIR/$KARAF_DIST/etc/org.ops4j.pax.logging.cfg | 46 | + echo "log4j.logger.org.apache.sshd = WARN" \ |
47 | + >> $ONOS_INSTALL_DIR/$KARAF_DIST/etc/org.ops4j.pax.logging.cfg | ||
38 | 48 | ||
39 | " | 49 | " |
40 | 50 | ||
41 | # Configure the ONOS installation | 51 | # Configure the ONOS installation |
42 | onos-config $node | 52 | onos-config $node |
43 | 53 | ||
44 | -# Ignite the ONOS service. | 54 | +# Unless -n option was given, attempt to ignite the ONOS service. |
45 | -onos-service $node start | 55 | +[ -z "$nostart" ] && onos-service $node start | ... | ... |
... | @@ -55,6 +55,10 @@ | ... | @@ -55,6 +55,10 @@ |
55 | <groupId>io.netty</groupId> | 55 | <groupId>io.netty</groupId> |
56 | <artifactId>netty-codec</artifactId> | 56 | <artifactId>netty-codec</artifactId> |
57 | </dependency> | 57 | </dependency> |
58 | + <dependency> | ||
59 | + <groupId>io.netty</groupId> | ||
60 | + <artifactId>netty-transport-native-epoll</artifactId> | ||
61 | + </dependency> | ||
58 | </dependencies> | 62 | </dependencies> |
59 | 63 | ||
60 | </project> | 64 | </project> | ... | ... |
... | @@ -44,8 +44,7 @@ public final class InternalMessage implements Message { | ... | @@ -44,8 +44,7 @@ public final class InternalMessage implements Message { |
44 | public void respond(byte[] data) throws IOException { | 44 | public void respond(byte[] data) throws IOException { |
45 | Builder builder = new Builder(messagingService); | 45 | Builder builder = new Builder(messagingService); |
46 | InternalMessage message = builder.withId(this.id) | 46 | InternalMessage message = builder.withId(this.id) |
47 | - // FIXME: Sender should be messagingService.localEp. | 47 | + .withSender(messagingService.localEp()) |
48 | - .withSender(this.sender) | ||
49 | .withPayload(data) | 48 | .withPayload(data) |
50 | .withType(REPLY_MESSAGE_TYPE) | 49 | .withType(REPLY_MESSAGE_TYPE) |
51 | .build(); | 50 | .build(); | ... | ... |
... | @@ -16,7 +16,11 @@ import io.netty.channel.ChannelHandlerContext; | ... | @@ -16,7 +16,11 @@ import io.netty.channel.ChannelHandlerContext; |
16 | import io.netty.channel.ChannelInitializer; | 16 | import io.netty.channel.ChannelInitializer; |
17 | import io.netty.channel.ChannelOption; | 17 | import io.netty.channel.ChannelOption; |
18 | import io.netty.channel.EventLoopGroup; | 18 | import io.netty.channel.EventLoopGroup; |
19 | +import io.netty.channel.ServerChannel; | ||
19 | import io.netty.channel.SimpleChannelInboundHandler; | 20 | import io.netty.channel.SimpleChannelInboundHandler; |
21 | +import io.netty.channel.epoll.EpollEventLoopGroup; | ||
22 | +import io.netty.channel.epoll.EpollServerSocketChannel; | ||
23 | +import io.netty.channel.epoll.EpollSocketChannel; | ||
20 | import io.netty.channel.nio.NioEventLoopGroup; | 24 | import io.netty.channel.nio.NioEventLoopGroup; |
21 | import io.netty.channel.socket.SocketChannel; | 25 | import io.netty.channel.socket.SocketChannel; |
22 | import io.netty.channel.socket.nio.NioServerSocketChannel; | 26 | import io.netty.channel.socket.nio.NioServerSocketChannel; |
... | @@ -38,11 +42,7 @@ public class NettyMessagingService implements MessagingService { | ... | @@ -38,11 +42,7 @@ public class NettyMessagingService implements MessagingService { |
38 | 42 | ||
39 | private final Logger log = LoggerFactory.getLogger(getClass()); | 43 | private final Logger log = LoggerFactory.getLogger(getClass()); |
40 | 44 | ||
41 | - private final int port; | ||
42 | private final Endpoint localEp; | 45 | private final Endpoint localEp; |
43 | - private final EventLoopGroup bossGroup = new NioEventLoopGroup(); | ||
44 | - private EventLoopGroup workerGroup; | ||
45 | - private Class<? extends Channel> channelClass; | ||
46 | private final ConcurrentMap<String, MessageHandler> handlers = new ConcurrentHashMap<>(); | 46 | private final ConcurrentMap<String, MessageHandler> handlers = new ConcurrentHashMap<>(); |
47 | private final Cache<Long, AsyncResponse> responseFutures = CacheBuilder.newBuilder() | 47 | private final Cache<Long, AsyncResponse> responseFutures = CacheBuilder.newBuilder() |
48 | .maximumSize(100000) | 48 | .maximumSize(100000) |
... | @@ -53,10 +53,31 @@ public class NettyMessagingService implements MessagingService { | ... | @@ -53,10 +53,31 @@ public class NettyMessagingService implements MessagingService { |
53 | private final GenericKeyedObjectPool<Endpoint, Channel> channels | 53 | private final GenericKeyedObjectPool<Endpoint, Channel> channels |
54 | = new GenericKeyedObjectPool<Endpoint, Channel>(new OnosCommunicationChannelFactory()); | 54 | = new GenericKeyedObjectPool<Endpoint, Channel>(new OnosCommunicationChannelFactory()); |
55 | 55 | ||
56 | - // TODO: make this configurable. | 56 | + private EventLoopGroup serverGroup; |
57 | + private EventLoopGroup clientGroup; | ||
58 | + private Class<? extends ServerChannel> serverChannelClass; | ||
59 | + private Class<? extends Channel> clientChannelClass; | ||
60 | + | ||
57 | private void initEventLoopGroup() { | 61 | private void initEventLoopGroup() { |
58 | - workerGroup = new NioEventLoopGroup(); | 62 | + // try Epoll first and if that does work, use nio. |
59 | - channelClass = NioSocketChannel.class; | 63 | + // TODO: make this configurable. |
64 | + try { | ||
65 | + clientGroup = new EpollEventLoopGroup(); | ||
66 | + serverGroup = new EpollEventLoopGroup(); | ||
67 | + serverChannelClass = EpollServerSocketChannel.class; | ||
68 | + clientChannelClass = EpollSocketChannel.class; | ||
69 | + return; | ||
70 | + } catch (Throwable t) { | ||
71 | + log.warn("Failed to initialize native (epoll) transport. Proceeding with nio.", t); | ||
72 | + } | ||
73 | + clientGroup = new NioEventLoopGroup(); | ||
74 | + serverGroup = new NioEventLoopGroup(); | ||
75 | + serverChannelClass = NioServerSocketChannel.class; | ||
76 | + clientChannelClass = NioSocketChannel.class; | ||
77 | + } | ||
78 | + | ||
79 | + public NettyMessagingService(String ip, int port) { | ||
80 | + localEp = new Endpoint(ip, port); | ||
60 | } | 81 | } |
61 | 82 | ||
62 | public NettyMessagingService() { | 83 | public NettyMessagingService() { |
... | @@ -66,7 +87,6 @@ public class NettyMessagingService implements MessagingService { | ... | @@ -66,7 +87,6 @@ public class NettyMessagingService implements MessagingService { |
66 | 87 | ||
67 | // FIXME: Constructor should not throw exceptions. | 88 | // FIXME: Constructor should not throw exceptions. |
68 | public NettyMessagingService(int port) { | 89 | public NettyMessagingService(int port) { |
69 | - this.port = port; | ||
70 | try { | 90 | try { |
71 | localEp = new Endpoint(java.net.InetAddress.getLocalHost().getHostName(), port); | 91 | localEp = new Endpoint(java.net.InetAddress.getLocalHost().getHostName(), port); |
72 | } catch (UnknownHostException e) { | 92 | } catch (UnknownHostException e) { |
... | @@ -84,8 +104,16 @@ public class NettyMessagingService implements MessagingService { | ... | @@ -84,8 +104,16 @@ public class NettyMessagingService implements MessagingService { |
84 | 104 | ||
85 | public void deactivate() throws Exception { | 105 | public void deactivate() throws Exception { |
86 | channels.close(); | 106 | channels.close(); |
87 | - bossGroup.shutdownGracefully(); | 107 | + serverGroup.shutdownGracefully(); |
88 | - workerGroup.shutdownGracefully(); | 108 | + clientGroup.shutdownGracefully(); |
109 | + } | ||
110 | + | ||
111 | + /** | ||
112 | + * Returns the local endpoint for this instance. | ||
113 | + * @return local end point. | ||
114 | + */ | ||
115 | + public Endpoint localEp() { | ||
116 | + return localEp; | ||
89 | } | 117 | } |
90 | 118 | ||
91 | @Override | 119 | @Override |
... | @@ -109,7 +137,7 @@ public class NettyMessagingService implements MessagingService { | ... | @@ -109,7 +137,7 @@ public class NettyMessagingService implements MessagingService { |
109 | channels.returnObject(ep, channel); | 137 | channels.returnObject(ep, channel); |
110 | } | 138 | } |
111 | } catch (Exception e) { | 139 | } catch (Exception e) { |
112 | - throw new IOException(e); | 140 | + throw new IOException("Failed to send message to " + ep.toString(), e); |
113 | } | 141 | } |
114 | } | 142 | } |
115 | 143 | ||
... | @@ -149,14 +177,14 @@ public class NettyMessagingService implements MessagingService { | ... | @@ -149,14 +177,14 @@ public class NettyMessagingService implements MessagingService { |
149 | b.option(ChannelOption.WRITE_BUFFER_LOW_WATER_MARK, 8 * 1024); | 177 | b.option(ChannelOption.WRITE_BUFFER_LOW_WATER_MARK, 8 * 1024); |
150 | // TODO: Need JVM options to configure PooledByteBufAllocator. | 178 | // TODO: Need JVM options to configure PooledByteBufAllocator. |
151 | b.option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT); | 179 | b.option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT); |
152 | - b.group(bossGroup, workerGroup) | 180 | + b.group(serverGroup, clientGroup) |
153 | - .channel(NioServerSocketChannel.class) | 181 | + .channel(serverChannelClass) |
154 | .childHandler(new OnosCommunicationChannelInitializer()) | 182 | .childHandler(new OnosCommunicationChannelInitializer()) |
155 | .option(ChannelOption.SO_BACKLOG, 128) | 183 | .option(ChannelOption.SO_BACKLOG, 128) |
156 | .childOption(ChannelOption.SO_KEEPALIVE, true); | 184 | .childOption(ChannelOption.SO_KEEPALIVE, true); |
157 | 185 | ||
158 | // Bind and start to accept incoming connections. | 186 | // Bind and start to accept incoming connections. |
159 | - b.bind(port).sync(); | 187 | + b.bind(localEp.port()).sync(); |
160 | } | 188 | } |
161 | 189 | ||
162 | private class OnosCommunicationChannelFactory | 190 | private class OnosCommunicationChannelFactory |
... | @@ -178,10 +206,10 @@ public class NettyMessagingService implements MessagingService { | ... | @@ -178,10 +206,10 @@ public class NettyMessagingService implements MessagingService { |
178 | bootstrap.option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT); | 206 | bootstrap.option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT); |
179 | bootstrap.option(ChannelOption.WRITE_BUFFER_HIGH_WATER_MARK, 32 * 1024); | 207 | bootstrap.option(ChannelOption.WRITE_BUFFER_HIGH_WATER_MARK, 32 * 1024); |
180 | bootstrap.option(ChannelOption.WRITE_BUFFER_LOW_WATER_MARK, 8 * 1024); | 208 | bootstrap.option(ChannelOption.WRITE_BUFFER_LOW_WATER_MARK, 8 * 1024); |
181 | - bootstrap.group(workerGroup); | 209 | + bootstrap.group(clientGroup); |
182 | // TODO: Make this faster: | 210 | // TODO: Make this faster: |
183 | // http://normanmaurer.me/presentations/2014-facebook-eng-netty/slides.html#37.0 | 211 | // http://normanmaurer.me/presentations/2014-facebook-eng-netty/slides.html#37.0 |
184 | - bootstrap.channel(channelClass); | 212 | + bootstrap.channel(clientChannelClass); |
185 | bootstrap.option(ChannelOption.SO_KEEPALIVE, true); | 213 | bootstrap.option(ChannelOption.SO_KEEPALIVE, true); |
186 | bootstrap.handler(new OnosCommunicationChannelInitializer()); | 214 | bootstrap.handler(new OnosCommunicationChannelInitializer()); |
187 | // Start the client. | 215 | // Start the client. | ... | ... |
-
Please register or login to post a comment