/*
* Copyright (c) 2015 Inocybe Technologies 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.groupbasedpolicy.renderer.iovisor.module;
import java.util.List;
import org.opendaylight.controller.md.sal.binding.api.DataBroker;
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.LogicalDatastoreType;
import org.opendaylight.groupbasedpolicy.renderer.iovisor.utils.IovisorIidFactory;
import org.opendaylight.groupbasedpolicy.util.DataStoreHelper;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.EndpointGroupId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.iovisor.rev151030.IovisorModuleId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.iovisor.rev151030.IovisorModuleInstances;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.iovisor.rev151030.iovisor.module.instances.IovisorModuleInstance;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.iovisor.rev151030.iovisor.module.instances.IovisorModuleInstanceKey;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.iovisor.rev151030.iovisor.modules.by.tenant.by.endpointgroup.id.IovisorModuleByTenantByEndpointgroupId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.iovisor.rev151030.iovisor.modules.by.tenant.by.endpointgroup.id.iovisor.module.by.tenant.by.endpointgroup.id.IovisorModuleInstanceId;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
import com.google.common.net.HostSpecifier;
public class IovisorModuleManager implements AutoCloseable {
private static final Logger LOG = LoggerFactory.getLogger(IovisorModuleManager.class);
private DataBroker dataBroker;
public IovisorModuleManager(DataBroker passedDataBroker) {
Preconditions.checkNotNull(passedDataBroker, "DataBroker instance must not be null");
dataBroker = passedDataBroker;
LOG.info("Initialized IOVisor IovisorModuleManager");
}
public boolean addProvisionedIovisorModule(IovisorModuleInstance iovisorModuleInstance) {
return addIovisorModule(iovisorModuleInstance, LogicalDatastoreType.CONFIGURATION);
}
public boolean addActiveIovisorModule(IovisorModuleId iovisorModuleId) {
IovisorModuleInstance iovisorModuleInstance = getProvisionedIovisorModule(iovisorModuleId);
if (iovisorModuleInstance == null) {
LOG.error("Cannot Activate IovisorModule {}, no provisioned IovisorModule found.",
iovisorModuleId.getValue());
return false;
}
return addIovisorModule(iovisorModuleInstance, LogicalDatastoreType.OPERATIONAL);
}
public boolean addIovisorModule(IovisorModuleInstance iovisorModuleInstance, LogicalDatastoreType dataStoreType) {
if (!isValidIovisorModuleInstance(iovisorModuleInstance))
return false;
WriteTransaction wTx = dataBroker.newWriteOnlyTransaction();
wTx.put(dataStoreType,
IovisorIidFactory.iovisorModuleInstanceIid(new IovisorModuleInstanceKey(iovisorModuleInstance.getId())),
iovisorModuleInstance);
return DataStoreHelper.submitToDs(wTx);
}
public IovisorModuleInstance getActiveIovisorModule(IovisorModuleId iovisorModuleId) {
if (!isValidIovisorModuleId(iovisorModuleId))
return null;
return getIovisorModule(iovisorModuleId, LogicalDatastoreType.OPERATIONAL);
}
public IovisorModuleInstance getProvisionedIovisorModule(IovisorModuleId iovisorModuleId) {
return getIovisorModule(iovisorModuleId, LogicalDatastoreType.CONFIGURATION);
}
private IovisorModuleInstance getIovisorModule(IovisorModuleId iovisorModuleId,
LogicalDatastoreType dataStoreType) {
ReadOnlyTransaction rTx = dataBroker.newReadOnlyTransaction();
Optional<IovisorModuleInstance> readFromDs = DataStoreHelper.readFromDs(dataStoreType,
IovisorIidFactory.iovisorModuleInstanceIid(new IovisorModuleInstanceKey(iovisorModuleId)), rTx);
if (readFromDs.isPresent()) {
return readFromDs.get();
}
return null;
}
public IovisorModuleInstances getIovisorModules(ReadOnlyTransaction rTx, LogicalDatastoreType dataStoreType) {
Optional<IovisorModuleInstances> readFromDs =
DataStoreHelper.readFromDs(dataStoreType, IovisorIidFactory.iovisorModuleInstanceWildCardIid(), rTx);
if (readFromDs.isPresent()) {
return readFromDs.get();
}
return null;
}
private boolean isValidIovisorModuleInstance(IovisorModuleInstance iovisorModuleInstance) {
if (iovisorModuleInstance == null || iovisorModuleInstance.getId() == null
|| iovisorModuleInstance.getUri() == null) {
LOG.info("IovisorModuleInstance was not valid. {} contained null.", iovisorModuleInstance.toString());
return false;
}
if (!isValidIovisorModuleId(iovisorModuleInstance.getId())) {
return false;
}
if (!isValidIovisorModuleUri(iovisorModuleInstance.getUri())) {
return false;
}
return true;
}
private boolean isValidIovisorModuleUri(Uri uri) {
/*
* TODO Still deciding if want to take IovisorModuleId in host:port form and if host
* is form name.something.org:port convert to IpAddress:port for putting in Uri. For now
* assuming Id==Uri
*/
IovisorModuleId idFromUri = new IovisorModuleId(uri.getValue());
if (!isValidIovisorModuleId(idFromUri)) {
LOG.error("IovisorModule Uri is not of form host-specifier:port {}", uri.getValue());
return false;
}
return true;
}
private boolean isValidIovisorModuleId(IovisorModuleId id) {
String[] idParts = id.getValue().split(":");
if (idParts.length != 2) {
LOG.error("IovisorModuleId is not of form host-specifier:port {}", id.getValue());
return false;
}
String nameOrIp = idParts[0];
if (!HostSpecifier.isValid(nameOrIp)) {
LOG.error("IovisorModuleId host specifier is incorrect format: {}", nameOrIp);
return false;
}
Integer port = Integer.valueOf(idParts[1]);
if (port < 0 || port > 65535) {
LOG.error("IovisorModuleId port specifier is incorrect format: {}", port);
return false;
}
return true;
}
public List<IovisorModuleInstanceId> getIovisorModulesByTenantByEpg(TenantId tenantId, EndpointGroupId epgId) {
Optional<IovisorModuleByTenantByEndpointgroupId> returnFromDs =
DataStoreHelper.readFromDs(LogicalDatastoreType.OPERATIONAL,
IovisorIidFactory.iovisorModuleByTenantIdByEndpointGroupIdIid(tenantId, epgId),
dataBroker.newReadOnlyTransaction());
if (returnFromDs.isPresent())
return returnFromDs.get().getIovisorModuleInstanceId();
return null;
}
@Override
public void close() throws Exception {}
}