blob: f861159e54257e150b3dc4b64a896b0ceb5e9e1b [file] [log] [blame]
/*
* Copyright 2015-present Open Networking Laboratory
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.onosproject.provider.lldp.impl;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Maps;
import org.onosproject.core.ApplicationId;
import org.onosproject.net.Device;
import org.onosproject.net.config.Config;
import org.slf4j.Logger;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import static org.onosproject.provider.lldp.impl.LldpLinkProvider.DEFAULT_RULES;
import static org.slf4j.LoggerFactory.getLogger;
/**
* LinkDiscovery suppression config class.
*/
public class SuppressionConfig extends Config<ApplicationId> {
private static final String DEVICE_TYPES = "deviceTypes";
private static final String ANNOTATION = "annotation";
private static final ObjectMapper MAPPER = new ObjectMapper();
private static final List<Device.Type> DEFAULT_DEVICE_TYPES
= ImmutableList.copyOf(DEFAULT_RULES.getSuppressedDeviceType());
private final Logger log = getLogger(getClass());
/**
* Returns types of devices on which LinkDiscovery is suppressed.
*
* @return set of device types
*/
public Set<Device.Type> deviceTypes() {
return ImmutableSet.copyOf(getList(DEVICE_TYPES, Device.Type::valueOf, DEFAULT_DEVICE_TYPES));
}
/**
* Sets types of devices on which LinkDiscovery is suppressed.
*
* @param deviceTypes new set of device types; null to clear
* @return self
*/
public SuppressionConfig deviceTypes(Set<Device.Type> deviceTypes) {
return (SuppressionConfig) setOrClear(DEVICE_TYPES, deviceTypes);
}
/**
* Returns annotation of Ports on which LinkDiscovery is suppressed.
*
* @return key-value pairs of annotation
*/
public Map<String, String> annotation() {
ImmutableMap.Builder<String, String> builder = ImmutableMap.builder();
String jsonAnnotation = get(ANNOTATION, null);
if (jsonAnnotation == null || jsonAnnotation.isEmpty()) {
return ImmutableMap.of();
}
JsonNode annotationNode;
try {
annotationNode = MAPPER.readTree(jsonAnnotation);
} catch (IOException e) {
log.error("Failed to read JSON tree from: {}", jsonAnnotation);
return ImmutableMap.of();
}
if (annotationNode.isObject()) {
ObjectNode obj = (ObjectNode) annotationNode;
Iterator<Map.Entry<String, JsonNode>> it = obj.fields();
while (it.hasNext()) {
Map.Entry<String, JsonNode> entry = it.next();
final String key = entry.getKey();
final JsonNode value = entry.getValue();
if (value.isValueNode()) {
if (value.isNull()) {
builder.put(key, SuppressionRules.ANY_VALUE);
} else {
builder.put(key, value.asText());
}
} else {
log.warn("Encountered unexpected JSON field {} for annotation", entry);
}
}
} else {
log.error("Encountered unexpected JSONNode {} for annotation", annotationNode);
return ImmutableMap.of();
}
return builder.build();
}
/**
* Sets annotation of Ports on which LinkDiscovery is suppressed.
*
* @param annotation new key-value pair of annotation; null to clear
* @return self
*/
public SuppressionConfig annotation(Map<String, String> annotation) {
// ANY_VALUE should be null in JSON
Map<String, String> config = Maps.transformValues(annotation,
v -> (v == SuppressionRules.ANY_VALUE) ? null : v);
String jsonAnnotation = null;
try {
// TODO Store annotation as a Map instead of a String (which needs NetworkConfigRegistry modification)
jsonAnnotation = MAPPER.writeValueAsString(config);
} catch (JsonProcessingException e) {
log.error("Failed to write JSON from: {}", annotation);
}
return (SuppressionConfig) setOrClear(ANNOTATION, jsonAnnotation);
}
}