mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
Add a network plugin for OpenDaylight
This plugin is a technology preview and designed to work with the OVSDB module
This commit is contained in:
parent
cbe2560a78
commit
1f9528bad3
16
LICENSE.header
Normal file
16
LICENSE.header
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you 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.
|
||||||
132
plugins/network-elements/opendaylight/pom.xml
Normal file
132
plugins/network-elements/opendaylight/pom.xml
Normal file
@ -0,0 +1,132 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you 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.
|
||||||
|
|
||||||
|
-->
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<artifactId>cloud-plugin-network-opendaylight</artifactId>
|
||||||
|
<name>Apache CloudStack Plugin - Network Opendaylight</name>
|
||||||
|
<parent>
|
||||||
|
<groupId>org.apache.cloudstack</groupId>
|
||||||
|
<artifactId>cloudstack-plugins</artifactId>
|
||||||
|
<version>4.4.0-SNAPSHOT</version>
|
||||||
|
<relativePath>../../pom.xml</relativePath>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<!-- not parenting to the maven-default pom, as we want this in services -->
|
||||||
|
<build>
|
||||||
|
<sourceDirectory>${basedir}/src/main/java</sourceDirectory>
|
||||||
|
<scriptSourceDirectory>${basedir}/src/main/scripts</scriptSourceDirectory>
|
||||||
|
<testSourceDirectory>${basedir}/src/test/java</testSourceDirectory>
|
||||||
|
<outputDirectory>${basedir}/target/classes</outputDirectory>
|
||||||
|
<testOutputDirectory>${basedir}/target/test-classes</testOutputDirectory>
|
||||||
|
<resources>
|
||||||
|
<resource>
|
||||||
|
<directory>${basedir}/src/main/resources</directory>
|
||||||
|
</resource>
|
||||||
|
</resources>
|
||||||
|
<testResources>
|
||||||
|
<testResource>
|
||||||
|
<directory>${basedir}/src/test/resources</directory>
|
||||||
|
</testResource>
|
||||||
|
</testResources>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-checkstyle-plugin</artifactId>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.cloudstack</groupId>
|
||||||
|
<artifactId>checkstyle</artifactId>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<phase>process-classes</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>check</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
<configuration>
|
||||||
|
<failsOnError>true</failsOnError>
|
||||||
|
<configLocation>tooling/checkstyle.xml</configLocation>
|
||||||
|
<consoleOutput>true</consoleOutput>
|
||||||
|
<includeTestSourceDirectory>true</includeTestSourceDirectory>
|
||||||
|
<sourceDirectory>${project.basedir}</sourceDirectory>
|
||||||
|
<includes>**\/*.java,**\/*.xml,**\/*.ini,**\/*.sh,**\/*.bat</includes>
|
||||||
|
<excludes>**\/target\/,**\/bin\/</excludes>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>com.mycila.maven-license-plugin</groupId>
|
||||||
|
<artifactId>maven-license-plugin</artifactId>
|
||||||
|
<version>1.9.0</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<phase>process-classes</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>format</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
<configuration>
|
||||||
|
<strictCheck>true</strictCheck>
|
||||||
|
<aggregate>true</aggregate>
|
||||||
|
<header>../../../LICENSE.header</header>
|
||||||
|
<mapping>
|
||||||
|
<xml>XML_STYLE</xml>
|
||||||
|
<java>DOUBLESLASH_STYLE</java>
|
||||||
|
<clj>SEMICOLON_STYLE</clj>
|
||||||
|
</mapping>
|
||||||
|
<useDefaultExcludes>false</useDefaultExcludes>
|
||||||
|
<excludes>
|
||||||
|
<exclude>target/**</exclude>
|
||||||
|
<exclude>.settings/**</exclude>
|
||||||
|
<exclude>.checkstyle</exclude>
|
||||||
|
<exclude>.project</exclude>
|
||||||
|
<exclude>.classpath</exclude>
|
||||||
|
</excludes>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
<profiles>
|
||||||
|
<profile>
|
||||||
|
<id>integration</id>
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-failsafe-plugin</artifactId>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<goals>
|
||||||
|
<goal>integration-test</goal>
|
||||||
|
<goal>verify</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
</profile>
|
||||||
|
</profiles>
|
||||||
|
</project>
|
||||||
@ -0,0 +1,174 @@
|
|||||||
|
//
|
||||||
|
// Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
// or more contributor license agreements. See the NOTICE file
|
||||||
|
// distributed with this work for additional information
|
||||||
|
// regarding copyright ownership. The ASF licenses this file
|
||||||
|
// to you 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.apache.cloudstack.network.opendaylight;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import javax.ejb.Local;
|
||||||
|
import javax.inject.Inject;
|
||||||
|
import javax.naming.ConfigurationException;
|
||||||
|
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import org.apache.cloudstack.network.opendaylight.agent.commands.StartupOpenDaylightControllerCommand;
|
||||||
|
|
||||||
|
import com.cloud.agent.api.StartupCommand;
|
||||||
|
import com.cloud.deploy.DeployDestination;
|
||||||
|
import com.cloud.exception.ConcurrentOperationException;
|
||||||
|
import com.cloud.exception.InsufficientCapacityException;
|
||||||
|
import com.cloud.exception.ResourceUnavailableException;
|
||||||
|
import com.cloud.host.Host;
|
||||||
|
import com.cloud.host.HostVO;
|
||||||
|
import com.cloud.network.Network;
|
||||||
|
import com.cloud.network.Network.Capability;
|
||||||
|
import com.cloud.network.Network.Provider;
|
||||||
|
import com.cloud.network.Network.Service;
|
||||||
|
import com.cloud.network.PhysicalNetworkServiceProvider;
|
||||||
|
import com.cloud.network.element.ConnectivityProvider;
|
||||||
|
import com.cloud.network.element.NetworkElement;
|
||||||
|
import com.cloud.offering.NetworkOffering;
|
||||||
|
import com.cloud.resource.ResourceManager;
|
||||||
|
import com.cloud.resource.ResourceStateAdapter;
|
||||||
|
import com.cloud.resource.ServerResource;
|
||||||
|
import com.cloud.resource.UnableDeleteHostException;
|
||||||
|
import com.cloud.utils.component.AdapterBase;
|
||||||
|
import com.cloud.utils.exception.CloudRuntimeException;
|
||||||
|
import com.cloud.vm.NicProfile;
|
||||||
|
import com.cloud.vm.ReservationContext;
|
||||||
|
import com.cloud.vm.VirtualMachineProfile;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
@Local(value = {NetworkElement.class, ConnectivityProvider.class})
|
||||||
|
public class OpendaylightElement extends AdapterBase implements ConnectivityProvider, ResourceStateAdapter {
|
||||||
|
|
||||||
|
private static final Logger s_logger = Logger.getLogger(OpendaylightElement.class);
|
||||||
|
private static final Map<Service, Map<Capability, String>> s_capabilities = setCapabilities();
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
ResourceManager resourceManager;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Map<Service, Map<Capability, String>> getCapabilities() {
|
||||||
|
return s_capabilities;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Provider getProvider() {
|
||||||
|
return Provider.Opendaylight;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
|
||||||
|
boolean configured = super.configure(name, params);
|
||||||
|
if (configured)
|
||||||
|
resourceManager.registerResourceStateAdapter(name, this);
|
||||||
|
return configured;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean implement(Network network, NetworkOffering offering, DeployDestination dest, ReservationContext context) throws ConcurrentOperationException,
|
||||||
|
ResourceUnavailableException, InsufficientCapacityException {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean prepare(Network network, NicProfile nic, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context) throws ConcurrentOperationException,
|
||||||
|
ResourceUnavailableException, InsufficientCapacityException {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean release(Network network, NicProfile nic, VirtualMachineProfile vm, ReservationContext context) throws ConcurrentOperationException,
|
||||||
|
ResourceUnavailableException {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean shutdown(Network network, ReservationContext context, boolean cleanup) throws ConcurrentOperationException, ResourceUnavailableException {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean destroy(Network network, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isReady(PhysicalNetworkServiceProvider provider) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean shutdownProviderInstances(PhysicalNetworkServiceProvider provider, ReservationContext context) throws ConcurrentOperationException,
|
||||||
|
ResourceUnavailableException {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean canEnableIndividualServices() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean verifyServicesCombination(Set<Service> services) {
|
||||||
|
if (services.contains(Service.Connectivity) && services.size() == 1)
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public HostVO createHostVOForConnectedAgent(HostVO host, StartupCommand[] startup) {
|
||||||
|
if (!(startup[0] instanceof StartupOpenDaylightControllerCommand)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
throw new CloudRuntimeException("createHostVOForConnectedAgent is not implemented for OpendaylightElement");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public HostVO createHostVOForDirectConnectAgent(HostVO host, StartupCommand[] startup, ServerResource resource, Map<String, String> details, List<String> hostTags) {
|
||||||
|
if (!(startup[0] instanceof StartupOpenDaylightControllerCommand)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
host.setType(Host.Type.L2Networking);
|
||||||
|
return host;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DeleteHostAnswer deleteHost(HostVO host, boolean isForced, boolean isForceDeleteStorage) throws UnableDeleteHostException {
|
||||||
|
return new DeleteHostAnswer(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Map<Service, Map<Capability, String>> setCapabilities() {
|
||||||
|
Map<Service, Map<Capability, String>> capabilities = new HashMap<Service, Map<Capability, String>>();
|
||||||
|
|
||||||
|
// L2 Support : SDN provisioning
|
||||||
|
capabilities.put(Service.Connectivity, null);
|
||||||
|
|
||||||
|
return capabilities;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,276 @@
|
|||||||
|
//
|
||||||
|
// Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
// or more contributor license agreements. See the NOTICE file
|
||||||
|
// distributed with this work for additional information
|
||||||
|
// regarding copyright ownership. The ASF licenses this file
|
||||||
|
// to you 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.apache.cloudstack.network.opendaylight;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
|
import org.apache.cloudstack.network.opendaylight.agent.commands.AddHypervisorCommand;
|
||||||
|
import org.apache.cloudstack.network.opendaylight.agent.commands.ConfigureNetworkCommand;
|
||||||
|
import org.apache.cloudstack.network.opendaylight.agent.commands.ConfigurePortCommand;
|
||||||
|
import org.apache.cloudstack.network.opendaylight.agent.commands.DestroyNetworkCommand;
|
||||||
|
import org.apache.cloudstack.network.opendaylight.agent.commands.DestroyPortCommand;
|
||||||
|
import org.apache.cloudstack.network.opendaylight.agent.responses.AddHypervisorAnswer;
|
||||||
|
import org.apache.cloudstack.network.opendaylight.agent.responses.ConfigureNetworkAnswer;
|
||||||
|
import org.apache.cloudstack.network.opendaylight.agent.responses.ConfigurePortAnswer;
|
||||||
|
import org.apache.cloudstack.network.opendaylight.agent.responses.DestroyNetworkAnswer;
|
||||||
|
import org.apache.cloudstack.network.opendaylight.agent.responses.DestroyPortAnswer;
|
||||||
|
import org.apache.cloudstack.network.opendaylight.dao.OpenDaylightControllerMappingDao;
|
||||||
|
import org.apache.cloudstack.network.opendaylight.dao.OpenDaylightControllerVO;
|
||||||
|
|
||||||
|
import com.cloud.agent.AgentManager;
|
||||||
|
import com.cloud.dc.DataCenter;
|
||||||
|
import com.cloud.dc.DataCenter.NetworkType;
|
||||||
|
import com.cloud.deploy.DeployDestination;
|
||||||
|
import com.cloud.deploy.DeploymentPlan;
|
||||||
|
import com.cloud.exception.InsufficientAddressCapacityException;
|
||||||
|
import com.cloud.exception.InsufficientVirtualNetworkCapcityException;
|
||||||
|
import com.cloud.network.Network;
|
||||||
|
import com.cloud.network.Network.GuestType;
|
||||||
|
import com.cloud.network.Network.Provider;
|
||||||
|
import com.cloud.network.Network.Service;
|
||||||
|
import com.cloud.network.Network.State;
|
||||||
|
import com.cloud.network.NetworkModel;
|
||||||
|
import com.cloud.network.NetworkProfile;
|
||||||
|
import com.cloud.network.Networks.BroadcastDomainType;
|
||||||
|
import com.cloud.network.PhysicalNetwork;
|
||||||
|
import com.cloud.network.PhysicalNetwork.IsolationMethod;
|
||||||
|
import com.cloud.network.dao.NetworkDao;
|
||||||
|
import com.cloud.network.dao.NetworkVO;
|
||||||
|
import com.cloud.network.dao.PhysicalNetworkDao;
|
||||||
|
import com.cloud.network.dao.PhysicalNetworkVO;
|
||||||
|
import com.cloud.network.guru.GuestNetworkGuru;
|
||||||
|
import com.cloud.offering.NetworkOffering;
|
||||||
|
import com.cloud.offerings.dao.NetworkOfferingServiceMapDao;
|
||||||
|
import com.cloud.user.Account;
|
||||||
|
import com.cloud.utils.exception.CloudRuntimeException;
|
||||||
|
import com.cloud.vm.NicProfile;
|
||||||
|
import com.cloud.vm.ReservationContext;
|
||||||
|
import com.cloud.vm.VirtualMachineProfile;
|
||||||
|
|
||||||
|
public class OpendaylightGuestNetworkGuru extends GuestNetworkGuru {
|
||||||
|
private static final Logger s_logger = Logger.getLogger(OpendaylightGuestNetworkGuru.class);
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
protected NetworkOfferingServiceMapDao ntwkOfferingSrvcDao;
|
||||||
|
@Inject
|
||||||
|
PhysicalNetworkDao physicalNetworkDao;
|
||||||
|
@Inject
|
||||||
|
OpenDaylightControllerMappingDao openDaylightControllerMappingDao;
|
||||||
|
@Inject
|
||||||
|
NetworkModel networkModel;
|
||||||
|
@Inject
|
||||||
|
AgentManager agentManager;
|
||||||
|
@Inject
|
||||||
|
NetworkDao networkDao;
|
||||||
|
|
||||||
|
public OpendaylightGuestNetworkGuru() {
|
||||||
|
_isolationMethods = new IsolationMethod[] {IsolationMethod.ODL};
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean canHandle(NetworkOffering offering, NetworkType networkType, PhysicalNetwork physicalNetwork) {
|
||||||
|
if (networkType == NetworkType.Advanced && isMyTrafficType(offering.getTrafficType()) && offering.getGuestType() == Network.GuestType.Isolated &&
|
||||||
|
isMyIsolationMethod(physicalNetwork) && ntwkOfferingSrvcDao.areServicesSupportedByNetworkOffering(offering.getId(), Service.Connectivity)
|
||||||
|
&& ntwkOfferingSrvcDao.isProviderForNetworkOffering(offering.getId(), Provider.Opendaylight)) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
s_logger.trace("We only take care of Guest networks of type " + GuestType.Isolated + " in zone of type " + NetworkType.Advanced);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Network design(NetworkOffering offering, DeploymentPlan plan, Network userSpecified, Account owner) {
|
||||||
|
PhysicalNetworkVO physnet = physicalNetworkDao.findById(plan.getPhysicalNetworkId());
|
||||||
|
DataCenter dc = _dcDao.findById(plan.getDataCenterId());
|
||||||
|
if (!canHandle(offering, dc.getNetworkType(), physnet)) {
|
||||||
|
s_logger.debug("Refusing to design this network");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
List<OpenDaylightControllerVO> devices = openDaylightControllerMappingDao.listByPhysicalNetwork(physnet.getId());
|
||||||
|
if (devices.isEmpty()) {
|
||||||
|
s_logger.error("No Controller on physical network " + physnet.getName());
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
s_logger.debug("Controller " + devices.get(0).getUuid() + " found on physical network " + physnet.getId());
|
||||||
|
s_logger.debug("Physical isolation type is ODL, asking GuestNetworkGuru to design this network");
|
||||||
|
|
||||||
|
NetworkVO networkObject = (NetworkVO)super.design(offering, plan, userSpecified, owner);
|
||||||
|
if (networkObject == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
// Override the broadcast domain type
|
||||||
|
networkObject.setBroadcastDomainType(BroadcastDomainType.OpenDaylight);
|
||||||
|
|
||||||
|
return networkObject;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Network implement(Network network, NetworkOffering offering, DeployDestination dest, ReservationContext context) throws InsufficientVirtualNetworkCapcityException {
|
||||||
|
assert (network.getState() == State.Implementing) : "Why are we implementing " + network;
|
||||||
|
|
||||||
|
long dcId = dest.getDataCenter().getId();
|
||||||
|
|
||||||
|
//get physical network id
|
||||||
|
Long physicalNetworkId = network.getPhysicalNetworkId();
|
||||||
|
|
||||||
|
// physical network id can be null in Guest Network in Basic zone, so locate the physical network
|
||||||
|
if (physicalNetworkId == null) {
|
||||||
|
physicalNetworkId = networkModel.findPhysicalNetworkId(dcId, offering.getTags(), offering.getTrafficType());
|
||||||
|
}
|
||||||
|
|
||||||
|
NetworkVO implemented = new NetworkVO(network.getTrafficType(), network.getMode(), network.getBroadcastDomainType(), network.getNetworkOfferingId(), State.Allocated,
|
||||||
|
network.getDataCenterId(), physicalNetworkId);
|
||||||
|
|
||||||
|
if (network.getGateway() != null) {
|
||||||
|
implemented.setGateway(network.getGateway());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (network.getCidr() != null) {
|
||||||
|
implemented.setCidr(network.getCidr());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Name is either the given name or the uuid
|
||||||
|
String name = network.getName();
|
||||||
|
if (name == null || name.isEmpty()) {
|
||||||
|
name = ((NetworkVO)network).getUuid();
|
||||||
|
}
|
||||||
|
|
||||||
|
List<OpenDaylightControllerVO> devices = openDaylightControllerMappingDao.listByPhysicalNetwork(physicalNetworkId);
|
||||||
|
if (devices.isEmpty()) {
|
||||||
|
s_logger.error("No Controller on physical network " + physicalNetworkId);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
OpenDaylightControllerVO controller = devices.get(0);
|
||||||
|
|
||||||
|
ConfigureNetworkCommand cmd = new ConfigureNetworkCommand(name, context.getAccount().getAccountName());
|
||||||
|
ConfigureNetworkAnswer answer = (ConfigureNetworkAnswer)agentManager.easySend(controller.getHostId(), cmd);
|
||||||
|
|
||||||
|
if (answer == null || !answer.getResult()) {
|
||||||
|
s_logger.error("ConfigureNetworkCommand failed");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
implemented.setBroadcastUri(BroadcastDomainType.OpenDaylight.toUri(answer.getNetworkUuid()));
|
||||||
|
implemented.setBroadcastDomainType(BroadcastDomainType.OpenDaylight);
|
||||||
|
s_logger.info("Implemented OK, network linked to = " + implemented.getBroadcastUri().toString());
|
||||||
|
|
||||||
|
return implemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void reserve(NicProfile nic, Network network, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context)
|
||||||
|
throws InsufficientVirtualNetworkCapcityException, InsufficientAddressCapacityException {
|
||||||
|
super.reserve(nic, network, vm, dest, context);
|
||||||
|
|
||||||
|
//get physical network id
|
||||||
|
Long physicalNetworkId = network.getPhysicalNetworkId();
|
||||||
|
|
||||||
|
List<OpenDaylightControllerVO> devices = openDaylightControllerMappingDao.listByPhysicalNetwork(physicalNetworkId);
|
||||||
|
if (devices.isEmpty()) {
|
||||||
|
s_logger.error("No Controller on physical network " + physicalNetworkId);
|
||||||
|
throw new InsufficientVirtualNetworkCapcityException("No OpenDaylight Controller configured for this network", dest.getPod().getId());
|
||||||
|
}
|
||||||
|
OpenDaylightControllerVO controller = devices.get(0);
|
||||||
|
|
||||||
|
AddHypervisorCommand addCmd = new AddHypervisorCommand(dest.getHost().getUuid(), dest.getHost().getPrivateIpAddress());
|
||||||
|
AddHypervisorAnswer addAnswer = (AddHypervisorAnswer)agentManager.easySend(controller.getHostId(), addCmd);
|
||||||
|
if (addAnswer == null || !addAnswer.getResult()) {
|
||||||
|
s_logger.error("Failed to add " + dest.getHost().getName() + " as a node to the controller");
|
||||||
|
throw new InsufficientVirtualNetworkCapcityException("Failed to add destination hypervisor to the OpenDaylight Controller", dest.getPod().getId());
|
||||||
|
}
|
||||||
|
|
||||||
|
ConfigurePortCommand cmd = new ConfigurePortCommand(UUID.fromString(nic.getUuid()), UUID.fromString(BroadcastDomainType.getValue(network.getBroadcastUri())), context
|
||||||
|
.getAccount().getAccountName(), nic.getMacAddress());
|
||||||
|
ConfigurePortAnswer answer = (ConfigurePortAnswer)agentManager.easySend(controller.getHostId(), cmd);
|
||||||
|
|
||||||
|
if (answer == null || !answer.getResult()) {
|
||||||
|
s_logger.error("ConfigureNetworkCommand failed");
|
||||||
|
throw new InsufficientVirtualNetworkCapcityException("Failed to configure the port on the OpenDaylight Controller", dest.getPod().getId());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean release(NicProfile nic, VirtualMachineProfile vm, String reservationId) {
|
||||||
|
boolean success = super.release(nic, vm, reservationId);
|
||||||
|
|
||||||
|
if (success) {
|
||||||
|
//get physical network id
|
||||||
|
NetworkVO network = _networkDao.findById(nic.getNetworkId());
|
||||||
|
Long physicalNetworkId = network.getPhysicalNetworkId();
|
||||||
|
|
||||||
|
List<OpenDaylightControllerVO> devices = openDaylightControllerMappingDao.listByPhysicalNetwork(physicalNetworkId);
|
||||||
|
if (devices.isEmpty()) {
|
||||||
|
s_logger.error("No Controller on physical network " + physicalNetworkId);
|
||||||
|
throw new CloudRuntimeException("No OpenDaylight controller on this physical network");
|
||||||
|
}
|
||||||
|
OpenDaylightControllerVO controller = devices.get(0);
|
||||||
|
|
||||||
|
DestroyPortCommand cmd = new DestroyPortCommand(UUID.fromString(nic.getUuid()));
|
||||||
|
DestroyPortAnswer answer = (DestroyPortAnswer)agentManager.easySend(controller.getHostId(), cmd);
|
||||||
|
|
||||||
|
if (answer == null || !answer.getResult()) {
|
||||||
|
s_logger.error("DestroyPortCommand failed");
|
||||||
|
success = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void shutdown(NetworkProfile profile, NetworkOffering offering) {
|
||||||
|
NetworkVO networkObject = networkDao.findById(profile.getId());
|
||||||
|
if (networkObject.getBroadcastDomainType() != BroadcastDomainType.OpenDaylight || networkObject.getBroadcastUri() == null) {
|
||||||
|
s_logger.warn("BroadcastUri is empty or incorrect for guestnetwork " + networkObject.getDisplayText());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
List<OpenDaylightControllerVO> devices = openDaylightControllerMappingDao.listByPhysicalNetwork(networkObject.getPhysicalNetworkId());
|
||||||
|
if (devices.isEmpty()) {
|
||||||
|
s_logger.error("No Controller on physical network " + networkObject.getPhysicalNetworkId());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
OpenDaylightControllerVO controller = devices.get(0);
|
||||||
|
|
||||||
|
DestroyNetworkCommand cmd = new DestroyNetworkCommand(BroadcastDomainType.getValue(networkObject.getBroadcastUri()));
|
||||||
|
DestroyNetworkAnswer answer = (DestroyNetworkAnswer)agentManager.easySend(controller.getHostId(), cmd);
|
||||||
|
|
||||||
|
if (answer == null || !answer.getResult()) {
|
||||||
|
s_logger.error("DestroyNetworkCommand failed");
|
||||||
|
}
|
||||||
|
|
||||||
|
super.shutdown(profile, offering);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean trash(Network network, NetworkOffering offering) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return super.trash(network, offering);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,321 @@
|
|||||||
|
//
|
||||||
|
// Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
// or more contributor license agreements. See the NOTICE file
|
||||||
|
// distributed with this work for additional information
|
||||||
|
// regarding copyright ownership. The ASF licenses this file
|
||||||
|
// to you 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.apache.cloudstack.network.opendaylight.agent;
|
||||||
|
|
||||||
|
import java.net.MalformedURLException;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.security.InvalidParameterException;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import javax.naming.ConfigurationException;
|
||||||
|
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
|
import org.apache.cloudstack.network.opendaylight.agent.commands.AddHypervisorCommand;
|
||||||
|
import org.apache.cloudstack.network.opendaylight.agent.commands.ConfigureNetworkCommand;
|
||||||
|
import org.apache.cloudstack.network.opendaylight.agent.commands.ConfigurePortCommand;
|
||||||
|
import org.apache.cloudstack.network.opendaylight.agent.commands.DestroyNetworkCommand;
|
||||||
|
import org.apache.cloudstack.network.opendaylight.agent.commands.DestroyPortCommand;
|
||||||
|
import org.apache.cloudstack.network.opendaylight.agent.commands.StartupOpenDaylightControllerCommand;
|
||||||
|
import org.apache.cloudstack.network.opendaylight.agent.responses.AddHypervisorAnswer;
|
||||||
|
import org.apache.cloudstack.network.opendaylight.agent.responses.ConfigureNetworkAnswer;
|
||||||
|
import org.apache.cloudstack.network.opendaylight.agent.responses.ConfigurePortAnswer;
|
||||||
|
import org.apache.cloudstack.network.opendaylight.agent.responses.DestroyNetworkAnswer;
|
||||||
|
import org.apache.cloudstack.network.opendaylight.agent.responses.DestroyPortAnswer;
|
||||||
|
import org.apache.cloudstack.network.opendaylight.api.NeutronRestApiException;
|
||||||
|
import org.apache.cloudstack.network.opendaylight.api.model.NeutronNetwork;
|
||||||
|
import org.apache.cloudstack.network.opendaylight.api.model.NeutronNetworkWrapper;
|
||||||
|
import org.apache.cloudstack.network.opendaylight.api.model.NeutronNode;
|
||||||
|
import org.apache.cloudstack.network.opendaylight.api.model.NeutronNodeWrapper;
|
||||||
|
import org.apache.cloudstack.network.opendaylight.api.model.NeutronNodesList;
|
||||||
|
import org.apache.cloudstack.network.opendaylight.api.model.NeutronPort;
|
||||||
|
import org.apache.cloudstack.network.opendaylight.api.model.NeutronPortWrapper;
|
||||||
|
import org.apache.cloudstack.network.opendaylight.api.resources.NeutronNetworksNorthboundAction;
|
||||||
|
import org.apache.cloudstack.network.opendaylight.api.resources.NeutronNodesNorthboundAction;
|
||||||
|
import org.apache.cloudstack.network.opendaylight.api.resources.NeutronPortsNorthboundAction;
|
||||||
|
|
||||||
|
import com.cloud.agent.IAgentControl;
|
||||||
|
import com.cloud.agent.api.Answer;
|
||||||
|
import com.cloud.agent.api.Command;
|
||||||
|
import com.cloud.agent.api.MaintainAnswer;
|
||||||
|
import com.cloud.agent.api.MaintainCommand;
|
||||||
|
import com.cloud.agent.api.PingCommand;
|
||||||
|
import com.cloud.agent.api.ReadyAnswer;
|
||||||
|
import com.cloud.agent.api.ReadyCommand;
|
||||||
|
import com.cloud.agent.api.StartupCommand;
|
||||||
|
import com.cloud.host.Host;
|
||||||
|
import com.cloud.host.Host.Type;
|
||||||
|
import com.cloud.resource.ServerResource;
|
||||||
|
|
||||||
|
public class OpenDaylightControllerResource implements ServerResource {
|
||||||
|
private static final Logger s_logger = Logger.getLogger(OpenDaylightControllerResource.class);
|
||||||
|
private Map<String, Object> configuration = new HashMap<String, Object>();
|
||||||
|
|
||||||
|
private URL controllerUrl;
|
||||||
|
private String controllerUsername;
|
||||||
|
private String controllerPassword;
|
||||||
|
|
||||||
|
private int runLevel;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
if (configuration.containsKey("name"))
|
||||||
|
return (String)configuration.get("name");
|
||||||
|
else
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setName(String name) {
|
||||||
|
configuration.put("name", name);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setConfigParams(Map<String, Object> params) {
|
||||||
|
for (Entry<String, Object> entry : params.entrySet()) {
|
||||||
|
configuration.put(entry.getKey(), entry.getValue());
|
||||||
|
}
|
||||||
|
updateConfiguration();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Map<String, Object> getConfigParams() {
|
||||||
|
return Collections.unmodifiableMap(configuration);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getRunLevel() {
|
||||||
|
return runLevel;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setRunLevel(int level) {
|
||||||
|
runLevel = level;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
|
||||||
|
for (Entry<String, Object> entry : params.entrySet()) {
|
||||||
|
configuration.put(entry.getKey(), entry.getValue());
|
||||||
|
}
|
||||||
|
updateConfiguration();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean start() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean stop() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Type getType() {
|
||||||
|
return Type.L2Networking;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public StartupCommand[] initialize() {
|
||||||
|
StartupOpenDaylightControllerCommand sc = new StartupOpenDaylightControllerCommand();
|
||||||
|
sc.setGuid((String)configuration.get("guid"));
|
||||||
|
sc.setName(getName());
|
||||||
|
sc.setDataCenter((String)configuration.get("zoneId"));
|
||||||
|
sc.setPod("");
|
||||||
|
sc.setPrivateIpAddress("");
|
||||||
|
sc.setStorageIpAddress("");
|
||||||
|
sc.setVersion(OpenDaylightControllerResource.class.getPackage().getImplementationVersion());
|
||||||
|
return new StartupCommand[] {sc};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PingCommand getCurrentStatus(long id) {
|
||||||
|
return new PingCommand(Host.Type.L2Networking, id);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Answer executeRequest(Command cmd) {
|
||||||
|
if (cmd instanceof ConfigureNetworkCommand) {
|
||||||
|
return executeRequest((ConfigureNetworkCommand)cmd);
|
||||||
|
} else if (cmd instanceof DestroyNetworkCommand) {
|
||||||
|
return executeRequest((DestroyNetworkCommand)cmd);
|
||||||
|
} else if (cmd instanceof ConfigurePortCommand) {
|
||||||
|
return executeRequest((ConfigurePortCommand)cmd);
|
||||||
|
} else if (cmd instanceof DestroyPortCommand) {
|
||||||
|
return executeRequest((DestroyPortCommand)cmd);
|
||||||
|
} else if (cmd instanceof AddHypervisorCommand) {
|
||||||
|
return executeRequest((AddHypervisorCommand)cmd);
|
||||||
|
} else if (cmd instanceof ReadyCommand) {
|
||||||
|
return executeRequest((ReadyCommand)cmd);
|
||||||
|
} else if (cmd instanceof MaintainCommand) {
|
||||||
|
return executeRequest((MaintainCommand)cmd);
|
||||||
|
} else {
|
||||||
|
return Answer.createUnsupportedCommandAnswer(cmd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void disconnected() {
|
||||||
|
s_logger.warn("OpenDaylightControllerResource is disconnected from the controller at " + controllerUrl);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IAgentControl getAgentControl() {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setAgentControl(IAgentControl agentControl) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private Answer executeRequest(final ReadyCommand cmd) {
|
||||||
|
return new ReadyAnswer(cmd);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Answer executeRequest(final MaintainCommand cmd) {
|
||||||
|
return new MaintainAnswer(cmd);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Answer executeRequest(ConfigureNetworkCommand cmd) {
|
||||||
|
NeutronNetworksNorthboundAction configureNetwork = new NeutronNetworksNorthboundAction(controllerUrl, controllerUsername, controllerPassword);
|
||||||
|
NeutronNetwork newNetwork = new NeutronNetwork();
|
||||||
|
|
||||||
|
// Configuration from the command
|
||||||
|
newNetwork.setName(cmd.getName());
|
||||||
|
newNetwork.setTenantId(cmd.getTenantId());
|
||||||
|
|
||||||
|
// Static configuation
|
||||||
|
newNetwork.setNetworkType("gre");
|
||||||
|
newNetwork.setShared(false);
|
||||||
|
newNetwork.setSegmentationId(100);
|
||||||
|
newNetwork.setId(UUID.randomUUID());
|
||||||
|
|
||||||
|
NeutronNetworkWrapper wrapper = new NeutronNetworkWrapper();
|
||||||
|
wrapper.setNetwork(newNetwork);
|
||||||
|
try {
|
||||||
|
wrapper = configureNetwork.createNeutronNetwork(wrapper);
|
||||||
|
} catch (NeutronRestApiException e) {
|
||||||
|
s_logger.error("createNeutronNetwork failed", e);
|
||||||
|
return new ConfigureNetworkAnswer(cmd, e);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new ConfigureNetworkAnswer(cmd, true, null, wrapper.getNetwork().getId().toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
private Answer executeRequest(DestroyNetworkCommand cmd) {
|
||||||
|
NeutronNetworksNorthboundAction configureNetwork = new NeutronNetworksNorthboundAction(controllerUrl, controllerUsername, controllerPassword);
|
||||||
|
try {
|
||||||
|
configureNetwork.deleteNeutronNetwork(cmd.getNetworkUuid());
|
||||||
|
} catch (NeutronRestApiException e) {
|
||||||
|
s_logger.error("deleteNeutronNetwork failed", e);
|
||||||
|
return new DestroyNetworkAnswer(cmd, e);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new DestroyNetworkAnswer(cmd, true, "Network " + cmd.getNetworkUuid() + " deleted");
|
||||||
|
}
|
||||||
|
|
||||||
|
private Answer executeRequest(ConfigurePortCommand cmd) {
|
||||||
|
NeutronPortsNorthboundAction configurePort = new NeutronPortsNorthboundAction(controllerUrl, controllerUsername, controllerPassword);
|
||||||
|
NeutronPort newPort = new NeutronPort();
|
||||||
|
|
||||||
|
// Configuration from the command
|
||||||
|
newPort.setId(cmd.getPortId());
|
||||||
|
newPort.setTenantId(cmd.getTennantId());
|
||||||
|
newPort.setAdminStateUp(true);
|
||||||
|
newPort.setName(cmd.getPortId().toString());
|
||||||
|
newPort.setNetworkId(cmd.getNetworkId());
|
||||||
|
newPort.setMacAddress(cmd.getMacAddress());
|
||||||
|
newPort.setDeviceId(UUID.randomUUID());
|
||||||
|
|
||||||
|
// Static valus
|
||||||
|
newPort.setStatus("ACTIVE");
|
||||||
|
newPort.setFixedIps(Collections.<String> emptyList());
|
||||||
|
|
||||||
|
NeutronPortWrapper portWrapper = new NeutronPortWrapper();
|
||||||
|
portWrapper.setPort(newPort);
|
||||||
|
try {
|
||||||
|
portWrapper = configurePort.createNeutronPort(portWrapper);
|
||||||
|
} catch (NeutronRestApiException e) {
|
||||||
|
s_logger.error("createPortCommand failed", e);
|
||||||
|
return new ConfigurePortAnswer(cmd, e);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new ConfigurePortAnswer(cmd, true, "Port " + portWrapper.getPort().getId().toString() + " created");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private Answer executeRequest(DestroyPortCommand cmd) {
|
||||||
|
NeutronPortsNorthboundAction configurePort = new NeutronPortsNorthboundAction(controllerUrl, controllerUsername, controllerPassword);
|
||||||
|
try {
|
||||||
|
configurePort.deleteNeutronPort(cmd.getPortId().toString());
|
||||||
|
} catch (NeutronRestApiException e) {
|
||||||
|
s_logger.error("deleteNeutronPort failed", e);
|
||||||
|
return new DestroyPortAnswer(cmd, e);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new DestroyPortAnswer(cmd, true, "Port " + cmd.getPortId().toString() + " deleted");
|
||||||
|
}
|
||||||
|
|
||||||
|
private Answer executeRequest(AddHypervisorCommand cmd) {
|
||||||
|
NeutronNodesNorthboundAction nodeActions = new NeutronNodesNorthboundAction(controllerUrl, controllerUsername, controllerPassword);
|
||||||
|
try {
|
||||||
|
NeutronNodesList<NeutronNodeWrapper> nodes = nodeActions.listAllNodes();
|
||||||
|
if (nodes.getNodes() != null) {
|
||||||
|
for (NeutronNodeWrapper nodeWrapper : nodes.getNodes()) {
|
||||||
|
NeutronNode node = nodeWrapper.getNode();
|
||||||
|
if (node.getId().equals(cmd.getHostId())) {
|
||||||
|
return new AddHypervisorAnswer(cmd, true, "Hypervisor already connected");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Not found in the existing node list, add it
|
||||||
|
nodeActions.updateNeutronNodeV2("OVS", cmd.getHostId(), cmd.getIpAddress(), 6640);
|
||||||
|
} catch (NeutronRestApiException e) {
|
||||||
|
s_logger.error("Call to OpenDaylight failed", e);
|
||||||
|
return new AddHypervisorAnswer(cmd, e);
|
||||||
|
}
|
||||||
|
return new AddHypervisorAnswer(cmd, true, "Hypervisor " + cmd.getHostId() + " added");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateConfiguration() {
|
||||||
|
if (!configuration.containsKey("url") || !configuration.containsKey("username") || !configuration.containsKey("password"))
|
||||||
|
throw new InvalidParameterException("OpenDaylightControllerResource needs a url, username and password.");
|
||||||
|
try {
|
||||||
|
controllerUrl = new URL((String)configuration.get("url"));
|
||||||
|
} catch (MalformedURLException e) {
|
||||||
|
throw new InvalidParameterException("OpenDaylightControllerResource found an invalid controller url");
|
||||||
|
}
|
||||||
|
controllerUsername = (String)configuration.get("username");
|
||||||
|
controllerPassword = (String)configuration.get("password");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,34 @@
|
|||||||
|
//
|
||||||
|
// Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
// or more contributor license agreements. See the NOTICE file
|
||||||
|
// distributed with this work for additional information
|
||||||
|
// regarding copyright ownership. The ASF licenses this file
|
||||||
|
// to you 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.apache.cloudstack.network.opendaylight.agent;
|
||||||
|
|
||||||
|
import org.apache.cloudstack.network.opendaylight.api.commands.AddOpenDaylightControllerCmd;
|
||||||
|
import org.apache.cloudstack.network.opendaylight.api.commands.DeleteOpenDaylightControllerCmd;
|
||||||
|
import org.apache.cloudstack.network.opendaylight.dao.OpenDaylightControllerVO;
|
||||||
|
|
||||||
|
import com.cloud.exception.InvalidParameterValueException;
|
||||||
|
import com.cloud.utils.component.PluggableService;
|
||||||
|
|
||||||
|
public interface OpenDaylightControllerResourceManager extends PluggableService {
|
||||||
|
|
||||||
|
public OpenDaylightControllerVO addController(AddOpenDaylightControllerCmd cmd);
|
||||||
|
|
||||||
|
public void deleteController(DeleteOpenDaylightControllerCmd cmd) throws InvalidParameterValueException;
|
||||||
|
}
|
||||||
@ -0,0 +1,173 @@
|
|||||||
|
//
|
||||||
|
// Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
// or more contributor license agreements. See the NOTICE file
|
||||||
|
// distributed with this work for additional information
|
||||||
|
// regarding copyright ownership. The ASF licenses this file
|
||||||
|
// to you 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.apache.cloudstack.network.opendaylight.agent;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
import javax.naming.ConfigurationException;
|
||||||
|
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
|
import org.apache.cloudstack.network.ExternalNetworkDeviceManager.NetworkDevice;
|
||||||
|
import org.apache.cloudstack.network.opendaylight.api.commands.AddOpenDaylightControllerCmd;
|
||||||
|
import org.apache.cloudstack.network.opendaylight.api.commands.DeleteOpenDaylightControllerCmd;
|
||||||
|
import org.apache.cloudstack.network.opendaylight.dao.OpenDaylightControllerMappingDao;
|
||||||
|
import org.apache.cloudstack.network.opendaylight.dao.OpenDaylightControllerVO;
|
||||||
|
|
||||||
|
import com.cloud.exception.InvalidParameterValueException;
|
||||||
|
import com.cloud.host.Host;
|
||||||
|
import com.cloud.host.HostVO;
|
||||||
|
import com.cloud.host.dao.HostDao;
|
||||||
|
import com.cloud.network.Network;
|
||||||
|
import com.cloud.network.Networks;
|
||||||
|
import com.cloud.network.PhysicalNetworkServiceProvider;
|
||||||
|
import com.cloud.network.dao.NetworkDao;
|
||||||
|
import com.cloud.network.dao.NetworkVO;
|
||||||
|
import com.cloud.network.dao.PhysicalNetworkDao;
|
||||||
|
import com.cloud.network.dao.PhysicalNetworkServiceProviderDao;
|
||||||
|
import com.cloud.network.dao.PhysicalNetworkServiceProviderVO;
|
||||||
|
import com.cloud.network.dao.PhysicalNetworkVO;
|
||||||
|
import com.cloud.resource.ResourceManager;
|
||||||
|
import com.cloud.resource.ResourceState;
|
||||||
|
import com.cloud.resource.ServerResource;
|
||||||
|
import com.cloud.utils.db.Transaction;
|
||||||
|
import com.cloud.utils.db.TransactionCallback;
|
||||||
|
import com.cloud.utils.db.TransactionStatus;
|
||||||
|
import com.cloud.utils.exception.CloudRuntimeException;
|
||||||
|
|
||||||
|
public class OpenDaylightControllerResourceManagerImpl implements OpenDaylightControllerResourceManager {
|
||||||
|
private final static Logger s_logger = Logger.getLogger(OpenDaylightControllerResourceManagerImpl.class);
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
HostDao hostDao;
|
||||||
|
@Inject
|
||||||
|
ResourceManager resourceManager;
|
||||||
|
@Inject
|
||||||
|
PhysicalNetworkDao physicalNetworkDao;
|
||||||
|
@Inject
|
||||||
|
PhysicalNetworkServiceProviderDao physicalNetworkServiceProviderDao;
|
||||||
|
@Inject
|
||||||
|
OpenDaylightControllerMappingDao openDaylightControllerMappingDao;
|
||||||
|
@Inject
|
||||||
|
NetworkDao networkDao;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Class<?>> getCommands() {
|
||||||
|
List<Class<?>> commands = new ArrayList<Class<?>>();
|
||||||
|
commands.add(AddOpenDaylightControllerCmd.class);
|
||||||
|
return commands;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public OpenDaylightControllerVO addController(AddOpenDaylightControllerCmd cmd) {
|
||||||
|
ServerResource odlController = new OpenDaylightControllerResource();
|
||||||
|
|
||||||
|
final String deviceName = NetworkDevice.OpenDaylightController.getName();
|
||||||
|
NetworkDevice networkDevice = NetworkDevice.getNetworkDevice(deviceName);
|
||||||
|
final Long physicalNetworkId = cmd.getPhysicalNetworkId();
|
||||||
|
PhysicalNetworkVO physicalNetwork = physicalNetworkDao.findById(physicalNetworkId);
|
||||||
|
if (physicalNetwork == null) {
|
||||||
|
throw new InvalidParameterValueException("Could not find phyical network with ID: " + physicalNetworkId);
|
||||||
|
}
|
||||||
|
long zoneId = physicalNetwork.getDataCenterId();
|
||||||
|
|
||||||
|
final PhysicalNetworkServiceProviderVO ntwkSvcProvider = physicalNetworkServiceProviderDao.findByServiceProvider(physicalNetwork.getId(),
|
||||||
|
networkDevice.getNetworkServiceProvder());
|
||||||
|
if (ntwkSvcProvider == null) {
|
||||||
|
throw new CloudRuntimeException("Network Service Provider: " + networkDevice.getNetworkServiceProvder() + " is not enabled in the physical network: "
|
||||||
|
+ physicalNetworkId + "to add this device");
|
||||||
|
} else if (ntwkSvcProvider.getState() == PhysicalNetworkServiceProvider.State.Shutdown) {
|
||||||
|
throw new CloudRuntimeException("Network Service Provider: " + ntwkSvcProvider.getProviderName() + " is in shutdown state in the physical network: "
|
||||||
|
+ physicalNetworkId + "to add this device");
|
||||||
|
}
|
||||||
|
|
||||||
|
final Map<String, String> hostParams = new HashMap<String, String>();
|
||||||
|
hostParams.put("guid", UUID.randomUUID().toString());
|
||||||
|
hostParams.put("zoneId", String.valueOf(physicalNetwork.getDataCenterId()));
|
||||||
|
hostParams.put("physicalNetworkId", String.valueOf(physicalNetwork.getId()));
|
||||||
|
hostParams.put("name", "ODL Controller - " + hostParams.get("guid"));
|
||||||
|
hostParams.put("url", cmd.getUrl());
|
||||||
|
hostParams.put("username", cmd.getUsername());
|
||||||
|
hostParams.put("password", cmd.getPassword());
|
||||||
|
|
||||||
|
Map<String, Object> hostdetails = new HashMap<String, Object>();
|
||||||
|
hostdetails.putAll(hostParams);
|
||||||
|
|
||||||
|
try {
|
||||||
|
odlController.configure(hostParams.get("name"), hostdetails);
|
||||||
|
final Host host = resourceManager.addHost(zoneId, odlController, Host.Type.L2Networking, hostParams);
|
||||||
|
if (host != null) {
|
||||||
|
return Transaction.execute(new TransactionCallback<OpenDaylightControllerVO>() {
|
||||||
|
@Override
|
||||||
|
public OpenDaylightControllerVO doInTransaction(TransactionStatus status) {
|
||||||
|
OpenDaylightControllerVO controller = new OpenDaylightControllerVO(host.getId(), physicalNetworkId, ntwkSvcProvider.getProviderName(), hostParams
|
||||||
|
.get("name"));
|
||||||
|
openDaylightControllerMappingDao.persist(controller);
|
||||||
|
return controller;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
throw new CloudRuntimeException("Failed to create host object for ODL Controller");
|
||||||
|
}
|
||||||
|
} catch (ConfigurationException e) {
|
||||||
|
throw new CloudRuntimeException("Failed to add ODL Controller as a resource", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void deleteController(DeleteOpenDaylightControllerCmd cmd) throws InvalidParameterValueException {
|
||||||
|
OpenDaylightControllerVO controller = openDaylightControllerMappingDao.findById(cmd.getId());
|
||||||
|
if (controller == null) {
|
||||||
|
throw new InvalidParameterValueException("No ODL Controller with id " + cmd.getId());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find the physical network we work for
|
||||||
|
Long physicalNetworkId = controller.getPhysicalNetworkId();
|
||||||
|
PhysicalNetworkVO physicalNetwork = physicalNetworkDao.findById(physicalNetworkId);
|
||||||
|
if (physicalNetwork != null) {
|
||||||
|
// Lets see if there are networks that use us
|
||||||
|
List<NetworkVO> networkList = networkDao.listByPhysicalNetwork(physicalNetworkId);
|
||||||
|
|
||||||
|
// Networks with broadcast type lswitch are ours
|
||||||
|
for (NetworkVO network : networkList) {
|
||||||
|
if (network.getBroadcastDomainType() == Networks.BroadcastDomainType.OpenDaylight) {
|
||||||
|
if ((network.getState() != Network.State.Shutdown) && (network.getState() != Network.State.Destroy)) {
|
||||||
|
throw new CloudRuntimeException("This Controller can not be deleted as there are one or more logical networks provisioned by cloudstack.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
HostVO host = hostDao.findById(controller.getHostId());
|
||||||
|
Long hostId = host.getId();
|
||||||
|
|
||||||
|
host.setResourceState(ResourceState.Maintenance);
|
||||||
|
hostDao.update(hostId, host);
|
||||||
|
resourceManager.deleteHost(hostId, false, false);
|
||||||
|
|
||||||
|
openDaylightControllerMappingDao.remove(cmd.getId());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,58 @@
|
|||||||
|
//
|
||||||
|
// Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
// or more contributor license agreements. See the NOTICE file
|
||||||
|
// distributed with this work for additional information
|
||||||
|
// regarding copyright ownership. The ASF licenses this file
|
||||||
|
// to you 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.apache.cloudstack.network.opendaylight.agent.commands;
|
||||||
|
|
||||||
|
import com.cloud.agent.api.Command;
|
||||||
|
|
||||||
|
public class AddHypervisorCommand extends Command {
|
||||||
|
private String hostId;
|
||||||
|
private String ipAddress;
|
||||||
|
|
||||||
|
public AddHypervisorCommand() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public AddHypervisorCommand(String hostId, String ipAddress) {
|
||||||
|
this.hostId = hostId;
|
||||||
|
this.ipAddress = ipAddress;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getHostId() {
|
||||||
|
return hostId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setHostId(String hostId) {
|
||||||
|
this.hostId = hostId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getIpAddress() {
|
||||||
|
return ipAddress;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setIpAddress(String ipAddress) {
|
||||||
|
this.ipAddress = ipAddress;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean executeInSequence() {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,54 @@
|
|||||||
|
//
|
||||||
|
// Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
// or more contributor license agreements. See the NOTICE file
|
||||||
|
// distributed with this work for additional information
|
||||||
|
// regarding copyright ownership. The ASF licenses this file
|
||||||
|
// to you 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.apache.cloudstack.network.opendaylight.agent.commands;
|
||||||
|
|
||||||
|
import com.cloud.agent.api.Command;
|
||||||
|
|
||||||
|
public class ConfigureNetworkCommand extends Command {
|
||||||
|
private String name;
|
||||||
|
private String tenantId;
|
||||||
|
|
||||||
|
public ConfigureNetworkCommand(String name, String tenantId) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTenantId() {
|
||||||
|
return tenantId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTenantId(String tennantId) {
|
||||||
|
tenantId = tennantId;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean executeInSequence() {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,80 @@
|
|||||||
|
//
|
||||||
|
// Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
// or more contributor license agreements. See the NOTICE file
|
||||||
|
// distributed with this work for additional information
|
||||||
|
// regarding copyright ownership. The ASF licenses this file
|
||||||
|
// to you 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.apache.cloudstack.network.opendaylight.agent.commands;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import com.cloud.agent.api.Command;
|
||||||
|
|
||||||
|
public class ConfigurePortCommand extends Command {
|
||||||
|
private UUID networkId;
|
||||||
|
private String tennantId;
|
||||||
|
private String macAddress;
|
||||||
|
private UUID portId;
|
||||||
|
|
||||||
|
public ConfigurePortCommand() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public ConfigurePortCommand(UUID portId, UUID networkId, String tennantId, String macAddress) {
|
||||||
|
this.portId = portId;
|
||||||
|
this.networkId = networkId;
|
||||||
|
this.tennantId = tennantId;
|
||||||
|
this.macAddress = macAddress;
|
||||||
|
}
|
||||||
|
|
||||||
|
public UUID getNetworkId() {
|
||||||
|
return networkId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNetworkId(UUID networkId) {
|
||||||
|
this.networkId = networkId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTennantId() {
|
||||||
|
return tennantId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTennantId(String tennantId) {
|
||||||
|
this.tennantId = tennantId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getMacAddress() {
|
||||||
|
return macAddress;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMacAddress(String macAddress) {
|
||||||
|
this.macAddress = macAddress;
|
||||||
|
}
|
||||||
|
|
||||||
|
public UUID getPortId() {
|
||||||
|
return portId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPortId(UUID portId) {
|
||||||
|
this.portId = portId;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean executeInSequence() {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,45 @@
|
|||||||
|
//
|
||||||
|
// Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
// or more contributor license agreements. See the NOTICE file
|
||||||
|
// distributed with this work for additional information
|
||||||
|
// regarding copyright ownership. The ASF licenses this file
|
||||||
|
// to you 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.apache.cloudstack.network.opendaylight.agent.commands;
|
||||||
|
|
||||||
|
import com.cloud.agent.api.Command;
|
||||||
|
|
||||||
|
public class DestroyNetworkCommand extends Command {
|
||||||
|
private String networkUuid;
|
||||||
|
|
||||||
|
public DestroyNetworkCommand(String networkUuid) {
|
||||||
|
this.networkUuid = networkUuid;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getNetworkUuid() {
|
||||||
|
return networkUuid;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNetworkUuid(String networkUuid) {
|
||||||
|
this.networkUuid = networkUuid;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean executeInSequence() {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,50 @@
|
|||||||
|
//
|
||||||
|
// Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
// or more contributor license agreements. See the NOTICE file
|
||||||
|
// distributed with this work for additional information
|
||||||
|
// regarding copyright ownership. The ASF licenses this file
|
||||||
|
// to you 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.apache.cloudstack.network.opendaylight.agent.commands;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import com.cloud.agent.api.Command;
|
||||||
|
|
||||||
|
public class DestroyPortCommand extends Command {
|
||||||
|
private UUID portId;
|
||||||
|
|
||||||
|
public DestroyPortCommand() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public DestroyPortCommand(UUID portId) {
|
||||||
|
this.portId = portId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public UUID getPortId() {
|
||||||
|
return portId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPortId(UUID portId) {
|
||||||
|
this.portId = portId;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean executeInSequence() {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,29 @@
|
|||||||
|
//
|
||||||
|
// Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
// or more contributor license agreements. See the NOTICE file
|
||||||
|
// distributed with this work for additional information
|
||||||
|
// regarding copyright ownership. The ASF licenses this file
|
||||||
|
// to you 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.apache.cloudstack.network.opendaylight.agent.commands;
|
||||||
|
|
||||||
|
import com.cloud.agent.api.StartupCommand;
|
||||||
|
import com.cloud.host.Host;
|
||||||
|
|
||||||
|
public class StartupOpenDaylightControllerCommand extends StartupCommand {
|
||||||
|
public StartupOpenDaylightControllerCommand() {
|
||||||
|
super(Host.Type.L2Networking);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,35 @@
|
|||||||
|
//
|
||||||
|
// Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
// or more contributor license agreements. See the NOTICE file
|
||||||
|
// distributed with this work for additional information
|
||||||
|
// regarding copyright ownership. The ASF licenses this file
|
||||||
|
// to you 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.apache.cloudstack.network.opendaylight.agent.responses;
|
||||||
|
|
||||||
|
import com.cloud.agent.api.Answer;
|
||||||
|
import com.cloud.agent.api.Command;
|
||||||
|
|
||||||
|
public class AddHypervisorAnswer extends Answer {
|
||||||
|
|
||||||
|
public AddHypervisorAnswer(Command command, boolean success, String details) {
|
||||||
|
super(command, success, details);
|
||||||
|
}
|
||||||
|
|
||||||
|
public AddHypervisorAnswer(Command command, Exception e) {
|
||||||
|
super(command, e);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,43 @@
|
|||||||
|
//
|
||||||
|
// Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
// or more contributor license agreements. See the NOTICE file
|
||||||
|
// distributed with this work for additional information
|
||||||
|
// regarding copyright ownership. The ASF licenses this file
|
||||||
|
// to you 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.apache.cloudstack.network.opendaylight.agent.responses;
|
||||||
|
|
||||||
|
import com.cloud.agent.api.Answer;
|
||||||
|
import com.cloud.agent.api.Command;
|
||||||
|
|
||||||
|
public class ConfigureNetworkAnswer extends Answer {
|
||||||
|
private String networkUuid;
|
||||||
|
|
||||||
|
public ConfigureNetworkAnswer(Command command, boolean success, String details, String networkUuid) {
|
||||||
|
this.networkUuid = networkUuid;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ConfigureNetworkAnswer(Command command, boolean success, String details) {
|
||||||
|
super(command, success, details);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ConfigureNetworkAnswer(Command command, Exception e) {
|
||||||
|
super(command, e);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getNetworkUuid() {
|
||||||
|
return networkUuid;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,35 @@
|
|||||||
|
//
|
||||||
|
// Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
// or more contributor license agreements. See the NOTICE file
|
||||||
|
// distributed with this work for additional information
|
||||||
|
// regarding copyright ownership. The ASF licenses this file
|
||||||
|
// to you 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.apache.cloudstack.network.opendaylight.agent.responses;
|
||||||
|
|
||||||
|
import com.cloud.agent.api.Answer;
|
||||||
|
import com.cloud.agent.api.Command;
|
||||||
|
|
||||||
|
public class ConfigurePortAnswer extends Answer {
|
||||||
|
|
||||||
|
public ConfigurePortAnswer(Command command, boolean success, String details) {
|
||||||
|
super(command, success, details);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ConfigurePortAnswer(Command command, Exception e) {
|
||||||
|
super(command, e);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,35 @@
|
|||||||
|
//
|
||||||
|
// Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
// or more contributor license agreements. See the NOTICE file
|
||||||
|
// distributed with this work for additional information
|
||||||
|
// regarding copyright ownership. The ASF licenses this file
|
||||||
|
// to you 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.apache.cloudstack.network.opendaylight.agent.responses;
|
||||||
|
|
||||||
|
import com.cloud.agent.api.Answer;
|
||||||
|
import com.cloud.agent.api.Command;
|
||||||
|
|
||||||
|
public class DestroyNetworkAnswer extends Answer {
|
||||||
|
|
||||||
|
public DestroyNetworkAnswer(Command command, boolean success, String details) {
|
||||||
|
super(command, success, details);
|
||||||
|
}
|
||||||
|
|
||||||
|
public DestroyNetworkAnswer(Command command, Exception e) {
|
||||||
|
super(command, e);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,35 @@
|
|||||||
|
//
|
||||||
|
// Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
// or more contributor license agreements. See the NOTICE file
|
||||||
|
// distributed with this work for additional information
|
||||||
|
// regarding copyright ownership. The ASF licenses this file
|
||||||
|
// to you 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.apache.cloudstack.network.opendaylight.agent.responses;
|
||||||
|
|
||||||
|
import com.cloud.agent.api.Answer;
|
||||||
|
import com.cloud.agent.api.Command;
|
||||||
|
|
||||||
|
public class DestroyPortAnswer extends Answer {
|
||||||
|
|
||||||
|
public DestroyPortAnswer(Command command, boolean success, String details) {
|
||||||
|
super(command, success, details);
|
||||||
|
}
|
||||||
|
|
||||||
|
public DestroyPortAnswer(Command command, Exception e) {
|
||||||
|
super(command, e);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,28 @@
|
|||||||
|
//
|
||||||
|
// Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
// or more contributor license agreements. See the NOTICE file
|
||||||
|
// distributed with this work for additional information
|
||||||
|
// regarding copyright ownership. The ASF licenses this file
|
||||||
|
// to you 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.apache.cloudstack.network.opendaylight.dao;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import com.cloud.utils.db.GenericDao;
|
||||||
|
|
||||||
|
public interface OpenDaylightControllerMappingDao extends GenericDao<OpenDaylightControllerVO, Long> {
|
||||||
|
List<OpenDaylightControllerVO> listByPhysicalNetwork(long physicalNetworkId);
|
||||||
|
}
|
||||||
@ -0,0 +1,45 @@
|
|||||||
|
//
|
||||||
|
// Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
// or more contributor license agreements. See the NOTICE file
|
||||||
|
// distributed with this work for additional information
|
||||||
|
// regarding copyright ownership. The ASF licenses this file
|
||||||
|
// to you 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.apache.cloudstack.network.opendaylight.dao;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import com.cloud.utils.db.GenericDaoBase;
|
||||||
|
import com.cloud.utils.db.SearchBuilder;
|
||||||
|
import com.cloud.utils.db.SearchCriteria;
|
||||||
|
import com.cloud.utils.db.SearchCriteria.Op;
|
||||||
|
|
||||||
|
public class OpenDaylightControllerMappingDaoImpl extends GenericDaoBase<OpenDaylightControllerVO, Long> implements OpenDaylightControllerMappingDao {
|
||||||
|
private SearchBuilder<OpenDaylightControllerVO> physicalNetworkIdSearch;
|
||||||
|
|
||||||
|
public OpenDaylightControllerMappingDaoImpl() {
|
||||||
|
physicalNetworkIdSearch = createSearchBuilder();
|
||||||
|
physicalNetworkIdSearch.and("physicalNetworkId", physicalNetworkIdSearch.entity().getPhysicalNetworkId(), Op.EQ);
|
||||||
|
physicalNetworkIdSearch.done();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<OpenDaylightControllerVO> listByPhysicalNetwork(long physicalNetworkId) {
|
||||||
|
SearchCriteria<OpenDaylightControllerVO> sc = physicalNetworkIdSearch.create();
|
||||||
|
sc.setParameters("physicalNetworkId", physicalNetworkId);
|
||||||
|
return search(sc, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,101 @@
|
|||||||
|
//
|
||||||
|
// Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
// or more contributor license agreements. See the NOTICE file
|
||||||
|
// distributed with this work for additional information
|
||||||
|
// regarding copyright ownership. The ASF licenses this file
|
||||||
|
// to you 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.apache.cloudstack.network.opendaylight.dao;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import javax.persistence.Column;
|
||||||
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.GeneratedValue;
|
||||||
|
import javax.persistence.GenerationType;
|
||||||
|
import javax.persistence.Id;
|
||||||
|
import javax.persistence.Table;
|
||||||
|
|
||||||
|
import org.apache.cloudstack.api.InternalIdentity;
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
@Table(name = "external_opendaylight_controllers")
|
||||||
|
public class OpenDaylightControllerVO implements InternalIdentity {
|
||||||
|
private static final long serialVersionUID = -575928081553194369L;
|
||||||
|
|
||||||
|
@Id
|
||||||
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
|
@Column(name = "id")
|
||||||
|
private long id;
|
||||||
|
|
||||||
|
@Column(name = "uuid")
|
||||||
|
private String uuid;
|
||||||
|
|
||||||
|
@Column(name = "host_id")
|
||||||
|
private long hostId;
|
||||||
|
|
||||||
|
@Column(name = "physical_network_id")
|
||||||
|
private long physicalNetworkId;
|
||||||
|
|
||||||
|
@Column(name = "provider_name")
|
||||||
|
private String providerName;
|
||||||
|
|
||||||
|
@Column(name = "device_name")
|
||||||
|
private String deviceName;
|
||||||
|
|
||||||
|
public OpenDaylightControllerVO() {
|
||||||
|
uuid = UUID.randomUUID().toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public OpenDaylightControllerVO(final long hostId, final long physicalNetworkId, final String providerName, final String deviceName) {
|
||||||
|
super();
|
||||||
|
this.hostId = hostId;
|
||||||
|
this.physicalNetworkId = physicalNetworkId;
|
||||||
|
this.providerName = providerName;
|
||||||
|
this.deviceName = deviceName;
|
||||||
|
uuid = UUID.randomUUID().toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getId() {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getUuid() {
|
||||||
|
return uuid;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUuid(String uuid) {
|
||||||
|
this.uuid = uuid;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getPhysicalNetworkId() {
|
||||||
|
return physicalNetworkId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getHostId() {
|
||||||
|
return hostId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getProviderName() {
|
||||||
|
return providerName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDeviceName() {
|
||||||
|
return deviceName;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,21 @@
|
|||||||
|
#
|
||||||
|
# Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
# or more contributor license agreements. See the NOTICE file
|
||||||
|
# distributed with this work for additional information
|
||||||
|
# regarding copyright ownership. The ASF licenses this file
|
||||||
|
# to you 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.
|
||||||
|
#
|
||||||
|
|
||||||
|
name=opendaylight
|
||||||
|
parent=network
|
||||||
@ -0,0 +1,42 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you 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.
|
||||||
|
|
||||||
|
-->
|
||||||
|
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xmlns:context="http://www.springframework.org/schema/context"
|
||||||
|
xmlns:aop="http://www.springframework.org/schema/aop"
|
||||||
|
xsi:schemaLocation="http://www.springframework.org/schema/beans
|
||||||
|
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
|
||||||
|
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
|
||||||
|
http://www.springframework.org/schema/context
|
||||||
|
http://www.springframework.org/schema/context/spring-context-3.0.xsd"
|
||||||
|
>
|
||||||
|
|
||||||
|
<bean id="OpendaylightGuestNetworkGuru" class="org.apache.cloudstack.network.opendaylight.OpendaylightGuestNetworkGuru">
|
||||||
|
<property name="name" value="OpendaylightGuestNetworkGuru" />
|
||||||
|
</bean>
|
||||||
|
<bean id="OpendaylightElement" class="org.apache.cloudstack.network.opendaylight.OpendaylightElement">
|
||||||
|
<property name="name" value="OpendaylightElement" />
|
||||||
|
</bean>
|
||||||
|
<bean id="OpenDaylightControllerResourceManager" class="org.apache.cloudstack.network.opendaylight.agent.OpenDaylightControllerResourceManagerImpl"/>
|
||||||
|
<bean id="OpenDaylightControllerMappingDao" class="org.apache.cloudstack.network.opendaylight.dao.OpenDaylightControllerMappingDaoImpl" />
|
||||||
|
|
||||||
|
</beans>
|
||||||
|
|
||||||
@ -51,6 +51,7 @@
|
|||||||
<module>network-elements/bigswitch-vns</module>
|
<module>network-elements/bigswitch-vns</module>
|
||||||
<module>network-elements/midonet</module>
|
<module>network-elements/midonet</module>
|
||||||
<module>network-elements/stratosphere-ssp</module>
|
<module>network-elements/stratosphere-ssp</module>
|
||||||
|
<module>network-elements/opendaylight</module>
|
||||||
<module>storage-allocators/random</module>
|
<module>storage-allocators/random</module>
|
||||||
<module>user-authenticators/ldap</module>
|
<module>user-authenticators/ldap</module>
|
||||||
<module>user-authenticators/md5</module>
|
<module>user-authenticators/md5</module>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user