blob: 467ccfcd2f526e4ab5ed22e4f44019d67a735319 [file] [log] [blame]
/*
* Copyright 2017-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.ovsdb.controller;
import com.google.common.collect.Maps;
import org.onosproject.net.DefaultAnnotations;
import org.onosproject.net.behaviour.QosDescription;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import static com.google.common.base.MoreObjects.toStringHelper;
import static com.google.common.base.Preconditions.checkNotNull;
import static org.onosproject.ovsdb.controller.OvsdbConstant.CBS;
import static org.onosproject.ovsdb.controller.OvsdbConstant.CIR;
import static org.onosproject.ovsdb.controller.OvsdbConstant.MAX_RATE;
import static org.onosproject.ovsdb.controller.OvsdbConstant.QOS_EGRESS_POLICER;
import static org.onosproject.ovsdb.controller.OvsdbConstant.QOS_EXTERNAL_ID_KEY;
import static org.onosproject.ovsdb.controller.OvsdbConstant.QOS_TYPE_PREFIX;
/**
* The class representing an OVSDB Qos.
* This class is immutable.
*/
public final class OvsdbQos {
private final String type;
private Optional<Map<Long, String>> queues;
private Map<String, String> otherConfigs;
private Map<String, String> externalIds;
/**
* Creates an OvsdbQos using the given inputs.
*
* @param type the type of the qos
* @param queues rate queues
* @param otherConfigs Key-value pairs for configuring rarely used features
* @param externalIds Key-value pairs for use by external frameworks, rather than by OVS itself
*/
private OvsdbQos(String type, Optional<Map<Long, String>> queues,
Map<String, String> otherConfigs,
Map<String, String> externalIds) {
this.type = checkNotNull(type);
this.queues = queues;
this.otherConfigs = otherConfigs;
this.externalIds = externalIds;
}
/**
* Returns the type of qos.
*
* @return the type of qos
*/
public String qosType() {
return type;
}
/**
* Returns the map of queues.
*
* @return the queues.
*/
public Optional<Map<Long, String>> qosQueues() {
return queues;
}
/**
* Returns other configurations of the qos.
*
* @return map of configurations
*/
public Map<String, String> otherConfigs() {
return otherConfigs;
}
/**
* Returns the optional external ids.
*
* @return the external ids.
*/
public Map<String, String> externalIds() {
return externalIds;
}
@Override
public int hashCode() {
return Objects.hash(type, queues, externalIds);
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof OvsdbQos) {
final OvsdbQos other = (OvsdbQos) obj;
return Objects.equals(this.type, other.type) &&
Objects.equals(this.otherConfigs, other.otherConfigs) &&
Objects.equals(this.queues, other.queues) &&
Objects.equals(this.externalIds, other.externalIds);
}
return false;
}
@Override
public String toString() {
return toStringHelper(this)
.add("qosType", qosType())
.add("qosQueues", qosQueues())
.add("otherConfigs", otherConfigs())
.add("externalIds", externalIds())
.toString();
}
/**
* Returns new OVSDB qos builder.
*
* @return ovsdb qos builder
*/
public static OvsdbQos.Builder builder() {
return new OvsdbQos.Builder();
}
/**
* Returns new OVSDB qos builder with Qos description.
*
* @param qosDesc qos description
* @return ovsdb qos builder
*/
public static Builder builder(QosDescription qosDesc) {
return new Builder(qosDesc);
}
/**
* Builder of OVSDB qos entities.
*/
public static final class Builder {
private String type;
private Optional<Map<Long, String>> queues = Optional.empty();
private Map<String, String> otherConfigs = Maps.newHashMap();
private Map<String, String> externalIds = Maps.newHashMap();
/**
* Constructs an empty builder.
*/
private Builder() {
}
/**
* Constructs a builder with a given Qos description.
*
* @param qosDesc Qos description
*/
private Builder(QosDescription qosDesc) {
if (qosDesc.maxRate().isPresent()) {
otherConfigs.put(MAX_RATE, String.valueOf((long) qosDesc.maxRate().get().bps()));
}
if (qosDesc.cir().isPresent()) {
otherConfigs.put(CIR, qosDesc.cir().get().toString());
}
if (qosDesc.cbs().isPresent()) {
otherConfigs.put(CBS, qosDesc.cbs().get().toString());
}
if (qosDesc.queues().isPresent()) {
Map<Long, String> map = new HashMap();
qosDesc.queues().get().forEach((k, v) -> map.put(k, v.queueId().name()));
queues = Optional.ofNullable(map);
}
type = qosDesc.type() == QosDescription.Type.EGRESS_POLICER ?
QOS_EGRESS_POLICER :
QOS_TYPE_PREFIX.concat(qosDesc.type().name().toLowerCase());
externalIds.putAll(((DefaultAnnotations) qosDesc.annotations()).asMap());
externalIds.put(QOS_EXTERNAL_ID_KEY, qosDesc.qosId().name());
}
/**
* Returns new OVSDB qos.
*
* @return ovsdb qos
*/
public OvsdbQos build() {
return new OvsdbQos(type, queues, otherConfigs, externalIds);
}
/**
* Returns OVSDB qos builder with a given type.
*
* @param type name of the qos
* @return ovsdb qos builder
*/
public Builder qosType(String type) {
this.type = type;
return this;
}
/**
* Returns OVSDB qos builder with a given queues.
*
* @param queues the map of queue
* @return ovsdb qos builder
*/
public Builder queues(Map<Long, String> queues) {
this.queues = Optional.ofNullable(queues);
return this;
}
/**
* Returns OVSDB qos builder with given configs.
*
* @param otherConfigs other configs
* @return ovsdb qos builder
*/
public Builder otherConfigs(Map<String, String> otherConfigs) {
this.otherConfigs = Maps.newHashMap(otherConfigs);
return this;
}
/**
* Returns OVSDB qos builder with given external ids.
*
* @param ids the external ids
* @return ovsdb qos builder
*/
public Builder externalIds(Map<String, String> ids) {
this.externalIds = ids;
return this;
}
}
}