blob: ccfd0ce6d25ddd22f3da4e27b15b0f824b516ee3 [file] [log] [blame]
Thomas Vachuska13433eb2019-12-02 11:11:13 -08001/*
2 * Copyright 2019-present Open Networking Foundation
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package org.onosproject.uonos.impl;
17
18import io.grpc.Server;
19import io.grpc.netty.NettyServerBuilder;
20import io.grpc.stub.StreamObserver;
21import org.onosproject.net.AnnotationKeys;
22import org.onosproject.net.Annotations;
23import org.onosproject.net.Device;
24import org.onosproject.net.device.DeviceService;
25import org.onosproject.uonos.DeviceOuterClass;
26import org.onosproject.uonos.DeviceServiceGrpc;
27import org.osgi.service.component.annotations.Activate;
28import org.osgi.service.component.annotations.Component;
29import org.osgi.service.component.annotations.Deactivate;
30import org.osgi.service.component.annotations.Reference;
31import org.osgi.service.component.annotations.ReferenceCardinality;
32import org.slf4j.Logger;
33import org.slf4j.LoggerFactory;
34
35import java.io.IOException;
36
37import static com.google.common.base.Strings.isNullOrEmpty;
38import static org.onosproject.uonos.DeviceOuterClass.ListRequest;
39import static org.onosproject.uonos.DeviceOuterClass.ListResponse;
40
41/**
42 * Provides implementation of the gRPC interface for onos-topo service.
43 */
44@Component(immediate = true)
45public class MicroOnosTopoManager {
46
47 private static final int MICRO_ONOS_PORT = 5150;
48 private static final byte[] MICRO_ONOS_DEFAULT_CERT = ("\n-----BEGIN CERTIFICATE-----\n" +
49 "MIIDZTCCAk0CCQDl7NF6ekffcTANBgkqhkiG9w0BAQsFADByMQswCQYDVQQGEwJV\n" +
50 "UzELMAkGA1UECAwCQ0ExEjAQBgNVBAcMCU1lbmxvUGFyazEMMAoGA1UECgwDT05G\n" +
51 "MRQwEgYDVQQLDAtFbmdpbmVlcmluZzEeMBwGA1UEAwwVY2Eub3Blbm5ldHdvcmtp\n" +
52 "bmcub3JnMB4XDTE5MDQxMTExMTYyM1oXDTIwMDQxMDExMTYyM1owdzELMAkGA1UE\n" +
53 "BhMCVVMxCzAJBgNVBAgMAkNBMRIwEAYDVQQHDAlNZW5sb1BhcmsxDDAKBgNVBAoM\n" +
54 "A09ORjEUMBIGA1UECwwLRW5naW5lZXJpbmcxIzAhBgNVBAMMGmNsaWVudDEub3Bl\n" +
55 "bm5ldHdvcmtpbmcub3JnMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\n" +
56 "5mR12oGXP+uDD7DzQZdTg96eHWTc0UKPwie2I5LLLVsRoH2PO5s2B5r6r/E8OUG4\n" +
57 "0pGb6tkDRIJ8eC0Z/6NvBkzn4fsJ5g0UW6sVlXfaf0y9JnMSvV05+g++75a7+CRx\n" +
58 "1BG3GNjGWbke1mx8d6SrQ8D1sjI3L0D+32mi0WU9jO2Uw9YXvXgxQmL9Krxdr3M/\n" +
59 "aZO9sTJZtIT0EEY3qBpPv+daAbuP5m+uhiEzYZP2bLywyzGyfrUmj9fjG/D1kuMM\n" +
60 "haEIUJQ2VTcIApKG/Kb3Mk3b3VCfTvpEHMVrKMoyNHQXXi+6X106+cu2WtoPv+U5\n" +
61 "VFVoufjRWSbcOmQ7qIHBiwIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQBRBR6LTFEU\n" +
62 "SWeEeguMsbHxN/6NIZuPejib1q9fTHeZ9cnIHIOLJaZzHiMZn5uw8s6D26kveNps\n" +
63 "iCr4O8xOjUa0uwbhMTgm3wkODLlV1DwGjFWk8v5UKGWqUQ94wVMQ16YMIR5DgJJM\n" +
64 "0DUzVcoFz+vLnMrDZ0AEk5vra1Z5KweSRvwHX7dJ6FIW7X3IgqXTqJtlV/D/vIi3\n" +
65 "UfBnjzqOy2LVfBD7du7i5NbTHfTUpoTvddVwQaKCuQGYHocoQvQD3VQcQDh1u0DD\n" +
66 "n2GkeEDLaDAGFAIO+PDg2iT8BhKeEepqswid9gYAhZcOjrlnl6smZo7jEzBj1a9Q\n" +
67 "e3q1STjfQqe8\n" +
68 "-----END CERTIFICATE-----\n").getBytes();
69
70 private static final byte[] MICRO_ONOS_DEFAULT_KEY = ("\n-----BEGIN PRIVATE KEY-----\n" +
71 "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC4zBmctGU/0LQ4\n" +
72 "uJAtny0Zh/NwAVAgjAlVE9Y3hh1fTiXB7eAPhLrCa3KCzRlQAUCvorNPKYhlHV70\n" +
73 "CL8ACWVrstxeY635I3UGanPZhdNRv1h6hW8hympqIKO1otWDV6pwi0gXo6Zco8QQ\n" +
74 "/3LriBlsGn34kvP52Sh4n/id38CCw34OgkItfZb8VeSkXdNQHN1sfB/z0fJXGdIz\n" +
75 "Io5JGGfgiw/i5ccesyXxfN8A3vBhKE1sUJzeHZGEzkdmo/ZbfpVQt4H6aKurYfwD\n" +
76 "xDQjVasf+Lq+WDKd2OzN+BZ+YBMNWUcmZkAh8zZmQWhCttLL484GOeCtqq5HGsTD\n" +
77 "JvfkHSAvAgMBAAECggEBAIi5ORnfvimA2FY+9y1J36xMEaiE0CvEcAMqMgvShljF\n" +
78 "ENpyjJvur964cHimFlxDEQDhd5jSOb/WAzK6ZdY5HXiZVMHhLg5uVV7x09TUVozc\n" +
79 "7TF5F8gAYssyau0wFJige9HYuvYCdkuEPsP0u6nXgDejQiBvWWM5b+APO3pS2bPk\n" +
80 "fbyXPnp+xUQAQhH/m+VCCG4hlC1bKulkY4yWKp5wrKtj2Xun0Vh4Iu9UJiH/EuQ6\n" +
81 "mwpUeWLECO5OYDKQWH90iIVDZufe+8yw1VZrN82cTWL86jetgPEXz6klWGUu1gHU\n" +
82 "r57xz0Nb4rhFPs49aw9Yj/LswF1I5zdF6EiT0H5aRoECgYEA2tNBEo4ta3JW4wF/\n" +
83 "/3AKAE79RV+06z74x3Id5w2ED8TRq3SRu5oMmR9kJhe6owNg8WcbK/h/LuI5+CPD\n" +
84 "V8Uo8HGQs5VisSJGJdCul8gA2bDGPEokGezdEdE6UUaNxpgRU484owZau80c4Q/Y\n" +
85 "B4evLdJL9KIaSB5oPHGfu65i41kCgYEA2DD29X6i1GOSwzKXTXNdrZjxxOqeZiVv\n" +
86 "/+TTiRffIUNMObtR6B8wWi5Y+oPUUj+Xop1vM7L9ZkwfkuDMtaZbryA37rsoAKP9\n" +
87 "Sdlemyt0cB+cL7MN04Od9UD4YzbapRGAoFJduzzneQN0PBUc6wvB6cMBH2UZsEjQ\n" +
88 "GdV0r/iC1scCgYEA0pg9J/5s99syg4YOCWdqOKHMXded5kjUZB4PaS44ynRA1SF6\n" +
89 "n3HCbhsn5wEvPXMi+TChlc+xlw1hfM3uUaoNnFmvSSWbtZ2mpP4RCUISj27xWVSB\n" +
90 "KfIrT9pspYuhJl9zTVeoyjxzVgowoOj+n0CV9yNMtkLLyFx7NLClaZqK0QECgYAj\n" +
91 "rECz1YeMwDlxWCG7N/QXNwt90LD+beMDOIDnODcrR+2GATDMuojB+K/Z9nLMd43P\n" +
92 "2WaGA1zoylrTY6CjwKWUSh6wl9VL9cNPsjx4Ij1+WtjszgDUC/2+gE/8HwsI/dBZ\n" +
93 "o/2vbadMQpOlbl5tMm124ySGR6prejhMavpsJvd/9QKBgGBN5jGWqdezvFx1dY0S\n" +
94 "uZAlqQ3h5w/0MMGSmaM+yN30wjFdWd3yMAxNgIp4Oj1noqvuqXiXnBjN6YER3GNx\n" +
95 "hpjimxkZY9ogyVGz+RP9YqGKKbUtBL/8zZ/LYbWGvo9yJ6HxwO397EhyXNhCvwyF\n" +
96 "sDhPaK+DnzwfkjBk3kXNve4o\n" +
97 "-----END PRIVATE KEY-----\n").getBytes();
98
99 private final Logger log = LoggerFactory.getLogger(getClass());
100
101 private Server server;
102
103 @Reference(cardinality = ReferenceCardinality.MANDATORY)
104 protected DeviceService deviceService;
105
106 @Activate
107 protected void activate() {
108 try {
109 server = NettyServerBuilder.forPort(MICRO_ONOS_PORT)
110// FIXME: make this work later
111// .useTransportSecurity(new ByteArrayInputStream(MICRO_ONOS_DEFAULT_CERT),
112// new ByteArrayInputStream(MICRO_ONOS_DEFAULT_KEY))
113 .addService(new MicroOnosDeviceService())
114 .build()
115 .start();
116 } catch (IOException e) {
117 log.error("Unable to start gRPC server", e);
118 throw new IllegalStateException("Unable to start gRPC server", e);
119 }
120 log.info("Started");
121 }
122
123 @Deactivate
124 protected void deactivate() {
125 if (server != null) {
126 server.shutdown();
127 }
128 log.info("Stopped");
129 }
130
131 private class MicroOnosDeviceService extends DeviceServiceGrpc.DeviceServiceImplBase {
132 @Override
133 public void list(ListRequest request,
134 StreamObserver<ListResponse> responseObserver) {
135 for (Device d : deviceService.getDevices()) {
136 Annotations annotations = d.annotations();
137 DeviceOuterClass.Device.Builder db = DeviceOuterClass.Device.newBuilder()
138 .setId(d.id().toString())
139 .setVersion(d.swVersion())
140 .setType(d.type().toString());
141 String value = annotations.value(AnnotationKeys.MANAGEMENT_ADDRESS);
142 if (!isNullOrEmpty(value)) {
143 db.setAddress(value);
144 }
145 String role = annotations.value("role");
146 if (!isNullOrEmpty(role)) {
147 db.setRole(role);
148 }
149
150 // TODO: populate protocols, etc.
151
152 ListResponse resp = ListResponse.newBuilder()
153 .setType(ListResponse.Type.NONE)
154 .setDevice(db.build())
155 .build();
156 responseObserver.onNext(resp);
157 }
158 responseObserver.onCompleted();
159 }
160 }
161
162}