You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by wi...@apache.org on 2015/04/15 10:05:04 UTC
[04/53] [abbrv] git commit: updated refs/heads/reporter to 5c99784
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/01864ef7/plugins/network-elements/bigswitch/src/com/cloud/api/commands/BcfConstants.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/bigswitch/src/com/cloud/api/commands/BcfConstants.java b/plugins/network-elements/bigswitch/src/com/cloud/api/commands/BcfConstants.java
new file mode 100644
index 0000000..4b6cc3a
--- /dev/null
+++ b/plugins/network-elements/bigswitch/src/com/cloud/api/commands/BcfConstants.java
@@ -0,0 +1,37 @@
+//
+// 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 org.apache.cloudstack.network.ExternalNetworkDeviceManager.NetworkDevice;
+
+import com.cloud.network.Network.Provider;
+
+public class BcfConstants {
+ public static final String BIGSWITCH_BCF_DEVICE_ID = "bcfdeviceid";
+ public static final String BIGSWITCH_BCF_DEVICE_NAME = "bigswitchdevicename";
+ public static final String BIGSWITCH_BCF_DEVICE_NAT = "nat";
+ public static final String EVENT_EXTERNAL_BCF_CONTROLLER_ADD = "PHYSICAL.BCFCONTROLLER.ADD";
+ public static final String EVENT_EXTERNAL_BCF_CONTROLLER_DELETE = "PHYSICAL.BCFCONTROLLER.DELETE";
+
+ public static final Provider BigSwitchBcf = new Provider("BigSwitchBcf", true);
+
+ public static final NetworkDevice BigSwitchBcfDevice = new NetworkDevice("BigSwitchBcf", BigSwitchBcf.getName());
+
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/01864ef7/plugins/network-elements/bigswitch/src/com/cloud/api/commands/DeleteBigSwitchBcfDeviceCmd.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/bigswitch/src/com/cloud/api/commands/DeleteBigSwitchBcfDeviceCmd.java b/plugins/network-elements/bigswitch/src/com/cloud/api/commands/DeleteBigSwitchBcfDeviceCmd.java
new file mode 100644
index 0000000..520be8d
--- /dev/null
+++ b/plugins/network-elements/bigswitch/src/com/cloud/api/commands/DeleteBigSwitchBcfDeviceCmd.java
@@ -0,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 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.ServerApiException;
+import org.apache.cloudstack.api.response.SuccessResponse;
+import org.apache.cloudstack.context.CallContext;
+
+import com.cloud.api.response.BigSwitchBcfDeviceResponse;
+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.BigSwitchBcfElementService;
+import com.cloud.utils.exception.CloudRuntimeException;
+
+@APICommand(name = "deleteBigSwitchBcfDevice", responseObject = SuccessResponse.class, description = " delete a BigSwitch BCF Controller device", since = "4.6.0",
+ requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
+public class DeleteBigSwitchBcfDeviceCmd extends BaseAsyncCmd {
+ private static final String s_name = "deletebigswitchbcfdeviceresponse";
+ @Inject
+ BigSwitchBcfElementService _bigswitchBcfElementService;
+
+ /////////////////////////////////////////////////////
+ //////////////// API parameters /////////////////////
+ /////////////////////////////////////////////////////
+
+ @Parameter(name = BcfConstants.BIGSWITCH_BCF_DEVICE_ID,
+ type = CommandType.UUID,
+ entityType = BigSwitchBcfDeviceResponse.class,
+ required = true,
+ description = "BigSwitch device ID")
+ private Long bigswitchBcfDeviceId;
+
+ /////////////////////////////////////////////////////
+ /////////////////// Accessors ///////////////////////
+ /////////////////////////////////////////////////////
+
+ public Long getBigSwitchBcfDeviceId() {
+ return bigswitchBcfDeviceId;
+ }
+
+ /////////////////////////////////////////////////////
+ /////////////// API Implementation///////////////////
+ /////////////////////////////////////////////////////
+
+ @Override
+ public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException,
+ ResourceAllocationException {
+ try {
+ boolean result = _bigswitchBcfElementService.deleteBigSwitchBcfDevice(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 CallContext.current().getCallingAccount().getId();
+ }
+
+ @Override
+ public String getEventType() {
+ return BcfConstants.EVENT_EXTERNAL_BCF_CONTROLLER_DELETE;
+ }
+
+ @Override
+ public String getEventDescription() {
+ return "Deleting BigSwitch BCF Controller";
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/01864ef7/plugins/network-elements/bigswitch/src/com/cloud/api/commands/ListBigSwitchBcfDevicesCmd.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/bigswitch/src/com/cloud/api/commands/ListBigSwitchBcfDevicesCmd.java b/plugins/network-elements/bigswitch/src/com/cloud/api/commands/ListBigSwitchBcfDevicesCmd.java
new file mode 100644
index 0000000..25c6752
--- /dev/null
+++ b/plugins/network-elements/bigswitch/src/com/cloud/api/commands/ListBigSwitchBcfDevicesCmd.java
@@ -0,0 +1,114 @@
+//
+// 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.log4j.Logger;
+
+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.ServerApiException;
+import org.apache.cloudstack.api.response.ListResponse;
+import org.apache.cloudstack.api.response.PhysicalNetworkResponse;
+
+import com.cloud.api.response.BigSwitchBcfDeviceResponse;
+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.BigSwitchBcfDeviceVO;
+import com.cloud.network.element.BigSwitchBcfElementService;
+import com.cloud.utils.exception.CloudRuntimeException;
+
+@APICommand(name = "listBigSwitchBcfDevices", responseObject = BigSwitchBcfDeviceResponse.class, description = "Lists BigSwitch BCF Controller devices", since = "4.6.0",
+ requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
+public class ListBigSwitchBcfDevicesCmd extends BaseListCmd {
+ public static final Logger s_logger = Logger.getLogger(ListBigSwitchBcfDevicesCmd.class.getName());
+ private static final String s_name = "listbigswitchbcfdeviceresponse";
+ @Inject
+ BigSwitchBcfElementService _bigswitchBcfElementService;
+
+ /////////////////////////////////////////////////////
+ //////////////// API parameters /////////////////////
+ /////////////////////////////////////////////////////
+
+ @Parameter(name = ApiConstants.PHYSICAL_NETWORK_ID, type = CommandType.UUID, entityType = PhysicalNetworkResponse.class, description = "the Physical Network ID")
+ private Long physicalNetworkId;
+
+ @Parameter(name = BcfConstants.BIGSWITCH_BCF_DEVICE_ID,
+ type = CommandType.UUID,
+ entityType = BigSwitchBcfDeviceResponse.class,
+ description = "bigswitch BCF controller device ID")
+ private Long bigswitchBcfDeviceId;
+
+ /////////////////////////////////////////////////////
+ /////////////////// Accessors ///////////////////////
+ /////////////////////////////////////////////////////
+
+ public Long getBigSwitchBcfDeviceId() {
+ return bigswitchBcfDeviceId;
+ }
+
+ public Long getPhysicalNetworkId() {
+ return physicalNetworkId;
+ }
+
+ /////////////////////////////////////////////////////
+ /////////////// API Implementation///////////////////
+ /////////////////////////////////////////////////////
+
+ @Override
+ public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException,
+ ResourceAllocationException {
+ try {
+ List<BigSwitchBcfDeviceVO> bigswitchDevices = _bigswitchBcfElementService.listBigSwitchBcfDevices(this);
+ ListResponse<BigSwitchBcfDeviceResponse> response = new ListResponse<BigSwitchBcfDeviceResponse>();
+ List<BigSwitchBcfDeviceResponse> bigswitchDevicesResponse = new ArrayList<BigSwitchBcfDeviceResponse>();
+
+ if (bigswitchDevices != null && !bigswitchDevices.isEmpty()) {
+ for (BigSwitchBcfDeviceVO bigswitchDeviceVO : bigswitchDevices) {
+ BigSwitchBcfDeviceResponse bigswitchDeviceResponse = _bigswitchBcfElementService.createBigSwitchBcfDeviceResponse(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/cloudstack/blob/01864ef7/plugins/network-elements/bigswitch/src/com/cloud/api/response/BigSwitchBcfDeviceResponse.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/bigswitch/src/com/cloud/api/response/BigSwitchBcfDeviceResponse.java b/plugins/network-elements/bigswitch/src/com/cloud/api/response/BigSwitchBcfDeviceResponse.java
new file mode 100644
index 0000000..37906a5
--- /dev/null
+++ b/plugins/network-elements/bigswitch/src/com/cloud/api/response/BigSwitchBcfDeviceResponse.java
@@ -0,0 +1,99 @@
+//
+// 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.response;
+
+import com.google.gson.annotations.SerializedName;
+
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.BaseResponse;
+import org.apache.cloudstack.api.EntityReference;
+
+import com.cloud.api.commands.BcfConstants;
+import com.cloud.network.BigSwitchBcfDeviceVO;
+import com.cloud.serializer.Param;
+
+@EntityReference(value = BigSwitchBcfDeviceVO.class)
+public class BigSwitchBcfDeviceResponse extends BaseResponse {
+ @SerializedName(BcfConstants.BIGSWITCH_BCF_DEVICE_ID)
+ @Param(description = "device id of the BigSwitch BCF Controller")
+ private String id;
+
+ @SerializedName(ApiConstants.PHYSICAL_NETWORK_ID)
+ @Param(description = "the physical network to which this BigSwitch BCF segment belongs to")
+ private String physicalNetworkId;
+
+ @SerializedName(ApiConstants.PROVIDER)
+ @Param(description = "name of the provider")
+ private String providerName;
+
+ @SerializedName(BcfConstants.BIGSWITCH_BCF_DEVICE_NAME)
+ @Param(description = "device name")
+ private String deviceName;
+
+ @SerializedName(ApiConstants.HOST_NAME)
+ @Param(description = "the controller Ip address")
+ private String hostName;
+
+ @SerializedName(ApiConstants.USERNAME) @Param(description="the controller username")
+ private String username;
+
+ @SerializedName(ApiConstants.PASSWORD) @Param(description="the controller password")
+ private String password;
+
+ @SerializedName(BcfConstants.BIGSWITCH_BCF_DEVICE_NAT)
+ @Param(description = "NAT support")
+ private Boolean nat;
+
+ public String getId() {
+ return this.id;
+ }
+
+ public void setId(String bcfDeviceId) {
+ this.id = bcfDeviceId;
+ }
+
+ public void setPhysicalNetworkId(String physicalNetworkId) {
+ this.physicalNetworkId = physicalNetworkId;
+ }
+
+ public void setProviderName(String providerName) {
+ this.providerName = providerName;
+ }
+
+ public void setDeviceName(String deviceName) {
+ this.deviceName = deviceName;
+ }
+
+ public void setHostName(String hostName) {
+ this.hostName = hostName;
+ }
+
+ public void setUserName(String username) {
+ this.username = username;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+ public void setNat(Boolean nat) {
+ this.nat = nat;
+ }
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/01864ef7/plugins/network-elements/bigswitch/src/com/cloud/network/BigSwitchBcfDeviceVO.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/bigswitch/src/com/cloud/network/BigSwitchBcfDeviceVO.java b/plugins/network-elements/bigswitch/src/com/cloud/network/BigSwitchBcfDeviceVO.java
new file mode 100644
index 0000000..8c7269e
--- /dev/null
+++ b/plugins/network-elements/bigswitch/src/com/cloud/network/BigSwitchBcfDeviceVO.java
@@ -0,0 +1,143 @@
+//
+// 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;
+
+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_bigswitch_bcf_devices")
+public class BigSwitchBcfDeviceVO implements InternalIdentity {
+
+ @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;
+
+ @Column(name = "hostname")
+ private String hostName;
+
+ @Column(name = "username")
+ private String userName;
+
+ @Column(name = "password")
+ private String password;
+
+ @Column(name = "nat")
+ private Boolean nat;
+
+ @Column(name = "hash")
+ private String hash;
+
+ public BigSwitchBcfDeviceVO() {
+ this.uuid = UUID.randomUUID().toString();
+ }
+
+ public BigSwitchBcfDeviceVO(long hostId, long physicalNetworkId, String providerName, String deviceName,
+ String hostName, String username, String password, Boolean nat, String hash) {
+ super();
+ this.hostId = hostId;
+ this.physicalNetworkId = physicalNetworkId;
+ this.providerName = providerName;
+ this.deviceName = deviceName;
+ this.uuid = UUID.randomUUID().toString();
+ this.hostName = hostName;
+ this.userName = username;
+ this.password = password;
+ this.nat = nat;
+ this.hash = hash;
+ }
+
+ @Override
+ public long getId() {
+ return id;
+ }
+
+ 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;
+ }
+
+ public String getHash() {
+ return hash;
+ }
+
+ public void setHash(String h) {
+ hash = h;
+ }
+
+ public String getHostName() {
+ return hostName;
+ }
+
+ public String getUserName() {
+ return userName;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public Boolean getNat() {
+ return nat;
+ }
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/01864ef7/plugins/network-elements/bigswitch/src/com/cloud/network/bigswitch/AclData.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/bigswitch/src/com/cloud/network/bigswitch/AclData.java b/plugins/network-elements/bigswitch/src/com/cloud/network/bigswitch/AclData.java
new file mode 100644
index 0000000..72b0cc9
--- /dev/null
+++ b/plugins/network-elements/bigswitch/src/com/cloud/network/bigswitch/AclData.java
@@ -0,0 +1,114 @@
+//
+// 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.bigswitch;
+
+import com.cloud.network.vpc.NetworkACLItem;
+import com.google.gson.annotations.SerializedName;
+
+/**
+ * AclData contains information expected by Big Switch Controller
+ * in ApplyBcfAclCommand
+ */
+
+public class AclData {
+ @SerializedName("id") private String id;
+ @SerializedName("priority") private int priority;
+ @SerializedName("action") private String action;
+ @SerializedName("ipproto") private String ipProto;
+ @SerializedName("source") private AclNetwork source;
+ @SerializedName("destination") private AclNetwork destination;
+
+ public AclData(){
+ this.id = null;
+ this.priority = 0;
+ this.action = null;
+ this.ipProto = null;
+ this.source = new AclNetwork();
+ this.destination = new AclNetwork();;
+ }
+
+ public class AclNetwork{
+ @SerializedName("cidr") private String cidr;
+ @SerializedName("port") private Integer port;
+
+ public AclNetwork(){
+ this.cidr = null;
+ this.port = null;
+ }
+
+ public AclNetwork(String cidr, Integer port){
+ this.cidr = cidr;
+ this.port = port;
+ }
+ }
+
+ public String getId() {
+ return id;
+ }
+ public void setId(String id) {
+ this.id = id;
+ }
+ public int getPriority() {
+ return priority;
+ }
+ public void setPriority(int priority) {
+ this.priority = priority;
+ }
+ public String getAction() {
+ return action;
+ }
+ public void setAction(String action) {
+ if(action.equalsIgnoreCase(NetworkACLItem.Action.Allow.name())){
+ this.action = "permit";
+ } else {
+ this.action = "deny";
+ }
+ }
+ public String getIpProto() {
+ return ipProto;
+ }
+ public void setIpProto(String ipProto) {
+ if (!ipProto.equalsIgnoreCase("all")){
+ switch(ipProto.toLowerCase()){
+ case "tcp":
+ this.ipProto = "6";
+ break;
+ case "udp":
+ this.ipProto = "17";
+ break;
+ case "icmp":
+ this.ipProto = "1";
+ break;
+ }
+ }
+ }
+ public AclNetwork getSource() {
+ return source;
+ }
+ public void setSource(AclNetwork source) {
+ this.source = source;
+ }
+ public AclNetwork getDestination() {
+ return destination;
+ }
+ public void setDestination(AclNetwork destination) {
+ this.destination = destination;
+ }
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/01864ef7/plugins/network-elements/bigswitch/src/com/cloud/network/bigswitch/AttachmentData.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/bigswitch/src/com/cloud/network/bigswitch/AttachmentData.java b/plugins/network-elements/bigswitch/src/com/cloud/network/bigswitch/AttachmentData.java
new file mode 100644
index 0000000..649f704
--- /dev/null
+++ b/plugins/network-elements/bigswitch/src/com/cloud/network/bigswitch/AttachmentData.java
@@ -0,0 +1,142 @@
+//
+// 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.bigswitch;
+
+import java.util.ArrayList;
+
+import com.google.gson.annotations.SerializedName;
+
+/**
+ * AttachmentData contains information expected by Big Switch Controller
+ * in CreateBcfAttachmentCommand
+ */
+public class AttachmentData {
+ @SerializedName("port") private Attachment attachment;
+
+ public Attachment getAttachment() {
+ return this.attachment;
+ }
+
+ public AttachmentData() {
+ this.attachment = new Attachment();
+ }
+
+ public class Attachment {
+ @SerializedName("id") private String id;
+ @SerializedName("tenant_name") private String tenantName;
+ @SerializedName("vlan") private Integer vlan;
+ @SerializedName("fixed_ips") private ArrayList<IpAddress> fixedIps;
+ @SerializedName("mac_address") private String macAddress;
+ @SerializedName("bound_segment") private BoundSegment boundSegment;
+ @SerializedName("binding:host_id") private String hostId;
+
+ public Attachment(){
+ this.boundSegment = new BoundSegment();
+ this.fixedIps = new ArrayList<IpAddress>();
+ }
+
+ public class BoundSegment {
+ @SerializedName("segmentation_id") private Integer segmentationId;
+
+ public Integer getSegmentationId() {
+ return segmentationId;
+ }
+
+ public void setSegmentationId(Integer segmentationId) {
+ this.segmentationId = segmentationId;
+ }
+ }
+
+ public class IpAddress {
+ @SerializedName("ip_address") private String ipAddress;
+
+ public IpAddress(String ipAddr) {
+ this.ipAddress = ipAddr;
+ }
+
+ public String getIpAddress(){
+ return ipAddress;
+ }
+ }
+
+ private String state;
+
+ public String getTenantName() {
+ return tenantName;
+ }
+
+ public void setTenantName(String tenantName) {
+ this.tenantName = tenantName;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getHostId() {
+ return hostId;
+ }
+
+ public void setHostId(String hostId) {
+ this.hostId = hostId;
+ }
+
+ public Integer getVlan() {
+ return vlan;
+ }
+
+ public void setVlan(Integer vlan) {
+ this.vlan = vlan;
+ this.boundSegment.setSegmentationId(vlan);
+ }
+
+ public ArrayList<IpAddress> getIpv4List() {
+ return fixedIps;
+ }
+
+ public void addIpv4(String ipv4) {
+ this.fixedIps.add(new IpAddress(ipv4));
+ }
+
+ public String getMac() {
+ return macAddress;
+ }
+
+ public void setMac(String mac) {
+ this.macAddress = mac;
+ }
+
+ public BoundSegment getBoundSegment() {
+ return boundSegment;
+ }
+
+ public String getState() {
+ return state;
+ }
+
+ public void setState(String state) {
+ this.state = state;
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/01864ef7/plugins/network-elements/bigswitch/src/com/cloud/network/bigswitch/BigSwitchBcfApi.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/bigswitch/src/com/cloud/network/bigswitch/BigSwitchBcfApi.java b/plugins/network-elements/bigswitch/src/com/cloud/network/bigswitch/BigSwitchBcfApi.java
new file mode 100644
index 0000000..5c1efb0
--- /dev/null
+++ b/plugins/network-elements/bigswitch/src/com/cloud/network/bigswitch/BigSwitchBcfApi.java
@@ -0,0 +1,459 @@
+//
+// 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.bigswitch;
+
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.lang.reflect.Type;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.nio.charset.Charset;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.httpclient.HttpClient;
+import org.apache.commons.httpclient.HttpException;
+import org.apache.commons.httpclient.HttpMethod;
+import org.apache.commons.httpclient.HttpMethodBase;
+import org.apache.commons.httpclient.HttpStatus;
+import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
+import org.apache.commons.httpclient.NameValuePair;
+import org.apache.commons.httpclient.cookie.CookiePolicy;
+import org.apache.commons.httpclient.methods.DeleteMethod;
+import org.apache.commons.httpclient.methods.GetMethod;
+import org.apache.commons.httpclient.methods.PostMethod;
+import org.apache.commons.httpclient.methods.PutMethod;
+import org.apache.commons.httpclient.methods.StringRequestEntity;
+import org.apache.commons.httpclient.protocol.Protocol;
+import org.apache.commons.httpclient.protocol.ProtocolSocketFactory;
+import org.apache.log4j.Logger;
+
+import com.google.gson.Gson;
+import com.google.gson.reflect.TypeToken;
+
+public class BigSwitchBcfApi {
+ private static final Logger s_logger = Logger.getLogger(BigSwitchBcfApi.class);
+ private final static String s_protocol = "https";
+ private final static String s_nsBaseUri = "/networkService/v1.1";
+ private final static String CONTENT_TYPE = "Content-type";
+ private final static String ACCEPT = "Accept";
+ private final static String CONTENT_JSON = "application/json";
+ private final static String HTTP_HEADER_INSTANCE_ID = "Instance-ID";
+ private final static String CLOUDSTACK_INSTANCE_ID = "cloudstack";
+ private final static String HASH_MATCH = "X-BSN-BVS-HASH-MATCH";
+ private final static MultiThreadedHttpConnectionManager s_httpClientManager = new MultiThreadedHttpConnectionManager();
+
+ private String _host;
+ private String _username;
+ private String _password;
+ private String _hash;
+ private String _zoneId;
+ private Boolean _nat;
+
+ private boolean _isMaster = false;
+
+ private int _port = 8000;
+
+ private HttpClient _client;
+ private Gson gson = new Gson();
+
+ public final static String HASH_CONFLICT = "HASH_CONFLICT";
+ public final static String HASH_IGNORE = "HASH_IGNORE";
+
+ /* This factory method is protected so we can extend this
+ * in the unittests.
+ */
+ protected HttpClient createHttpClient() {
+ return new HttpClient(s_httpClientManager);
+ }
+
+ protected HttpMethod createMethod(String type, String uri, int port) throws BigSwitchBcfApiException {
+ String url;
+ try {
+ url = new URL(s_protocol, _host, port, uri).toString();
+ } catch (MalformedURLException e) {
+ s_logger.error("Unable to build Big Switch API URL", e);
+ throw new BigSwitchBcfApiException("Unable to build Big Switch API URL", e);
+ }
+
+ if ("post".equalsIgnoreCase(type)) {
+ return new PostMethod(url);
+ } else if ("get".equalsIgnoreCase(type)) {
+ return new GetMethod(url);
+ } else if ("delete".equalsIgnoreCase(type)) {
+ return new DeleteMethod(url);
+ } else if ("put".equalsIgnoreCase(type)) {
+ return new PutMethod(url);
+ } else {
+ throw new BigSwitchBcfApiException("Requesting unknown method type");
+ }
+ }
+
+ public BigSwitchBcfApi() {
+ _client = createHttpClient();
+ _client.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);
+
+ try {
+ // Cast to ProtocolSocketFactory to avoid the deprecated constructor with the SecureProtocolSocketFactory parameter
+ Protocol.registerProtocol("https", new Protocol("https", (ProtocolSocketFactory) new TrustingProtocolSocketFactory(), _port));
+ } catch (IOException e) {
+ s_logger.warn("Failed to register the TrustingProtocolSocketFactory, falling back to default SSLSocketFactory", e);
+ }
+ }
+
+ /**
+ * Setter used by UI to set BSN controller address
+ * @param address
+ */
+ public void setControllerAddress(String address) {
+ this._host = address;
+ }
+
+ /**
+ * Setter used by UI to set BSN controller user name
+ * @param username
+ */
+ public void setControllerUsername(String username) {
+ this._username = username;
+ }
+
+ /**
+ * Setter used by UI to set BSN controller password
+ * @param password
+ */
+ public void setControllerPassword(String password) {
+ this._password = password;
+ }
+
+ /**
+ * Setter used by UI to set BSN controller NAT mode
+ * @param nat
+ */
+ public void setControllerNat(Boolean nat) {
+ this._nat = nat;
+ }
+
+ public boolean isNatEnabled() {
+ return this._nat;
+ }
+
+ /**
+ * Setter used by UI to set BSN controller password
+ * @param password
+ */
+ public void setZoneId(String zoneId) {
+ this._zoneId = zoneId;
+ }
+
+ public String createNetwork(NetworkData network) throws BigSwitchBcfApiException {
+ String uri = s_nsBaseUri + "/tenants/" + network.getNetwork().getTenantId() + "/networks";
+ return executeCreateObject(network, uri, Collections.<String, String> emptyMap());
+ }
+
+ public String deleteNetwork(String tenantId, String networkId) throws BigSwitchBcfApiException {
+ String uri = s_nsBaseUri + "/tenants/" + tenantId + "/networks/" + networkId;
+ return executeDeleteObject(uri);
+ }
+
+ public String createAttachment(String tenantId, String networkId, AttachmentData attachment) throws BigSwitchBcfApiException {
+ String uri = s_nsBaseUri + "/tenants/" + tenantId + "/networks/" + networkId + "/ports/" + attachment.getAttachment().getId() + "/attachment";
+ return executeCreateObject(attachment, uri, Collections.<String, String> emptyMap());
+ }
+
+ public String modifyAttachment(String tenantId, String networkId, AttachmentData attachment) throws BigSwitchBcfApiException {
+ String uri = s_nsBaseUri + "/tenants/" + tenantId + "/networks/" + networkId + "/ports/" + attachment.getAttachment().getId() + "/attachment";
+ return executeUpdateObject(attachment, uri, Collections.<String, String> emptyMap());
+ }
+
+ public String deleteAttachment(String tenantId, String networkId, String attachmentId) throws BigSwitchBcfApiException {
+ String uri = s_nsBaseUri + "/tenants/" + tenantId + "/networks/" + networkId + "/ports/" + attachmentId + "/attachment";
+ return executeDeleteObject(uri);
+ }
+
+ public String createRouter(String tenantId, RouterData router) throws BigSwitchBcfApiException {
+ String uri = s_nsBaseUri + "/tenants/" + tenantId + "/routers";
+ return executeCreateObject(router, uri, Collections.<String, String> emptyMap());
+ }
+
+ public String modifyRouter(String tenantId, RouterData router) throws BigSwitchBcfApiException,
+ IllegalArgumentException{
+ String uri = s_nsBaseUri + "/tenants/" + tenantId + "/routers";
+ return executeCreateObject(router, uri, Collections.<String, String> emptyMap());
+ }
+
+ public String createRouterInterface(String tenantId, String routerId, RouterInterfaceData routerInterface) throws BigSwitchBcfApiException {
+ String uri = s_nsBaseUri + "/tenants/" + tenantId + "/routers/" + routerId + "/interfaces";
+ return executeCreateObject(routerInterface, uri, Collections.<String, String> emptyMap());
+ }
+
+ public String createFloatingIp(String tenantId, FloatingIpData fip) throws BigSwitchBcfApiException {
+ String uri = s_nsBaseUri + "/tenants/" + tenantId + "/floatingips";
+ return executeCreateObject(fip, uri, Collections.<String, String> emptyMap());
+ }
+
+ public String deleteFloatingIp(String tenantId, String fipId) throws BigSwitchBcfApiException {
+ String uri = s_nsBaseUri + "/tenants/" + tenantId + "/floatingips/" + fipId;
+ return executeDeleteObject(uri);
+ }
+
+ public ControlClusterStatus getControlClusterStatus() throws BigSwitchBcfApiException {
+ String uri = s_nsBaseUri + "/health";
+ ControlClusterStatus ccs = executeRetrieveObject(new TypeToken<ControlClusterStatus>() {
+ }.getType(), uri, null);
+ ccs.setStatus(true);
+ return ccs;
+ }
+
+ public Capabilities getCapabilities() throws BigSwitchBcfApiException {
+ String uri = s_nsBaseUri + "/capabilities";
+ List<String> capslist = executeRetrieveObject(new TypeToken<List<String>>() {
+ }.getType(), uri, null);
+ Capabilities caps = new Capabilities();
+ caps.setCapabilities(capslist);
+ return caps;
+ }
+
+ public String syncTopology(TopologyData topo) throws BigSwitchBcfApiException {
+ String uri = s_nsBaseUri + "/topology";
+ return executeCreateObject(topo, uri, Collections.<String, String> emptyMap());
+ }
+
+ public ControllerData getControllerData() {
+ return new ControllerData(_host, _isMaster);
+ }
+
+ private void checkInvariants() throws BigSwitchBcfApiException{
+ if (_host == null || _host.isEmpty()) {
+ throw new BigSwitchBcfApiException("Hostname is null or empty");
+ }
+ if (_username == null || _username.isEmpty()){
+ throw new BigSwitchBcfApiException("Username is null or empty");
+ }
+ if (_password == null || _password.isEmpty()){
+ throw new BigSwitchBcfApiException("Password is null or empty");
+ }
+ }
+
+ private String checkResponse(HttpMethodBase m, String errorMessageBase) throws BigSwitchBcfApiException,
+ IllegalArgumentException{
+ String customErrorMsg = null;
+ if (m.getStatusCode() == HttpStatus.SC_OK) {
+ String hash = "";
+ if (m.getResponseHeader(HASH_MATCH) != null) {
+ hash = m.getResponseHeader(HASH_MATCH).getValue();
+ set_hash(hash);
+ }
+ return hash;
+ }
+ if (m.getStatusCode() == HttpStatus.SC_CONFLICT) {
+ if(m instanceof GetMethod) {
+ return HASH_CONFLICT;
+ }
+ throw new BigSwitchBcfApiException("BCF topology sync required", true);
+ }
+ if (m.getStatusCode() == HttpStatus.SC_SEE_OTHER) {
+ _isMaster = false;
+ set_hash(HASH_IGNORE);
+ return HASH_IGNORE;
+ }
+ if (m.getStatusCode() == HttpStatus.SC_NOT_FOUND) {
+ if (m instanceof DeleteMethod){
+ return "";
+ }
+ }
+ if (m.getStatusCode() == HttpStatus.SC_BAD_REQUEST) {
+ customErrorMsg = " Invalid data in BCF request";
+ throw new IllegalArgumentException(customErrorMsg);
+ }
+ String errorMessage = responseToErrorMessage(m);
+ m.releaseConnection();
+ s_logger.error(errorMessageBase + errorMessage);
+ throw new BigSwitchBcfApiException(errorMessageBase + errorMessage + customErrorMsg);
+ }
+
+ private void setHttpHeader(HttpMethodBase m) {
+ m.setRequestHeader(CONTENT_TYPE, CONTENT_JSON);
+ m.setRequestHeader(ACCEPT, CONTENT_JSON);
+ m.setRequestHeader(HTTP_HEADER_INSTANCE_ID, CLOUDSTACK_INSTANCE_ID + "-" + _zoneId);
+ if (_hash != "" ) {
+ m.setRequestHeader(HASH_MATCH, _hash);
+ }
+
+ String authString = _username + ":" + _password;
+ String encodedAuthString = "Basic " + Base64.encodeBase64String(authString.getBytes(Charset.forName("UTF-8")));
+ m.setRequestHeader("Authorization", encodedAuthString);
+ }
+
+ protected <T> String executeUpdateObject(T newObject, String uri, Map<String, String> parameters) throws BigSwitchBcfApiException,
+ IllegalArgumentException{
+ checkInvariants();
+
+ PutMethod pm = (PutMethod)createMethod("put", uri, _port);
+
+ setHttpHeader(pm);
+
+ try {
+ pm.setRequestEntity(new StringRequestEntity(gson.toJson(newObject), CONTENT_JSON, null));
+ } catch (UnsupportedEncodingException e) {
+ throw new BigSwitchBcfApiException("Failed to encode json request body", e);
+ }
+
+ executeMethod(pm);
+
+ String hash = checkResponse(pm, "BigSwitch HTTP update failed: ");
+
+ pm.releaseConnection();
+
+ return hash;
+ }
+
+ protected <T> String executeCreateObject(T newObject, String uri, Map<String, String> parameters) throws BigSwitchBcfApiException {
+ checkInvariants();
+
+ PostMethod pm = (PostMethod)createMethod("post", uri, _port);
+
+ setHttpHeader(pm);
+
+ try {
+ pm.setRequestEntity(new StringRequestEntity(gson.toJson(newObject), CONTENT_JSON, null));
+ } catch (UnsupportedEncodingException e) {
+ throw new BigSwitchBcfApiException("Failed to encode json request body", e);
+ }
+
+ executeMethod(pm);
+
+ String hash = checkResponse(pm, "BigSwitch HTTP create failed: ");
+
+ pm.releaseConnection();
+
+ return hash;
+ }
+
+ protected String executeDeleteObject(String uri) throws BigSwitchBcfApiException {
+ checkInvariants();
+
+ DeleteMethod dm = (DeleteMethod)createMethod("delete", uri, _port);
+
+ setHttpHeader(dm);
+
+ executeMethod(dm);
+
+ String hash = checkResponse(dm, "BigSwitch HTTP delete failed: ");
+
+ dm.releaseConnection();
+
+ return hash;
+ }
+
+ @SuppressWarnings("unchecked")
+ protected <T> T executeRetrieveObject(Type returnObjectType,
+ String uri, Map<String, String> parameters) throws BigSwitchBcfApiException {
+ checkInvariants();
+
+ GetMethod gm = (GetMethod)createMethod("get", uri, _port);
+
+ setHttpHeader(gm);
+
+ if (parameters != null && !parameters.isEmpty()) {
+ List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(parameters.size());
+ for (Entry<String, String> e : parameters.entrySet()) {
+ nameValuePairs.add(new NameValuePair(e.getKey(), e.getValue()));
+ }
+ gm.setQueryString(nameValuePairs.toArray(new NameValuePair[0]));
+ }
+
+ executeMethod(gm);
+
+ String hash = checkResponse(gm, "BigSwitch HTTP get failed: ");
+
+ T returnValue;
+ try {
+ // CAUTIOUS: Safety margin of 2048 characters - extend if needed.
+ returnValue = (T)gson.fromJson(gm.getResponseBodyAsString(2048), returnObjectType);
+ } catch (IOException e) {
+ s_logger.error("IOException while retrieving response body", e);
+ throw new BigSwitchBcfApiException(e);
+ } finally {
+ gm.releaseConnection();
+ }
+ if(returnValue instanceof ControlClusterStatus) {
+ if(hash == HASH_CONFLICT) {
+ _isMaster = true;
+ ((ControlClusterStatus) returnValue).setTopologySyncRequested(true);
+ } else if (hash != HASH_IGNORE && !_isMaster) {
+ _isMaster = true;
+ ((ControlClusterStatus) returnValue).setTopologySyncRequested(true);
+ }
+ }
+ return returnValue;
+ }
+
+ protected void executeMethod(HttpMethodBase method) throws BigSwitchBcfApiException {
+ try {
+ _client.executeMethod(method);
+ if (method.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) {
+ method.releaseConnection();
+ }
+ } catch (HttpException e) {
+ s_logger.error("HttpException caught while trying to connect to the BigSwitch Controller", e);
+ method.releaseConnection();
+ throw new BigSwitchBcfApiException("API call to BigSwitch Controller Failed", e);
+ } catch (IOException e) {
+ s_logger.error("IOException caught while trying to connect to the BigSwitch Controller", e);
+ method.releaseConnection();
+ throw new BigSwitchBcfApiException("API call to BigSwitch Controller Failed", e);
+ }
+ }
+
+ private String responseToErrorMessage(HttpMethodBase method) {
+ assert method.isRequestSent() : "no use getting an error message unless the request is sent";
+
+ if ("text/html".equals(method.getResponseHeader(CONTENT_TYPE).getValue())) {
+ // The error message is the response content
+ // Safety margin of 2048 characters, anything longer is probably useless
+ // and will clutter the logs
+ try {
+ return method.getResponseBodyAsString(2048);
+ } catch (IOException e) {
+ s_logger.debug("Error while loading response body", e);
+ }
+ }
+
+ // The default
+ return method.getStatusText();
+ }
+
+ public static String getCloudstackInstanceId() {
+ return CLOUDSTACK_INSTANCE_ID;
+ }
+
+ public String get_hash() {
+ return _hash;
+ }
+
+ public void set_hash(String hash) {
+ this._hash = hash;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/01864ef7/plugins/network-elements/bigswitch/src/com/cloud/network/bigswitch/BigSwitchBcfApiException.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/bigswitch/src/com/cloud/network/bigswitch/BigSwitchBcfApiException.java b/plugins/network-elements/bigswitch/src/com/cloud/network/bigswitch/BigSwitchBcfApiException.java
new file mode 100644
index 0000000..feed707
--- /dev/null
+++ b/plugins/network-elements/bigswitch/src/com/cloud/network/bigswitch/BigSwitchBcfApiException.java
@@ -0,0 +1,55 @@
+//
+// 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.bigswitch;
+
+public class BigSwitchBcfApiException extends Exception {
+
+ private static final long serialVersionUID = -5864952230870945604L;
+ private boolean topologySyncRequested = false;
+
+ public BigSwitchBcfApiException() {
+ }
+
+ public BigSwitchBcfApiException(String message) {
+ super(message);
+ }
+
+ public BigSwitchBcfApiException(Throwable cause) {
+ super(cause);
+ }
+
+ public BigSwitchBcfApiException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public BigSwitchBcfApiException(String message, boolean syncRequest) {
+ super(message);
+ this.set_topologySyncRequested(syncRequest);
+ }
+
+ public boolean is_topologySyncRequested() {
+ return topologySyncRequested;
+ }
+
+ public void set_topologySyncRequested(boolean requested) {
+ this.topologySyncRequested = requested;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/01864ef7/plugins/network-elements/bigswitch/src/com/cloud/network/bigswitch/BigSwitchBcfUtils.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/bigswitch/src/com/cloud/network/bigswitch/BigSwitchBcfUtils.java b/plugins/network-elements/bigswitch/src/com/cloud/network/bigswitch/BigSwitchBcfUtils.java
new file mode 100644
index 0000000..b6e3359
--- /dev/null
+++ b/plugins/network-elements/bigswitch/src/com/cloud/network/bigswitch/BigSwitchBcfUtils.java
@@ -0,0 +1,571 @@
+//
+// 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.bigswitch;
+
+import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.net.util.SubnetUtils;
+import org.apache.log4j.Logger;
+import org.bouncycastle.util.IPAddress;
+
+import com.cloud.agent.AgentManager;
+import com.cloud.agent.api.BcfAnswer;
+import com.cloud.agent.api.BcfCommand;
+import com.cloud.agent.api.CacheBcfTopologyCommand;
+import com.cloud.agent.api.GetControllerDataAnswer;
+import com.cloud.agent.api.GetControllerDataCommand;
+import com.cloud.agent.api.SyncBcfTopologyCommand;
+import com.cloud.dc.VlanVO;
+import com.cloud.dc.dao.VlanDao;
+import com.cloud.host.HostVO;
+import com.cloud.host.dao.HostDao;
+import com.cloud.hypervisor.Hypervisor.HypervisorType;
+import com.cloud.network.BigSwitchBcfDeviceVO;
+import com.cloud.network.Network;
+import com.cloud.network.NetworkModel;
+import com.cloud.network.Networks.BroadcastDomainType;
+import com.cloud.network.Networks.TrafficType;
+import com.cloud.network.bigswitch.TopologyData.Port;
+import com.cloud.network.dao.BigSwitchBcfDao;
+import com.cloud.network.dao.FirewallRulesCidrsDao;
+import com.cloud.network.dao.FirewallRulesCidrsVO;
+import com.cloud.network.dao.FirewallRulesDao;
+import com.cloud.network.dao.IPAddressDao;
+import com.cloud.network.dao.IPAddressVO;
+import com.cloud.network.dao.NetworkDao;
+import com.cloud.network.dao.NetworkVO;
+import com.cloud.network.rules.FirewallRule.Purpose;
+import com.cloud.network.rules.FirewallRuleVO;
+import com.cloud.network.vpc.NetworkACLItem;
+import com.cloud.network.vpc.NetworkACLItemCidrsDao;
+import com.cloud.network.vpc.NetworkACLItemCidrsVO;
+import com.cloud.network.vpc.NetworkACLItemDao;
+import com.cloud.network.vpc.NetworkACLItemVO;
+import com.cloud.network.vpc.Vpc;
+import com.cloud.network.vpc.dao.VpcDao;
+import com.cloud.utils.db.DB;
+import com.cloud.utils.db.SearchCriteria;
+import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionStatus;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.vm.NicVO;
+import com.cloud.vm.VMInstanceVO;
+import com.cloud.vm.dao.NicDao;
+import com.cloud.vm.dao.VMInstanceDao;
+
+public class BigSwitchBcfUtils {
+ private static final Logger s_logger = Logger.getLogger(BigSwitchBcfUtils.class);
+
+ private final NetworkDao _networkDao;
+ private final NicDao _nicDao;
+ private final VMInstanceDao _vmDao;
+ private final HostDao _hostDao;
+ private final VpcDao _vpcDao;
+ private final BigSwitchBcfDao _bigswitchBcfDao;
+ private final AgentManager _agentMgr;
+ private final VlanDao _vlanDao;
+ private final IPAddressDao _ipAddressDao;
+ private final FirewallRulesDao _fwRulesDao;
+ private final FirewallRulesCidrsDao _fwCidrsDao;
+ private final NetworkACLItemDao _aclItemDao;
+ private final NetworkACLItemCidrsDao _aclItemCidrsDao;
+ private final NetworkModel _networkModel;
+
+ public BigSwitchBcfUtils(NetworkDao networkDao,
+ NicDao nicDao, VMInstanceDao vmDao, HostDao hostDao,
+ VpcDao vpcDao, BigSwitchBcfDao bigswitchBcfDao,
+ AgentManager agentMgr, VlanDao vlanDao, IPAddressDao ipAddressDao,
+ FirewallRulesDao fwRulesDao, FirewallRulesCidrsDao fwCidrsDao,
+ NetworkACLItemDao aclItemDao, NetworkACLItemCidrsDao aclItemCidrsDao,
+ NetworkModel networkModel){
+ _networkDao = networkDao;
+ _nicDao = nicDao;
+ _vmDao = vmDao;
+ _hostDao = hostDao;
+ _vpcDao = vpcDao;
+ _bigswitchBcfDao = bigswitchBcfDao;
+ _agentMgr = agentMgr;
+ _vlanDao = vlanDao;
+ _ipAddressDao = ipAddressDao;
+ _fwRulesDao = fwRulesDao;
+ _fwCidrsDao = fwCidrsDao;
+ _aclItemDao = aclItemDao;
+ _aclItemCidrsDao = aclItemCidrsDao;
+ _networkModel = networkModel;
+ }
+
+ public ControlClusterData getControlClusterData(long physicalNetworkId){
+ ControlClusterData cluster = new ControlClusterData();
+
+ // reusable command to query all devices
+ GetControllerDataCommand cmd = new GetControllerDataCommand();
+
+ // retrieve all registered BCF devices
+ List<BigSwitchBcfDeviceVO> devices = _bigswitchBcfDao.listByPhysicalNetwork(physicalNetworkId);
+ for (BigSwitchBcfDeviceVO d: devices){
+ HostVO bigswitchBcfHost = _hostDao.findById(d.getHostId());
+ if (bigswitchBcfHost == null){
+ continue;
+ }
+
+ _hostDao.loadDetails(bigswitchBcfHost);
+ GetControllerDataAnswer answer = (GetControllerDataAnswer) _agentMgr.easySend(bigswitchBcfHost.getId(), cmd);
+ if (answer != null){
+ if (answer.isMaster()) {
+ cluster.setMaster(bigswitchBcfHost);
+ } else {
+ cluster.setSlave(bigswitchBcfHost);
+ }
+ }
+ }
+ return cluster;
+ }
+
+ public TopologyData getTopology(){
+ long physicalNetworkId;
+ List<BigSwitchBcfDeviceVO> devices = _bigswitchBcfDao.listAll();
+ if(!devices.isEmpty()){
+ physicalNetworkId = devices.get(0).getPhysicalNetworkId();
+ return getTopology(physicalNetworkId);
+ } else {
+ return null;
+ }
+ }
+
+ public NetworkVO getPublicNetwork(long physicalNetworkId){
+ List<NetworkVO> pubNets = _networkDao.listByPhysicalNetworkTrafficType(physicalNetworkId, TrafficType.Public);
+ return pubNets.get(0);
+ }
+
+ public TopologyData getTopology(long physicalNetworkId){
+ List<NetworkVO> networks;
+ List<NicVO> nics;
+
+ networks = _networkDao.listByPhysicalNetworkTrafficType(physicalNetworkId, TrafficType.Guest);
+
+ TopologyData topo = new TopologyData();
+
+ // networks:
+ // - all user created networks (VPC or non-VPC)
+ // - one external network
+ // routers:
+ // - per VPC (handle in network loop)
+ // - per stand-alone network (handle in network loop)
+ // - one external router
+
+ // handle external network first, only if NAT service is enabled
+ if(networks != null) {
+ if(!(networks.isEmpty()) && isNatEnabled()!=null && isNatEnabled()){
+ // get public net info - needed to set up source nat gateway
+ NetworkVO pubNet = getPublicNetwork(physicalNetworkId);
+
+ // locate subnet info
+ SearchCriteria<VlanVO> sc = _vlanDao.createSearchCriteria();
+ sc.setParameters("network_id", pubNet.getId());
+ VlanVO vlanVO = _vlanDao.findOneBy(sc);
+
+ // add tenant external network external
+ TopologyData.Network network = topo.new Network();
+ network.setId("external");
+ network.setName("external");
+ network.setTenantId("external");
+ network.setTenantName("external");
+
+ String pubVlan = null;
+ try {
+ pubVlan = BroadcastDomainType.getValue(vlanVO.getVlanTag());
+ if(StringUtils.isNumeric(pubVlan)){
+ network.setVlan(Integer.valueOf(pubVlan));
+ } else {
+ // untagged
+ pubVlan = "0";
+ }
+ } catch (URISyntaxException e) {
+ e.printStackTrace();
+ }
+
+ topo.addNetwork(network);
+ }
+ }
+
+ // routerMap used internally for multiple updates to same tenant's router
+ // add back to topo.routers after loop
+ HashMap<String, RouterData> routerMap = new HashMap<String, RouterData>();
+
+ for (NetworkVO netVO: networks){
+ TopologyData.Network network = topo.new Network();
+ network.setId(netVO.getUuid());
+ network.setName(netVO.getName());
+
+ Integer vlan = null;
+ if (netVO.getBroadcastUri() != null) {
+ String vlanStr = BroadcastDomainType.getValue(netVO.getBroadcastUri());
+ if(StringUtils.isNumeric(vlanStr)){
+ vlan = Integer.valueOf(vlanStr);
+ } else {
+ // untagged
+ vlan = 0;
+ }
+ }
+ network.setVlan(vlan);
+ network.setState(netVO.getState().name());
+
+ nics = _nicDao.listByNetworkId(netVO.getId());
+ List<Port> ports = new ArrayList<Port>();
+ String tenantId = null;
+ String tenantName = null;
+
+ // if VPC network, assign BCF tenant id with vpc uuid
+ Vpc vpc = null;
+ if(netVO.getVpcId()!=null){
+ vpc = _vpcDao.acquireInLockTable(netVO.getVpcId());
+ }
+
+ if (vpc != null) {
+ tenantId = vpc.getUuid();
+ tenantName = vpc.getName();
+ } else {
+ tenantId = netVO.getUuid();
+ tenantName = netVO.getName();
+ }
+
+ for(NicVO nic: nics){
+ NetworkData netData = new NetworkData();
+ TopologyData.Port p = topo.new Port();
+
+ p.setAttachmentInfo(netData.new AttachmentInfo(nic.getUuid(),nic.getMacAddress()));
+
+ VMInstanceVO vm = _vmDao.findById(nic.getInstanceId());
+ HostVO host = _hostDao.findById(vm.getHostId());
+
+ // if host not found, ignore this nic
+ if (host == null) {
+ continue;
+ }
+
+ String hostname = host.getName();
+ long zoneId = netVO.getDataCenterId();
+ String vmwareVswitchLabel = _networkModel.getDefaultGuestTrafficLabel(zoneId, HypervisorType.VMware);
+ String[] labelArray = null;
+ String vswitchName = null;
+ if(vmwareVswitchLabel!=null){
+ labelArray=vmwareVswitchLabel.split(",");
+ vswitchName = labelArray[0];
+ }
+
+ // hypervisor type:
+ // kvm: ivs port name
+ // vmware: specific portgroup naming convention
+ String pgName = "";
+ if (host.getHypervisorType() == HypervisorType.KVM){
+ pgName = hostname;
+ } else if (host.getHypervisorType() == HypervisorType.VMware){
+ pgName = hostname + "-" + vswitchName;
+ }
+
+ p.setHostId(pgName);
+
+ p.setSegmentInfo(netData.new SegmentInfo(BroadcastDomainType.Vlan.name(), vlan));
+
+ p.setOwner(BigSwitchBcfApi.getCloudstackInstanceId());
+
+ List<AttachmentData.Attachment.IpAddress> ipList = new ArrayList<AttachmentData.Attachment.IpAddress>();
+ ipList.add(new AttachmentData().getAttachment().new IpAddress(nic.getIp4Address()));
+ p.setIpAddresses(ipList);
+
+ p.setId(nic.getUuid());
+
+ p.setMac(nic.getMacAddress());
+
+ netData.getNetwork().setId(network.getId());
+ netData.getNetwork().setName(network.getName());
+ netData.getNetwork().setTenantId(tenantId);
+ netData.getNetwork().setTenantName(tenantName);
+ netData.getNetwork().setState(netVO.getState().name());
+
+ p.setNetwork(netData.getNetwork());
+ ports.add(p);
+ }
+ network.setTenantId(tenantId);
+ network.setTenantName(tenantName);
+ network.setPorts(ports);
+ topo.addNetwork(network);
+
+ // add router for network
+ RouterData routerData;
+ if(tenantId != null){
+ if(!routerMap.containsKey(tenantId)){
+ routerData = new RouterData(tenantId);
+ routerMap.put(tenantId, routerData);
+ } else {
+ routerData = routerMap.get(tenantId);
+ }
+
+ routerData.getRouter().getAcls().addAll(listACLbyNetwork(netVO));
+ if(vpc != null){
+ routerData.getRouter().addExternalGateway(getPublicIpByVpc(vpc));
+ } else {
+ routerData.getRouter().addExternalGateway(getPublicIpByNetwork(netVO));
+ }
+
+ RouterInterfaceData intf = new RouterInterfaceData(tenantId, netVO.getGateway(), netVO.getCidr(),
+ netVO.getUuid(), netVO.getName());
+ routerData.getRouter().addInterface(intf);
+ }
+ }
+
+ for(RouterData rd: routerMap.values()) {
+ topo.addRouter(rd.getRouter());
+ }
+
+ return topo;
+ }
+
+ public String getPublicIpByNetwork(Network network){
+ List<IPAddressVO> allocatedIps = _ipAddressDao.listByAssociatedNetwork(network.getId(), true);
+ for (IPAddressVO ip: allocatedIps){
+ if(ip.isSourceNat()){
+ return ip.getAddress().addr();
+ }
+ }
+ return null;
+ }
+
+ public String getPublicIpByVpc(Vpc vpc){
+ List<IPAddressVO> allocatedIps = _ipAddressDao.listByAssociatedVpc(vpc.getId(), true);
+ for (IPAddressVO ip: allocatedIps){
+ if(ip.isSourceNat()){
+ return ip.getAddress().addr();
+ }
+ }
+ return null;
+ }
+
+ public List<AclData> listACLbyNetwork(Network network){
+ List<AclData> aclList = new ArrayList<AclData>();
+
+ List<FirewallRuleVO> fwRules;
+ fwRules = _fwRulesDao.listByNetworkAndPurposeAndNotRevoked(network.getId(), Purpose.Firewall);
+ List<FirewallRulesCidrsVO> fwCidrList = null;
+ SubnetUtils utils;
+
+ for(FirewallRuleVO rule: fwRules){
+ AclData acl = new AclData();
+ acl.setId(rule.getUuid());
+ acl.setPriority((int)rule.getId()); // CloudStack Firewall interface does not have priority
+ acl.setIpProto(rule.getProtocol());
+ String cidr = null;
+ Integer port = rule.getSourcePortStart();
+ fwCidrList = _fwCidrsDao.listByFirewallRuleId(rule.getId());
+ if(fwCidrList != null){
+ if(fwCidrList.size()>1 || rule.getSourcePortEnd()!=port){
+ continue;
+ } else {
+ cidr = fwCidrList.get(0).getCidr();
+ }
+ }
+ if (cidr == null || cidr.equalsIgnoreCase("0.0.0.0/0")) {
+ cidr = "";
+ } else {
+ utils = new SubnetUtils(cidr);
+ if(!utils.getInfo().getNetworkAddress().equals(utils.getInfo().getAddress())){
+ continue;
+ }
+ }
+ acl.setSource(acl.new AclNetwork(cidr, port));
+ acl.setAction("permit");
+
+ aclList.add(acl);
+ }
+
+ List<NetworkACLItemVO> aclItems;
+ List<NetworkACLItemCidrsVO> aclCidrList;
+
+ if (network.getNetworkACLId() != null){
+ aclItems = _aclItemDao.listByACL(network.getNetworkACLId());
+ for(NetworkACLItem item: aclItems){
+ AclData acl = new AclData();
+ acl.setId(item.getUuid());
+ acl.setPriority(item.getNumber());
+ acl.setIpProto(item.getProtocol());
+ String cidr = null; // currently BCF supports single cidr policy
+ Integer port = item.getSourcePortStart(); // currently BCF supports single port policy
+ aclCidrList = _aclItemCidrsDao.listByNetworkACLItemId(item.getId());
+ if(aclCidrList != null){
+ if(aclCidrList.size()>1 || item.getSourcePortEnd()!=port){
+ continue;
+ } else {
+ cidr = aclCidrList.get(0).getCidr();
+ }
+ }
+ if (cidr == null || cidr.equalsIgnoreCase("0.0.0.0/0")) {
+ cidr = "";
+ } else {
+ utils = new SubnetUtils(cidr);
+ if(!utils.getInfo().getNetworkAddress().equals(utils.getInfo().getAddress())){
+ continue;
+ }
+ }
+ acl.setSource(acl.new AclNetwork(cidr, port));
+ acl.setAction(item.getAction().name());
+
+ aclList.add(acl);
+ }
+ }
+
+ return aclList;
+ }
+
+ public String syncTopologyToBcfHost(HostVO bigswitchBcfHost){
+ SyncBcfTopologyCommand syncCmd;
+ if(isNatEnabled()!=null && isNatEnabled()){
+ syncCmd = new SyncBcfTopologyCommand(true, true);
+ } else {
+ syncCmd = new SyncBcfTopologyCommand(true, false);
+ }
+ BcfAnswer syncAnswer = (BcfAnswer) _agentMgr.easySend(bigswitchBcfHost.getId(), syncCmd);
+ if (syncAnswer == null || !syncAnswer.getResult()) {
+ s_logger.error("SyncBcfTopologyCommand failed");
+ return null;
+ }
+ return syncAnswer.getHash();
+ }
+
+ public String syncTopologyToBcfHost(HostVO bigswitchBcfHost, boolean natEnabled){
+ SyncBcfTopologyCommand syncCmd;
+ if(natEnabled){
+ syncCmd = new SyncBcfTopologyCommand(true, true);
+ } else {
+ syncCmd = new SyncBcfTopologyCommand(true, false);
+ }
+ BcfAnswer syncAnswer = (BcfAnswer) _agentMgr.easySend(bigswitchBcfHost.getId(), syncCmd);
+ if (syncAnswer == null || !syncAnswer.getResult()) {
+ s_logger.error("SyncBcfTopologyCommand failed");
+ return null;
+ }
+ return syncAnswer.getHash();
+ }
+
+ public BcfAnswer sendBcfCommandWithNetworkSyncCheck(BcfCommand cmd, Network network)throws IllegalArgumentException{
+ // get registered Big Switch controller
+ ControlClusterData cluster = getControlClusterData(network.getPhysicalNetworkId());
+ if(cluster.getMaster()==null){
+ return new BcfAnswer(cmd, new CloudRuntimeException("Big Switch Network controller temporarily unavailable"));
+ }
+
+ TopologyData topo = getTopology(network.getPhysicalNetworkId());
+
+ cmd.setTopology(topo);
+ BcfAnswer answer = (BcfAnswer) _agentMgr.easySend(cluster.getMaster().getId(), cmd);
+
+ if (answer == null || !answer.getResult()) {
+ s_logger.error ("BCF API Command failed");
+ throw new IllegalArgumentException("Failed API call to Big Switch Network plugin");
+ }
+
+ String newHash = answer.getHash();
+ if (cmd.is_topologySyncRequested()) {
+ newHash = syncTopologyToBcfHost(cluster.getMaster());
+ }
+ if(newHash != null){
+ commitTopologyHash(network.getPhysicalNetworkId(), newHash);
+ }
+
+ HostVO slave = cluster.getSlave();
+ if(slave != null){
+ TopologyData newTopo = getTopology(network.getPhysicalNetworkId());
+ CacheBcfTopologyCommand cacheCmd = new CacheBcfTopologyCommand(newTopo);
+ _agentMgr.easySend(cluster.getSlave().getId(), cacheCmd);
+ }
+
+ return answer;
+ }
+
+ @DB
+ public Boolean commitTopologyHash(long physicalNetworkId, final String hash) {
+ final List<BigSwitchBcfDeviceVO> devices = _bigswitchBcfDao.listByPhysicalNetwork(physicalNetworkId);
+
+ return Transaction.execute(new TransactionCallback<Boolean>() {
+ @Override
+ public Boolean doInTransaction(TransactionStatus status) {
+ for (BigSwitchBcfDeviceVO d: devices){
+ d.setHash(hash);
+ _bigswitchBcfDao.update(d.getId(), d);
+ }
+ return true;
+ }
+ });
+ }
+
+ public Boolean isNatEnabled(){
+ List<BigSwitchBcfDeviceVO> devices = _bigswitchBcfDao.listAll();
+ if(devices != null && !devices.isEmpty()){
+ return devices.get(0).getNat();
+ } else {
+ return null;
+ }
+ }
+
+ public Integer getSubnetMaskLength(String maskString){
+ if(!IPAddress.isValidIPv4(maskString)){
+ return null;
+ }
+ String[] octets = maskString.split(".");
+ Integer bits = 0;
+ for (String o: octets){
+ switch(o){
+ case "255":
+ bits += 8;
+ continue;
+ case "254":
+ bits += 7;
+ return bits;
+ case "252":
+ bits += 6;
+ return bits;
+ case "248":
+ bits += 5;
+ return bits;
+ case "240":
+ bits += 4;
+ return bits;
+ case "224":
+ bits += 3;
+ return bits;
+ case "192":
+ bits += 2;
+ return bits;
+ case "128":
+ bits += 1;
+ return bits;
+ case "0":
+ return bits;
+ default:
+ throw new NumberFormatException("non-contiguous subnet mask not supported");
+ }
+ }
+ return bits;
+ }
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/01864ef7/plugins/network-elements/bigswitch/src/com/cloud/network/bigswitch/BigSwitchStatus.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/bigswitch/src/com/cloud/network/bigswitch/BigSwitchStatus.java b/plugins/network-elements/bigswitch/src/com/cloud/network/bigswitch/BigSwitchStatus.java
new file mode 100644
index 0000000..0b3a895
--- /dev/null
+++ b/plugins/network-elements/bigswitch/src/com/cloud/network/bigswitch/BigSwitchStatus.java
@@ -0,0 +1,32 @@
+//
+// 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.bigswitch;
+
+public class BigSwitchStatus {
+ private boolean topologySyncRequested = false;
+
+ public boolean isTopologySyncRequested() {
+ return topologySyncRequested;
+ }
+
+ public void setTopologySyncRequested(boolean topologySyncRequested) {
+ this.topologySyncRequested = topologySyncRequested;
+ }
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/01864ef7/plugins/network-elements/bigswitch/src/com/cloud/network/bigswitch/Capabilities.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/bigswitch/src/com/cloud/network/bigswitch/Capabilities.java b/plugins/network-elements/bigswitch/src/com/cloud/network/bigswitch/Capabilities.java
new file mode 100644
index 0000000..b033a84
--- /dev/null
+++ b/plugins/network-elements/bigswitch/src/com/cloud/network/bigswitch/Capabilities.java
@@ -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 com.cloud.network.bigswitch;
+
+import java.util.List;
+
+public class Capabilities extends BigSwitchStatus {
+ private List<String> capabilities;
+
+ public List<String> getCapabilities() {
+ return capabilities;
+ }
+
+ public void setCapabilities(List<String> caps) {
+ capabilities = caps;
+ }
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/01864ef7/plugins/network-elements/bigswitch/src/com/cloud/network/bigswitch/ControlClusterData.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/bigswitch/src/com/cloud/network/bigswitch/ControlClusterData.java b/plugins/network-elements/bigswitch/src/com/cloud/network/bigswitch/ControlClusterData.java
new file mode 100644
index 0000000..7d62899
--- /dev/null
+++ b/plugins/network-elements/bigswitch/src/com/cloud/network/bigswitch/ControlClusterData.java
@@ -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 com.cloud.network.bigswitch;
+
+import com.cloud.host.HostVO;
+
+public class ControlClusterData {
+ private HostVO master;
+ private HostVO slave;
+
+ public HostVO getMaster() {
+ return master;
+ }
+
+ public void setMaster(HostVO master) {
+ this.master = master;
+ }
+
+ public HostVO getSlave() {
+ return slave;
+ }
+
+ public void setSlave(HostVO slave) {
+ this.slave = slave;
+ }
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/01864ef7/plugins/network-elements/bigswitch/src/com/cloud/network/bigswitch/ControlClusterStatus.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/bigswitch/src/com/cloud/network/bigswitch/ControlClusterStatus.java b/plugins/network-elements/bigswitch/src/com/cloud/network/bigswitch/ControlClusterStatus.java
new file mode 100644
index 0000000..8a17bea
--- /dev/null
+++ b/plugins/network-elements/bigswitch/src/com/cloud/network/bigswitch/ControlClusterStatus.java
@@ -0,0 +1,32 @@
+//
+// 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.bigswitch;
+
+public class ControlClusterStatus extends BigSwitchStatus {
+ private boolean healthy;
+
+ public boolean getStatus() {
+ return healthy;
+ }
+
+ public void setStatus(boolean status) {
+ this.healthy = status;
+ }
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/01864ef7/plugins/network-elements/bigswitch/src/com/cloud/network/bigswitch/ControllerData.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/bigswitch/src/com/cloud/network/bigswitch/ControllerData.java b/plugins/network-elements/bigswitch/src/com/cloud/network/bigswitch/ControllerData.java
new file mode 100644
index 0000000..224a7ab
--- /dev/null
+++ b/plugins/network-elements/bigswitch/src/com/cloud/network/bigswitch/ControllerData.java
@@ -0,0 +1,39 @@
+//
+// 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.bigswitch;
+
+public class ControllerData {
+ private final String ipAddress;
+ private final boolean isMaster;
+
+ public ControllerData(String ipAddress, boolean isMaster) {
+ this.ipAddress = ipAddress;
+ this.isMaster = isMaster;
+ }
+
+ public String getIpAddress() {
+ return ipAddress;
+ }
+
+ public boolean isMaster() {
+ return isMaster;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/01864ef7/plugins/network-elements/bigswitch/src/com/cloud/network/bigswitch/FloatingIpData.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/bigswitch/src/com/cloud/network/bigswitch/FloatingIpData.java b/plugins/network-elements/bigswitch/src/com/cloud/network/bigswitch/FloatingIpData.java
new file mode 100644
index 0000000..6e2c422
--- /dev/null
+++ b/plugins/network-elements/bigswitch/src/com/cloud/network/bigswitch/FloatingIpData.java
@@ -0,0 +1,93 @@
+//
+// 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.bigswitch;
+
+import com.google.gson.annotations.SerializedName;
+
+public class FloatingIpData {
+ @SerializedName("router_id") private String routerId;
+ @SerializedName("tenant_id") private String tenantId;
+ @SerializedName("floating_network_id") private String networkId;
+ @SerializedName("fixed_ip_address") private String fixedIp;
+ @SerializedName("floating_ip_address") private String floatingIp;
+ @SerializedName("floating_mac_address") private String mac;
+ @SerializedName("id") private String id;
+
+ public FloatingIpData(){
+ this.mac = null;
+ }
+
+ public String getRouterId() {
+ return routerId;
+ }
+
+ public void setRouterId(String routerId) {
+ this.routerId = routerId;
+ }
+
+ public String getTenantId() {
+ return tenantId;
+ }
+
+ public void setTenantId(String tenantId) {
+ this.tenantId = tenantId;
+ }
+
+ public String getNetworkId() {
+ return networkId;
+ }
+
+ public void setNetworkId(String networkId) {
+ this.networkId = networkId;
+ }
+
+ public String getFixedIp() {
+ return fixedIp;
+ }
+
+ public void setFixedIp(String fixedIp) {
+ this.fixedIp = fixedIp;
+ }
+
+ public String getFloatingIp() {
+ return floatingIp;
+ }
+
+ /***
+ * current implementation auto-generates id using public ip
+ * replacing "." with "-"
+ ***/
+ public void setFloatingIpAndId(String floatingIp) {
+ this.floatingIp = floatingIp;
+ this.id = floatingIp.replace(".", "-");
+ }
+
+ public String getMac() {
+ return mac;
+ }
+
+ public void setMac(String mac) {
+ this.mac = mac;
+ }
+
+ public String getId() {
+ return id;
+ }
+}