blob: c8170780fbbf71c2e3148a65aa05bc5c7e6a8b76 [file] [log] [blame]
Carmelo Cascone04098db2018-01-30 18:10:32 -08001/*
2 * Copyright 2018-present Open Networking Foundation
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Carmelo Casconeac963a82018-01-31 14:56:31 -080017package org.onosproject.pipelines.fabric.pro;
Carmelo Cascone04098db2018-01-30 18:10:32 -080018
19import com.google.common.collect.ImmutableList;
20import org.apache.felix.scr.annotations.Activate;
21import org.apache.felix.scr.annotations.Component;
22import org.apache.felix.scr.annotations.Deactivate;
23import org.apache.felix.scr.annotations.Reference;
24import org.apache.felix.scr.annotations.ReferenceCardinality;
25import org.onosproject.net.behaviour.Pipeliner;
26import org.onosproject.net.device.PortStatisticsDiscovery;
27import org.onosproject.net.pi.model.DefaultPiPipeconf;
28import org.onosproject.net.pi.model.PiPipeconf;
29import org.onosproject.net.pi.model.PiPipeconfId;
30import org.onosproject.net.pi.model.PiPipelineInterpreter;
31import org.onosproject.net.pi.model.PiPipelineModel;
32import org.onosproject.net.pi.service.PiPipeconfService;
33import org.onosproject.p4runtime.model.P4InfoParser;
34import org.onosproject.p4runtime.model.P4InfoParserException;
35import org.onosproject.pipelines.fabric.FabricInterpreter;
36import org.onosproject.pipelines.fabric.FabricPortStatisticsDiscovery;
37import org.onosproject.pipelines.fabric.pipeliner.FabricPipeliner;
38
39import java.net.URL;
40import java.util.Collection;
41
42import static java.lang.String.format;
43import static org.onosproject.net.pi.model.PiPipeconf.ExtensionType.P4_INFO_TEXT;
44import static org.onosproject.net.pi.model.PiPipeconf.ExtensionType.TOFINO_BIN;
45import static org.onosproject.net.pi.model.PiPipeconf.ExtensionType.TOFINO_CONTEXT_JSON;
46import static org.onosproject.pipelines.fabric.PipeconfLoader.FABRIC_PIPECONF_ID;
47
48/**
49 * Pipeline config loader for fabric pipeline.
50 */
51@Component(immediate = true)
52public class HwPipeconfLoader {
53
54 private static final String MAVERICKS = "mavericks";
Carmelo Cascone0fbc9082018-02-11 13:02:37 -080055 private static final String MONTARA = "montara";
Carmelo Cascone04098db2018-01-30 18:10:32 -080056
57 private static final String PLAIN_FABRIC = "";
Carmelo Cascone8ac4fc82018-02-01 13:27:50 -080058 private static final String WITH_SPGW = "-spgw";
Carmelo Cascone04888222018-03-19 22:18:12 -070059 private static final String WITH_SPGW_INT = "-spgw-int";
Carmelo Cascone04098db2018-01-30 18:10:32 -080060
61 // TODO: add WITH_SPGW when ready
62 private static final Collection<String> APPENDICES = ImmutableList
Carmelo Cascone04888222018-03-19 22:18:12 -070063 .of(PLAIN_FABRIC, WITH_SPGW, WITH_SPGW_INT);
Carmelo Cascone04098db2018-01-30 18:10:32 -080064
65 private static final Collection<String> PLATFORMS = ImmutableList
Carmelo Cascone0fbc9082018-02-11 13:02:37 -080066 .of(MAVERICKS, MONTARA);
Carmelo Cascone04098db2018-01-30 18:10:32 -080067
68 private static final String BASE_PATH = "/p4c-out/tofino/fabric%s/%s";
69 private static final String BASE_TOFINO_BIN_PATH = BASE_PATH + "/tofino.bin";
70 private static final String BASE_CONTEXT_JSON_PATH = BASE_PATH + "/context.json";
71 private static final String BASE_P4INFO_PATH = BASE_PATH + "/fabric.p4info";
72
73 private static final Collection<PiPipeconf> ALL_PIPECONFS = buildAll();
74
75 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
76 private PiPipeconfService piPipeconfService;
77
78 @Activate
79 public void activate() {
80 // Registers all pipeconf at component activation.
81 ALL_PIPECONFS.forEach(piPipeconfService::register);
82 }
83
84 @Deactivate
85 public void deactivate() {
86 ALL_PIPECONFS.stream().map(PiPipeconf::id).forEach(piPipeconfService::remove);
87 }
88
89 private static PiPipeconf buildTofinoPipeconf(String platform, String appendix) {
90 final PiPipeconfId pipeconfId = new PiPipeconfId(
91 FABRIC_PIPECONF_ID.id() + appendix + "." + platform);
92 final URL tofinoBinUrl = HwPipeconfLoader.class
93 .getResource(format(BASE_TOFINO_BIN_PATH, appendix, platform));
94 final URL contextJsonUrl = HwPipeconfLoader.class
95 .getResource(format(BASE_CONTEXT_JSON_PATH, appendix, platform));
96 final URL p4InfoUrl = HwPipeconfLoader.class
97 .getResource(format(BASE_P4INFO_PATH, appendix, platform));
98
99 final PiPipelineModel model = parseP4Info(p4InfoUrl);
100 return DefaultPiPipeconf.builder()
101 .withId(pipeconfId)
102 .withPipelineModel(model)
103 .addBehaviour(PiPipelineInterpreter.class, FabricInterpreter.class)
104 .addBehaviour(Pipeliner.class, FabricPipeliner.class)
105 .addBehaviour(PortStatisticsDiscovery.class, FabricPortStatisticsDiscovery.class)
106 .addExtension(P4_INFO_TEXT, p4InfoUrl)
107 .addExtension(TOFINO_BIN, tofinoBinUrl)
108 .addExtension(TOFINO_CONTEXT_JSON, contextJsonUrl)
109 .build();
110 }
111
112 private static Collection<PiPipeconf> buildAll() {
113 ImmutableList.Builder<PiPipeconf> builder = ImmutableList.builder();
114 for (String platform : PLATFORMS) {
115 for (String appendix : APPENDICES) {
116 builder.add(buildTofinoPipeconf(platform, appendix));
117 }
118 }
119 return builder.build();
120 }
121
122 private static PiPipelineModel parseP4Info(URL p4InfoUrl) {
123 try {
124 return P4InfoParser.parse(p4InfoUrl);
125 } catch (P4InfoParserException e) {
126 throw new RuntimeException(e);
127 }
128 }
129}