<relativePath>..</relativePath>
</parent>
+ <properties>
+ <checkstyle.skip>true</checkstyle.skip>
+ </properties>
+
<groupId>org.opendaylight.alto</groupId>
- <artifactId>commons</artifactId>
+ <artifactId>alto-commons</artifactId>
<packaging>bundle</packaging>
<build>
--- /dev/null
+package org.opendaylight.alto.commons.types.mapper;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.opendaylight.alto.commons.types.rfc7285.AltoNetworkMap;
+import org.opendaylight.alto.commons.types.rfc7285.Endpoint;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpPrefix;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpPrefixBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.network.map.Map;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.network.map.MapBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.network.map.MapKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.resources.network.maps.NetworkMap;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.resources.network.maps.NetworkMapBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.resources.network.maps.NetworkMapKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.EndpointAddressType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.PidName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.ResourceId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.TagString;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.endpoint.address.group.EndpointAddressGroup;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.endpoint.address.group.EndpointAddressGroupBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.endpoint.address.group.EndpointAddressGroupKey;
+
+public class AltoYangMapper {
+ public static final String IPV4 = "ipv4";
+ public static final String IPV6 = "ipv6";
+
+ public AltoYangMapper() {};
+
+ public NetworkMap asNetworkMap(AltoNetworkMap base) {
+ ResourceId rid = new ResourceId(base.meta.vtag.rid);
+
+ NetworkMapBuilder networkMapBuilder = new NetworkMapBuilder();
+ networkMapBuilder.setTag(new TagString(base.meta.vtag.tag));
+ networkMapBuilder.setResourceId(rid);
+ networkMapBuilder.setKey(new NetworkMapKey(rid));
+ networkMapBuilder.setMap(asNetworkMapDataList(base.map));
+
+ return networkMapBuilder.build();
+ }
+
+ public List<Map> asNetworkMapDataList(java.util.Map<String, Endpoint.AddressGroup> mapData) {
+ List<Map> resultMapData = new ArrayList<Map>();
+ for (String key : mapData.keySet()) {
+ resultMapData.add(asNetworkMapData(key, mapData.get(key)));
+ }
+ return resultMapData;
+ }
+
+ public Map asNetworkMapData(String key, Endpoint.AddressGroup data) {
+ PidName pid = new PidName(key);
+ return new MapBuilder()
+ .setPid(pid)
+ .setKey(new MapKey(pid))
+ .setEndpointAddressGroup(asEndpointAddressGroupList(data))
+ .build();
+ }
+
+ public List<EndpointAddressGroup> asEndpointAddressGroupList(Endpoint.AddressGroup addressGroup) {
+ List<EndpointAddressGroup> endpointAddressGroup = new ArrayList<EndpointAddressGroup>();
+ java.util.Map<String, Object> addressGroupMap = addressGroup.any();
+ for (String key : addressGroupMap.keySet()) {
+ endpointAddressGroup.add(constructEndpointAddressGroupElement(key, addressGroupMap));
+ }
+ return endpointAddressGroup;
+ }
+
+ @SuppressWarnings("unchecked")
+ private EndpointAddressGroup constructEndpointAddressGroupElement(String key, java.util.Map<String, Object> addressGroupMap){
+ EndpointAddressGroupBuilder addressGroupBuilder = new EndpointAddressGroupBuilder();
+ EndpointAddressType type = null;
+ if (IPV4.equals(key)) {
+ type = new EndpointAddressType(EndpointAddressType.Enumeration.Ipv4);
+ } else if (IPV6.equals(key)) {
+ type = new EndpointAddressType(EndpointAddressType.Enumeration.Ipv6);
+ }
+
+ addressGroupBuilder.setAddressType(type);
+ addressGroupBuilder.setKey(new EndpointAddressGroupKey(type));
+ addressGroupBuilder.setEndpointPrefix(constructIpPrefixList((List<String>)addressGroupMap.get(key)));
+ return addressGroupBuilder.build();
+ }
+
+ private List<IpPrefix> constructIpPrefixList(List<String> ipList) {
+ List<IpPrefix> ipPrefixList = new ArrayList<IpPrefix>();
+ for (String ip : ipList) {
+ ipPrefixList.add(IpPrefixBuilder.getDefaultInstance(ip));
+ }
+ return ipPrefixList;
+ }
+}
-package org.opendaylight.alto.commons.types.rfc7285;
+package org.opendaylight.alto.commons.types.mapper;
+
+import org.opendaylight.alto.commons.types.rfc7285.AltoNetworkMap;
+import org.opendaylight.alto.commons.types.rfc7285.CostMap;
+import org.opendaylight.alto.commons.types.rfc7285.CostType;
+import org.opendaylight.alto.commons.types.rfc7285.Endpoint;
+import org.opendaylight.alto.commons.types.rfc7285.Extensible;
+import org.opendaylight.alto.commons.types.rfc7285.IRD;
+import org.opendaylight.alto.commons.types.rfc7285.VersionTag;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
public class JSONMapper {
return mapper.readValue(json, IRD.class);
}
- public NetworkMap asNetworkMap(String json) throws Exception {
- return mapper.readValue(json, NetworkMap.class);
+ public AltoNetworkMap asNetworkMap(String json) throws Exception {
+ return mapper.readValue(json, AltoNetworkMap.class);
}
public VersionTag asVersionTag(String json) throws Exception {
--- /dev/null
+package org.opendaylight.alto.commons.types.rfc7285;
+
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.network.map.MapBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.network.map.MapKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.resources.network.maps.NetworkMap;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.resources.network.maps.NetworkMapBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.resources.network.maps.NetworkMapKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.PidName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.ResourceId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.TagString;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+/**
+ * Network Map: defined in RFC 7285 section 11.2.1
+ * */
+public class AltoNetworkMap {
+
+ public AltoNetworkMap() {}
+
+ public AltoNetworkMap(NetworkMap base) {
+ this.meta = new AltoNetworkMap.Meta(
+ new VersionTag(base.getResourceId().getValue(), base.getTag().getValue()));
+
+ this.map = new LinkedHashMap<String, Endpoint.AddressGroup>();
+ List<org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.network.map.Map> baseMaps = base.getMap();
+ for (org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.network.map.Map map : baseMaps) {
+ String key = map.getKey().getPid().getValue();
+ this.map.put(key, new Endpoint.AddressGroup(map.getEndpointAddressGroup()));
+ }
+ }
+
+ public static class Meta extends Extensible {
+ public Meta() {}
+
+ public Meta(VersionTag vtag) {
+ this.vtag = vtag;
+ }
+
+ @JsonProperty("vtag")
+ public VersionTag vtag;
+
+ }
+
+ /**
+ * used for filtered-network-map, RFC7285 secion 11.3.1
+ * */
+ public static class Filter {
+
+ @JsonProperty("pids")
+ public List<String> pids;
+
+ }
+
+ @JsonProperty("meta")
+ public Meta meta;
+
+ @JsonProperty("network-map")
+ public Map<String, Endpoint.AddressGroup> map
+ = new LinkedHashMap<String, Endpoint.AddressGroup>();
+
+ public NetworkMap asYangNetworkMap() {
+ ResourceId rid = new ResourceId(this.meta.vtag.rid);
+ return new NetworkMapBuilder()
+ .setTag(new TagString(this.meta.vtag.tag))
+ .setResourceId(rid)
+ .setKey(new NetworkMapKey(rid))
+ .setMap(asNetworkMapDataList(this.map))
+ .build();
+ }
+
+ private List<org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.network.map.Map> asNetworkMapDataList(
+ java.util.Map<String, Endpoint.AddressGroup> mapData) {
+ List<org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.network.map.Map> resultMapData =
+ new ArrayList<org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.network.map.Map>();
+ for (String key : mapData.keySet()) {
+ resultMapData.add(asNetworkMapData(key, mapData.get(key)));
+ }
+ return resultMapData;
+ }
+
+ private org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.network.map.Map asNetworkMapData(
+ String key, Endpoint.AddressGroup data) {
+ PidName pid = new PidName(key);
+ return new MapBuilder()
+ .setPid(pid)
+ .setKey(new MapKey(pid))
+ .setEndpointAddressGroup(data.asYangEndpointAddressGroupList())
+ .build();
+ }
+
+}
package org.opendaylight.alto.commons.types.rfc7285;
+import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.List;
import java.util.Map;
import java.util.LinkedHashMap;
-public class Endpoint {
-
- public static class AddressGroup extends Extensible {
-
- @JsonProperty("ipv4")
- public List<String> ipv4 = new ArrayList<String>();
-
- @JsonProperty("ipv6")
- public List<String> ipv6 = new ArrayList<String>();
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpPrefix;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpPrefixBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.EndpointAddressType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.endpoint.address.group.EndpointAddressGroup;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.endpoint.address.group.EndpointAddressGroupBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.endpoint.address.group.EndpointAddressGroupKey;
+public class Endpoint {
+
+
+ public static class AddressGroup extends Extensible {
+
+ @JsonIgnore
+ public static final String IPV4_LABEL = "ipv4";
+
+ @JsonIgnore
+ public static final String IPV6_LABEL = "ipv6";
+
+ @JsonProperty(IPV4_LABEL)
+ public List<String> ipv4 = new ArrayList<String>();
+
+ @JsonProperty(IPV6_LABEL)
+ public List<String> ipv6 = new ArrayList<String>();
+
+ public AddressGroup() {}
+
+ public AddressGroup(List<EndpointAddressGroup> base) {
+ for (EndpointAddressGroup group : base) {
+ switch (group.getAddressType().getEnumeration()) {
+ case Ipv4:
+ this.ipv4 = asStringIpPrefixList(EndpointAddressType.Enumeration.Ipv4, group.getEndpointPrefix());
+ break;
+ case Ipv6:
+ this.ipv6 = asStringIpPrefixList(EndpointAddressType.Enumeration.Ipv6, group.getEndpointPrefix());
+ break;
+ default:
+ break;
+ }
+ }
}
- public static class PropertyRequest {
+ private List<String> asStringIpPrefixList(EndpointAddressType.Enumeration type, List<IpPrefix> base) {
+ List<String> addressPrefixes = new ArrayList<String>();
+ for (IpPrefix prefix : base) {
+ switch (type) {
+ case Ipv4:
+ addressPrefixes.add(prefix.getIpv4Prefix().getValue());
+ break;
+ case Ipv6:
+ addressPrefixes.add(prefix.getIpv6Prefix().getValue());
+ break;
+ default:
+ break;
+ }
+ }
+ return addressPrefixes;
+ }
+
+ public List<EndpointAddressGroup> asYangEndpointAddressGroupList() {
+ List<EndpointAddressGroup> endpointAddressGroup = new ArrayList<EndpointAddressGroup>();
+ if (this.ipv4.size() > 0) {
+ endpointAddressGroup.add(asYangEndpointAddressGroup(IPV4_LABEL, this.ipv4));
+ }
+ if (this.ipv6.size() > 0) {
+ endpointAddressGroup.add(asYangEndpointAddressGroup(IPV6_LABEL, this.ipv6));
+ }
+ return endpointAddressGroup;
+ }
- @JsonProperty("properties")
- public List<String> properties;
+ private EndpointAddressGroup asYangEndpointAddressGroup(String key, List<String> ipList){
+ EndpointAddressType type = null;
+ if (IPV4_LABEL.equals(key)) {
+ type = new EndpointAddressType(EndpointAddressType.Enumeration.Ipv4);
+ } else if (IPV6_LABEL.equals(key)) {
+ type = new EndpointAddressType(EndpointAddressType.Enumeration.Ipv6);
+ }
+
+ return new EndpointAddressGroupBuilder().setAddressType(type)
+ .setKey(new EndpointAddressGroupKey(type))
+ .setEndpointPrefix(asYangIpPrefix(ipList))
+ .build();
+ }
- @JsonProperty("endpoints")
- public List<String> endpoints;
+ private List<IpPrefix> asYangIpPrefix(List<String> ipList) {
+ List<IpPrefix> ipPrefixList = new ArrayList<IpPrefix>();
+ for (String ip : ipList) {
+ ipPrefixList.add(IpPrefixBuilder.getDefaultInstance(ip));
+ }
+ return ipPrefixList;
}
+ }
- public static class PropertyRespond {
+ public static class PropertyRequest {
- public static class Meta extends Extensible {
+ @JsonProperty("properties")
+ public List<String> properties;
- @JsonProperty("dependent-vtags")
- public List<VersionTag> netmap_tags;
+ @JsonProperty("endpoints")
+ public List<String> endpoints;
+ }
- }
+ public static class PropertyRespond {
+
+ public static class Meta extends Extensible {
- @JsonProperty("meta")
- public Meta meta;
+ @JsonProperty("dependent-vtags")
+ public List<VersionTag> netmap_tags;
- @JsonProperty("endpoint-properties")
- public Map<String, Map<String, Object>> answer
- = new LinkedHashMap<String, Map<String, Object>>();
}
- public static class CostRequest {
+ @JsonProperty("meta")
+ public Meta meta;
- @JsonProperty("cost-type")
- public CostType costType;
+ @JsonProperty("endpoint-properties")
+ public Map<String, Map<String, Object>> answer = new LinkedHashMap<String, Map<String, Object>>();
+ }
- @JsonProperty("endpoints")
- public QueryPairs endpoints;
- }
+ public static class CostRequest {
- public static class CostRespond {
+ @JsonProperty("cost-type")
+ public CostType costType;
- public static class Meta extends Extensible {
+ @JsonProperty("endpoints")
+ public QueryPairs endpoints;
+ }
- @JsonProperty("cost-type")
- public CostType costType;
+ public static class CostRespond {
- }
+ public static class Meta extends Extensible {
- @JsonProperty("meta")
- public Meta meta;
+ @JsonProperty("cost-type")
+ public CostType costType;
- @JsonProperty("endpoint-cost-map")
- public Map<String, Map<String, Object>> answer
- = new LinkedHashMap<String, Map<String, Object>>();
}
+
+ @JsonProperty("meta")
+ public Meta meta;
+
+ @JsonProperty("endpoint-cost-map")
+ public Map<String, Map<String, Object>> answer = new LinkedHashMap<String, Map<String, Object>>();
+ }
}
+++ /dev/null
-package org.opendaylight.alto.commons.types.rfc7285;
-
-import java.util.List;
-import java.util.Map;
-import java.util.LinkedHashMap;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-/**
- * Network Map: defined in RFC 7285 section 11.2.1
- * */
-public class NetworkMap {
-
- public static class Meta extends Extensible {
-
- @JsonProperty("vtag")
- public VersionTag vtag;
-
- }
-
- /**
- * used for filtered-network-map, RFC7285 secion 11.3.1
- * */
- public static class Filter {
-
- @JsonProperty("pids")
- public List<String> pids;
-
- }
-
- @JsonProperty("meta")
- public Meta meta;
-
- @JsonProperty("network-map")
- public Map<String, Endpoint.AddressGroup> map
- = new LinkedHashMap<String, Endpoint.AddressGroup>();
-
-}
<instructions>
<Import-Package>
org.opendaylight.yang.gen.v1.urn.opendaylight.alto.*,
- org.opendaylight.alto.services.api,
+ org.opendaylight.alto.services,
+ org.opendaylight.alto.commons.*,
org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924,
org.apache.commons.logging,
com.sun.jersey.spi.container.servlet,
<dependency>
<groupId>${project.groupId}</groupId>
- <artifactId>commons</artifactId>
+ <artifactId>alto-commons</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
- <artifactId>services.api</artifactId>
+ <artifactId>alto-services</artifactId>
<version>${project.version}</version>
</dependency>
*/
package org.opendaylight.alto.northbound;
-import org.opendaylight.alto.commons.types.rfc7285.MediaType;
-import org.opendaylight.alto.services.api.IRDService;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.IRD;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Response;
+import org.opendaylight.alto.commons.types.mapper.JSONMapper;
+import org.opendaylight.alto.commons.types.rfc7285.MediaType;
+import org.opendaylight.alto.services.AltoService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.resources.network.maps.NetworkMap;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.IRD;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.ResourceId;
+
@Path("/")
public class AltoNorthbound {
-
- private static final Logger mLogger = LoggerFactory.getLogger(AltoNorthbound.class);
-
- @GET
- @Produces({MediaType.ALTO_DIRECTORY, MediaType.ALTO_ERROR})
- public Response retrieveIRD() {
- IRDService fas = new FakeAltoService();
- try {
- IRD ird = fas.getIRD();
- return Response.ok(ird, MediaType.ALTO_DIRECTORY).build();
- } catch (Exception e) {
- }
- return Response.ok("", MediaType.ALTO_ERROR).build();
+ private AltoService altoService = new AltoService();
+ private JSONMapper mapper = new JSONMapper();
+
+ @GET
+ @Produces({ MediaType.ALTO_DIRECTORY, MediaType.ALTO_ERROR })
+ public Response retrieveIRD() {
+ try {
+ IRD ird = altoService.getIRD();
+ return Response.ok(ird, MediaType.ALTO_DIRECTORY).build();
+ } catch (Exception e) {
}
+ return Response.ok("", MediaType.ALTO_ERROR).build();
+ }
- @Path("/networkmap/{networkmap_id}")
- @GET
- @Produces({MediaType.ALTO_NETWORKMAP, MediaType.ALTO_ERROR})
- public Response retrieveNetworkMap(@PathParam(value = "networkmap_id") String nmap_id) {
- /* TODO */
- return Response.ok("", MediaType.ALTO_ERROR).build();
+ @Path("/networkmap/{networkmap_id}")
+ @GET
+ @Produces({ MediaType.ALTO_NETWORKMAP, MediaType.ALTO_ERROR })
+ public Response retrieveNetworkMap(
+ @PathParam(value = "networkmap_id") String nmap_id) {
+ NetworkMap networkMap = altoService.getNetworkMap(new ResourceId(nmap_id));
+ try {
+ return Response.ok("", MediaType.ALTO_NETWORKMAP).build();
+ } catch (Exception e) {
+ return Response.ok("", MediaType.ALTO_ERROR).build();
}
+ }
}
+++ /dev/null
-package org.opendaylight.alto.northbound;
-
-import org.opendaylight.alto.services.api.IRDService;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Uri;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.resources.IRD;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.resources.IRDBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.CostTypeName;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.CostMetric;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.CostMode;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.MediaType;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.ResourceId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.cost.types.CostTypes;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.cost.types.CostTypesBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.cost.types.CostTypesKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.ird.MetaBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.ird.data.Resources;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.ird.data.ResourcesBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.ird.data.ResourcesKey;
-
-import java.util.ArrayList;
-import java.util.List;
-
-class FakeAltoService implements IRDService {
- @Override
- public IRD getIRD() {
- IRDBuilder irdb = new IRDBuilder();
- MetaBuilder mb = new MetaBuilder();
-
- List<CostTypes> cost_types = new ArrayList<CostTypes>();
- CostTypesBuilder cb = new CostTypesBuilder();
- CostTypeName name = new CostTypeName("num-routing");
- CostMetric metric = new CostMetric(CostMetric.Enumeration.Routingcost);
- CostMode mode = CostMode.Numerical;
- CostTypesKey ckey = new CostTypesKey(name);
-
- cost_types.add(cb.setCostTypeName(name).setCostMetric(metric).setCostMode(mode).setKey(ckey).build());
- irdb.setMeta(mb.setCostTypes(cost_types).build());
-
- List<Resources> resources = new ArrayList<Resources>();
- ResourcesBuilder rb = new ResourcesBuilder();
-
- MediaType mt = new MediaType(MediaType.Enumeration.AltoNetworkmap);
- Uri uri = new Uri("http://localhost:8080/controller/nb/v2/networkmap/default");
- ResourcesKey rkey = new ResourcesKey(new ResourceId("my-default-networkmap"));
-
- resources.add(rb.setMediaType(mt).setUri(uri).setKey(rkey).build());
- irdb.setResources(resources);
-
- return irdb.build();
- }
-
- @Override
- public boolean register(ResourceId id, Resources resource) {
- return true;
- }
-
- @Override
- public void unregister(ResourceId id) {
- }
-}
<packaging>bundle</packaging>
<properties>
- <checkstyle.skip>true</checkstyle.skip>
<sal-binding-api.version>1.2.0-SNAPSHOT</sal-binding-api.version>
+ <configfile>default.networkmap</configfile>
</properties>
<dependencies>
<artifactId>alto-model</artifactId>
<version>${project.version}</version>
</dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>alto-commons</artifactId>
+ <version>${project.version}</version>
+ </dependency>
<dependency>
<groupId>org.opendaylight.controller</groupId>
<artifactId>config-api</artifactId>
</execution>
</executions>
</plugin>
+
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>build-helper-maven-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>attach-artifacts</id>
+ <goals>
+ <goal>attach-artifact</goal>
+ </goals>
+ <phase>package</phase>
+ <configuration>
+ <artifacts>
+ <artifact>
+ <file>${project.build.directory}/classes/${configfile}</file>
+ <type>xml</type>
+ <classifier>config</classifier>
+ </artifact>
+ </artifacts>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
</plugins>
</build>
<scm>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- vi: set et smarttab sw=4 tabstop=4: -->
-<!--
-Copyright (c) 2015 Yale University and others. All rights reserved.
-
-This program and the accompanying materials are made available under the
-terms of the Eclipse Public License v1.0 which accompanies this distribution,
-and is available at http://www.eclipse.org/legal/epl-v10.html
--->
-<snapshot>
- <required-capabilities>
- </required-capabilities>
- <configuration>
-
- <data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
- <modules xmlns="urn:opendaylight:params:xml:ns:yang:controller:config">
- <module>
- <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:alto:impl">prefix:alto-impl</type>
- <name>alto-default</name>
- <broker>
- <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">binding:binding-broker-osgi-registry</type>
- <name>binding-osgi-broker</name>
- </broker>
- </module>
- </modules>
- </data>
- </configuration>
-</snapshot>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<metadata modelVersion="1.1.0">
- <groupId>org.opendaylight.alto</groupId>
- <artifactId>alto-impl</artifactId>
- <version>1.0.0-SNAPSHOT</version>
- <versioning>
- <snapshot>
- <localCopy>true</localCopy>
- </snapshot>
- <lastUpdated>20150330113731</lastUpdated>
- <snapshotVersions>
- <snapshotVersion>
- <classifier>config</classifier>
- <extension>xml</extension>
- <value>1.0.0-SNAPSHOT</value>
- <updated>20150330113731</updated>
- </snapshotVersion>
- </snapshotVersions>
- </versioning>
-</metadata>
+++ /dev/null
-/*
- * Copyright (c) 2015 Yale University and others. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-package org.opendaylight.alto;
-
-import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext;
-import org.opendaylight.controller.sal.binding.api.BindingAwareProvider;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class AltoProvider implements BindingAwareProvider, AutoCloseable {
-
- private static final Logger LOG = LoggerFactory.getLogger(AltoProvider.class);
-
- @Override
- public void onSessionInitiated(ProviderContext session) {
- LOG.info("AltoProvider Session Initiated");
- }
-
- @Override
- public void close() throws Exception {
- LOG.info("AltoProvider Closed");
- }
-
-}
--- /dev/null
+package org.opendaylight.controller.alto.provider;
+
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+
+import org.opendaylight.alto.commons.types.mapper.JSONMapper;
+import org.opendaylight.controller.config.yang.config.alto_provider.impl.AltoProviderRuntimeMXBean;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
+import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
+import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
+import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.AltoServiceService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.EndpointCostServiceInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.EndpointCostServiceOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.FilteredCostMapServiceInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.FilteredCostMapServiceOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.FilteredNetworkMapServiceInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.FilteredNetworkMapServiceOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.Resources;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.ResourcesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.resources.NetworkMaps;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.resources.NetworkMapsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.resources.network.maps.NetworkMap;
+import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.base.Function;
+import com.google.common.util.concurrent.FutureCallback;
+import com.google.common.util.concurrent.Futures;
+
+public class AltoProvider implements AltoServiceService, DataChangeListener,
+ AltoProviderRuntimeMXBean, AutoCloseable {
+
+ private static final Logger LOG = LoggerFactory.getLogger(AltoProvider.class);
+
+ public static final InstanceIdentifier<Resources> ALTO_IID = InstanceIdentifier
+ .builder(Resources.class).build();
+
+ private static final Path configFilePath = Paths.get("configuration/default.networkmap");
+ private JSONMapper jsonMapper = new JSONMapper();
+
+ private DataBroker dataProvider;
+ private final ExecutorService executor;
+
+ public AltoProvider() {
+ this.executor = Executors.newFixedThreadPool(1);
+ }
+
+ public void setDataProvider(final DataBroker salDataProvider) {
+ this.dataProvider = salDataProvider;
+ this.dataProvider.registerDataChangeListener(LogicalDatastoreType.OPERATIONAL, ALTO_IID, this, DataChangeScope.SUBTREE);
+ setResourcesStatusUp(null);
+ }
+
+ private Resources buildResources() {
+ try {
+ return new ResourcesBuilder()
+ .setNetworkMaps(loadNetworkMaps())
+ .build();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ return null;
+ }
+
+ private NetworkMaps loadNetworkMaps() throws Exception {
+ return new NetworkMapsBuilder()
+ .setNetworkMap(loadNetworkMapList())
+ .build();
+ }
+
+ private List<NetworkMap> loadNetworkMapList() {
+ List<NetworkMap> networkMapList = new ArrayList<NetworkMap>();
+ try {
+ String content = new String(Files.readAllBytes(configFilePath), StandardCharsets.UTF_8);
+ networkMapList.add(jsonMapper.asNetworkMap(content).asYangNetworkMap());
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ return networkMapList;
+ }
+
+ @Override
+ public void onDataChanged(
+ final AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
+ DataObject dataObject = change.getUpdatedSubtree();
+ if (dataObject instanceof Resources) {
+ Resources altoResources = (Resources) dataObject;
+ LOG.info("onDataChanged - new ALTO config: {}", altoResources);
+ }
+ }
+
+ private void setResourcesStatusUp(final Function<Boolean, Void> resultCallback) {
+ WriteTransaction tx = dataProvider.newWriteOnlyTransaction();
+ tx.put(LogicalDatastoreType.OPERATIONAL, ALTO_IID, buildResources());
+
+ Futures.addCallback(tx.submit(), new FutureCallback<Void>() {
+ @Override
+ public void onSuccess(final Void result) {
+ notifyCallback(true);
+ }
+
+ @Override
+ public void onFailure(final Throwable t) {
+ LOG.error("Failed to initiate resources", t);
+ notifyCallback(false);
+ }
+
+ void notifyCallback(final boolean result) {
+ if (resultCallback != null) {
+ resultCallback.apply(result);
+ }
+ }
+ });
+ }
+
+ @Override
+ public Future<RpcResult<EndpointCostServiceOutput>> endpointCostService(
+ EndpointCostServiceInput input) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Future<RpcResult<FilteredCostMapServiceOutput>> filteredCostMapService(
+ FilteredCostMapServiceInput input) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Future<RpcResult<FilteredNetworkMapServiceOutput>> filteredNetworkMapService(
+ final FilteredNetworkMapServiceInput input) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Long getToastsMade() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public void close() throws ExecutionException, InterruptedException {
+ executor.shutdown();
+ if (dataProvider != null) {
+ WriteTransaction tx = dataProvider.newWriteOnlyTransaction();
+ tx.delete(LogicalDatastoreType.OPERATIONAL, ALTO_IID);
+ Futures.addCallback(tx.submit(), new FutureCallback<Void>() {
+ @Override
+ public void onSuccess(final Void result) {
+ LOG.debug("Delete ALTO commit result: " + result);
+ }
+
+ @Override
+ public void onFailure(final Throwable t) {
+ LOG.error("Delete of ALTO failed", t);
+ }
+ });
+ }
+ }
+}
-package org.opendaylight.alto.services.ext.fsmap;
+package org.opendaylight.controller.alto.provider;
+import java.io.IOException;
import java.net.URI;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.ClosedWatchServiceException;
import java.nio.file.FileSystem;
-import java.nio.file.SimpleFileVisitor;
import java.nio.file.FileVisitResult;
-import java.nio.file.PathMatcher;
-import java.nio.file.WatchService;
-import java.nio.file.WatchKey;
-import java.nio.file.WatchEvent;
import java.nio.file.Files;
import java.nio.file.Path;
+import java.nio.file.PathMatcher;
import java.nio.file.Paths;
+import java.nio.file.SimpleFileVisitor;
import java.nio.file.StandardWatchEventKinds;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.ClosedWatchServiceException;
+import java.nio.file.WatchEvent;
+import java.nio.file.WatchKey;
+import java.nio.file.WatchService;
import java.nio.file.attribute.BasicFileAttributes;
-
-import java.io.IOException;
-
-import java.util.concurrent.locks.ReentrantLock;
-import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.ArrayList;
import java.util.HashMap;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.locks.ReentrantLock;
-import org.opendaylight.alto.commons.types.rfc7285.JSONMapper;
-import org.opendaylight.alto.commons.types.rfc7285.NetworkMap;
+import org.opendaylight.alto.commons.types.mapper.JSONMapper;
+import org.opendaylight.alto.commons.types.rfc7285.AltoNetworkMap;
import org.opendaylight.alto.commons.types.rfc7285.VersionTag;
-
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.resources.network.maps.NetworkMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private MapFileLoader loader = null;
private AtomicBoolean cancelled = new AtomicBoolean(false);
private HashMap<Path, VersionTag> path_to_id = new HashMap<Path, VersionTag>();
- private HashMap<VersionTag, NetworkMap> id_to_map = new HashMap<VersionTag, NetworkMap>();
- private JSONMapper mapper = new JSONMapper();
+ private HashMap<VersionTag, AltoNetworkMap> id_to_map = new HashMap<VersionTag, AltoNetworkMap>();
+ private JSONMapper jsonMapper = new JSONMapper();
public FileSystemNetworkMapGenerator(URI uri) throws Exception {
source = Paths.get(uri);
-
+
FileSystem fs = source.getFileSystem();
watcher = fs.newWatchService();
if (watcher == null) {
}
onCreateDir(source);
-
loader = new MapFileLoader(fs);
Files.walkFileTree(source, loader);
}
cleanup();
}
- public void cleanup() {
+ private void cleanup() {
lock.lock();
for (WatchKey key: keys.values()) {
try {
} catch (Exception e) {
}
- for (VersionTag vtag: path_to_id.values()) {
- // TODO remove network map
- }
path_to_id.clear();
id_to_map.clear();
lock.unlock();
cleanup();
}
- public void onCreate(Path file) {
- //TODO
+ private void onCreate(Path file) {
try {
String content = new String(Files.readAllBytes(file), StandardCharsets.US_ASCII);
- NetworkMap map = mapper.asNetworkMap(content);
-
+ AltoNetworkMap map = jsonMapper.asNetworkMap(content);
VersionTag vtag = map.meta.vtag;
logger.info("vtag: <" + vtag.rid + ", " + vtag.tag + ">");
if (id_to_map.get(map.meta.vtag) != null) {
}
}
- public void onCreateDir(Path dir) {
+ private void onCreateDir(Path dir) {
try {
WatchKey key = dir.register(watcher,
StandardWatchEventKinds.ENTRY_CREATE,
}
}
- public void onDelete(Path file) {
+ private void onDelete(Path file) {
//TODO
try {
VersionTag vtag = path_to_id.get(file);
}
}
- public void onDeleteDir(Path dir) {
+ private void onDeleteDir(Path dir) {
// TODO
try {
WatchKey key = keys.get(dir);
}
}
- public void onModify(Path file) {
- //TODO
- try {
+ private void onModify(Path file) {
+ try {
String content = new String(Files.readAllBytes(file), StandardCharsets.US_ASCII);
- NetworkMap map = mapper.asNetworkMap(content);
+ AltoNetworkMap map = jsonMapper.asNetworkMap(content);
VersionTag vtag = map.meta.vtag;
VersionTag old = path_to_id.get(file);
}
}
- public void onModifyDir(Path dir) {
- //TODO
+ private void onModifyDir(Path dir) {
onDeleteDir(dir);
onModifyDir(dir);
}
+
+ public List<NetworkMap> getYangNetworkMaps() {
+ List<AltoNetworkMap> networkMapList = new ArrayList<AltoNetworkMap>(id_to_map.values());
+ List<NetworkMap> list = new ArrayList<NetworkMap>();
+ for (AltoNetworkMap map : networkMapList) {
+ list.add(map.asYangNetworkMap());
+ }
+ return list;
+ }
}
package org.opendaylight.controller.config.yang.config.alto_provider.impl;
+import org.opendaylight.controller.alto.provider.AltoProvider;
import org.opendaylight.controller.md.sal.binding.api.DataBroker;
import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.provider.impl.rev141119.OpendaylightAlto;
import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.AltoServiceService;
-public class AltoProviderModule extends org.opendaylight.controller.config.yang.config.alto_provider.impl.AbstractAltoProviderModule {
+public class AltoProviderModule extends AbstractAltoProviderModule {
public AltoProviderModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) {
super(identifier, dependencyResolver);
}
@Override
public java.lang.AutoCloseable createInstance() {
- final OpendaylightAlto opendaylightAlto = new OpendaylightAlto();
+ final AltoProvider altoProvider = new AltoProvider();
DataBroker dataBrokerService = getDataBrokerDependency();
- opendaylightAlto.setDataProvider(dataBrokerService);
-
+ altoProvider.setDataProvider(dataBrokerService);
+
final BindingAwareBroker.RpcRegistration<AltoServiceService> rpcRegistration = getRpcRegistryDependency()
- .addRpcImplementation(AltoServiceService.class, opendaylightAlto);
+ .addRpcImplementation(AltoServiceService.class, altoProvider);
+ final AltoProviderRuntimeRegistration runtimeReg = getRootRuntimeBeanRegistratorWrapper().register(altoProvider);
- // Wrap toaster as AutoCloseable and close registrations to md-sal at
- // close(). The close method is where you would generally clean up
- // thread pools
- // etc.
final class AutoCloseableAlto implements AutoCloseable {
-
@Override
public void close() throws Exception {
rpcRegistration.close();
- opendaylightAlto.close();
+ runtimeReg.close();
+ altoProvider.close();
}
}
+++ /dev/null
-package org.opendaylight.yang.gen.v1.urn.opendaylight.alto.provider.impl.rev141119;
-
-import com.google.common.base.Function;
-import com.google.common.base.Optional;
-import com.google.common.util.concurrent.AsyncFunction;
-import com.google.common.util.concurrent.FutureCallback;
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
-import org.opendaylight.controller.config.yang.config.alto_provider.impl.AltoProviderRuntimeMXBean;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
-import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
-import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.sal.binding.api.NotificationProviderService;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpPrefix;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Prefix;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.*;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.filtered.network.map.service.output.FilteredNetworkMapService;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.filtered.network.map.service.output.FilteredNetworkMapServiceBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.resources.NetworkMaps;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.resources.NetworkMapsBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.resources.network.maps.NetworkMap;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.resources.network.maps.NetworkMapBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.resources.network.maps.NetworkMapKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.network.map.Map;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.network.map.MapBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.EndpointAddressType;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.PidName;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.ResourceId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.TagString;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.endpoint.address.group.EndpointAddressGroup;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.endpoint.address.group.EndpointAddressGroupBuilder;
-import org.opendaylight.yangtools.yang.binding.DataObject;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.opendaylight.yangtools.yang.common.RpcResult;
-import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-import java.util.concurrent.atomic.AtomicLong;
-
-public class OpendaylightAlto implements AltoServiceService,
- AltoProviderRuntimeMXBean, DataChangeListener, AutoCloseable {
-
- private static final Logger LOG = LoggerFactory
- .getLogger(OpendaylightAlto.class);
-
- public static final InstanceIdentifier<Resources> ALTO_IID = InstanceIdentifier
- .builder(Resources.class).build();
-
- // Currently we don't have any notifications.
- private NotificationProviderService notificationProvider;
- private DataBroker dataProvider;
-
- private final ExecutorService executor;
-
- // dummy state data example
- private final AtomicLong toastsMade = new AtomicLong(0);
-
- public OpendaylightAlto() {
- executor = Executors.newFixedThreadPool(1);
- }
-
- public void setNotificationProvider(
- final NotificationProviderService salService) {
- this.notificationProvider = salService;
- }
-
- public void setDataProvider(final DataBroker salDataProvider) {
- this.dataProvider = salDataProvider;
- setResourcesStatusUp(null);
- }
-
- /**
- * Implemented from the AutoCloseable interface. Delete all resources.
- */
- @Override
- public void close() throws ExecutionException, InterruptedException {
- // When we close this service we need to shutdown our executor!
- executor.shutdown();
-
- if (dataProvider != null) {
- WriteTransaction tx = dataProvider.newWriteOnlyTransaction();
- tx.delete(LogicalDatastoreType.OPERATIONAL, ALTO_IID);
- Futures.addCallback(tx.submit(), new FutureCallback<Void>() {
- @Override
- public void onSuccess(final Void result) {
- LOG.debug("Delete ALTO commit result: " + result);
- }
-
- @Override
- public void onFailure(final Throwable t) {
- LOG.error("Delete of ALTO failed", t);
- }
- });
- }
- }
-
- private Resources buildResources() {
- return new ResourcesBuilder().setNetworkMaps(buildDummyNetworkMaps())
- .setNetworkMaps(buildDummyNetworkMaps()).build();
- }
-
- /*
- * builds a dummy container networkmaps
- */
- private NetworkMaps buildDummyNetworkMaps() {
- ResourceId dummyResourceId = new ResourceId("my-dummy-net-map-1");
-
- PidName pid1 = new PidName("PID1");
- PidName pid2 = new PidName("PID2");
- PidName pid3 = new PidName("PID3");
-
- EndpointAddressType ipv4Type = new EndpointAddressType(
- EndpointAddressType.Enumeration.Ipv4);
- EndpointAddressType ipv6Type = new EndpointAddressType(
- EndpointAddressType.Enumeration.Ipv6);
-
- /* for PID1 */
- List<IpPrefix> pid1list = new ArrayList<>();
- pid1list.add(new IpPrefix(new Ipv4Prefix("192.0.2.0/24")));
- pid1list.add(new IpPrefix(new Ipv4Prefix("198.51.100.0/25")));
-
- EndpointAddressGroup eag1 = new EndpointAddressGroupBuilder()
- .setAddressType(ipv4Type).setEndpointPrefix(pid1list).build();
-
- List<EndpointAddressGroup> eagList1 = new ArrayList<>();
- eagList1.add(eag1);
-
- Map dummyMap1 = new MapBuilder().setPid(pid1)
- .setEndpointAddressGroup(eagList1).build();
-
- /* for PID2 */
- List<IpPrefix> pid2list = new ArrayList<>();
- pid2list.add(new IpPrefix(new Ipv4Prefix("198.51.100.128/25")));
-
- EndpointAddressGroup eag2 = new EndpointAddressGroupBuilder()
- .setAddressType(ipv4Type).setEndpointPrefix(pid2list).build();
-
- List<EndpointAddressGroup> eagList2 = new ArrayList<>();
- eagList2.add(eag2);
- Map dummyMap2 = new MapBuilder().setPid(pid2)
- .setEndpointAddressGroup(eagList2).build();
-
- /* for PID3 */
- List<IpPrefix> pid3ipv4List = new ArrayList<>();
- pid3ipv4List.add(new IpPrefix(new Ipv4Prefix("0.0.0.0/0")));
- EndpointAddressGroup eag3ipv4 = new EndpointAddressGroupBuilder()
- .setAddressType(ipv4Type).setEndpointPrefix(pid3ipv4List).build();
-
- List<IpPrefix> pid3ipv6List = new ArrayList<>();
- pid3ipv6List.add(new IpPrefix(new Ipv6Prefix("::/0")));
- EndpointAddressGroup eag3ipv6 = new EndpointAddressGroupBuilder()
- .setAddressType(ipv6Type).setEndpointPrefix(pid3ipv6List).build();
-
- List<EndpointAddressGroup> eagList3 = new ArrayList<>();
- eagList3.add(eag3ipv4);
- eagList3.add(eag3ipv6);
- Map dummyMap3 = new MapBuilder().setPid(pid3)
- .setEndpointAddressGroup(eagList3).build();
-
- /* put together default dummy net map */
- List<Map> dummyListMap = new ArrayList<>();
- dummyListMap.add(dummyMap1);
- dummyListMap.add(dummyMap2);
- dummyListMap.add(dummyMap3);
-
- NetworkMapBuilder dummyNetworkMapBuilder = new NetworkMapBuilder();
- dummyNetworkMapBuilder.setResourceId(dummyResourceId)
- .setTag(new TagString("dummyv01")).setMap(dummyListMap);
-
- List<NetworkMap> dummyListNetworkMap = new ArrayList<>();
- dummyListNetworkMap.add(dummyNetworkMapBuilder.build());
-
- /* wrap with network-maps container */
- return new NetworkMapsBuilder().setNetworkMap(dummyListNetworkMap)
- .build();
- }
-
- /**
- * Implemented from the DataChangeListener interface.
- */
- @Override
- public void onDataChanged(
- final AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
- DataObject dataObject = change.getUpdatedSubtree();
- if (dataObject instanceof Resources) {
- Resources altoResources = (Resources) dataObject;
- LOG.info("onDataChanged - new ALTO config: {}", altoResources);
- }
- }
-
- /* dummy example state data TODO */
-
- /**
- * JMX RPC call implemented from the AltoProviderRuntimeMXBean interface.
- */
- @Override
- public void clearToastsMade() {
- LOG.info("clearToastsMade");
- toastsMade.set(0);
- }
-
- /**
- * Accesssor method implemented from the ToasterProviderRuntimeMXBean
- * interface.
- */
- @Override
- public Long getToastsMade() {
- return toastsMade.get();
- }
-
- private void setResourcesStatusUp(
- final Function<Boolean, Void> resultCallback) {
-
- WriteTransaction tx = dataProvider.newWriteOnlyTransaction();
- tx.put(LogicalDatastoreType.OPERATIONAL, ALTO_IID, buildResources());
-
- Futures.addCallback(tx.submit(), new FutureCallback<Void>() {
- @Override
- public void onSuccess(final Void result) {
- notifyCallback(true);
- }
-
- @Override
- public void onFailure(final Throwable t) {
- // We shouldn't get an OptimisticLockFailedException (or any ex)
- // as no
- // other component should be updating the operational state.
- LOG.error("Failed to update toaster status", t);
-
- notifyCallback(false);
- }
-
- void notifyCallback(final boolean result) {
- if (resultCallback != null) {
- resultCallback.apply(result);
- }
- }
- });
- }
-
- @Override
- public Future<RpcResult<EndpointCostServiceOutput>> endpointCostService(
- EndpointCostServiceInput input) {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public Future<RpcResult<FilteredCostMapServiceOutput>> filteredCostMapService(
- FilteredCostMapServiceInput input) {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public Future<RpcResult<FilteredNetworkMapServiceOutput>> filteredNetworkMapService(
- final FilteredNetworkMapServiceInput input) {
-
- ResourceId rid = input.getResourceId();
- NetworkMapKey networkMapKey = new NetworkMapKey(rid);
-
- final ReadOnlyTransaction tx = dataProvider.newReadOnlyTransaction();
- ListenableFuture<Optional<NetworkMap>> readFuture = tx.read(
- LogicalDatastoreType.OPERATIONAL, ALTO_IID.child(NetworkMaps.class)
- .child(NetworkMap.class, networkMapKey));
-
- final ListenableFuture<RpcResult<FilteredNetworkMapServiceOutput>> futureResult = Futures
- .transform(
- readFuture,
- new AsyncFunction<Optional<NetworkMap>, RpcResult<FilteredNetworkMapServiceOutput>>() {
-
- @Override
- public ListenableFuture<RpcResult<FilteredNetworkMapServiceOutput>> apply(
- Optional<NetworkMap> networkMapData) throws Exception {
-
- ResourceId networkMapId = new ResourceId(
- "ResourceID Not Available");
- TagString networkMapTag = new TagString(
- "Tag Not Available");
-
- if (networkMapData.isPresent()) {
- networkMapId = ((NetworkMap) networkMapData.get())
- .getResourceId();
- networkMapTag = ((NetworkMap) networkMapData.get())
- .getTag();
- }
-
- LOG.info("Read network map rid: {}", networkMapId);
- LOG.info("Read network map tag: {}", networkMapTag);
-
- List<PidName> pidList = input.getPids();
-
- List<Map> networkMapMap = networkMapData.get().getMap();
- List<Map> filteredMap = new ArrayList<>();
-
- for (Map m : networkMapMap) {
- PidName pid = m.getPid();
- if (pidList.contains(pid)) {
- filteredMap.add(m);
- }
- }
-
- FilteredNetworkMapService serviceResult = new FilteredNetworkMapServiceBuilder()
- .setResourceId(networkMapId).setTag(networkMapTag)
- .setMap(filteredMap).build();
-
- FilteredNetworkMapServiceOutput serviceOutput = new FilteredNetworkMapServiceOutputBuilder()
- .setFilteredNetworkMapService(serviceResult)
- .build();
-
- return Futures.immediateFuture(RpcResultBuilder
- .<FilteredNetworkMapServiceOutput> success()
- .withResult(serviceOutput).build());
- }
- });
-
- return futureResult;
- }
-}
--- /dev/null
+{"meta":{"vtag":{"resource-id":"my-default-network-map","tag":"da65eca2eb7a10ce8b059740b0b2e3f8eb1d4785"}},"network-map":{"PID1":{"ipv4": ["192.0.2.0/24","198.51.100.0/25"]},"PID2":{"ipv4": ["198.51.100.128/25"]},"PID3":{"ipv4": ["0.0.0.0/0"],"ipv6": ["::/0"]}}}
+++ /dev/null
-package org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.alto.provider.impl.rev141119;
-import java.util.concurrent.Future;
-import org.opendaylight.yangtools.yang.binding.RpcService;
-import org.opendaylight.yangtools.yang.common.RpcResult;
-
-
-/**
- * Interface for implementing the following YANG RPCs defined in module <b>alto-provider-impl</b>
- * <br>(Source path: <i>META-INF/yang/alto-provider-impl.yang</i>):
- * <pre>
- * rpc clear-toasts-made {
- * "JMX call to clear the toasts-made counter.";
- * input {
- * leaf context-instance {
- * type instance-identifier;
- * }
- * }
- *
- * status CURRENT;
- * }
- * </pre>
- *
- */
-public interface AltoProviderImplService
- extends
- RpcService
-{
-
-
-
-
- /**
- * JMX call to clear the toasts-made counter.
- *
- */
- Future<RpcResult<java.lang.Void>> clearToastsMade(ClearToastsMadeInput input);
-
-}
-
+++ /dev/null
-package org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.alto.provider.impl.rev141119;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.rpc.context.rev130617.RpcContextRef;
-import org.opendaylight.yangtools.yang.common.QName;
-import org.opendaylight.yangtools.yang.binding.DataObject;
-import org.opendaylight.yangtools.yang.binding.Augmentable;
-
-
-/**
- * <p>This class represents the following YANG schema fragment defined in module <b>alto-provider-impl</b>
- * <br>(Source path: <i>META-INF/yang/alto-provider-impl.yang</i>):
- * <pre>
- * container input {
- * leaf context-instance {
- * type instance-identifier;
- * }
- * uses rpc-context-ref {
- * refine (urn:opendaylight:params:xml:ns:yang:controller:config:alto-provider:impl?revision=2014-11-19)context-instance {
- * leaf context-instance {
- * type instance-identifier;
- * }
- * }
- * }
- * }
- * </pre>
- * The schema path to identify an instance is
- * <i>alto-provider-impl/clear-toasts-made/input</i>
- *
- * <p>To create instances of this class use {@link org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.alto.provider.impl.rev141119.ClearToastsMadeInputBuilder}.
- * @see org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.alto.provider.impl.rev141119.ClearToastsMadeInputBuilder
- *
- */
-public interface ClearToastsMadeInput
- extends
- RpcContextRef,
- DataObject,
- Augmentable<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.alto.provider.impl.rev141119.ClearToastsMadeInput>
-{
-
-
-
- public static final QName QNAME = org.opendaylight.yangtools.yang.common.QName.cachedReference(org.opendaylight.yangtools.yang.common.QName.create("urn:opendaylight:params:xml:ns:yang:controller:config:alto-provider:impl","2014-11-19","input"));
-
-
-}
-
+++ /dev/null
-package org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.alto.provider.impl.rev141119;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import java.util.Collections;
-import java.util.Map;
-import org.opendaylight.yangtools.yang.binding.DataObject;
-import java.util.HashMap;
-import org.opendaylight.yangtools.concepts.Builder;
-import org.opendaylight.yangtools.yang.binding.Augmentation;
-
-
-/**
- * Class that builds {@link org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.alto.provider.impl.rev141119.ClearToastsMadeInput} instances.
- *
- * @see org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.alto.provider.impl.rev141119.ClearToastsMadeInput
- *
- */
-public class ClearToastsMadeInputBuilder implements Builder <org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.alto.provider.impl.rev141119.ClearToastsMadeInput> {
-
- private InstanceIdentifier<?> _contextInstance;
-
- Map<java.lang.Class<? extends Augmentation<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.alto.provider.impl.rev141119.ClearToastsMadeInput>>, Augmentation<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.alto.provider.impl.rev141119.ClearToastsMadeInput>> augmentation = new HashMap<>();
-
- public ClearToastsMadeInputBuilder() {
- }
- public ClearToastsMadeInputBuilder(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.rpc.context.rev130617.RpcContextRef arg) {
- this._contextInstance = arg.getContextInstance();
- }
-
- public ClearToastsMadeInputBuilder(ClearToastsMadeInput base) {
- this._contextInstance = base.getContextInstance();
- if (base instanceof ClearToastsMadeInputImpl) {
- ClearToastsMadeInputImpl _impl = (ClearToastsMadeInputImpl) base;
- this.augmentation = new HashMap<>(_impl.augmentation);
- }
- }
-
- /**
- *Set fields from given grouping argument. Valid argument is instance of one of following types:
- * <ul>
- * <li>org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.rpc.context.rev130617.RpcContextRef</li>
- * </ul>
- *
- * @param arg grouping object
- * @throws IllegalArgumentException if given argument is none of valid types
- */
- public void fieldsFrom(DataObject arg) {
- boolean isValidArg = false;
- if (arg instanceof org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.rpc.context.rev130617.RpcContextRef) {
- this._contextInstance = ((org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.rpc.context.rev130617.RpcContextRef)arg).getContextInstance();
- isValidArg = true;
- }
- if (!isValidArg) {
- throw new IllegalArgumentException(
- "expected one of: [org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.rpc.context.rev130617.RpcContextRef] \n" +
- "but was: " + arg
- );
- }
- }
-
- public InstanceIdentifier<?> getContextInstance() {
- return _contextInstance;
- }
-
- @SuppressWarnings("unchecked")
- public <E extends Augmentation<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.alto.provider.impl.rev141119.ClearToastsMadeInput>> E getAugmentation(java.lang.Class<E> augmentationType) {
- if (augmentationType == null) {
- throw new IllegalArgumentException("Augmentation Type reference cannot be NULL!");
- }
- return (E) augmentation.get(augmentationType);
- }
-
- public ClearToastsMadeInputBuilder setContextInstance(InstanceIdentifier<?> value) {
- this._contextInstance = value;
- return this;
- }
-
- public ClearToastsMadeInputBuilder addAugmentation(java.lang.Class<? extends Augmentation<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.alto.provider.impl.rev141119.ClearToastsMadeInput>> augmentationType, Augmentation<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.alto.provider.impl.rev141119.ClearToastsMadeInput> augmentation) {
- if (augmentation == null) {
- return removeAugmentation(augmentationType);
- }
- this.augmentation.put(augmentationType, augmentation);
- return this;
- }
-
- public ClearToastsMadeInputBuilder removeAugmentation(java.lang.Class<? extends Augmentation<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.alto.provider.impl.rev141119.ClearToastsMadeInput>> augmentationType) {
- this.augmentation.remove(augmentationType);
- return this;
- }
-
- public ClearToastsMadeInput build() {
- return new ClearToastsMadeInputImpl(this);
- }
-
- private static final class ClearToastsMadeInputImpl implements ClearToastsMadeInput {
-
- public java.lang.Class<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.alto.provider.impl.rev141119.ClearToastsMadeInput> getImplementedInterface() {
- return org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.alto.provider.impl.rev141119.ClearToastsMadeInput.class;
- }
-
- private final InstanceIdentifier<?> _contextInstance;
-
- private Map<java.lang.Class<? extends Augmentation<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.alto.provider.impl.rev141119.ClearToastsMadeInput>>, Augmentation<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.alto.provider.impl.rev141119.ClearToastsMadeInput>> augmentation = new HashMap<>();
-
- private ClearToastsMadeInputImpl(ClearToastsMadeInputBuilder base) {
- this._contextInstance = base.getContextInstance();
- switch (base.augmentation.size()) {
- case 0:
- this.augmentation = Collections.emptyMap();
- break;
- case 1:
- final Map.Entry<java.lang.Class<? extends Augmentation<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.alto.provider.impl.rev141119.ClearToastsMadeInput>>, Augmentation<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.alto.provider.impl.rev141119.ClearToastsMadeInput>> e = base.augmentation.entrySet().iterator().next();
- this.augmentation = Collections.<java.lang.Class<? extends Augmentation<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.alto.provider.impl.rev141119.ClearToastsMadeInput>>, Augmentation<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.alto.provider.impl.rev141119.ClearToastsMadeInput>>singletonMap(e.getKey(), e.getValue());
- break;
- default :
- this.augmentation = new HashMap<>(base.augmentation);
- }
- }
-
- @Override
- public InstanceIdentifier<?> getContextInstance() {
- return _contextInstance;
- }
-
- @SuppressWarnings("unchecked")
- @Override
- public <E extends Augmentation<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.alto.provider.impl.rev141119.ClearToastsMadeInput>> E getAugmentation(java.lang.Class<E> augmentationType) {
- if (augmentationType == null) {
- throw new IllegalArgumentException("Augmentation Type reference cannot be NULL!");
- }
- return (E) augmentation.get(augmentationType);
- }
-
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = 1;
- result = prime * result + ((_contextInstance == null) ? 0 : _contextInstance.hashCode());
- result = prime * result + ((augmentation == null) ? 0 : augmentation.hashCode());
- return result;
- }
-
- @Override
- public boolean equals(java.lang.Object obj) {
- if (this == obj) {
- return true;
- }
- if (!(obj instanceof DataObject)) {
- return false;
- }
- if (!org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.alto.provider.impl.rev141119.ClearToastsMadeInput.class.equals(((DataObject)obj).getImplementedInterface())) {
- return false;
- }
- org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.alto.provider.impl.rev141119.ClearToastsMadeInput other = (org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.alto.provider.impl.rev141119.ClearToastsMadeInput)obj;
- if (_contextInstance == null) {
- if (other.getContextInstance() != null) {
- return false;
- }
- } else if(!_contextInstance.equals(other.getContextInstance())) {
- return false;
- }
- if (getClass() == obj.getClass()) {
- // Simple case: we are comparing against self
- ClearToastsMadeInputImpl otherImpl = (ClearToastsMadeInputImpl) obj;
- if (augmentation == null) {
- if (otherImpl.augmentation != null) {
- return false;
- }
- } else if(!augmentation.equals(otherImpl.augmentation)) {
- return false;
- }
- } else {
- // Hard case: compare our augments with presence there...
- for (Map.Entry<java.lang.Class<? extends Augmentation<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.alto.provider.impl.rev141119.ClearToastsMadeInput>>, Augmentation<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.alto.provider.impl.rev141119.ClearToastsMadeInput>> e : augmentation.entrySet()) {
- if (!e.getValue().equals(other.getAugmentation(e.getKey()))) {
- return false;
- }
- }
- // .. and give the other one the chance to do the same
- if (!obj.equals(this)) {
- return false;
- }
- }
- return true;
- }
-
- @Override
- public java.lang.String toString() {
- java.lang.StringBuilder builder = new java.lang.StringBuilder ("ClearToastsMadeInput [");
- boolean first = true;
-
- if (_contextInstance != null) {
- if (first) {
- first = false;
- } else {
- builder.append(", ");
- }
- builder.append("_contextInstance=");
- builder.append(_contextInstance);
- }
- if (first) {
- first = false;
- } else {
- builder.append(", ");
- }
- builder.append("augmentation=");
- builder.append(augmentation.values());
- return builder.append(']').toString();
- }
- }
-
-}
+++ /dev/null
-package org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.alto.provider.impl.rev141119;
-import org.opendaylight.yangtools.yang.common.QName;
-import org.opendaylight.yangtools.yang.binding.BaseIdentity;
-
-
-/**
- * <p>This class represents the following YANG schema fragment defined in module <b>alto-provider-impl</b>
- * <br>(Source path: <i>META-INF/yang/alto-provider-impl.yang</i>):
- * <pre>
- * identity clear-toasts-made-rpc {
- * status CURRENT;
- * }
- * </pre>
- * The schema path to identify an instance is
- * <i>alto-provider-impl/clear-toasts-made-rpc</i>
- *
- */
-public abstract class ClearToastsMadeRpc extends BaseIdentity
- {
- public static final QName QNAME = org.opendaylight.yangtools.yang.common.QName.cachedReference(org.opendaylight.yangtools.yang.common.QName.create("urn:opendaylight:params:xml:ns:yang:controller:config:alto-provider:impl","2014-11-19","clear-toasts-made-rpc"));
-
- public ClearToastsMadeRpc() {
-
-
- }
-
-
-
-
-
-
-
-
-
-
-}
-
module alto-provider-impl {
yang-version 1;
-
+
namespace "urn:opendaylight:params:xml:ns:yang:controller:config:alto-provider:impl";
// TODO: replace with IANA namespace when assigned
prefix config;
revision-date 2013-04-05;
}
-
+
import opendaylight-md-sal-binding {
prefix mdsal;
revision-date 2013-10-28;
organization "ALTO WG";
contact "alto@ietf.org";
- description
+ description
"This module defines the implementation model for the ALTO services
using restconf. Note this is not interop with RFC7285.";
revision 2014-11-19 {
description "Initial version for ODL.";
}
-
-
// This is the definition of the service implementation as a module identity
identity alto-provider-impl {
config:java-name-prefix AltoProvider;
}
- // Augments the 'configuration' choice node under modules/module.
+ // Augments the 'configuration' choice node under modules/module.
augment "/config:modules/config:module/config:configuration" {
case alto-provider-impl {
when "/config:modules/config:module/config:type = 'alto-provider-impl'";
}
}
- //wires in the data-broker service
+ //wires in the data-broker service
container data-broker {
uses config:service-ref {
refine type {
config:required-identity mdsal:binding-async-data-broker;
}
}
- }
+ }
}
}
augment "/config:modules/config:module/config:state" {
case alto-provider-impl {
when "/config:modules/config:module/config:type = 'alto-provider-impl'";
-
+
leaf toasts-made {
type uint32;
}
-
- rpcx:rpc-context-instance "clear-toasts-made-rpc";
- }
- }
- identity clear-toasts-made-rpc;
-
- rpc clear-toasts-made {
- description
- "JMX call to clear the toasts-made counter.";
-
- input {
- uses rpcx:rpc-context-ref {
- refine context-instance {
- rpcx:rpc-context-instance clear-toasts-made-rpc;
- }
- }
+ rpcx:rpc-context-instance "clear-toasts-made-rpc";
}
}
-
}
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
-
- <parent>
- <groupId>org.opendaylight.alto</groupId>
- <artifactId>alto-parent</artifactId>
- <version>1.0.0-SNAPSHOT</version>
- <relativePath>../..</relativePath>
- </parent>
-
- <groupId>org.opendaylight.alto</groupId>
- <artifactId>services.api</artifactId>
- <packaging>bundle</packaging>
-
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-checkstyle-plugin</artifactId>
- <version>${checkstyle.version}</version>
-
- <executions>
- <execution>
- <phase>process-sources</phase>
- <goals>
- <goal>check</goal>
- </goals>
- </execution>
- </executions>
-
- <configuration>
- <failsOnError>true</failsOnError>
- <configLocation>controller/checkstyle.xml</configLocation>
- <consoleOutput>true</consoleOutput>
- <includeTestSourceDirectory>true</includeTestSourceDirectory>
- <sourceDirectory>${project.basedir}</sourceDirectory>
- <excludes>**\/target\/,**\/bin\/,**\/third-party,**\/yang-gen-sal</excludes>
- </configuration>
-
- <dependencies>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>checkstyle</artifactId>
- <version>${controller.checkstyle.version}</version>
- </dependency>
- </dependencies>
- </plugin>
-
- <plugin>
- <groupId>org.apache.felix</groupId>
- <artifactId>maven-bundle-plugin</artifactId>
- <version>${bundle.plugin.version}</version>
- <extensions>true</extensions>
- <configuration>
- <instructions>
- <Import-Package>
- org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924,
- </Import-Package>
- <Export-Package>
- org.opendaylight.alto.services.api.*;
- </Export-Package>
- <Bundle-Name>${project.groupId}.${project.artifactId}</Bundle-Name>
- </instructions>
- </configuration>
- </plugin>
-
- </plugins>
- </build>
-
- <dependencies>
-
- <dependency>
- <groupId>${project.groupId}</groupId>
- <artifactId>alto-model</artifactId>
- <version>${project.version}</version>
- </dependency>
-
- </dependencies>
-</project>
-
+++ /dev/null
-
-package org.opendaylight.alto.services.api;
-
-import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.IRD;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.ird.data.Resources;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.ResourceId;
-
-public interface IRDService {
-
- public IRD getIRD();
-
- public boolean register(ResourceId id, Resources resource);
-
- public void unregister(ResourceId id);
-
-}
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
-
- <parent>
- <groupId>org.opendaylight.alto</groupId>
- <artifactId>alto-parent</artifactId>
- <version>1.0.0-SNAPSHOT</version>
- <relativePath>../..</relativePath>
- </parent>
-
- <groupId>org.opendaylight.alto</groupId>
- <artifactId>services.ext</artifactId>
- <packaging>pom</packaging>
-
- <modules>
- <module>fs-map</module>
- </modules>
-
-</project>
-
<parent>
<groupId>org.opendaylight.alto</groupId>
- <artifactId>services.ext</artifactId>
+ <artifactId>alto-parent</artifactId>
<version>1.0.0-SNAPSHOT</version>
- <relativePath>..</relativePath>
+ <relativePath>../</relativePath>
</parent>
<groupId>org.opendaylight.alto</groupId>
- <artifactId>services.ext.fs-map</artifactId>
+ <artifactId>alto-services</artifactId>
<packaging>bundle</packaging>
<build>
<plugins>
-
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<configuration>
<instructions>
<Import-Package>
- org.opendaylight.alto.commons.types.rfc7285,
- org.opendaylight.alto.services.api,
+ org.opendaylight.yang.gen.v1.urn.opendaylight.alto.*,
org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924,
- org.slf4j,
+ org.opendaylight.yangtools.yang.common,
+ org.opendaylight.yangtools.yang.binding,
+ org.opendaylight.controller.md.sal.binding.api,
+ org.opendaylight.controller.sal.binding.api,
+ org.osgi.framework
</Import-Package>
<Export-Package>
- org.opendaylight.alto.services.ext.fsmap;
+ org.opendaylight.alto.services;
</Export-Package>
- <Bundle-Name>${project.groupId}.${project.artifactId}</Bundle-Name>
+ <Bundle-Activator>org.opendaylight.alto.services.AltoService</Bundle-Activator>
</instructions>
</configuration>
</plugin>
</build>
<dependencies>
-
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>alto-model</artifactId>
<version>${project.version}</version>
</dependency>
-
<dependency>
- <groupId>${project.groupId}</groupId>
- <artifactId>services.api</artifactId>
- <version>${project.version}</version>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>sal-binding-api</artifactId>
+ <version>${mdsal.version}</version>
</dependency>
-
<dependency>
- <groupId>${project.groupId}</groupId>
- <artifactId>commons</artifactId>
- <version>${project.version}</version>
+ <groupId>org.osgi</groupId>
+ <artifactId>org.osgi.core</artifactId>
+ <version>${osgi.core.version}</version>
</dependency>
-
</dependencies>
</project>
--- /dev/null
+package org.opendaylight.alto.services;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.ExecutionException;
+
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.ReadTransaction;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.controller.sal.binding.api.AbstractBrokerAwareActivator;
+import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
+import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ConsumerContext;
+import org.opendaylight.controller.sal.binding.api.BindingAwareConsumer;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Uri;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.resources.IRDBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.resources.NetworkMaps;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.resources.network.maps.NetworkMap;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.resources.network.maps.NetworkMapKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.CostMetric;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.CostMode;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.CostTypeName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.IRD;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.MediaType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.ResourceId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.cost.types.CostTypes;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.cost.types.CostTypesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.cost.types.CostTypesKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.ird.MetaBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.ird.data.Resources;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.ird.data.ResourcesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.ird.data.ResourcesKey;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.osgi.framework.BundleContext;
+
+import com.google.common.base.Optional;
+
+public class AltoService extends AbstractBrokerAwareActivator implements BindingAwareConsumer {
+ private DataBroker dataBroker;
+
+ @Override
+ public void onSessionInitialized(ConsumerContext session) {
+ this.dataBroker = session.getSALService(DataBroker.class);
+ }
+
+ public NetworkMap getNetworkMap(ResourceId resourceId) {
+ ReadTransaction tx = dataBroker.newReadOnlyTransaction();
+ Optional<NetworkMap> networkMap = null;
+ try {
+ InstanceIdentifier<NetworkMap> npIID = InstanceIdentifier
+ .builder(org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.Resources.class)
+ .child(NetworkMaps.class)
+ .child(NetworkMap.class, new NetworkMapKey(new ResourceId(resourceId)))
+ .build();
+ networkMap = tx.read(LogicalDatastoreType.OPERATIONAL, npIID).get();
+ } catch (InterruptedException | ExecutionException e) {
+ e.printStackTrace();
+ }
+
+ return networkMap.get();
+ }
+
+ public IRD getIRD() {
+ IRDBuilder irdb = new IRDBuilder();
+ MetaBuilder mb = new MetaBuilder();
+
+ List<CostTypes> cost_types = new ArrayList<CostTypes>();
+ CostTypesBuilder cb = new CostTypesBuilder();
+ CostTypeName name = new CostTypeName("num-routing");
+ CostMetric metric = new CostMetric(CostMetric.Enumeration.Routingcost);
+ CostMode mode = CostMode.Numerical;
+ CostTypesKey ckey = new CostTypesKey(name);
+
+ cost_types.add(cb.setCostTypeName(name).setCostMetric(metric).setCostMode(mode).setKey(ckey).build());
+ irdb.setMeta(mb.setCostTypes(cost_types).build());
+
+ List<Resources> resources = new ArrayList<Resources>();
+ ResourcesBuilder rb = new ResourcesBuilder();
+
+ MediaType mt = new MediaType(MediaType.Enumeration.AltoNetworkmap);
+ Uri uri = new Uri("http://localhost:8080/controller/nb/v2/networkmap/default");
+ ResourcesKey rkey = new ResourcesKey(new ResourceId("my-default-networkmap"));
+
+ resources.add(rb.setMediaType(mt).setUri(uri).setKey(rkey).build());
+ irdb.setResources(resources);
+
+ return irdb.build();
+ }
+
+ @Override
+ protected void onBrokerAvailable(BindingAwareBroker broker, BundleContext context) {
+ broker.registerConsumer(this);
+ }
+}
<dependency>
<groupId>${project.groupId}</groupId>
- <artifactId>commons</artifactId>
+ <artifactId>alto-commons</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
- <artifactId>services.api</artifactId>
+ <artifactId>alto-services</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>alto-provider</artifactId>
<version>${project.version}</version>
</dependency>
<repository>mvn:org.opendaylight.controller/features-mdsal/${mdsal.version}/xml/features</repository>
<repository>mvn:org.opendaylight.controller/features-restconf/${mdsal.version}/xml/features</repository>
+ <feature name='odl-alto-all' version='${project.version}' description='OpenDaylight :: alto :: all '>
+ <feature version='${project.version}'>odl-alto-provider</feature>
+ <feature version='${project.version}'>odl-alto-northbound</feature>
+ </feature>
+
<feature name='odl-alto-model' version='${project.version}' description='OpenDaylight :: alto :: model '>
<feature version='${yangtools.version}'>odl-yangtools-models</feature>
<bundle>mvn:org.opendaylight.alto/alto-model/${project.version}</bundle>
</feature>
- <feature name='odl-alto-jackson-dependency' version='${project.version}' description='Opendaylight :: alto :: jackson_dependency'>
- <bundle>mvn:com.fasterxml.jackson.core/jackson-annotations/${jackson.version}</bundle>
- <bundle>mvn:com.fasterxml.jackson.core/jackson-core/${jackson.version}</bundle>
- <bundle>mvn:com.fasterxml.jackson.core/jackson-databind/${jackson.version}</bundle>
- </feature>
-
- <feature name='odl-alto-utils' version='${project.version}' description='OpenDaylight :: alto :: utils'>
+ <feature name='odl-alto-commons' version='${project.version}' description='OpenDaylight :: alto :: commons'>
<feature version='${project.version}'>odl-alto-model</feature>
<feature version='${jackson.version}'>odl-base-jackson</feature>
- <bundle>mvn:org.opendaylight.alto/commons/${project.version}</bundle>
- <bundle>mvn:org.opendaylight.alto/services.api/${project.version}</bundle>
+ <bundle>mvn:org.opendaylight.alto/alto-commons/${project.version}</bundle>
+ </feature>
+
+ <feature name='odl-alto-provider' version='${project.version}' description='OpenDaylight :: alto :: provider'>
+ <feature version='${project.version}'>odl-alto-commons</feature>
+ <feature version='${mdsal.version}'>odl-mdsal-common</feature>
+ <feature version='${mdsal.version}'>odl-mdsal-broker</feature>
+ <feature version='${config.version}'>odl-config-api</feature>
+ <configfile finalname="configuration/default.networkmap">mvn:org.opendaylight.alto/alto-provider/${project.version}/xml/config</configfile>
+ <bundle>mvn:org.opendaylight.alto/alto-provider/${project.version}</bundle>
</feature>
- <feature name='odl-alto-extension' version='${project.version}' description='Opendaylight :: alto :: extension'>
- <feature version='${project.version}'>odl-alto-utils</feature>
- <bundle>mvn:org.opendaylight.alto/services.ext.fs-map/${project.version}</bundle>
+ <feature name='odl-alto-services' version='${project.version}' description='OpenDaylight :: alto :: services'>
+ <feature version='${project.version}'>odl-alto-commons</feature>
+ <feature version='${mdsal.version}'>odl-mdsal-common</feature>
+ <feature version='${mdsal.version}'>odl-mdsal-broker</feature>
+ <bundle>mvn:org.opendaylight.alto/alto-services/${project.version}</bundle>
</feature>
<feature name='odl-alto-northbound' version='${project.version}' description='Opendaylight :: alto :: northbound'>
- <feature version='${project.version}'>odl-alto-model</feature>
- <feature version='${project.version}'>odl-alto-utils</feature>
+ <feature version='${project.version}'>odl-alto-services</feature>
<feature version='${jersey.version}'>odl-base-jersey</feature>
- <feature>war</feature>
+ <feature version='${war.version}'>war</feature>
<feature version='${controller.commons.northbound.version}'>odl-adsal-northbound</feature>
<bundle>mvn:org.opendaylight.alto/alto-northbound/${project.version}</bundle>
</feature>
<groupId>org.opendaylight.odlparent</groupId>
<artifactId>odlparent</artifactId>
<version>1.5.0-SNAPSHOT</version>
- <relativePath></relativePath>
</parent>
<groupId>org.opendaylight.alto</groupId>
<name>alto</name> <!-- Used by Sonar to set project name -->
<packaging>pom</packaging>
- <!--
- <scm>
- <connection>scm:git:ssh://git.opendaylight.org:29418/sfc.git</connection>
- <developerConnection>scm:git:ssh://git.opendaylight.org:29418/sfc.git</developerConnection>
- <url>https://wiki.opendaylight.org/view/Service_Function_Chaining:Main</url>
- <tag>HEAD</tag>
- </scm>
- -->
-
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ <checkstyle.skip>true</checkstyle.skip>
+
<!-- Java Versions -->
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<yang.ext.version>2013.09.07.7-SNAPSHOT</yang.ext.version>
<config.version>0.3.0-SNAPSHOT</config.version>
<sal.version>0.7.1-SNAPSHOT</sal.version>
+ <war.version>3.0.1</war.version>
<mdsal.version>1.2.0-SNAPSHOT</mdsal.version>
<controller.model.version>1.2.0-SNAPSHOT</controller.model.version>
<build.helper.version>1.8</build.helper.version>
<powermock.version>1.5.6</powermock.version>
</properties>
+ <repositories>
+ <repository>
+ <releases>
+ <enabled>true</enabled>
+ <updatePolicy>never</updatePolicy>
+ </releases>
+ <snapshots>
+ <enabled>false</enabled>
+ </snapshots>
+ <id>opendaylight-mirror</id>
+ <name>opendaylight-mirror</name>
+ <url>http://nexus.opendaylight.org/content/groups/public/</url>
+ </repository>
+ <repository>
+ <releases>
+ <enabled>false</enabled>
+ </releases>
+ <snapshots>
+ <enabled>true</enabled>
+ </snapshots>
+ <id>opendaylight-snapshot</id>
+ <name>opendaylight-snapshot</name>
+ <url>http://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/</url>
+ </repository>
+ </repositories>
+
<distributionManagement>
- <!-- OpenDayLight Released artifact -->
<repository>
<id>opendaylight-release</id>
<url>http://nexus.opendaylight.org/content/repositories/opendaylight.release</url>
</repository>
- <!-- OpenDayLight Snapshot artifact -->
<snapshotRepository>
<id>opendaylight-snapshot</id>
<url>http://nexus.opendaylight.org/content/repositories/opendaylight.snapshot</url>
</snapshotRepository>
- <!-- Site deployment -->
- <!-- site>
- <id>website</id>
- <url>${sitedeploy}</url>
- </site -->
</distributionManagement>
<modules>
<module>alto-artifacts</module>
<module>features</module>
<module>alto-commons</module>
- <module>alto-services/api</module>
- <module>alto-services/ext</module>
+ <module>alto-services</module>
<!--
<module>alto-karaf</module>
-->