Merge "Tests for neutron-ovsdb"
[groupbasedpolicy.git] / renderers / iovisor / src / main / java / org / opendaylight / groupbasedpolicy / renderer / iovisor / module / IovisorModuleManager.java
1 /*
2  * Copyright (c) 2015 Inocybe Technologies and others. All rights reserved.
3  *
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
7  */
8
9 package org.opendaylight.groupbasedpolicy.renderer.iovisor.module;
10
11 import java.util.List;
12
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;
30
31 import com.google.common.base.Optional;
32 import com.google.common.base.Preconditions;
33 import com.google.common.net.HostSpecifier;
34
35 public class IovisorModuleManager implements AutoCloseable {
36
37     private static final Logger LOG = LoggerFactory.getLogger(IovisorModuleManager.class);
38     private DataBroker dataBroker;
39
40     public IovisorModuleManager(DataBroker passedDataBroker) {
41         Preconditions.checkNotNull(passedDataBroker, "DataBroker instance must not be null");
42         dataBroker = passedDataBroker;
43         LOG.info("Initialized IOVisor IovisorModuleManager");
44     }
45
46     public boolean addProvisionedIovisorModule(IovisorModuleInstance iovisorModuleInstance) {
47         return addIovisorModule(iovisorModuleInstance, LogicalDatastoreType.CONFIGURATION);
48     }
49
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());
55             return false;
56         }
57         return addIovisorModule(iovisorModuleInstance, LogicalDatastoreType.OPERATIONAL);
58     }
59
60     public boolean addIovisorModule(IovisorModuleInstance iovisorModuleInstance, LogicalDatastoreType dataStoreType) {
61         if (!isValidIovisorModuleInstance(iovisorModuleInstance))
62             return false;
63         WriteTransaction wTx = dataBroker.newWriteOnlyTransaction();
64         wTx.put(dataStoreType,
65                 IovisorIidFactory.iovisorModuleInstanceIid(new IovisorModuleInstanceKey(iovisorModuleInstance.getId())),
66                 iovisorModuleInstance);
67         return DataStoreHelper.submitToDs(wTx);
68     }
69
70     public IovisorModuleInstance getActiveIovisorModule(IovisorModuleId iovisorModuleId) {
71         if (!isValidIovisorModuleId(iovisorModuleId))
72             return null;
73         return getIovisorModule(iovisorModuleId, LogicalDatastoreType.OPERATIONAL);
74     }
75
76     public IovisorModuleInstance getProvisionedIovisorModule(IovisorModuleId iovisorModuleId) {
77         return getIovisorModule(iovisorModuleId, LogicalDatastoreType.CONFIGURATION);
78     }
79
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();
87         }
88         return null;
89     }
90
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();
96         }
97         return null;
98     }
99
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());
104             return false;
105         }
106         if (!isValidIovisorModuleId(iovisorModuleInstance.getId())) {
107             return false;
108         }
109         if (!isValidIovisorModuleUri(iovisorModuleInstance.getUri())) {
110             return false;
111         }
112         return true;
113     }
114
115     private boolean isValidIovisorModuleUri(Uri uri) {
116         /*
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
119          * assuming Id==Uri
120          */
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());
124             return false;
125         }
126         return true;
127     }
128
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());
133             return false;
134         }
135         String nameOrIp = idParts[0];
136         if (!HostSpecifier.isValid(nameOrIp)) {
137             LOG.error("IovisorModuleId host specifier is incorrect format: {}", nameOrIp);
138             return false;
139         }
140         Integer port = Integer.valueOf(idParts[1]);
141         if (port < 0 || port > 65535) {
142             LOG.error("IovisorModuleId port specifier is incorrect format: {}", port);
143             return false;
144         }
145         return true;
146     }
147
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();
155         return null;
156     }
157
158     @Override
159     public void close() throws Exception {}
160
161 }