CDS: Add stress test RPC to the cars model
[controller.git] / opendaylight / md-sal / sal-netconf-connector / src / main / java / org / opendaylight / controller / sal / connect / util / RemoteDeviceId.java
1 /*
2  * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.controller.sal.connect.util;
9
10 import com.google.common.base.Preconditions;
11 import java.net.InetSocketAddress;
12 import org.opendaylight.controller.config.api.ModuleIdentifier;
13 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Host;
14 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.HostBuilder;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.network.topology.topology.topology.types.TopologyNetconf;
20 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
21 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
22 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
23 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
24 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
25 import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
26 import org.opendaylight.yangtools.yang.common.QName;
27 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
28
29 public final class RemoteDeviceId {
30
31     private final String name;
32     private final org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier path;
33     private final InstanceIdentifier<Node> bindingPath;
34     private final NodeKey key;
35     private final org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier topologyPath;
36     private final InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node> topologyBindingPath;
37     private InetSocketAddress address;
38     private Host host;
39
40     public RemoteDeviceId(final ModuleIdentifier identifier, InetSocketAddress address) {
41         this(Preconditions.checkNotNull(identifier).getInstanceName());
42         this.address = address;
43         this.host = buildHost();
44     }
45
46     private RemoteDeviceId(final String name) {
47         this.name = Preconditions.checkNotNull(name);
48         this.key = new NodeKey(new NodeId(name));
49         this.path = createBIPath(name);
50         this.bindingPath = createBindingPath(key);
51         this.topologyPath = createBIPathForTopology(name);
52         this.topologyBindingPath = createBindingPathForTopology(key);
53     }
54
55     public RemoteDeviceId(final String name, InetSocketAddress address) {
56         this(name);
57         this.address = address;
58         this.host = buildHost();
59     }
60
61     private static InstanceIdentifier<Node> createBindingPath(final NodeKey key) {
62         return InstanceIdentifier.builder(Nodes.class).child(Node.class, key).build();
63     }
64
65     private static org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier createBIPath(final String name) {
66         final org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.InstanceIdentifierBuilder builder =
67                 org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.builder();
68         builder.node(Nodes.QNAME).node(Node.QNAME).nodeWithKey(Node.QNAME, QName.create(Node.QNAME.getNamespace(), Node.QNAME.getRevision(), "id"), name);
69
70         return builder.build();
71     }
72
73     private static InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node> createBindingPathForTopology(final NodeKey key) {
74         final InstanceIdentifier<NetworkTopology> networkTopology = InstanceIdentifier.builder(NetworkTopology.class).build();
75         final KeyedInstanceIdentifier<Topology, TopologyKey> topology = networkTopology.child(Topology.class, new TopologyKey(new TopologyId(TopologyNetconf.QNAME.getLocalName())));
76         return topology
77                 .child(org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node.class,
78                         new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey
79                                 (new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId(key.getId().getValue())));
80     }
81
82     private static org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier createBIPathForTopology(final String name) {
83         final org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.InstanceIdentifierBuilder builder =
84                 org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.builder();
85         builder
86                 .node(NetworkTopology.QNAME)
87                 .node(Topology.QNAME)
88                 .nodeWithKey(Topology.QNAME, QName.create(Topology.QNAME, "topology-id"), TopologyNetconf.QNAME.getLocalName())
89                 .node(org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node.QNAME)
90                 .nodeWithKey(org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node.QNAME,
91                         QName.create(org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node.QNAME, "node-id"), name);
92         return builder.build();
93     }
94
95     private Host buildHost() {
96         return HostBuilder.getDefaultInstance(address.getHostString());
97     }
98
99     public String getName() {
100         return name;
101     }
102
103     public InstanceIdentifier<Node> getBindingPath() {
104         return bindingPath;
105     }
106
107     public org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier getPath() {
108         return path;
109     }
110
111     public NodeKey getBindingKey() {
112         return key;
113     }
114
115     public InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node> getTopologyBindingPath() {
116         return topologyBindingPath;
117     }
118
119     public YangInstanceIdentifier getTopologyPath() {
120         return topologyPath;
121     }
122
123     public InetSocketAddress getAddress() {
124         return address;
125     }
126
127     public Host getHost() {
128         return host;
129     }
130
131     @Override
132     public String toString() {
133         return "RemoteDevice{" + name +'}';
134     }
135
136     @Override
137     public boolean equals(final Object o) {
138         if (this == o) {
139             return true;
140         }
141         if (!(o instanceof RemoteDeviceId)) {
142             return false;
143         }
144
145         final RemoteDeviceId that = (RemoteDeviceId) o;
146
147         if (!name.equals(that.name)) {
148             return false;
149         }
150         if (!bindingPath.equals(that.bindingPath)) {
151             return false;
152         }
153
154         return true;
155     }
156
157     @Override
158     public int hashCode() {
159         int result = name.hashCode();
160         result = 31 * result + bindingPath.hashCode();
161         return result;
162     }
163 }