You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ke...@apache.org on 2013/02/02 00:27:31 UTC
[48/50] [abbrv] Merge javelin into master
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/296c2033/api/src/com/cloud/network/PhysicalNetwork.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/296c2033/api/src/com/cloud/offering/NetworkOffering.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/296c2033/api/src/org/apache/cloudstack/api/ApiConstants.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/296c2033/api/src/org/apache/cloudstack/api/command/admin/network/CreateNetworkOfferingCmd.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/296c2033/api/src/org/apache/cloudstack/api/response/NetworkOfferingResponse.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/296c2033/api/src/org/apache/cloudstack/api/response/NetworkResponse.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/296c2033/client/pom.xml
----------------------------------------------------------------------
diff --cc client/pom.xml
index df82402,27bca3d..3ae9dc5
--- a/client/pom.xml
+++ b/client/pom.xml
@@@ -262,22 -336,38 +341,38 @@@
</target>
</configuration>
</execution>
- <execution>
- <id>process-nonoss</id>
- <phase>process-resources</phase>
- <goals>
- <goal>run</goal>
- </goals>
- <configuration>
- <target if="${nonoss}">
- <echo>test</echo>
- <replaceregexp
- file="${basedir}/target/generated-webapp/WEB-INF/classes/environment.properties"
- match="cloud-stack-components-specification=.*"
- replace="cloud-stack-components-specification=components-nonoss.xml" byline="true" />
- </target>
- </configuration>
- </execution>
+ <execution>
+ <id>process-nonoss</id>
+ <phase>process-resources</phase>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ <configuration>
+ <target if="${nonoss}">
+ <echo>test</echo>
+ <replaceregexp
+ file="${basedir}/target/generated-webapp/WEB-INF/classes/environment.properties"
+ match="cloud-stack-components-specification=.*"
+ replace="cloud-stack-components-specification=components-nonoss.xml" byline="true" />
+ </target>
+ </configuration>
+ </execution>
+ <execution>
+ <id>process-nonoss-spring-context</id>
+ <phase>process-resources</phase>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ <configuration>
+ <target if="${nonoss}">
+ <echo>test</echo>
+ <replaceregexp
+ file="${basedir}/target/generated-webapp/WEB-INF/web.xml"
+ match="classpath:applicationContext.xml, classpath:componentContext.xml"
+ replace="classpath:applicationContext.xml, classpath:nonossComponentContext.xml" byline="true" />
+ </target>
+ </configuration>
+ </execution>
</executions>
</plugin>
<!-- there are the jasypt libs requires by some of the python scripts -->
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/296c2033/client/tomcatconf/componentContext.xml.in
----------------------------------------------------------------------
diff --cc client/tomcatconf/componentContext.xml.in
index 0000000,ca91727..82b5228
mode 000000,100644..100644
--- a/client/tomcatconf/componentContext.xml.in
+++ b/client/tomcatconf/componentContext.xml.in
@@@ -1,0 -1,258 +1,269 @@@
+ <!--
+ 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:tx="http://www.springframework.org/schema/tx"
+ 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/tx
+ http://www.springframework.org/schema/tx/spring-tx-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">
+
+
+ <!--
+ Compose a CloudStack deployment with selected components here
+ -->
+ <bean id="databaseUpgradeChecker" class="com.cloud.upgrade.DatabaseUpgradeChecker" />
+
+ <bean id="management-server" class ="com.cloud.server.ManagementServerExtImpl" />
+ <bean id="configuration-server" class="com.cloud.server.ConfigurationServerImpl" />
+
+ <bean id="clusterManagerImpl" class="com.cloud.cluster.ClusterManagerImpl" />
+ <bean id="clusteredAgentManagerImpl" class="com.cloud.agent.manager.ClusteredAgentManagerImpl" />
+ <bean id="clusteredVirtualMachineManagerImpl" class="com.cloud.vm.ClusteredVirtualMachineManagerImpl" />
+ <bean id="highAvailabilityManagerExtImpl" class="com.cloud.ha.HighAvailabilityManagerExtImpl" />
+ <!-- bean id="bareMetalVmManagerImpl" class="com.cloud.baremetal.BareMetalVmManagerImpl" / -->
+ <bean id="userVmManagerImpl" class="com.cloud.vm.UserVmManagerImpl" />
+ <bean id="consoleProxyManagerImpl" class="com.cloud.consoleproxy.ConsoleProxyManagerImpl" />
+ <bean id="securityGroupManagerImpl2" class="com.cloud.network.security.SecurityGroupManagerImpl2" />
+ <bean id="premiumSecondaryStorageManagerImpl" class="com.cloud.secstorage.PremiumSecondaryStorageManagerImpl" />
+ <bean id="randomlyIncreasingVMInstanceDaoImpl" class="com.cloud.vm.dao.RandomlyIncreasingVMInstanceDaoImpl" />
+ <bean id="ipv6AddressManagerImpl" class="com.cloud.network.Ipv6AddressManagerImpl" />
+ <bean id="RegionManagerImpl" class="org.apache.cloudstack.region.RegionManagerImpl" />
++
++ <bean id="ApiRateLimitService" class="org.apache.cloudstack.ratelimit.ApiRateLimitServiceImpl">
++ <property name="name" value="ApiRateLimitService"/>
++ </bean>
+
+ <!--
+ Network Elements
+ -->
+ <bean id="Ovs" class="com.cloud.network.element.OvsElement">
+ <property name="name" value="Ovs"/>
+ </bean>
+ <bean id="ExternalDhcpServer" class="com.cloud.network.element.ExternalDhcpElement">
+ <property name="name" value="ExternalDhcpServer"/>
+ </bean>
+ <bean id="BareMetal" class="com.cloud.network.element.BareMetalElement">
+ <property name="name" value="BareMetal"/>
+ </bean>
+ <bean id="SecurityGroupProvider" class="com.cloud.network.element.SecurityGroupElement">
+ <property name="name" value="SecurityGroupProvider"/>
+ </bean>
+ <bean id="VirtualRouter" class="com.cloud.network.element.VirtualRouterElement">
+ <property name="name" value="VirtualRouter"/>
+ </bean>
+ <bean id="VpcVirtualRouter" class="com.cloud.network.element.VpcVirtualRouterElement">
+ <property name="name" value="VpcVirtualRouter"/>
+ </bean>
+ <bean id="NiciraNvp" class="com.cloud.network.element.NiciraNvpElement">
+ <property name="name" value="NiciraNvp"/>
+ </bean>
++ <bean id="BigSwitchVnsElementService" class="com.cloud.network.element.BigSwitchVnsElement">
++ <property name="name" value="BigSwitchVnsElementService"/>
++ </bean>
+
+ <!--
+ Adapters
+ -->
+ <bean id="FirstFitRouting" class="com.cloud.agent.manager.allocator.impl.FirstFitRoutingAllocator">
+ <property name="name" value="FirstFitRouting"/>
+ </bean>
+
+ <!--
+ Storage pool allocators
+ -->
+ <bean id="LocalStoragePoolAllocator" class="com.cloud.storage.allocator.LocalStoragePoolAllocator">
+ <property name="name" value="LocalStorage"/>
+ </bean>
+ <bean id="FirstFitStoragePoolAllocator" class="com.cloud.storage.allocator.FirstFitStoragePoolAllocator">
+ <property name="name" value="Storage"/>
+ </bean>
+
+ <bean id="UserConcentratedAllocator" class="com.cloud.agent.manager.allocator.impl.UserConcentratedAllocator">
+ <property name="name" value="User First"/>
+ </bean>
+
+ <bean id="ConsoleProxyAllocator" class="com.cloud.consoleproxy.ConsoleProxyBalanceAllocator">
+ <property name="name" value="Balance"/>
+ </bean>
+
+ <bean id="StaticRoleBasedAPIAccessChecker" class="org.apache.cloudstack.acl.StaticRoleBasedAPIAccessChecker"/>
+
+ <bean id="ApiRateLimitServiceImpl" class="org.apache.cloudstack.ratelimit.ApiRateLimitServiceImpl"/>
+
+ <bean id="ExteralIpAddressAllocator" class="com.cloud.network.ExteralIpAddressAllocator">
+ <property name="name" value="Basic"/>
+ </bean>
+
+ <bean id="hyervisorTemplateAdapter" class="com.cloud.template.HyervisorTemplateAdapter">
+ <property name="name" value="HypervisorAdapter"/>
+ </bean>
+
+ <!--
+ Authenticators
+ -->
+ <bean id="MD5UserAuthenticator" class="com.cloud.server.auth.MD5UserAuthenticator">
+ <property name="name" value="MD5"/>
+ </bean>
+
+ <bean id="LDAPUserAuthenticator" class="com.cloud.server.auth.LDAPUserAuthenticator">
+ <property name="name" value="LDAP"/>
+ </bean>
+
+ <!--
+ Investigators
+ -->
+ <bean id="CheckOnAgentInvestigator" class="com.cloud.ha.CheckOnAgentInvestigator">
+ <property name="name" value="SimpleInvestigator"/>
+ </bean>
+
+ <bean id="XenServerInvestigator" class="com.cloud.ha.XenServerInvestigator">
+ <property name="name" value="XenServerInvestigator"/>
+ </bean>
+
+ <bean id="UserVmDomRInvestigator" class="com.cloud.ha.UserVmDomRInvestigator">
+ <property name="name" value="PingInvestigator"/>
+ </bean>
+
+ <bean id="ManagementIPSystemVMInvestigator" class="com.cloud.ha.ManagementIPSystemVMInvestigator">
+ <property name="name" value="ManagementIPSysVMInvestigator"/>
+ </bean>
+
+ <!--
+ Fencers
+ -->
+ <bean id="XenServerFencer" class="com.cloud.ha.XenServerFencer">
+ <property name="name" value="XenServerFenceBuilder"/>
+ </bean>
+ <bean id="KVMFencer" class="com.cloud.ha.KVMFencer">
+ <property name="name" value="KVMFenceBuilder"/>
+ </bean>
+ <bean id="OvmFencer" class="com.cloud.ovm.hypervisor.OvmFencer">
+ <property name="name" value="OvmFenceBuilder"/>
+ </bean>
+
+ <bean id="XcpServerDiscoverer" class="com.cloud.hypervisor.xen.discoverer.XcpServerDiscoverer">
+ <property name="name" value="XCP Agent"/>
+ </bean>
+
+ <bean id="SecondaryStorageDiscoverer" class="com.cloud.storage.secondary.SecondaryStorageDiscoverer">
+ <property name="name" value="SecondaryStorage"/>
+ </bean>
+
+ <bean id="KvmServerDiscoverer" class="com.cloud.hypervisor.kvm.discoverer.KvmServerDiscoverer">
+ <property name="name" value="KVM Agent"/>
+ </bean>
+
+ <bean id="BareMetalDiscoverer" class="com.cloud.baremetal.BareMetalDiscoverer">
+ <property name="name" value="Bare Metal Agent"/>
+ </bean>
+
+ <bean id="HypervServerDiscoverer" class="com.cloud.hypervisor.hyperv.HypervServerDiscoverer">
+ <property name="name" value="SCVMMServer"/>
+ </bean>
+
+ <bean id="OvmDiscoverer" class="com.cloud.ovm.hypervisor.OvmDiscoverer">
+ <property name="name" value="Ovm Discover"/>
+ </bean>
+
+ <bean id="FirstFitPlanner" class="com.cloud.deploy.FirstFitPlanner">
+ <property name="name" value="First Fit"/>
+ </bean>
+
+ <bean id="UserDispersingPlanner" class="com.cloud.deploy.UserDispersingPlanner">
+ <property name="name" value="UserDispersing"/>
+ </bean>
+
+ <bean id="UserConcentratedPodPlanner" class="com.cloud.deploy.UserConcentratedPodPlanner">
+ <property name="name" value="UserConcentratedPod"/>
+ </bean>
+
+ <bean id="BareMetalPlanner" class="com.cloud.deploy.BareMetalPlanner">
+ <property name="name" value="BareMetal Fit"/>
+ </bean>
+
+
+ <!--
+ Network Gurus
+ -->
+ <bean id="StorageNetworkGuru" class="com.cloud.network.guru.StorageNetworkGuru">
+ <property name="name" value="StorageNetworkGuru"/>
+ </bean>
+ <bean id="ExternalGuestNetworkGuru" class="com.cloud.network.guru.ExternalGuestNetworkGuru">
+ <property name="name" value="ExternalGuestNetworkGuru"/>
+ </bean>
+ <bean id="PublicNetworkGuru" class="com.cloud.network.guru.PublicNetworkGuru">
+ <property name="name" value="PublicNetworkGuru"/>
+ </bean>
+ <bean id="PodBasedNetworkGuru" class="com.cloud.network.guru.PodBasedNetworkGuru">
+ <property name="name" value="PodBasedNetworkGuru"/>
+ </bean>
+ <bean id="ControlNetworkGuru" class="com.cloud.network.guru.ControlNetworkGuru">
+ <property name="name" value="ControlNetworkGuru"/>
+ </bean>
+ <bean id="DirectNetworkGuru" class="com.cloud.network.guru.DirectNetworkGuru">
+ <property name="name" value="DirectNetworkGuru"/>
+ </bean>
+ <bean id="DirectPodBasedNetworkGuru" class="com.cloud.network.guru.DirectPodBasedNetworkGuru">
+ <property name="name" value="DirectPodBasedNetworkGuru"/>
+ </bean>
+ <bean id="OvsGuestNetworkGuru" class="com.cloud.network.guru.OvsGuestNetworkGuru">
+ <property name="name" value="OvsGuestNetworkGuru"/>
+ </bean>
+ <bean id="PrivateNetworkGuru" class="com.cloud.network.guru.PrivateNetworkGuru">
+ <property name="name" value="PrivateNetworkGuru"/>
+ </bean>
+ <bean id="NiciraNvpGuestNetworkGuru" class="com.cloud.network.guru.NiciraNvpGuestNetworkGuru">
+ <property name="name" value="NiciraNvpGuestNetworkGuru"/>
+ </bean>
++ <bean id="BigSwitchVnsGuestNetworkGuru" class=".BigSwitchVnsGuestNetworkGuru">
++ <property name="name" value="com.cloud.network.guru.BigSwitchVnsGuestNetworkGuru"/>
++ </bean>
++
+
+ <!--
+ Hypervisor Gurus
+ -->
+ <bean id="XenServerGuru" class="com.cloud.hypervisor.XenServerGuru">
+ <property name="name" value="XenServerGuru"/>
+ </bean>
+
+ <bean id="KVMGuru" class="com.cloud.hypervisor.KVMGuru">
+ <property name="name" value="KVMGuru"/>
+ </bean>
+
+ <bean id="BareMetalGuru" class="com.cloud.baremetal.BareMetalGuru">
+ <property name="name" value="BareMetalGuru"/>
+ </bean>
+
+ <bean id="HypervGuru" class="com.cloud.hypervisor.guru.HypervGuru">
+ <property name="name" value="HypervGuru"/>
+ </bean>
+
+ <bean id="OvmGuru" class="com.cloud.ovm.hypervisor.OvmGuru">
+ <property name="name" value="OvmGuru"/>
+ </bean>
+
+ </beans>
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/296c2033/client/vmops.log.2013-01-09.gz
----------------------------------------------------------------------
diff --cc client/vmops.log.2013-01-09.gz
index 0000000,0000000..573dafb
new file mode 100644
Binary files differ
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/296c2033/client/vmops.log.2013-01-18.gz
----------------------------------------------------------------------
diff --cc client/vmops.log.2013-01-18.gz
index 0000000,0000000..fe5ab35
new file mode 100644
Binary files differ
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/296c2033/plugins/network-elements/bigswitch-vns/src/com/cloud/api/commands/AddBigSwitchVnsDeviceCmd.java
----------------------------------------------------------------------
diff --cc plugins/network-elements/bigswitch-vns/src/com/cloud/api/commands/AddBigSwitchVnsDeviceCmd.java
index 3662a2e,0000000..c4c4ba9
mode 100644,000000..100644
--- a/plugins/network-elements/bigswitch-vns/src/com/cloud/api/commands/AddBigSwitchVnsDeviceCmd.java
+++ b/plugins/network-elements/bigswitch-vns/src/com/cloud/api/commands/AddBigSwitchVnsDeviceCmd.java
@@@ -1,110 -1,0 +1,111 @@@
+// 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 com.cloud.api.commands;
+
++import javax.inject.Inject;
++
+import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.ApiErrorCode;
+import org.apache.cloudstack.api.BaseAsyncCmd;
+import org.apache.cloudstack.api.Parameter;
- import org.apache.cloudstack.api.PlugService;
+import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.api.response.PhysicalNetworkResponse;
+
+import com.cloud.api.response.BigSwitchVnsDeviceResponse;
+import com.cloud.exception.ConcurrentOperationException;
+import com.cloud.exception.InsufficientCapacityException;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.exception.ResourceAllocationException;
+import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.network.BigSwitchVnsDeviceVO;
+import com.cloud.network.element.BigSwitchVnsElementService;
+import com.cloud.user.UserContext;
+import com.cloud.utils.exception.CloudRuntimeException;
+
+@APICommand(name = "addBigSwitchVnsDevice", responseObject=BigSwitchVnsDeviceResponse.class, description="Adds a BigSwitch VNS device")
+public class AddBigSwitchVnsDeviceCmd extends BaseAsyncCmd {
+ private static final String s_name = "addbigswitchvnsdeviceresponse";
- @PlugService BigSwitchVnsElementService _bigswitchVnsElementService;
++ @Inject BigSwitchVnsElementService _bigswitchVnsElementService;
+
+ /////////////////////////////////////////////////////
+ //////////////// API parameters /////////////////////
+ /////////////////////////////////////////////////////
+
+ @Parameter(name=ApiConstants.PHYSICAL_NETWORK_ID, type=CommandType.UUID, entityType = PhysicalNetworkResponse.class,
+ required=true, description="the Physical Network ID")
+ private Long physicalNetworkId;
+
+ @Parameter(name=ApiConstants.HOST_NAME, type=CommandType.STRING, required=true,
+ description="Hostname of ip address of the BigSwitch VNS Controller.")
+ private String host;
+
+ /////////////////////////////////////////////////////
+ /////////////////// Accessors ///////////////////////
+ /////////////////////////////////////////////////////
+
+ public Long getPhysicalNetworkId() {
+ return physicalNetworkId;
+ }
+
+ public String getHost() {
+ return host;
+ }
+
+ /////////////////////////////////////////////////////
+ /////////////// API Implementation///////////////////
+ /////////////////////////////////////////////////////
+
+ @Override
+ public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException {
+ try {
+ BigSwitchVnsDeviceVO bigswitchVnsDeviceVO = _bigswitchVnsElementService.addBigSwitchVnsDevice(this);
+ if (bigswitchVnsDeviceVO != null) {
+ BigSwitchVnsDeviceResponse response = _bigswitchVnsElementService.createBigSwitchVnsDeviceResponse(bigswitchVnsDeviceVO);
+ response.setObjectName("bigswitchvnsdevice");
+ response.setResponseName(getCommandName());
+ this.setResponseObject(response);
+ } else {
+ throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to add BigSwitch VNS device due to internal error.");
+ }
+ } catch (InvalidParameterValueException invalidParamExcp) {
+ throw new ServerApiException(ApiErrorCode.PARAM_ERROR, invalidParamExcp.getMessage());
+ } catch (CloudRuntimeException runtimeExcp) {
+ throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, runtimeExcp.getMessage());
+ }
+ }
+
+ @Override
+ public String getCommandName() {
+ return s_name;
+ }
+
+ @Override
+ public long getEntityOwnerId() {
+ return UserContext.current().getCaller().getId();
+ }
+
+ @Override
+ public String getEventType() {
+ return VnsConstants.EVENT_EXTERNAL_VNS_CONTROLLER_ADD;
+ }
+
+ @Override
+ public String getEventDescription() {
+ return "Adding a BigSwitch VNS Controller";
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/296c2033/plugins/network-elements/bigswitch-vns/src/com/cloud/api/commands/DeleteBigSwitchVnsDeviceCmd.java
----------------------------------------------------------------------
diff --cc plugins/network-elements/bigswitch-vns/src/com/cloud/api/commands/DeleteBigSwitchVnsDeviceCmd.java
index 83adb22,0000000..06eee15
mode 100644,000000..100644
--- a/plugins/network-elements/bigswitch-vns/src/com/cloud/api/commands/DeleteBigSwitchVnsDeviceCmd.java
+++ b/plugins/network-elements/bigswitch-vns/src/com/cloud/api/commands/DeleteBigSwitchVnsDeviceCmd.java
@@@ -1,99 -1,0 +1,100 @@@
+// 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 com.cloud.api.commands;
+
+
++import javax.inject.Inject;
++
+import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.ApiErrorCode;
+import org.apache.cloudstack.api.BaseAsyncCmd;
+import org.apache.cloudstack.api.Parameter;
- import org.apache.cloudstack.api.PlugService;
+import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.api.response.SuccessResponse;
+
+import com.cloud.exception.ConcurrentOperationException;
+import com.cloud.exception.InsufficientCapacityException;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.exception.ResourceAllocationException;
+import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.network.element.BigSwitchVnsElementService;
+import com.cloud.user.UserContext;
+import com.cloud.utils.exception.CloudRuntimeException;
+
+@APICommand(name = "deleteBigSwitchVnsDevice", responseObject=SuccessResponse.class, description=" delete a bigswitch vns device")
+public class DeleteBigSwitchVnsDeviceCmd extends BaseAsyncCmd {
+ private static final String s_name = "deletebigswitchvnsdeviceresponse";
- @PlugService BigSwitchVnsElementService _bigswitchVnsElementService;
++ @Inject BigSwitchVnsElementService _bigswitchVnsElementService;
+
+ /////////////////////////////////////////////////////
+ //////////////// API parameters /////////////////////
+ /////////////////////////////////////////////////////
+
+ @Parameter(name=VnsConstants.BIGSWITCH_VNS_DEVICE_ID, type=CommandType.LONG, required=true, description="BigSwitch device ID")
+ private Long bigswitchVnsDeviceId;
+
+ /////////////////////////////////////////////////////
+ /////////////////// Accessors ///////////////////////
+ /////////////////////////////////////////////////////
+
+ public Long getBigSwitchVnsDeviceId() {
+ return bigswitchVnsDeviceId;
+ }
+
+ /////////////////////////////////////////////////////
+ /////////////// API Implementation///////////////////
+ /////////////////////////////////////////////////////
+
+ @Override
+ public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException {
+ try {
+ boolean result = _bigswitchVnsElementService.deleteBigSwitchVnsDevice(this);
+ if (result) {
+ SuccessResponse response = new SuccessResponse(getCommandName());
+ response.setResponseName(getCommandName());
+ this.setResponseObject(response);
+ } else {
+ throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to delete BigSwitch device.");
+ }
+ } catch (InvalidParameterValueException invalidParamExcp) {
+ throw new ServerApiException(ApiErrorCode.PARAM_ERROR, invalidParamExcp.getMessage());
+ } catch (CloudRuntimeException runtimeExcp) {
+ throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, runtimeExcp.getMessage());
+ }
+ }
+
+ @Override
+ public String getCommandName() {
+ return s_name;
+ }
+
+ @Override
+ public long getEntityOwnerId() {
+ return UserContext.current().getCaller().getId();
+ }
+
+ @Override
+ public String getEventType() {
+ return VnsConstants.EVENT_EXTERNAL_VNS_CONTROLLER_DELETE;
+ }
+
+ @Override
+ public String getEventDescription() {
+ return "Deleting BigSwitch Vns Controller";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/296c2033/plugins/network-elements/bigswitch-vns/src/com/cloud/api/commands/ListBigSwitchVnsDevicesCmd.java
----------------------------------------------------------------------
diff --cc plugins/network-elements/bigswitch-vns/src/com/cloud/api/commands/ListBigSwitchVnsDevicesCmd.java
index d9a209e,0000000..c0710ea
mode 100644,000000..100644
--- a/plugins/network-elements/bigswitch-vns/src/com/cloud/api/commands/ListBigSwitchVnsDevicesCmd.java
+++ b/plugins/network-elements/bigswitch-vns/src/com/cloud/api/commands/ListBigSwitchVnsDevicesCmd.java
@@@ -1,109 -1,0 +1,110 @@@
+// 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 com.cloud.api.commands;
+
+import java.util.ArrayList;
+import java.util.List;
+
++import javax.inject.Inject;
++
+import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.ApiErrorCode;
+import org.apache.cloudstack.api.BaseListCmd;
+import org.apache.cloudstack.api.Parameter;
- import org.apache.cloudstack.api.PlugService;
+import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.api.response.ListResponse;
+import org.apache.cloudstack.api.response.PhysicalNetworkResponse;
+import org.apache.log4j.Logger;
+
+import com.cloud.api.response.BigSwitchVnsDeviceResponse;
+import com.cloud.exception.ConcurrentOperationException;
+import com.cloud.exception.InsufficientCapacityException;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.exception.ResourceAllocationException;
+import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.network.BigSwitchVnsDeviceVO;
+import com.cloud.network.element.BigSwitchVnsElementService;
+import com.cloud.utils.exception.CloudRuntimeException;
+
+@APICommand(name = "listBigSwitchVnsDevices", responseObject=BigSwitchVnsDeviceResponse.class, description="Lists BigSwitch Vns devices")
+public class ListBigSwitchVnsDevicesCmd extends BaseListCmd {
+ public static final Logger s_logger = Logger.getLogger(ListBigSwitchVnsDevicesCmd.class.getName());
+ private static final String s_name = "listbigswitchvnsdeviceresponse";
- @PlugService BigSwitchVnsElementService _bigswitchVnsElementService;
++ @Inject BigSwitchVnsElementService _bigswitchVnsElementService;
+
+ /////////////////////////////////////////////////////
+ //////////////// API parameters /////////////////////
+ /////////////////////////////////////////////////////
+
+ @Parameter(name=ApiConstants.PHYSICAL_NETWORK_ID, type=CommandType.UUID,
+ entityType = PhysicalNetworkResponse.class,
+ description="the Physical Network ID")
+ private Long physicalNetworkId;
+
+ @Parameter(name=VnsConstants.BIGSWITCH_VNS_DEVICE_ID,
+ type=CommandType.LONG,
+ description="bigswitch vns device ID")
+ private Long bigswitchVnsDeviceId;
+
+ /////////////////////////////////////////////////////
+ /////////////////// Accessors ///////////////////////
+ /////////////////////////////////////////////////////
+
+ public Long getBigSwitchVnsDeviceId() {
+ return bigswitchVnsDeviceId;
+ }
+
+ public Long getPhysicalNetworkId() {
+ return physicalNetworkId;
+ }
+
+ /////////////////////////////////////////////////////
+ /////////////// API Implementation///////////////////
+ /////////////////////////////////////////////////////
+
+ @Override
+ public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException,
+ ConcurrentOperationException, ResourceAllocationException {
+ try {
+ List<BigSwitchVnsDeviceVO> bigswitchDevices = _bigswitchVnsElementService.listBigSwitchVnsDevices(this);
+ ListResponse<BigSwitchVnsDeviceResponse> response = new ListResponse<BigSwitchVnsDeviceResponse>();
+ List<BigSwitchVnsDeviceResponse> bigswitchDevicesResponse = new ArrayList<BigSwitchVnsDeviceResponse>();
+
+ if (bigswitchDevices != null && !bigswitchDevices.isEmpty()) {
+ for (BigSwitchVnsDeviceVO bigswitchDeviceVO : bigswitchDevices) {
+ BigSwitchVnsDeviceResponse bigswitchDeviceResponse =
+ _bigswitchVnsElementService.createBigSwitchVnsDeviceResponse(bigswitchDeviceVO);
+ bigswitchDevicesResponse.add(bigswitchDeviceResponse);
+ }
+ }
+
+ response.setResponses(bigswitchDevicesResponse);
+ response.setResponseName(getCommandName());
+ this.setResponseObject(response);
+ } catch (InvalidParameterValueException invalidParamExcp) {
+ throw new ServerApiException(ApiErrorCode.PARAM_ERROR, invalidParamExcp.getMessage());
+ } catch (CloudRuntimeException runtimeExcp) {
+ throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, runtimeExcp.getMessage());
+ }
+ }
+
+ @Override
+ public String getCommandName() {
+ return s_name;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/296c2033/plugins/network-elements/bigswitch-vns/src/com/cloud/network/dao/BigSwitchVnsDaoImpl.java
----------------------------------------------------------------------
diff --cc plugins/network-elements/bigswitch-vns/src/com/cloud/network/dao/BigSwitchVnsDaoImpl.java
index 955bdda,0000000..dad9f36
mode 100644,000000..100644
--- a/plugins/network-elements/bigswitch-vns/src/com/cloud/network/dao/BigSwitchVnsDaoImpl.java
+++ b/plugins/network-elements/bigswitch-vns/src/com/cloud/network/dao/BigSwitchVnsDaoImpl.java
@@@ -1,48 -1,0 +1,51 @@@
+// 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 com.cloud.network.dao;
+
+import java.util.List;
+
+import javax.ejb.Local;
+
++import org.springframework.stereotype.Component;
++
+import com.cloud.network.BigSwitchVnsDeviceVO;
+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;
+
++@Component
+@Local(value=BigSwitchVnsDao.class)
+public class BigSwitchVnsDaoImpl extends GenericDaoBase<BigSwitchVnsDeviceVO, Long>
+ implements BigSwitchVnsDao {
+
+ protected final SearchBuilder<BigSwitchVnsDeviceVO> physicalNetworkIdSearch;
+
+ public BigSwitchVnsDaoImpl() {
+ physicalNetworkIdSearch = createSearchBuilder();
+ physicalNetworkIdSearch.and("physicalNetworkId", physicalNetworkIdSearch.entity().getPhysicalNetworkId(), Op.EQ);
+ physicalNetworkIdSearch.done();
+ }
+
+ @Override
+ public List<BigSwitchVnsDeviceVO> listByPhysicalNetwork(long physicalNetworkId) {
+ SearchCriteria<BigSwitchVnsDeviceVO> sc = physicalNetworkIdSearch.create();
+ sc.setParameters("physicalNetworkId", physicalNetworkId);
+ return search(sc, null);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/296c2033/plugins/network-elements/bigswitch-vns/src/com/cloud/network/element/BigSwitchVnsElement.java
----------------------------------------------------------------------
diff --cc plugins/network-elements/bigswitch-vns/src/com/cloud/network/element/BigSwitchVnsElement.java
index 35e4bdb,0000000..67d0d8d
mode 100644,000000..100644
--- a/plugins/network-elements/bigswitch-vns/src/com/cloud/network/element/BigSwitchVnsElement.java
+++ b/plugins/network-elements/bigswitch-vns/src/com/cloud/network/element/BigSwitchVnsElement.java
@@@ -1,543 -1,0 +1,543 @@@
+// 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 com.cloud.network.element;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+
+import javax.ejb.Local;
++import javax.inject.Inject;
+import javax.naming.ConfigurationException;
+
+import org.apache.cloudstack.network.ExternalNetworkDeviceManager.NetworkDevice;
+import org.apache.log4j.Logger;
+
+import com.cloud.agent.AgentManager;
+import com.cloud.agent.api.CreateVnsPortAnswer;
+import com.cloud.agent.api.CreateVnsPortCommand;
+import com.cloud.agent.api.DeleteVnsPortAnswer;
+import com.cloud.agent.api.DeleteVnsPortCommand;
+import com.cloud.agent.api.StartupBigSwitchVnsCommand;
+import com.cloud.agent.api.StartupCommand;
+import com.cloud.api.ApiDBUtils;
+import com.cloud.api.commands.AddBigSwitchVnsDeviceCmd;
+import com.cloud.api.commands.DeleteBigSwitchVnsDeviceCmd;
+import com.cloud.api.commands.ListBigSwitchVnsDevicesCmd;
+import com.cloud.api.commands.VnsConstants;
+import com.cloud.api.response.BigSwitchVnsDeviceResponse;
+import com.cloud.configuration.ConfigurationManager;
+import com.cloud.dc.dao.VlanDao;
+import com.cloud.deploy.DeployDestination;
+import com.cloud.exception.ConcurrentOperationException;
+import com.cloud.exception.InsufficientCapacityException;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.host.DetailVO;
+import com.cloud.host.Host;
+import com.cloud.host.HostVO;
+import com.cloud.host.dao.HostDao;
+import com.cloud.host.dao.HostDetailsDao;
+import com.cloud.network.BigSwitchVnsDeviceVO;
+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.NetworkModel;
- import com.cloud.network.NetworkVO;
+import com.cloud.network.Networks;
+import com.cloud.network.Networks.BroadcastDomainType;
+import com.cloud.network.PhysicalNetwork;
+import com.cloud.network.PhysicalNetworkServiceProvider;
- import com.cloud.network.PhysicalNetworkVO;
+import com.cloud.network.dao.BigSwitchVnsDao;
+import com.cloud.network.dao.NetworkDao;
+import com.cloud.network.dao.NetworkServiceMapDao;
++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.network.resource.BigSwitchVnsResource;
+import com.cloud.offering.NetworkOffering;
+import com.cloud.resource.ResourceManager;
+import com.cloud.resource.ResourceState;
+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.component.Inject;
+import com.cloud.utils.db.DB;
+import com.cloud.utils.db.Transaction;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.vm.NicProfile;
+import com.cloud.vm.ReservationContext;
+import com.cloud.vm.VirtualMachine;
+import com.cloud.vm.VirtualMachineProfile;
+
+@Local(value = {NetworkElement.class, ConnectivityProvider.class})
+public class BigSwitchVnsElement extends AdapterBase implements
+ BigSwitchVnsElementService, ConnectivityProvider, ResourceStateAdapter {
+ private static final Logger s_logger = Logger.getLogger(BigSwitchVnsElement.class);
+
+ private static final Map<Service, Map<Capability, String>> capabilities = setCapabilities();
+
+ @Inject
+ ResourceManager _resourceMgr;
+ @Inject
+ PhysicalNetworkDao _physicalNetworkDao;
+ @Inject
+ PhysicalNetworkServiceProviderDao _physicalNetworkServiceProviderDao;
+ @Inject
+ BigSwitchVnsDao _bigswitchVnsDao;
+ @Inject
+ HostDetailsDao _hostDetailsDao;
+ @Inject
+ HostDao _hostDao;
+ @Inject
+ AgentManager _agentMgr;
+ @Inject
+ NetworkDao _networkDao;
+ @Inject
+ NetworkModel _networkModel;
+ @Inject
+ ConfigurationManager _configMgr;
+ @Inject
+ NetworkServiceMapDao _ntwkSrvcDao;
+ @Inject
+ VlanDao _vlanDao;
+
+ @Override
+ public Map<Service, Map<Capability, String>> getCapabilities() {
+ return capabilities;
+ }
+
+ @Override
+ public Provider getProvider() {
+ return VnsConstants.BigSwitchVns;
+ }
+
+ private boolean canHandle(Network network, Service service) {
+ s_logger.debug("Checking if BigSwitchVnsElement can handle service "
+ + service.getName() + " on network " + network.getDisplayText());
+ if (network.getBroadcastDomainType() != BroadcastDomainType.Lswitch) {
+ return false;
+ }
+
+ if (!_networkModel.isProviderForNetwork(getProvider(),
+ network.getId())) {
+ s_logger.debug("BigSwitchVnsElement is not a provider for network "
+ + network.getDisplayText());
+ return false;
+ }
+
+ if (!_ntwkSrvcDao.canProviderSupportServiceInNetwork(network.getId(),
+ service, VnsConstants.BigSwitchVns)) {
+ s_logger.debug("BigSwitchVnsElement can't provide the "
+ + service.getName() + " service on network "
+ + network.getDisplayText());
+ return false;
+ }
+
+ return true;
+ }
+
+ @Override
+ public boolean configure(String name, Map<String, Object> params)
+ throws ConfigurationException {
+ super.configure(name, params);
+ _resourceMgr.registerResourceStateAdapter(this.getClass()
+ .getSimpleName(), this);
+ return true;
+ }
+
+ @Override
+ public boolean implement(Network network, NetworkOffering offering,
+ DeployDestination dest, ReservationContext context)
+ throws ConcurrentOperationException, ResourceUnavailableException,
+ InsufficientCapacityException {
+ s_logger.debug("entering BigSwitchVnsElement implement function for network "
+ + network.getDisplayText()
+ + " (state "
+ + network.getState()
+ + ")");
+
+ return true;
+ }
+
+ @Override
+ public boolean prepare(Network network, NicProfile nic,
+ VirtualMachineProfile<? extends VirtualMachine> vm,
+ DeployDestination dest, ReservationContext context)
+ throws ConcurrentOperationException, ResourceUnavailableException,
+ InsufficientCapacityException {
+
+ if (!canHandle(network, Service.Connectivity)) {
+ return false;
+ }
+
+ if (network.getBroadcastUri() == null) {
+ s_logger.error("Nic has no broadcast Uri with the LSwitch Uuid");
+ return false;
+ }
+
+ String mac = nic.getMacAddress();
+ String tenantId = context.getDomain().getName() + "-" + context.getAccount().getAccountId();
+
+ List<BigSwitchVnsDeviceVO> devices = _bigswitchVnsDao
+ .listByPhysicalNetwork(network.getPhysicalNetworkId());
+ if (devices.isEmpty()) {
+ s_logger.error("No BigSwitch Controller on physical network "
+ + network.getPhysicalNetworkId());
+ return false;
+ }
+ BigSwitchVnsDeviceVO bigswitchVnsDevice = devices.get(0);
+ HostVO bigswitchVnsHost = _hostDao.findById(bigswitchVnsDevice.getHostId());
+
+ CreateVnsPortCommand cmd = new CreateVnsPortCommand(
+ network.getBroadcastUri().getSchemeSpecificPart(),
+ vm.getUuid(),
+ tenantId,
+ nic.getName(),
+ mac);
+ CreateVnsPortAnswer answer = (CreateVnsPortAnswer) _agentMgr
+ .easySend(bigswitchVnsHost.getId(), cmd);
+
+ if (answer == null || !answer.getResult()) {
+ s_logger.error("CreatePortCommand failed");
+ return false;
+ }
+
+ return true;
+ }
+
+ @Override
+ public boolean release(Network network, NicProfile nic,
+ VirtualMachineProfile<? extends VirtualMachine> vm,
+ ReservationContext context) throws ConcurrentOperationException,
+ ResourceUnavailableException {
+
+ if (!canHandle(network, Service.Connectivity)) {
+ return false;
+ }
+
+ if (network.getBroadcastUri() == null) {
+ s_logger.error("Nic has no broadcast Uri with the LSwitch Uuid");
+ return false;
+ }
+
+ String tenantId = context.getDomain().getName() + "-" + context.getAccount().getAccountId();
+
+ List<BigSwitchVnsDeviceVO> devices = _bigswitchVnsDao
+ .listByPhysicalNetwork(network.getPhysicalNetworkId());
+ if (devices.isEmpty()) {
+ s_logger.error("No BigSwitch Controller on physical network "
+ + network.getPhysicalNetworkId());
+ return false;
+ }
+ BigSwitchVnsDeviceVO bigswitchVnsDevice = devices.get(0);
+ HostVO bigswitchVnsHost = _hostDao.findById(bigswitchVnsDevice.getHostId());
+
+ DeleteVnsPortCommand cmd = new DeleteVnsPortCommand(
+ network.getBroadcastUri().getSchemeSpecificPart(),
+ vm.getUuid(),
+ tenantId);
+ DeleteVnsPortAnswer answer = (DeleteVnsPortAnswer) _agentMgr
+ .easySend(bigswitchVnsHost.getId(), cmd);
+
+ if (answer == null || !answer.getResult()) {
+ s_logger.error("DeletePortCommand failed");
+ return false;
+ }
+
+ return true;
+ }
+
+ @Override
+ public boolean shutdown(Network network, ReservationContext context,
+ boolean cleanup) throws ConcurrentOperationException,
+ ResourceUnavailableException {
+ if (!canHandle(network, Service.Connectivity)) {
+ return false;
+ }
+
+ return true;
+ }
+
+ @Override
+ public boolean destroy(Network network, ReservationContext context)
+ throws ConcurrentOperationException, ResourceUnavailableException {
+ if (!canHandle(network, Service.Connectivity)) {
+ return false;
+ }
+
+ return true;
+ }
+
+ @Override
+ public boolean isReady(PhysicalNetworkServiceProvider provider) {
+ return true;
+ }
+
+ @Override
+ public boolean shutdownProviderInstances(
+ PhysicalNetworkServiceProvider provider, ReservationContext context)
+ throws ConcurrentOperationException, ResourceUnavailableException {
+ // Nothing to do here.
+ return true;
+ }
+
+ @Override
+ public boolean canEnableIndividualServices() {
+ return true;
+ }
+
+ @Override
+ public boolean verifyServicesCombination(Set<Service> services) {
+ if (!services.contains(Service.Connectivity)) {
+ s_logger.warn("Unable to provide services without Connectivity service enabled for this element");
+ return false;
+ }
+ return 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;
+ }
+
+ @Override
+ @DB
+ public BigSwitchVnsDeviceVO addBigSwitchVnsDevice(AddBigSwitchVnsDeviceCmd cmd) {
+ ServerResource resource = new BigSwitchVnsResource();
+ String deviceName = VnsConstants.BigSwitchVns.getName();
+ NetworkDevice networkDevice = NetworkDevice
+ .getNetworkDevice(deviceName);
+ Long physicalNetworkId = cmd.getPhysicalNetworkId();
+ BigSwitchVnsDeviceVO bigswitchVnsDevice = null;
+
+ PhysicalNetworkVO physicalNetwork = _physicalNetworkDao
+ .findById(physicalNetworkId);
+ if (physicalNetwork == null) {
+ throw new InvalidParameterValueException(
+ "Could not find phyical network with ID: "
+ + physicalNetworkId);
+ }
+ long zoneId = physicalNetwork.getDataCenterId();
+
+ 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");
+ }
+
+ if (_bigswitchVnsDao.listByPhysicalNetwork(physicalNetworkId).size() != 0) {
+ throw new CloudRuntimeException(
+ "A BigSwitch controller device is already configured on this physical network");
+ }
+
+ Map<String, String> params = new HashMap<String, String>();
+ params.put("guid", UUID.randomUUID().toString());
+ params.put("zoneId", String.valueOf(physicalNetwork.getDataCenterId()));
+ params.put("physicalNetworkId", String.valueOf(physicalNetwork.getId()));
+ params.put("name", "BigSwitch Controller - " + cmd.getHost());
+ params.put("ip", cmd.getHost());
+ // FIXME What to do with multiple isolation types
+ params.put("transportzoneisotype",
+ physicalNetwork.getIsolationMethods().get(0).toLowerCase());
+
+ Map<String, Object> hostdetails = new HashMap<String, Object>();
+ hostdetails.putAll(params);
+
+ Transaction txn = Transaction.currentTxn();
+ try {
+ resource.configure(cmd.getHost(), hostdetails);
+
+ Host host = _resourceMgr.addHost(zoneId, resource,
+ Host.Type.L2Networking, params);
+ if (host != null) {
+ txn.start();
+
+ bigswitchVnsDevice = new BigSwitchVnsDeviceVO(host.getId(),
+ physicalNetworkId, ntwkSvcProvider.getProviderName(),
+ deviceName);
+ _bigswitchVnsDao.persist(bigswitchVnsDevice);
+
+ DetailVO detail = new DetailVO(host.getId(),
+ "bigswitchvnsdeviceid",
+ String.valueOf(bigswitchVnsDevice.getId()));
+ _hostDetailsDao.persist(detail);
+
+ txn.commit();
+ return bigswitchVnsDevice;
+ } else {
+ throw new CloudRuntimeException(
+ "Failed to add BigSwitch Vns Device due to internal error.");
+ }
+ } catch (ConfigurationException e) {
+ txn.rollback();
+ throw new CloudRuntimeException(e.getMessage());
+ }
+ }
+
+ @Override
+ public BigSwitchVnsDeviceResponse createBigSwitchVnsDeviceResponse(
+ BigSwitchVnsDeviceVO bigswitchVnsDeviceVO) {
+ HostVO bigswitchVnsHost = _hostDao.findById(bigswitchVnsDeviceVO.getHostId());
+ _hostDao.loadDetails(bigswitchVnsHost);
+
+ BigSwitchVnsDeviceResponse response = new BigSwitchVnsDeviceResponse();
+ response.setDeviceName(bigswitchVnsDeviceVO.getDeviceName());
+ PhysicalNetwork pnw = ApiDBUtils.findPhysicalNetworkById(bigswitchVnsDeviceVO.getPhysicalNetworkId());
+ if (pnw != null) {
+ response.setPhysicalNetworkId(pnw.getUuid());
+ }
+ response.setId(bigswitchVnsDeviceVO.getUuid());
+ response.setProviderName(bigswitchVnsDeviceVO.getProviderName());
+ response.setHostName(bigswitchVnsHost.getDetail("ip"));
+ response.setObjectName("bigswitchvnsdevice");
+ return response;
+ }
+
+ @Override
+ public boolean deleteBigSwitchVnsDevice(DeleteBigSwitchVnsDeviceCmd cmd) {
+ Long bigswitchVnsDeviceId = cmd.getBigSwitchVnsDeviceId();
+ BigSwitchVnsDeviceVO bigswitchVnsDevice = _bigswitchVnsDao
+ .findById(bigswitchVnsDeviceId);
+ if (bigswitchVnsDevice == null) {
+ throw new InvalidParameterValueException(
+ "Could not find a BigSwitch Controller with id " + bigswitchVnsDevice);
+ }
+
+ // Find the physical network we work for
+ Long physicalNetworkId = bigswitchVnsDevice.getPhysicalNetworkId();
+ PhysicalNetworkVO physicalNetwork = _physicalNetworkDao
+ .findById(physicalNetworkId);
+ if (physicalNetwork != null) {
+ List<NetworkVO> networkList = _networkDao
+ .listByPhysicalNetwork(physicalNetworkId);
+
+ // Networks with broadcast type lswitch are ours
+ for (NetworkVO network : networkList) {
+ if (network.getBroadcastDomainType() == Networks.BroadcastDomainType.Lswitch) {
+ if ((network.getState() != Network.State.Shutdown)
+ && (network.getState() != Network.State.Destroy)) {
+ throw new CloudRuntimeException(
+ "This BigSwitch Controller device can not be deleted as there are one or more " +
+ "logical networks provisioned by cloudstack.");
+ }
+ }
+ }
+ }
+
+ HostVO bigswitchHost = _hostDao.findById(bigswitchVnsDevice.getHostId());
+ Long hostId = bigswitchHost.getId();
+
+ bigswitchHost.setResourceState(ResourceState.Maintenance);
+ _hostDao.update(hostId, bigswitchHost);
+ _resourceMgr.deleteHost(hostId, false, false);
+
+ _bigswitchVnsDao.remove(bigswitchVnsDeviceId);
+ return true;
+ }
+
+ @Override
+ public List<BigSwitchVnsDeviceVO> listBigSwitchVnsDevices(
+ ListBigSwitchVnsDevicesCmd cmd) {
+ Long physicalNetworkId = cmd.getPhysicalNetworkId();
+ Long bigswitchVnsDeviceId = cmd.getBigSwitchVnsDeviceId();
+ List<BigSwitchVnsDeviceVO> responseList = new ArrayList<BigSwitchVnsDeviceVO>();
+
+ if (physicalNetworkId == null && bigswitchVnsDeviceId == null) {
+ throw new InvalidParameterValueException(
+ "Either physical network Id or bigswitch device Id must be specified");
+ }
+
+ if (bigswitchVnsDeviceId != null) {
+ BigSwitchVnsDeviceVO bigswitchVnsDevice = _bigswitchVnsDao
+ .findById(bigswitchVnsDeviceId);
+ if (bigswitchVnsDevice == null) {
+ throw new InvalidParameterValueException(
+ "Could not find BigSwitch controller with id: "
+ + bigswitchVnsDevice);
+ }
+ responseList.add(bigswitchVnsDevice);
+ } else {
+ PhysicalNetworkVO physicalNetwork = _physicalNetworkDao
+ .findById(physicalNetworkId);
+ if (physicalNetwork == null) {
+ throw new InvalidParameterValueException(
+ "Could not find a physical network with id: "
+ + physicalNetworkId);
+ }
+ responseList = _bigswitchVnsDao
+ .listByPhysicalNetwork(physicalNetworkId);
+ }
+
+ return responseList;
+ }
+
+ @Override
+ public HostVO createHostVOForConnectedAgent(HostVO host,
+ StartupCommand[] cmd) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public HostVO createHostVOForDirectConnectAgent(HostVO host,
+ StartupCommand[] startup, ServerResource resource,
+ Map<String, String> details, List<String> hostTags) {
+ if (!(startup[0] instanceof StartupBigSwitchVnsCommand)) {
+ return null;
+ }
+ host.setType(Host.Type.L2Networking);
+ return host;
+ }
+
+ @Override
+ public DeleteHostAnswer deleteHost(HostVO host, boolean isForced,
+ boolean isForceDeleteStorage) throws UnableDeleteHostException {
+ if (!(host.getType() == Host.Type.L2Networking)) {
+ return null;
+ }
+ return new DeleteHostAnswer(true);
+ }
+
+ @Override
+ public List<Class<?>> getCommands() {
+ List<Class<?>> cmdList = new ArrayList<Class<?>>();
+ cmdList.add(AddBigSwitchVnsDeviceCmd.class);
+ cmdList.add(DeleteBigSwitchVnsDeviceCmd.class);
+ cmdList.add(ListBigSwitchVnsDevicesCmd.class);
+ return cmdList;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/296c2033/plugins/network-elements/bigswitch-vns/src/com/cloud/network/guru/BigSwitchVnsGuestNetworkGuru.java
----------------------------------------------------------------------
diff --cc plugins/network-elements/bigswitch-vns/src/com/cloud/network/guru/BigSwitchVnsGuestNetworkGuru.java
index fe21163,0000000..b96ea56
mode 100644,000000..100644
--- a/plugins/network-elements/bigswitch-vns/src/com/cloud/network/guru/BigSwitchVnsGuestNetworkGuru.java
+++ b/plugins/network-elements/bigswitch-vns/src/com/cloud/network/guru/BigSwitchVnsGuestNetworkGuru.java
@@@ -1,261 -1,0 +1,261 @@@
+/*
+ * 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 com.cloud.network.guru;
+
+import com.cloud.agent.AgentManager;
+import com.cloud.agent.api.CreateVnsNetworkAnswer;
+import com.cloud.agent.api.CreateVnsNetworkCommand;
+import com.cloud.agent.api.DeleteVnsNetworkCommand;
+import com.cloud.dc.DataCenter;
+import com.cloud.dc.DataCenter.NetworkType;
+import com.cloud.dc.dao.DataCenterDao;
+import com.cloud.deploy.DeployDestination;
+import com.cloud.deploy.DeploymentPlan;
+import com.cloud.exception.InsufficientAddressCapacityException;
+import com.cloud.exception.InsufficientVirtualNetworkCapcityException;
+import com.cloud.host.HostVO;
+import com.cloud.host.dao.HostDao;
+import com.cloud.host.dao.HostDetailsDao;
+import com.cloud.network.BigSwitchVnsDeviceVO;
+import com.cloud.network.Network;
+import com.cloud.network.NetworkProfile;
- import com.cloud.network.NetworkVO;
+import com.cloud.network.Network.GuestType;
+import com.cloud.network.Network.State;
+import com.cloud.network.Networks.BroadcastDomainType;
+import com.cloud.network.PhysicalNetwork;
+import com.cloud.network.PhysicalNetwork.IsolationMethod;
- import com.cloud.network.PhysicalNetworkVO;
+import com.cloud.network.dao.BigSwitchVnsDao;
++import com.cloud.network.dao.NetworkVO;
+import com.cloud.network.dao.PhysicalNetworkDao;
++import com.cloud.network.dao.PhysicalNetworkVO;
+import com.cloud.offering.NetworkOffering;
+import com.cloud.resource.ResourceManager;
+import com.cloud.user.Account;
+import com.cloud.user.dao.AccountDao;
- import com.cloud.utils.component.Inject;
+import com.cloud.vm.NicProfile;
+import com.cloud.vm.ReservationContext;
+import com.cloud.vm.VirtualMachine;
+import com.cloud.vm.VirtualMachineProfile;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.List;
+
+import org.apache.log4j.Logger;
+
+import javax.ejb.Local;
++import javax.inject.Inject;
+
+
+@Local(value = NetworkGuru.class)
+public class BigSwitchVnsGuestNetworkGuru extends GuestNetworkGuru {
+ private static final Logger s_logger = Logger.getLogger(BigSwitchVnsGuestNetworkGuru.class);
+
+ @Inject
+ DataCenterDao _zoneDao;
+ @Inject
+ PhysicalNetworkDao _physicalNetworkDao;
+ @Inject
+ AccountDao _accountDao;
+ @Inject
+ BigSwitchVnsDao _bigswitchVnsDao;
+ @Inject
+ HostDao _hostDao;
+ @Inject
+ ResourceManager _resourceMgr;
+ @Inject
+ AgentManager _agentMgr;
+ @Inject
+ HostDetailsDao _hostDetailsDao;
+
+ public BigSwitchVnsGuestNetworkGuru() {
+ super();
+ _isolationMethods = new IsolationMethod[] { IsolationMethod.VNS };
+ }
+
+ @Override
+ protected boolean canHandle(NetworkOffering offering, NetworkType networkType,
+ PhysicalNetwork physicalNetwork) {
+ if (networkType == NetworkType.Advanced
+ && isMyTrafficType(offering.getTrafficType())
+ && offering.getGuestType() == Network.GuestType.Isolated
+ && isMyIsolationMethod(physicalNetwork)) {
+ 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) {
+ // Check of the isolation type of the related physical network is VNS
+ PhysicalNetworkVO physnet = _physicalNetworkDao.findById(plan.getPhysicalNetworkId());
+ if (physnet == null ||
+ physnet.getIsolationMethods() == null ||
+ !physnet.getIsolationMethods().contains("VNS")) {
+ s_logger.debug("Refusing to design this network, the physical isolation type is not VNS");
+ return null;
+ }
+
+ List<BigSwitchVnsDeviceVO> devices = _bigswitchVnsDao.listByPhysicalNetwork(physnet.getId());
+ if (devices.isEmpty()) {
+ s_logger.error("No BigSwitxh Controller on physical network " + physnet.getName());
+ return null;
+ }
+ s_logger.debug("BigSwitch Controller " + devices.get(0).getUuid() +
+ " found on physical network " + physnet.getId());
+
+ s_logger.debug("Physical isolation type is VNS, 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.Lswitch);
+
+ 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 = _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());
+ }
+
+ String vnet = _dcDao.allocateVnet(dcId, physicalNetworkId,
+ network.getAccountId(), context.getReservationId());
+ if (vnet == null) {
+ throw new InsufficientVirtualNetworkCapcityException("Unable to allocate vnet as a " +
+ "part of network " + network + " implement ", DataCenter.class, dcId);
+ }
+ int vlan = Integer.parseInt(vnet);
+
+ // Name is either the given name or the uuid
+ String name = network.getName();
+ String networkUuid = implemented.getUuid();
+ if (name == null || name.isEmpty()) {
+ name = ((NetworkVO)network).getUuid();
+ }
+ if (name.length() > 64 ) {
+ name = name.substring(0, 63); // max length 64
+ }
+
+ String tenantId = context.getDomain().getName() + "-" + context.getAccount().getAccountId();
+ List<BigSwitchVnsDeviceVO> devices = _bigswitchVnsDao.listByPhysicalNetwork(physicalNetworkId);
+ if (devices.isEmpty()) {
+ s_logger.error("No BigSwitch Controller on physical network " + physicalNetworkId);
+ return null;
+ }
+ BigSwitchVnsDeviceVO bigswitchVnsDevice = devices.get(0);
+ HostVO bigswitchVnsHost = _hostDao.findById(bigswitchVnsDevice.getHostId());
+ _hostDao.loadDetails(bigswitchVnsHost);
+
+ CreateVnsNetworkCommand cmd = new CreateVnsNetworkCommand(networkUuid, name, tenantId, vlan);
+ CreateVnsNetworkAnswer answer = (CreateVnsNetworkAnswer) _agentMgr.easySend(bigswitchVnsHost.getId(), cmd);
+
+ if (answer == null || !answer.getResult()) {
+ s_logger.error ("CreateNetworkCommand failed");
+ return null;
+ }
+
+ try {
+ implemented.setBroadcastUri(new URI("vns", cmd.getNetworkUuid(), null));
+ implemented.setBroadcastDomainType(BroadcastDomainType.Lswitch);
+ s_logger.info("Implemented OK, network " + networkUuid + " in tenant " +
+ tenantId + " linked to " + implemented.getBroadcastUri().toString());
+ } catch (URISyntaxException e) {
+ s_logger.error("Unable to store network id in broadcast uri, uuid = " + implemented.getUuid(), e);
+ }
+
+ return implemented;
+ }
+
+ @Override
+ public void reserve(NicProfile nic, Network network,
+ VirtualMachineProfile<? extends VirtualMachine> vm,
+ DeployDestination dest, ReservationContext context)
+ throws InsufficientVirtualNetworkCapcityException,
+ InsufficientAddressCapacityException {
+ // TODO Auto-generated method stub
+ super.reserve(nic, network, vm, dest, context);
+ }
+
+ @Override
+ public boolean release(NicProfile nic,
+ VirtualMachineProfile<? extends VirtualMachine> vm,
+ String reservationId) {
+ // TODO Auto-generated method stub
+ return super.release(nic, vm, reservationId);
+ }
+
+ @Override
+ public void shutdown(NetworkProfile profile, NetworkOffering offering) {
+ NetworkVO networkObject = _networkDao.findById(profile.getId());
+ if (networkObject.getBroadcastDomainType() != BroadcastDomainType.Lswitch ||
+ networkObject.getBroadcastUri() == null) {
+ s_logger.warn("BroadcastUri is empty or incorrect for guestnetwork " + networkObject.getDisplayText());
+ return;
+ }
+
+ List<BigSwitchVnsDeviceVO> devices = _bigswitchVnsDao.listByPhysicalNetwork(networkObject.getPhysicalNetworkId());
+ if (devices.isEmpty()) {
+ s_logger.error("No BigSwitch Controller on physical network " + networkObject.getPhysicalNetworkId());
+ return;
+ }
+ BigSwitchVnsDeviceVO bigswitchVnsDevice = devices.get(0);
+ HostVO bigswitchVnsHost = _hostDao.findById(bigswitchVnsDevice.getHostId());
+
+ String tenantId = profile.getNetworkDomain() + "-" + profile.getAccountId();
+
+ DeleteVnsNetworkCommand cmd = new DeleteVnsNetworkCommand(tenantId,
+ networkObject.getBroadcastUri().getSchemeSpecificPart());
+ _agentMgr.easySend(bigswitchVnsHost.getId(), cmd);
+
+ super.shutdown(profile, offering);
+ }
+
+ @Override
+ public boolean trash(Network network, NetworkOffering offering,
+ Account owner) {
+ return super.trash(network, offering, owner);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/296c2033/plugins/network-elements/bigswitch-vns/src/com/cloud/network/resource/BigSwitchVnsResource.java
----------------------------------------------------------------------
diff --cc plugins/network-elements/bigswitch-vns/src/com/cloud/network/resource/BigSwitchVnsResource.java
index 52c9ba7,0000000..8d070b5
mode 100644,000000..100644
--- a/plugins/network-elements/bigswitch-vns/src/com/cloud/network/resource/BigSwitchVnsResource.java
+++ b/plugins/network-elements/bigswitch-vns/src/com/cloud/network/resource/BigSwitchVnsResource.java
@@@ -1,322 -1,0 +1,323 @@@
+// 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 com.cloud.network.resource;
+
+import java.util.Map;
+
+import javax.naming.ConfigurationException;
+
+import org.apache.log4j.Logger;
+
+import com.cloud.agent.IAgentControl;
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.Command;
+import com.cloud.agent.api.CreateVnsNetworkAnswer;
+import com.cloud.agent.api.CreateVnsNetworkCommand;
+import com.cloud.agent.api.CreateVnsPortAnswer;
+import com.cloud.agent.api.CreateVnsPortCommand;
+import com.cloud.agent.api.DeleteVnsNetworkAnswer;
+import com.cloud.agent.api.DeleteVnsNetworkCommand;
+import com.cloud.agent.api.DeleteVnsPortAnswer;
+import com.cloud.agent.api.DeleteVnsPortCommand;
+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.agent.api.StartupBigSwitchVnsCommand;
+import com.cloud.agent.api.UpdateVnsPortAnswer;
+import com.cloud.agent.api.UpdateVnsPortCommand;
+import com.cloud.host.Host;
+import com.cloud.host.Host.Type;
+import com.cloud.network.bigswitch.BigSwitchVnsApi;
+import com.cloud.network.bigswitch.BigSwitchVnsApiException;
+import com.cloud.network.bigswitch.ControlClusterStatus;
+import com.cloud.network.bigswitch.Attachment;
+import com.cloud.network.bigswitch.Network;
+import com.cloud.network.bigswitch.Port;
+import com.cloud.resource.ServerResource;
++import com.cloud.utils.component.ManagerBase;
+
- public class BigSwitchVnsResource implements ServerResource {
++public class BigSwitchVnsResource extends ManagerBase implements ServerResource {
+ private static final Logger s_logger = Logger.getLogger(BigSwitchVnsResource.class);
+
+ private String _name;
+ private String _guid;
+ private String _zoneId;
+ private int _numRetries;
+
+ private BigSwitchVnsApi _bigswitchVnsApi;
+
+ protected BigSwitchVnsApi createBigSwitchVnsApi() {
+ return new BigSwitchVnsApi();
+ }
+
+ @Override
+ public boolean configure(String name, Map<String, Object> params)
+ throws ConfigurationException {
+
+ _name = (String) params.get("name");
+ if (_name == null) {
+ throw new ConfigurationException("Unable to find name");
+ }
+
+ _guid = (String)params.get("guid");
+ if (_guid == null) {
+ throw new ConfigurationException("Unable to find the guid");
+ }
+
+ _zoneId = (String) params.get("zoneId");
+ if (_zoneId == null) {
+ throw new ConfigurationException("Unable to find zone");
+ }
+
+ _numRetries = 2;
+
+ String ip = (String) params.get("ip");
+ if (ip == null) {
+ throw new ConfigurationException("Unable to find IP");
+ }
+
+ _bigswitchVnsApi = createBigSwitchVnsApi();
+ _bigswitchVnsApi.setControllerAddress(ip);
+
+ return true;
+ }
+
+ @Override
+ public boolean start() {
+ return true;
+ }
+
+ @Override
+ public boolean stop() {
+ return true;
+ }
+
+ @Override
+ public String getName() {
+ return _name;
+ }
+
+ @Override
+ public Type getType() {
+ // Think up a better name for this Type?
+ return Host.Type.L2Networking;
+ }
+
+ @Override
+ public StartupCommand[] initialize() {
+ StartupBigSwitchVnsCommand sc = new StartupBigSwitchVnsCommand();
+ sc.setGuid(_guid);
+ sc.setName(_name);
+ sc.setDataCenter(_zoneId);
+ sc.setPod("");
+ sc.setPrivateIpAddress("");
+ sc.setStorageIpAddress("");
+ sc.setVersion("");
+ return new StartupCommand[] { sc };
+ }
+
+ @Override
+ public PingCommand getCurrentStatus(long id) {
+ try {
+ ControlClusterStatus ccs = _bigswitchVnsApi.getControlClusterStatus();
+ if (!ccs.getStatus()) {
+ s_logger.error("ControlCluster state is not ready: " + ccs.getStatus());
+ return null;
+ }
+ } catch (BigSwitchVnsApiException e) {
+ s_logger.error("getControlClusterStatus failed", e);
+ return null;
+ }
+ return new PingCommand(Host.Type.L2Networking, id);
+ }
+
+ @Override
+ public Answer executeRequest(Command cmd) {
+ return executeRequest(cmd, _numRetries);
+ }
+
+ public Answer executeRequest(Command cmd, int numRetries) {
+ if (cmd instanceof ReadyCommand) {
+ return executeRequest((ReadyCommand) cmd);
+ }
+ else if (cmd instanceof MaintainCommand) {
+ return executeRequest((MaintainCommand)cmd);
+ }
+ else if (cmd instanceof CreateVnsNetworkCommand) {
+ return executeRequest((CreateVnsNetworkCommand)cmd, numRetries);
+ }
+ else if (cmd instanceof DeleteVnsNetworkCommand) {
+ return executeRequest((DeleteVnsNetworkCommand) cmd, numRetries);
+ }
+ else if (cmd instanceof CreateVnsPortCommand) {
+ return executeRequest((CreateVnsPortCommand) cmd, numRetries);
+ }
+ else if (cmd instanceof DeleteVnsPortCommand) {
+ return executeRequest((DeleteVnsPortCommand) cmd, numRetries);
+ }
+ else if (cmd instanceof UpdateVnsPortCommand) {
+ return executeRequest((UpdateVnsPortCommand) cmd, numRetries);
+ }
+ s_logger.debug("Received unsupported command " + cmd.toString());
+ return Answer.createUnsupportedCommandAnswer(cmd);
+ }
+
+ @Override
+ public void disconnected() {
+ }
+
+ @Override
+ public IAgentControl getAgentControl() {
+ return null;
+ }
+
+ @Override
+ public void setAgentControl(IAgentControl agentControl) {
+ }
+
+ private Answer executeRequest(CreateVnsNetworkCommand cmd, int numRetries) {
+ Network network = new Network();
+ network.setTenant_id(cmd.getTenantUuid());
+ network.setUuid(cmd.getNetworkUuid());
+ network.setDisplay_name(truncate("vns-cloudstack-" + cmd.getName(), 64));
+ network.setVlan(cmd.getVlan());
+
+ try {
+ _bigswitchVnsApi.createNetwork(network);
+ return new CreateVnsNetworkAnswer(cmd, true, "VNS " + network.getUuid() + " created");
+ } catch (BigSwitchVnsApiException e) {
+ if (numRetries > 0) {
+ return retry(cmd, --numRetries);
+ }
+ else {
+ return new CreateVnsNetworkAnswer(cmd, e);
+ }
+ }
+
+ }
+
+ private Answer executeRequest(DeleteVnsNetworkCommand cmd, int numRetries) {
+ try {
+ _bigswitchVnsApi.deleteNetwork(cmd.get_tenantUuid(), cmd.getNetworkUuid());
+ return new DeleteVnsNetworkAnswer(cmd, true, "VNS " + cmd.getNetworkUuid() + " deleted");
+ } catch (BigSwitchVnsApiException e) {
+ if (numRetries > 0) {
+ return retry(cmd, --numRetries);
+ }
+ else {
+ return new DeleteVnsNetworkAnswer(cmd, e);
+ }
+ }
+ }
+
+ private Answer executeRequest(CreateVnsPortCommand cmd, int numRetries) {
+ Port port = new Port();
+ port.setId(cmd.getPortUuid());
+ port.setName(cmd.getPortName());
+ port.setTenant_id(cmd.getTenantUuid());
+
+ try {
+ _bigswitchVnsApi.createPort(cmd.getNetworkUuid(), port);
+ try {
+ Attachment attachment = new Attachment();
+ attachment.setId(cmd.getPortUuid());
+ attachment.setMac(cmd.getMac());
+ _bigswitchVnsApi.modifyPortAttachment(cmd.getTenantUuid(),
+ cmd.getNetworkUuid(), cmd.getPortUuid(), attachment);
+
+ } catch (BigSwitchVnsApiException ex) {
+ s_logger.warn("modifyPortAttachment failed after switchport was created, removing switchport");
+ _bigswitchVnsApi.deletePort(cmd.getTenantUuid(), cmd.getNetworkUuid(), cmd.getPortUuid());
+ throw (ex); // Rethrow the original exception
+ }
+ return new CreateVnsPortAnswer(cmd, true, "network port " + cmd.getPortUuid() + " created");
+ } catch (BigSwitchVnsApiException e) {
+ if (numRetries > 0) {
+ return retry(cmd, --numRetries);
+ }
+ else {
+ return new CreateVnsPortAnswer(cmd, e);
+ }
+ }
+ }
+
+ private Answer executeRequest(DeleteVnsPortCommand cmd, int numRetries) {
+ try {
+ _bigswitchVnsApi.deletePortAttachment(cmd.getTenantUuid(), cmd.getNetworkUuid(), cmd.getPortUuid());
+ try {
+ _bigswitchVnsApi.deletePort(cmd.getTenantUuid(), cmd.getNetworkUuid(), cmd.getPortUuid());
+ } catch (BigSwitchVnsApiException ex) {
+ s_logger.warn("deletePort failed after portAttachment was removed");
+ throw (ex); // Rethrow the original exception
+ }
+ return new DeleteVnsPortAnswer(cmd, true, "network port " + cmd.getPortUuid() + " deleted");
+ } catch (BigSwitchVnsApiException e) {
+ if (numRetries > 0) {
+ return retry(cmd, --numRetries);
+ }
+ else {
+ return new DeleteVnsPortAnswer(cmd, e);
+ }
+ }
+ }
+
+ private Answer executeRequest(UpdateVnsPortCommand cmd, int numRetries) {
+ Port port = new Port();
+ port.setId(cmd.getPortUuid());
+ port.setName(cmd.getPortName());
+ port.setTenant_id(cmd.getTenantUuid());
+
+ try {
+ _bigswitchVnsApi.modifyPort(cmd.getNetworkUuid(), port);
+ return new UpdateVnsPortAnswer(cmd, true, "Network Port " + cmd.getPortUuid() + " updated");
+ } catch (BigSwitchVnsApiException e) {
+ if (numRetries > 0) {
+ return retry(cmd, --numRetries);
+ }
+ else {
+ return new UpdateVnsPortAnswer(cmd, e);
+ }
+ }
+
+ }
+
+ private Answer executeRequest(ReadyCommand cmd) {
+ return new ReadyAnswer(cmd);
+ }
+
+ private Answer executeRequest(MaintainCommand cmd) {
+ return new MaintainAnswer(cmd);
+ }
+
+ private Answer retry(Command cmd, int numRetries) {
+ s_logger.warn("Retrying " + cmd.getClass().getSimpleName() + ". Number of retries remaining: " + numRetries);
+ return executeRequest(cmd, numRetries);
+ }
+
+ private String truncate(String string, int length) {
+ if (string.length() <= length) {
+ return string;
+ }
+ else {
+ return string.substring(0, length);
+ }
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/296c2033/plugins/pom.xml
----------------------------------------------------------------------
diff --cc plugins/pom.xml
index 198a632,4daa71d..02459b4
mode 100644,100755..100755
--- a/plugins/pom.xml
+++ b/plugins/pom.xml
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/296c2033/server/src/com/cloud/agent/manager/ClusteredAgentManagerImpl.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/296c2033/server/src/com/cloud/api/ApiResponseHelper.java
----------------------------------------------------------------------