finalize alto-manager and add README.md file
[alto.git] / alto-manager / src / main / java / org / opendaylight / alto / manager / AltoCreate.java
1 package org.opendaylight.alto.manager;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 import org.apache.felix.gogo.commands.Argument;
7 import org.apache.felix.gogo.commands.Command;
8 import org.opendaylight.alto.commons.types.converter.RFC2ModelCostMapConverter;
9 import org.opendaylight.alto.commons.types.converter.RFC2ModelEndpointPropMapConverter;
10 import org.opendaylight.alto.commons.types.converter.RFC2ModelNetworkMapConverter;
11 import org.opendaylight.alto.commons.types.model150404.ModelCostMap;
12 import org.opendaylight.alto.commons.types.model150404.ModelEndpointPropertyMap;
13 import org.opendaylight.alto.commons.types.model150404.ModelJSONMapper;
14 import org.opendaylight.alto.commons.types.model150404.ModelNetworkMap;
15 import org.opendaylight.alto.commons.types.rfc7285.RFC7285CostMap;
16 import org.opendaylight.alto.commons.types.rfc7285.RFC7285JSONMapper;
17 import org.opendaylight.alto.commons.types.rfc7285.RFC7285NetworkMap;
18 import org.opendaylight.alto.manager.AltoManagerConstants.MAP_FORMAT_TYPE;
19 import org.slf4j.Logger;
20 import org.slf4j.LoggerFactory;
21
22 @Command(scope = "alto", name = "create", description = "Create resource by resource type and resource file")
23 public class AltoCreate extends AltoManager {
24   private static final Logger log = LoggerFactory.getLogger(AltoCreate.class);
25   private RFC7285JSONMapper rfcMapper = new RFC7285JSONMapper();
26   private ModelJSONMapper modelMapper = new ModelJSONMapper();
27   private RFC2ModelNetworkMapConverter networkMapConverter = new RFC2ModelNetworkMapConverter();
28   private RFC2ModelCostMapConverter costMapConverter = new RFC2ModelCostMapConverter();
29   private RFC2ModelEndpointPropMapConverter endpointPropConverter = new RFC2ModelEndpointPropMapConverter();
30   private MAP_FORMAT_TYPE format = MAP_FORMAT_TYPE.RFC;
31   
32   @Argument(index = 0, name = "resource-type", description = "Resource Type", required = true, multiValued = false)
33   String resourceType = null;
34
35   @Argument(index = 1, name = "resource-file", description = "Resource File", required = true, multiValued = false)
36   String resourceFile = null;
37   
38   public AltoCreate() {
39     super();
40   }
41   
42   @Override
43   protected Object doExecute() throws Exception {
44     if (networkMapType().equals(resourceType)) {
45       putNetworkMaps();
46     } else if (costMapType().equals(resourceType)) {
47       putCostMaps();
48     } else if (endpointPropertyMapType().equals(resourceType)) {
49       putEndpointPropertyMap();
50     } else {
51       throw new UnsupportedOperationException("Unsupported resource type \"" + resourceType + "\".");
52     }
53     return null;
54   }
55   
56   private void putNetworkMaps() throws Exception {
57     log.info("Loading network maps from " + this.resourceFile);
58     List<ModelNetworkMap> networkMaps = getYangNetworkMaps(readFromFile(resourceFile));
59     for (ModelNetworkMap map : networkMaps) {
60       log.info("Putting network map \"" + map.rid + "\"...");
61       String data = modelMapper.asJSON(map);
62       putMap(AltoManagerConstants.NETWORK_MAP_URL, map.rid, data);
63     }
64   }
65   
66   private List<ModelNetworkMap> getYangNetworkMaps(String data) throws Exception {
67     if (MAP_FORMAT_TYPE.RFC.equals(format)) {
68       List<ModelNetworkMap> modelNetworkMaps = new ArrayList<ModelNetworkMap>();
69       for (RFC7285NetworkMap networkMap : rfcMapper.asNetworkMapList(data)) {
70         modelNetworkMaps.add(networkMapConverter.convert(networkMap));
71       }
72       return modelNetworkMaps;
73     }
74     return modelMapper.asNetworkMapList(data);
75   }
76   
77   private void putCostMaps() throws Exception {
78     log.info("Loading cost map from " + this.resourceFile);
79     List<ModelCostMap> costMaps = getYangCostMaps(readFromFile(resourceFile));
80     for (ModelCostMap map : costMaps) {
81       log.info("Putting cost map " + map.rid + "...");
82       String data = modelMapper.asJSON(map);
83       putMap(AltoManagerConstants.COST_MAP_URL, map.rid, data);
84     }
85   }
86   
87   private List<ModelCostMap> getYangCostMaps(String data) throws Exception {
88     if (MAP_FORMAT_TYPE.RFC.equals(format)) {
89       List<ModelCostMap> modelCostMaps = new ArrayList<ModelCostMap>();
90       for (RFC7285CostMap costMap : rfcMapper.asCostMapList(data)) {
91         modelCostMaps.add(costMapConverter.convert(costMap));
92       }
93       return modelCostMaps;
94     }
95     return modelMapper.asCostMapList(data);
96   }
97   
98   private void putEndpointPropertyMap() throws Exception {
99     log.info("Loading endpoint property map from " + this.resourceFile);
100     ModelEndpointPropertyMap endpointPropMap = getYangEndpointPropMap(readFromFile(resourceFile));
101     String data = modelMapper.asJSON(endpointPropMap);
102     httpPut(AltoManagerConstants.ENDPOINT_PROP_MAP_URL, wrapdata(data));
103   }
104   
105   private ModelEndpointPropertyMap getYangEndpointPropMap(String data) throws Exception {
106     if (MAP_FORMAT_TYPE.RFC.equals(format)) {
107        return endpointPropConverter.convert(rfcMapper.asEndpointPropMap(data));
108     }
109     return modelMapper.asEndpointPropMap(data);
110   }
111   
112   private void putMap(String baseUrl, String resourceId, String data) throws Exception {
113     if (resourceId == null) {
114       throw new RuntimeException("No ResourceId Specified.");
115     }
116     httpPut(baseUrl + resourceId, wrapdata(data));
117   }
118   
119   private String wrapdata(String data) throws Exception {
120     if (endpointPropertyMapType().equals(resourceType)) {
121       return "{\"alto-service:" + resourceType  + "\":" + data + "}";
122     } else {
123       return "{\"alto-service:" + resourceType  + "\":[" + data + "]}";
124     }
125   }
126 }