2 * Copyright (c) 2015 Inocybe Technologies and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
9 package org.opendaylight.groupbasedpolicy.renderer.iovisor.module;
11 import java.util.List;
13 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
14 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
15 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
16 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
17 import org.opendaylight.groupbasedpolicy.renderer.iovisor.utils.IovisorIidFactory;
18 import org.opendaylight.groupbasedpolicy.util.DataStoreHelper;
19 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Uri;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.EndpointGroupId;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.iovisor.rev151030.IovisorModuleId;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.iovisor.rev151030.IovisorModuleInstances;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.iovisor.rev151030.iovisor.module.instances.IovisorModuleInstance;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.iovisor.rev151030.iovisor.module.instances.IovisorModuleInstanceKey;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.iovisor.rev151030.iovisor.modules.by.tenant.by.endpointgroup.id.IovisorModuleByTenantByEndpointgroupId;
27 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;
28 import org.slf4j.Logger;
29 import org.slf4j.LoggerFactory;
31 import com.google.common.base.Optional;
32 import com.google.common.base.Preconditions;
33 import com.google.common.net.HostSpecifier;
35 public class IovisorModuleManager implements AutoCloseable {
37 private static final Logger LOG = LoggerFactory.getLogger(IovisorModuleManager.class);
38 private DataBroker dataBroker;
40 public IovisorModuleManager(DataBroker passedDataBroker) {
41 Preconditions.checkNotNull(passedDataBroker, "DataBroker instance must not be null");
42 dataBroker = passedDataBroker;
43 LOG.info("Initialized IOVisor IovisorModuleManager");
46 public boolean addProvisionedIovisorModule(IovisorModuleInstance iovisorModuleInstance) {
47 return addIovisorModule(iovisorModuleInstance, LogicalDatastoreType.CONFIGURATION);
50 public boolean addActiveIovisorModule(IovisorModuleId iovisorModuleId) {
51 IovisorModuleInstance iovisorModuleInstance = getProvisionedIovisorModule(iovisorModuleId);
52 if (iovisorModuleInstance == null) {
53 LOG.error("Cannot Activate IovisorModule {}, no provisioned IovisorModule found.",
54 iovisorModuleId.getValue());
57 return addIovisorModule(iovisorModuleInstance, LogicalDatastoreType.OPERATIONAL);
60 public boolean addIovisorModule(IovisorModuleInstance iovisorModuleInstance, LogicalDatastoreType dataStoreType) {
61 if (!isValidIovisorModuleInstance(iovisorModuleInstance))
63 WriteTransaction wTx = dataBroker.newWriteOnlyTransaction();
64 wTx.put(dataStoreType,
65 IovisorIidFactory.iovisorModuleInstanceIid(new IovisorModuleInstanceKey(iovisorModuleInstance.getId())),
66 iovisorModuleInstance);
67 return DataStoreHelper.submitToDs(wTx);
70 public IovisorModuleInstance getActiveIovisorModule(IovisorModuleId iovisorModuleId) {
71 if (!isValidIovisorModuleId(iovisorModuleId))
73 return getIovisorModule(iovisorModuleId, LogicalDatastoreType.OPERATIONAL);
76 public IovisorModuleInstance getProvisionedIovisorModule(IovisorModuleId iovisorModuleId) {
77 return getIovisorModule(iovisorModuleId, LogicalDatastoreType.CONFIGURATION);
80 private IovisorModuleInstance getIovisorModule(IovisorModuleId iovisorModuleId,
81 LogicalDatastoreType dataStoreType) {
82 ReadOnlyTransaction rTx = dataBroker.newReadOnlyTransaction();
83 Optional<IovisorModuleInstance> readFromDs = DataStoreHelper.readFromDs(dataStoreType,
84 IovisorIidFactory.iovisorModuleInstanceIid(new IovisorModuleInstanceKey(iovisorModuleId)), rTx);
85 if (readFromDs.isPresent()) {
86 return readFromDs.get();
91 public IovisorModuleInstances getIovisorModules(ReadOnlyTransaction rTx, LogicalDatastoreType dataStoreType) {
92 Optional<IovisorModuleInstances> readFromDs =
93 DataStoreHelper.readFromDs(dataStoreType, IovisorIidFactory.iovisorModuleInstanceWildCardIid(), rTx);
94 if (readFromDs.isPresent()) {
95 return readFromDs.get();
100 private boolean isValidIovisorModuleInstance(IovisorModuleInstance iovisorModuleInstance) {
101 if (iovisorModuleInstance == null || iovisorModuleInstance.getId() == null
102 || iovisorModuleInstance.getUri() == null) {
103 LOG.info("IovisorModuleInstance was not valid. {} contained null.", iovisorModuleInstance.toString());
106 if (!isValidIovisorModuleId(iovisorModuleInstance.getId())) {
109 if (!isValidIovisorModuleUri(iovisorModuleInstance.getUri())) {
115 private boolean isValidIovisorModuleUri(Uri uri) {
117 * TODO Still deciding if want to take IovisorModuleId in host:port form and if host
118 * is form name.something.org:port convert to IpAddress:port for putting in Uri. For now
121 IovisorModuleId idFromUri = new IovisorModuleId(uri.getValue());
122 if (!isValidIovisorModuleId(idFromUri)) {
123 LOG.error("IovisorModule Uri is not of form host-specifier:port {}", uri.getValue());
129 private boolean isValidIovisorModuleId(IovisorModuleId id) {
130 String[] idParts = id.getValue().split(":");
131 if (idParts.length != 2) {
132 LOG.error("IovisorModuleId is not of form host-specifier:port {}", id.getValue());
135 String nameOrIp = idParts[0];
136 if (!HostSpecifier.isValid(nameOrIp)) {
137 LOG.error("IovisorModuleId host specifier is incorrect format: {}", nameOrIp);
140 Integer port = Integer.valueOf(idParts[1]);
141 if (port < 0 || port > 65535) {
142 LOG.error("IovisorModuleId port specifier is incorrect format: {}", port);
148 public List<IovisorModuleInstanceId> getIovisorModulesByTenantByEpg(TenantId tenantId, EndpointGroupId epgId) {
149 Optional<IovisorModuleByTenantByEndpointgroupId> returnFromDs =
150 DataStoreHelper.readFromDs(LogicalDatastoreType.OPERATIONAL,
151 IovisorIidFactory.iovisorModuleByTenantIdByEndpointGroupIdIid(tenantId, epgId),
152 dataBroker.newReadOnlyTransaction());
153 if (returnFromDs.isPresent())
154 return returnFromDs.get().getIovisorModuleInstanceId();
159 public void close() throws Exception {}