Thomas Vachuska | 13433eb | 2019-12-02 11:11:13 -0800 | [diff] [blame] | 1 | /* |
| 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 | */ |
| 16 | package org.onosproject.uonos.impl; |
| 17 | |
| 18 | import io.grpc.Server; |
| 19 | import io.grpc.netty.NettyServerBuilder; |
| 20 | import io.grpc.stub.StreamObserver; |
| 21 | import org.onosproject.net.AnnotationKeys; |
| 22 | import org.onosproject.net.Annotations; |
| 23 | import org.onosproject.net.Device; |
| 24 | import org.onosproject.net.device.DeviceService; |
| 25 | import org.onosproject.uonos.DeviceOuterClass; |
| 26 | import org.onosproject.uonos.DeviceServiceGrpc; |
| 27 | import org.osgi.service.component.annotations.Activate; |
| 28 | import org.osgi.service.component.annotations.Component; |
| 29 | import org.osgi.service.component.annotations.Deactivate; |
| 30 | import org.osgi.service.component.annotations.Reference; |
| 31 | import org.osgi.service.component.annotations.ReferenceCardinality; |
| 32 | import org.slf4j.Logger; |
| 33 | import org.slf4j.LoggerFactory; |
| 34 | |
| 35 | import java.io.IOException; |
| 36 | |
| 37 | import static com.google.common.base.Strings.isNullOrEmpty; |
| 38 | import static org.onosproject.uonos.DeviceOuterClass.ListRequest; |
| 39 | import static org.onosproject.uonos.DeviceOuterClass.ListResponse; |
| 40 | |
| 41 | /** |
| 42 | * Provides implementation of the gRPC interface for onos-topo service. |
| 43 | */ |
| 44 | @Component(immediate = true) |
| 45 | public 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 | } |