diff --git a/agent-simulator/tomcatconf/components-simulator.xml.in b/agent-simulator/tomcatconf/components-simulator.xml.in index 935925632da..c92c6420d4c 100755 --- a/agent-simulator/tomcatconf/components-simulator.xml.in +++ b/agent-simulator/tomcatconf/components-simulator.xml.in @@ -3,7 +3,14 @@ true - + + + + + + + + diff --git a/agent/conf/agent.properties b/agent/conf/agent.properties index 60222277f33..bff768f3f14 100644 --- a/agent/conf/agent.properties +++ b/agent/conf/agent.properties @@ -28,3 +28,6 @@ zone=default #guid= a GUID to identify the agent +#vm.migrate.speed set the vm migrate speed, by default, it's the speed of guest network +#local.storage.path local storage path, by default, it's /var/lib/libvirt/images/ +#cmds.timeout the timeout for time-consuming operations, such create/copy snapshot \ No newline at end of file diff --git a/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java b/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java index 079c7b71dab..a43df2f3d37 100755 --- a/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java +++ b/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java @@ -243,6 +243,7 @@ public class LibvirtComputingResource extends ServerResourceBase implements private String _dcId; private String _pod; private String _clusterId; + private int _migrateSpeed; private long _hvVersion; private KVMHAMonitor _monitor; @@ -722,7 +723,26 @@ public class LibvirtComputingResource extends ServerResourceBase implements if (_mountPoint == null) { _mountPoint = "/mnt"; } - + + value = (String) params.get("vm.migrate.speed"); + _migrateSpeed = NumbersUtil.parseInt(value, -1); + if (_migrateSpeed == -1) { + //get guest network device speed + _migrateSpeed = 0; + String speed = Script.runSimpleBashScript("ethtool " + _pifs.second() + " |grep Speed | cut -d \\ -f 2"); + if (speed != null) { + String[] tokens = speed.split("M"); + if (tokens.length == 2) { + try { + _migrateSpeed = Integer.parseInt(tokens[0]); + } catch (Exception e) { + + } + s_logger.debug("device " + _pifs.second() + " has speed: " + String.valueOf(_migrateSpeed)); + } + } + params.put("vm.migrate.speed", String.valueOf(_migrateSpeed)); + } saveProperties(params); return true; @@ -2004,7 +2024,7 @@ public class LibvirtComputingResource extends ServerResourceBase implements * VIR_MIGRATE_PERSIST_DEST(1<<3) */ destDomain = dm.migrate(dconn, (1 << 0) | (1 << 3), vmName, "tcp:" - + cmd.getDestinationIp(), 0); + + cmd.getDestinationIp(), _migrateSpeed); } catch (LibvirtException e) { s_logger.debug("Can't migrate domain: " + e.getMessage()); result = e.getMessage(); diff --git a/api/src/com/cloud/api/ApiConstants.java b/api/src/com/cloud/api/ApiConstants.java index ad986c67350..4ed625c40f7 100755 --- a/api/src/com/cloud/api/ApiConstants.java +++ b/api/src/com/cloud/api/ApiConstants.java @@ -331,6 +331,7 @@ public class ApiConstants { public static final String IS_STATIC_NAT = "isstaticnat"; public static final String SORT_BY = "sortby"; public static final String CHANGE_CIDR = "changecidr"; + public static final String PURPOSE = "purpose"; public enum HostDetails { all, capacity, events, stats, min; diff --git a/api/src/com/cloud/api/commands/AddHostCmd.java b/api/src/com/cloud/api/commands/AddHostCmd.java index a71f672288f..f931fe61f77 100755 --- a/api/src/com/cloud/api/commands/AddHostCmd.java +++ b/api/src/com/cloud/api/commands/AddHostCmd.java @@ -142,7 +142,7 @@ public class AddHostCmd extends BaseCmd { List result = _resourceService.discoverHosts(this); ListResponse response = new ListResponse(); List hostResponses = new ArrayList(); - if (result != null) { + if (result != null && result.size() > 0) { for (Host host : result) { HostResponse hostResponse = _responseGenerator.createHostResponse(host); hostResponses.add(hostResponse); diff --git a/api/src/com/cloud/api/commands/AddNetworkServiceProviderCmd.java b/api/src/com/cloud/api/commands/AddNetworkServiceProviderCmd.java index 131f6673a70..88bb755937b 100644 --- a/api/src/com/cloud/api/commands/AddNetworkServiceProviderCmd.java +++ b/api/src/com/cloud/api/commands/AddNetworkServiceProviderCmd.java @@ -30,6 +30,7 @@ import com.cloud.api.Implementation; import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.api.response.ProviderResponse; +import com.cloud.async.AsyncJob; import com.cloud.event.EventTypes; import com.cloud.exception.ResourceAllocationException; import com.cloud.network.PhysicalNetworkServiceProvider; @@ -131,4 +132,9 @@ public class AddNetworkServiceProviderCmd extends BaseAsyncCreateCmd { public String getEventDescription() { return "Adding physical network ServiceProvider: " + getEntityId(); } + + @Override + public AsyncJob.Type getInstanceType() { + return AsyncJob.Type.PhysicalNetworkServiceProvider; + } } diff --git a/api/src/com/cloud/api/commands/AddTrafficTypeCmd.java b/api/src/com/cloud/api/commands/AddTrafficTypeCmd.java index 41117b59650..747800835e9 100644 --- a/api/src/com/cloud/api/commands/AddTrafficTypeCmd.java +++ b/api/src/com/cloud/api/commands/AddTrafficTypeCmd.java @@ -28,6 +28,7 @@ import com.cloud.api.Implementation; import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.api.response.TrafficTypeResponse; +import com.cloud.async.AsyncJob; import com.cloud.event.EventTypes; import com.cloud.exception.ResourceAllocationException; import com.cloud.network.PhysicalNetworkTrafficType; @@ -151,4 +152,9 @@ public class AddTrafficTypeCmd extends BaseAsyncCreateCmd { public String getEventDescription() { return "Adding physical network traffic type: " + getEntityId(); } + + @Override + public AsyncJob.Type getInstanceType() { + return AsyncJob.Type.TrafficType; + } } diff --git a/api/src/com/cloud/api/commands/CreateFirewallRuleCmd.java b/api/src/com/cloud/api/commands/CreateFirewallRuleCmd.java index e8f5cc819eb..a8f242c0bf6 100644 --- a/api/src/com/cloud/api/commands/CreateFirewallRuleCmd.java +++ b/api/src/com/cloud/api/commands/CreateFirewallRuleCmd.java @@ -32,6 +32,7 @@ import com.cloud.api.Implementation; import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.api.response.FirewallResponse; +import com.cloud.async.AsyncJob; import com.cloud.event.EventTypes; import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.NetworkRuleConflictException; @@ -301,5 +302,10 @@ public class CreateFirewallRuleCmd extends BaseAsyncCreateCmd implements Firewal return FirewallRuleType.User; } } + + @Override + public AsyncJob.Type getInstanceType() { + return AsyncJob.Type.FirewallRule; + } } diff --git a/api/src/com/cloud/api/commands/CreateIpForwardingRuleCmd.java b/api/src/com/cloud/api/commands/CreateIpForwardingRuleCmd.java index 32971c984fe..859144f775f 100644 --- a/api/src/com/cloud/api/commands/CreateIpForwardingRuleCmd.java +++ b/api/src/com/cloud/api/commands/CreateIpForwardingRuleCmd.java @@ -32,6 +32,7 @@ import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.api.response.FirewallRuleResponse; import com.cloud.api.response.IpForwardingRuleResponse; +import com.cloud.async.AsyncJob; import com.cloud.event.EventTypes; import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.NetworkRuleConflictException; @@ -298,5 +299,10 @@ public class CreateIpForwardingRuleCmd extends BaseAsyncCreateCmd implements Sta public FirewallRuleType getType() { return FirewallRuleType.User; } + + @Override + public AsyncJob.Type getInstanceType() { + return AsyncJob.Type.FirewallRule; + } } diff --git a/api/src/com/cloud/api/commands/CreateLoadBalancerRuleCmd.java b/api/src/com/cloud/api/commands/CreateLoadBalancerRuleCmd.java index 43f40ef4b08..c7229755877 100644 --- a/api/src/com/cloud/api/commands/CreateLoadBalancerRuleCmd.java +++ b/api/src/com/cloud/api/commands/CreateLoadBalancerRuleCmd.java @@ -31,6 +31,7 @@ import com.cloud.api.Implementation; import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.api.response.LoadBalancerResponse; +import com.cloud.async.AsyncJob; import com.cloud.dc.DataCenter; import com.cloud.dc.DataCenter.NetworkType; import com.cloud.event.EventTypes; @@ -347,6 +348,11 @@ public class CreateLoadBalancerRuleCmd extends BaseAsyncCreateCmd /*implements public void setSourceIpAddressId(Long ipId) { this.publicIpId = ipId; } + + @Override + public AsyncJob.Type getInstanceType() { + return AsyncJob.Type.FirewallRule; + } } diff --git a/api/src/com/cloud/api/commands/CreatePortForwardingRuleCmd.java b/api/src/com/cloud/api/commands/CreatePortForwardingRuleCmd.java index 159eb8f2417..add7e4dcfc4 100644 --- a/api/src/com/cloud/api/commands/CreatePortForwardingRuleCmd.java +++ b/api/src/com/cloud/api/commands/CreatePortForwardingRuleCmd.java @@ -31,6 +31,7 @@ import com.cloud.api.Implementation; import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.api.response.FirewallRuleResponse; +import com.cloud.async.AsyncJob; import com.cloud.event.EventTypes; import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.NetworkRuleConflictException; @@ -307,5 +308,10 @@ public class CreatePortForwardingRuleCmd extends BaseAsyncCreateCmd implements P public FirewallRuleType getType() { return FirewallRuleType.User; } + + @Override + public AsyncJob.Type getInstanceType() { + return AsyncJob.Type.FirewallRule; + } } diff --git a/api/src/com/cloud/api/commands/CreateStorageNetworkIpRangeCmd.java b/api/src/com/cloud/api/commands/CreateStorageNetworkIpRangeCmd.java index 7a5aae4cc6b..de5a58a025f 100755 --- a/api/src/com/cloud/api/commands/CreateStorageNetworkIpRangeCmd.java +++ b/api/src/com/cloud/api/commands/CreateStorageNetworkIpRangeCmd.java @@ -43,6 +43,9 @@ public class CreateStorageNetworkIpRangeCmd extends BaseAsyncCmd { @Parameter(name=ApiConstants.NETMASK, type=CommandType.STRING, required=true, description="the netmask for storage network") private String netmask; + @Parameter(name=ApiConstants.GATEWAY, type=CommandType.STRING, required=true, description="the gateway for storage network") + private String gateway; + ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// @@ -66,6 +69,10 @@ public class CreateStorageNetworkIpRangeCmd extends BaseAsyncCmd { public String getNetmask() { return netmask; } + + public String getGateWay() { + return gateway; + } @Override public String getEventType() { diff --git a/api/src/com/cloud/api/commands/DeleteFirewallRuleCmd.java b/api/src/com/cloud/api/commands/DeleteFirewallRuleCmd.java index 40083bd46f4..78f55fff67f 100644 --- a/api/src/com/cloud/api/commands/DeleteFirewallRuleCmd.java +++ b/api/src/com/cloud/api/commands/DeleteFirewallRuleCmd.java @@ -27,6 +27,7 @@ import com.cloud.api.Implementation; import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.api.response.SuccessResponse; +import com.cloud.async.AsyncJob; import com.cloud.event.EventTypes; import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.ResourceUnavailableException; @@ -112,4 +113,9 @@ public class DeleteFirewallRuleCmd extends BaseAsyncCmd { public Long getSyncObjId() { return _firewallService.getFirewallRule(id).getNetworkId(); } + + @Override + public AsyncJob.Type getInstanceType() { + return AsyncJob.Type.FirewallRule; + } } diff --git a/api/src/com/cloud/api/commands/DeleteIpForwardingRuleCmd.java b/api/src/com/cloud/api/commands/DeleteIpForwardingRuleCmd.java index 363a31af3e1..2b27eb6f260 100644 --- a/api/src/com/cloud/api/commands/DeleteIpForwardingRuleCmd.java +++ b/api/src/com/cloud/api/commands/DeleteIpForwardingRuleCmd.java @@ -28,6 +28,7 @@ import com.cloud.api.Implementation; import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.api.response.SuccessResponse; +import com.cloud.async.AsyncJob; import com.cloud.event.EventTypes; import com.cloud.exception.InvalidParameterValueException; import com.cloud.network.rules.FirewallRule; @@ -115,5 +116,10 @@ public class DeleteIpForwardingRuleCmd extends BaseAsyncCmd { public Long getSyncObjId() { return _rulesService.getFirewallRule(id).getNetworkId(); } + + @Override + public AsyncJob.Type getInstanceType() { + return AsyncJob.Type.FirewallRule; + } } diff --git a/api/src/com/cloud/api/commands/DeleteLoadBalancerRuleCmd.java b/api/src/com/cloud/api/commands/DeleteLoadBalancerRuleCmd.java index 686e9efef40..f0afcd42ac8 100644 --- a/api/src/com/cloud/api/commands/DeleteLoadBalancerRuleCmd.java +++ b/api/src/com/cloud/api/commands/DeleteLoadBalancerRuleCmd.java @@ -27,6 +27,7 @@ import com.cloud.api.Implementation; import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.api.response.SuccessResponse; +import com.cloud.async.AsyncJob; import com.cloud.event.EventTypes; import com.cloud.exception.InvalidParameterValueException; import com.cloud.network.rules.LoadBalancer; @@ -110,4 +111,9 @@ public class DeleteLoadBalancerRuleCmd extends BaseAsyncCmd { } return lb.getNetworkId(); } + + @Override + public AsyncJob.Type getInstanceType() { + return AsyncJob.Type.FirewallRule; + } } diff --git a/api/src/com/cloud/api/commands/DeleteNetworkServiceProviderCmd.java b/api/src/com/cloud/api/commands/DeleteNetworkServiceProviderCmd.java index 1c03653940f..60d0d191c75 100644 --- a/api/src/com/cloud/api/commands/DeleteNetworkServiceProviderCmd.java +++ b/api/src/com/cloud/api/commands/DeleteNetworkServiceProviderCmd.java @@ -28,6 +28,7 @@ import com.cloud.api.Implementation; import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.api.response.SuccessResponse; +import com.cloud.async.AsyncJob; import com.cloud.event.EventTypes; import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.ResourceUnavailableException; @@ -101,4 +102,9 @@ public class DeleteNetworkServiceProviderCmd extends BaseAsyncCmd { public String getEventDescription() { return "Deleting Physical network ServiceProvider: " + getId(); } + + @Override + public AsyncJob.Type getInstanceType() { + return AsyncJob.Type.PhysicalNetworkServiceProvider; + } } diff --git a/api/src/com/cloud/api/commands/DeletePortForwardingRuleCmd.java b/api/src/com/cloud/api/commands/DeletePortForwardingRuleCmd.java index f8427a2048b..6ddb4136248 100644 --- a/api/src/com/cloud/api/commands/DeletePortForwardingRuleCmd.java +++ b/api/src/com/cloud/api/commands/DeletePortForwardingRuleCmd.java @@ -27,6 +27,7 @@ import com.cloud.api.Implementation; import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.api.response.SuccessResponse; +import com.cloud.async.AsyncJob; import com.cloud.event.EventTypes; import com.cloud.exception.InvalidParameterValueException; import com.cloud.network.rules.PortForwardingRule; @@ -114,4 +115,9 @@ public class DeletePortForwardingRuleCmd extends BaseAsyncCmd { public Long getSyncObjId() { return _rulesService.getPortForwardigRule(id).getNetworkId(); } + + @Override + public AsyncJob.Type getInstanceType() { + return AsyncJob.Type.FirewallRule; + } } diff --git a/api/src/com/cloud/api/commands/DeleteTrafficTypeCmd.java b/api/src/com/cloud/api/commands/DeleteTrafficTypeCmd.java index f1bc2bebaac..81bc8bb22dc 100644 --- a/api/src/com/cloud/api/commands/DeleteTrafficTypeCmd.java +++ b/api/src/com/cloud/api/commands/DeleteTrafficTypeCmd.java @@ -28,6 +28,7 @@ import com.cloud.api.Implementation; import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.api.response.SuccessResponse; +import com.cloud.async.AsyncJob; import com.cloud.event.EventTypes; import com.cloud.user.Account; @@ -88,5 +89,9 @@ public class DeleteTrafficTypeCmd extends BaseAsyncCmd { return EventTypes.EVENT_TRAFFIC_TYPE_DELETE; } + @Override + public AsyncJob.Type getInstanceType() { + return AsyncJob.Type.TrafficType; + } } diff --git a/api/src/com/cloud/api/commands/MigrateVolumeCmd.java b/api/src/com/cloud/api/commands/MigrateVolumeCmd.java index 7df7628cde1..7e2d614af23 100644 --- a/api/src/com/cloud/api/commands/MigrateVolumeCmd.java +++ b/api/src/com/cloud/api/commands/MigrateVolumeCmd.java @@ -27,7 +27,7 @@ public class MigrateVolumeCmd extends BaseAsyncCmd { private Long volumeId; @IdentityMapper(entityTableName="storage_pool") - @Parameter(name=ApiConstants.STORAGE_ID, type=CommandType.LONG, required=false, description="destination storage pool ID to migrate the volume to") + @Parameter(name=ApiConstants.STORAGE_ID, type=CommandType.LONG, required=true, description="destination storage pool ID to migrate the volume to") private Long storageId; ///////////////////////////////////////////////////// diff --git a/api/src/com/cloud/api/commands/UpdateNetworkServiceProviderCmd.java b/api/src/com/cloud/api/commands/UpdateNetworkServiceProviderCmd.java index 8ad3e5b9e9b..f98a2fc6362 100644 --- a/api/src/com/cloud/api/commands/UpdateNetworkServiceProviderCmd.java +++ b/api/src/com/cloud/api/commands/UpdateNetworkServiceProviderCmd.java @@ -30,6 +30,7 @@ import com.cloud.api.Implementation; import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.api.response.ProviderResponse; +import com.cloud.async.AsyncJob; import com.cloud.event.EventTypes; import com.cloud.network.PhysicalNetworkServiceProvider; import com.cloud.user.Account; @@ -103,5 +104,10 @@ public class UpdateNetworkServiceProviderCmd extends BaseAsyncCmd { public String getEventDescription() { return "Updating physical network ServiceProvider: " + getId(); } + + @Override + public AsyncJob.Type getInstanceType() { + return AsyncJob.Type.PhysicalNetworkServiceProvider; + } } diff --git a/api/src/com/cloud/api/commands/UpdateTrafficTypeCmd.java b/api/src/com/cloud/api/commands/UpdateTrafficTypeCmd.java index d93654ea9a3..299aef0f429 100644 --- a/api/src/com/cloud/api/commands/UpdateTrafficTypeCmd.java +++ b/api/src/com/cloud/api/commands/UpdateTrafficTypeCmd.java @@ -28,6 +28,7 @@ import com.cloud.api.Implementation; import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.api.response.TrafficTypeResponse; +import com.cloud.async.AsyncJob; import com.cloud.event.EventTypes; import com.cloud.network.PhysicalNetworkTrafficType; import com.cloud.user.Account; @@ -111,5 +112,8 @@ public class UpdateTrafficTypeCmd extends BaseAsyncCmd { return EventTypes.EVENT_TRAFFIC_TYPE_UPDATE; } - + @Override + public AsyncJob.Type getInstanceType() { + return AsyncJob.Type.TrafficType; + } } diff --git a/api/src/com/cloud/api/response/AlertResponse.java b/api/src/com/cloud/api/response/AlertResponse.java index a8f7b759d5c..f5cc39ba0f1 100644 --- a/api/src/com/cloud/api/response/AlertResponse.java +++ b/api/src/com/cloud/api/response/AlertResponse.java @@ -30,7 +30,14 @@ public class AlertResponse extends BaseResponse { @SerializedName(ApiConstants.ID) @Param(description="the id of the alert") private IdentityProxy id = new IdentityProxy("alert"); - @SerializedName(ApiConstants.TYPE) @Param(description="the alert type") + @SerializedName(ApiConstants.TYPE) @Param(description="One of the following alert types: " + + "MEMORY = 0, CPU = 1, STORAGE = 2, STORAGE_ALLOCATED = 3, PUBLIC_IP = 4, PRIVATE_IP = 5, HOST = 6, USERVM = 7, " + + "DOMAIN_ROUTER = 8, CONSOLE_PROXY = 9, ROUTING = 10: lost connection to default route (to the gateway), " + + "STORAGE_MISC = 11: lost connection to default route (to the gateway), " + + "USAGE_SERVER = 12: lost connection to default route (to the gateway), " + + "MANAGMENT_NODE = 13: lost connection to default route (to the gateway), " + + "DOMAIN_ROUTER_MIGRATE = 14, CONSOLE_PROXY_MIGRATE = 15, USERVM_MIGRATE = 16, VLAN = 17, SSVM = 18, " + + "USAGE_SERVER_RESULT = 19") private Short alertType; @SerializedName(ApiConstants.DESCRIPTION) @Param(description="description of the alert") diff --git a/api/src/com/cloud/api/response/AsyncJobResponse.java b/api/src/com/cloud/api/response/AsyncJobResponse.java index 40d9a2c4548..13be7f35739 100644 --- a/api/src/com/cloud/api/response/AsyncJobResponse.java +++ b/api/src/com/cloud/api/response/AsyncJobResponse.java @@ -19,8 +19,6 @@ package com.cloud.api.response; import java.util.Date; -import org.apache.log4j.Logger; - import com.cloud.api.ApiConstants; import com.cloud.api.IdentityProxy; import com.cloud.api.ResponseObject; @@ -119,7 +117,13 @@ public class AsyncJobResponse extends BaseResponse { this.jobInstanceId.setTableName("security_group"); } else if (jobInstanceType.equalsIgnoreCase(AsyncJob.Type.PhysicalNetwork.toString())) { this.jobInstanceId.setTableName("physical_network"); - }else if (!jobInstanceType.equalsIgnoreCase(AsyncJob.Type.None.toString())){ + } else if (jobInstanceType.equalsIgnoreCase(AsyncJob.Type.TrafficType.toString())) { + this.jobInstanceId.setTableName("physical_network_traffic_types"); + } else if (jobInstanceType.equalsIgnoreCase(AsyncJob.Type.PhysicalNetworkServiceProvider.toString())) { + this.jobInstanceId.setTableName("physical_network_service_providers"); + } else if (jobInstanceType.equalsIgnoreCase(AsyncJob.Type.FirewallRule.toString())) { + this.jobInstanceId.setTableName("firewall_rules"); + } else if (!jobInstanceType.equalsIgnoreCase(AsyncJob.Type.None.toString())){ // TODO : when we hit here, we need to add instanceType -> UUID entity table mapping assert(false); } diff --git a/api/src/com/cloud/api/response/IPAddressResponse.java b/api/src/com/cloud/api/response/IPAddressResponse.java index 40def18c650..0617aef844a 100644 --- a/api/src/com/cloud/api/response/IPAddressResponse.java +++ b/api/src/com/cloud/api/response/IPAddressResponse.java @@ -93,7 +93,10 @@ public class IPAddressResponse extends BaseResponse implements ControlledEntityR private String state; @SerializedName(ApiConstants.PHYSICAL_NETWORK_ID) @Param(description="the physical network this belongs to") - private IdentityProxy physicalNetworkId = new IdentityProxy("physical_network"); + private IdentityProxy physicalNetworkId = new IdentityProxy("physical_network"); + + @SerializedName(ApiConstants.PURPOSE) @Param(description="purpose of the IP address. In Acton this value is not null for Elastic IPs only, and can have either StaticNat or LB value") + private String purpose; /* @SerializedName(ApiConstants.JOB_ID) @Param(description="shows the current pending asynchronous job ID. This tag is not returned if no current pending jobs are acting on the volume") @@ -207,11 +210,11 @@ public class IPAddressResponse extends BaseResponse implements ControlledEntityR this.physicalNetworkId.setValue(physicalNetworkId); } - public long getphysicalNetworkId() { - return physicalNetworkId.getValue(); - } - public void setIsElastic(Boolean isElastic) { this.isElastic = isElastic; } + + public void setPurpose(String purpose) { + this.purpose = purpose; + } } diff --git a/api/src/com/cloud/api/response/StorageNetworkIpRangeResponse.java b/api/src/com/cloud/api/response/StorageNetworkIpRangeResponse.java index 1506c828fc6..db8dfe123ef 100755 --- a/api/src/com/cloud/api/response/StorageNetworkIpRangeResponse.java +++ b/api/src/com/cloud/api/response/StorageNetworkIpRangeResponse.java @@ -6,7 +6,7 @@ import com.cloud.serializer.Param; import com.google.gson.annotations.SerializedName; public class StorageNetworkIpRangeResponse extends BaseResponse { - @SerializedName(ApiConstants.VLAN) @Param(description="the uuid of storage network IP range.") + @SerializedName(ApiConstants.ID) @Param(description="the uuid of storage network IP range.") private String uuid; @SerializedName(ApiConstants.VLAN) @Param(description="the ID or VID of the VLAN.") @@ -19,7 +19,10 @@ public class StorageNetworkIpRangeResponse extends BaseResponse { private String startIp; @SerializedName(ApiConstants.END_IP) @Param(description="the end ip of the storage network IP range") - private String endIp; + private String endIp; + + @SerializedName(ApiConstants.GATEWAY) @Param(description="the gateway of the storage network IP range") + private String gateway; @SerializedName(ApiConstants.NETWORK_ID) @Param(description="the network uuid of storage network IP range") private String networkUuid; @@ -30,7 +33,7 @@ public class StorageNetworkIpRangeResponse extends BaseResponse { @SerializedName(ApiConstants.NETMASK) @Param(description="the netmask of the storage network IP range") private String netmask; - public void setUuid(String uuId) { + public void setUuid(String uuid) { this.uuid = uuid; } @@ -60,5 +63,9 @@ public class StorageNetworkIpRangeResponse extends BaseResponse { public void setNetmask(String netmask) { this.netmask = netmask; + } + + public void setGateway(String gateway) { + this.gateway = gateway; } } diff --git a/api/src/com/cloud/api/response/UserVmResponse.java b/api/src/com/cloud/api/response/UserVmResponse.java index 151d45d0cc3..a7eef6215f5 100755 --- a/api/src/com/cloud/api/response/UserVmResponse.java +++ b/api/src/com/cloud/api/response/UserVmResponse.java @@ -147,6 +147,11 @@ public class UserVmResponse extends BaseResponse implements ControlledEntityResp @SerializedName("hypervisor") @Param(description="the hypervisor on which the template runs") private String hypervisor; + @SerializedName(ApiConstants.PUBLIC_IP_ID) @Param(description="public IP address id associated with vm via Static nat rule") + private IdentityProxy publicIpId = new IdentityProxy("user_ip_address"); + + @SerializedName(ApiConstants.PUBLIC_IP) @Param(description="public IP address id associated with vm via Static nat rule") + private String publicIp; public void setHypervisor(String hypervisor) { this.hypervisor = hypervisor; @@ -322,4 +327,12 @@ public class UserVmResponse extends BaseResponse implements ControlledEntityResp public void setProjectName(String projectName) { this.projectName = projectName; } + + public void setPublicIpId(Long publicIpId) { + this.publicIpId.setValue(publicIpId); + } + + public void setPublicIp(String publicIp) { + this.publicIp = publicIp; + } } diff --git a/api/src/com/cloud/async/AsyncJob.java b/api/src/com/cloud/async/AsyncJob.java index 8004c84b042..9db25c742e9 100644 --- a/api/src/com/cloud/async/AsyncJob.java +++ b/api/src/com/cloud/async/AsyncJob.java @@ -36,7 +36,10 @@ public interface AsyncJob extends Identity { StoragePool, IpAddress, SecurityGroup, - PhysicalNetwork + PhysicalNetwork, + TrafficType, + PhysicalNetworkServiceProvider, + FirewallRule } Long getId(); diff --git a/api/src/com/cloud/dc/StorageNetworkIpRange.java b/api/src/com/cloud/dc/StorageNetworkIpRange.java index 8cffa6ea0c6..91d6b20d36f 100755 --- a/api/src/com/cloud/dc/StorageNetworkIpRange.java +++ b/api/src/com/cloud/dc/StorageNetworkIpRange.java @@ -15,5 +15,7 @@ public interface StorageNetworkIpRange { String getZoneUuid(); - String getNetmask(); + String getNetmask(); + + String getGateway(); } diff --git a/api/src/com/cloud/network/IpAddress.java b/api/src/com/cloud/network/IpAddress.java index 7b1d06fd709..e4eefe89d6b 100644 --- a/api/src/com/cloud/network/IpAddress.java +++ b/api/src/com/cloud/network/IpAddress.java @@ -44,6 +44,11 @@ public interface IpAddress extends ControlledEntity { Releasing, // The IP address is being released for other network elements and is not ready for allocation. Free // The IP address is ready to be allocated. } + + enum Purpose { + StaticNat, + Lb + } long getDataCenterId(); diff --git a/client/WEB-INF/classes/resources/messages.properties b/client/WEB-INF/classes/resources/messages.properties index 6d845614eaf..45b46b284b4 100644 --- a/client/WEB-INF/classes/resources/messages.properties +++ b/client/WEB-INF/classes/resources/messages.properties @@ -1,4 +1,13 @@ #new labels (begin) ********************************************************************************************** +state.Stopping=Stopping +message.add.load.balancer.under.ip=The load balancer rule has been added under IP: +message.select.instance=Please select an instance. +label.select=Select +label.select.vm.for.static.nat=Select VM for static NAT +label.select.instance=Select instance +label.nat.port.range=NAT Port Range +label.static.nat.vm.details=Static NAT VM Details +label.edit.lb.rule=Edit LB rule message.migrate.instance.to.host=Please confirm that you want to migrate instance to another host. label.migrate.instance.to.host=Migrate instance to another host message.migrate.instance.to.ps=Please confirm that you want to migrate instance to another primary storage. diff --git a/client/WEB-INF/classes/resources/messages_ja.properties b/client/WEB-INF/classes/resources/messages_ja.properties index cbc12668862..5dfb3db092d 100644 --- a/client/WEB-INF/classes/resources/messages_ja.properties +++ b/client/WEB-INF/classes/resources/messages_ja.properties @@ -1,4 +1,13 @@ #new labels (begin) ********************************************************************************************** +state.Stopping=停止 +message.add.load.balancer.under.ip=ロードバランサのルールは、IPの下に追加されました。 +message.select.instance=インスタンスを選択してください。 +label.select=選択する +label.select.vm.for.static.nat=スタティックNATのためにVMを選択します。 +label.select.instance=インスタンスを選択します。 +label.nat.port.range=NATのポート範囲 +label.static.nat.vm.details=スタティックNAT仮想マシンの詳細 +label.edit.lb.rule=LBルールを編集する message.migrate.instance.to.host=別のホストにインスタンスを移行することを確認してください。 label.migrate.instance.to.host=別のホストにインスタンスを移行する message.migrate.instance.to.ps=別のプライマリ·ストレージにインスタンスを移行することを確認してください。 @@ -431,7 +440,7 @@ message.desc.secondary.storage=Each zone must have at lease one NFS or secondary label.launch.zone=Launch zone message.please.wait.while.zone.is.being.created=Please wait while your zone is being created; this may take a while... -label.load.balancing=Load Balancing +label.load.balancing=ロード·バランシング; label.static.nat.enabled=Static NAT Enabled label.zones=Zones label.view.more=View more diff --git a/client/tomcatconf/commands.properties.in b/client/tomcatconf/commands.properties.in index 3870a512e17..b0d286bd967 100755 --- a/client/tomcatconf/commands.properties.in +++ b/client/tomcatconf/commands.properties.in @@ -324,4 +324,7 @@ deleteStorageNetworkIpRange=com.cloud.api.commands.DeleteStorageNetworkIpRangeCm listStorageNetworkIpRange=com.cloud.api.commands.listStorageNetworkIpRangeCmd;1 updateStorageNetworkIpRange=com.cloud.api.commands.UpdateStorageNetworkIpRangeCmd;1 - +### Network Devices commands +addNetworkDevice=com.cloud.api.commands.AddNetworkDeviceCmd;1 +listNetworkDevice=com.cloud.api.commands.ListNetworkDeviceCmd;1 +deleteNetworkDevice=com.cloud.api.commands.DeleteNetworkDeviceCmd;1 diff --git a/core/src/com/cloud/configuration/ConfigurationVO.java b/core/src/com/cloud/configuration/ConfigurationVO.java index 3ddcbe1e307..2e9cf3d6b41 100644 --- a/core/src/com/cloud/configuration/ConfigurationVO.java +++ b/core/src/com/cloud/configuration/ConfigurationVO.java @@ -91,7 +91,7 @@ public class ConfigurationVO implements Configuration{ } public String getValue() { - return ("Hidden".equals(getCategory()) ? DBEncryptionUtil.decrypt(value) : value); + return (("Hidden".equals(getCategory()) || "Secure".equals(getCategory())) ? DBEncryptionUtil.decrypt(value) : value); } public void setValue(String value) { diff --git a/core/src/com/cloud/storage/resource/NfsSecondaryStorageResource.java b/core/src/com/cloud/storage/resource/NfsSecondaryStorageResource.java index 54f2b0ea654..e320c71481c 100755 --- a/core/src/com/cloud/storage/resource/NfsSecondaryStorageResource.java +++ b/core/src/com/cloud/storage/resource/NfsSecondaryStorageResource.java @@ -122,6 +122,7 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S private String _eth1ip; private String _storageIp; private String _storageNetmask; + private String _storageGateway; final private String _parent = "/mnt/SecStorage"; final private String _tmpltDir = "/var/cloudstack/template"; final private String _tmpltpp = "template.properties"; @@ -597,7 +598,7 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S InetAddress nfsHostAddr = InetAddress.getByName(nfsHost); String nfsHostIp = nfsHostAddr.getHostAddress(); - addRouteToInternalIpOrCidr(_storageIp, _storageIp, _storageNetmask, nfsHostIp); + addRouteToInternalIpOrCidr(_storageGateway, _storageIp, _storageNetmask, nfsHostIp); String nfsPath = nfsHostIp + ":" + uri.getPath(); String dir = UUID.nameUUIDFromBytes(nfsPath.getBytes()).toString(); String root = _parent + "/" + dir; @@ -997,6 +998,7 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S s_logger.warn("Wait, there is no storageip in /proc/cmdline, something wrong!"); } _storageNetmask = (String) params.get("storagenetmask"); + _storageGateway = (String) params.get("storagegateway"); super.configure(name, params); _params = params; diff --git a/docs/2.2/CloudStack2.2.11InstallGuide.docx b/docs/2.2/CloudStack2.2.11InstallGuide.docx index 0c69dc65365..cfbda465102 100644 Binary files a/docs/2.2/CloudStack2.2.11InstallGuide.docx and b/docs/2.2/CloudStack2.2.11InstallGuide.docx differ diff --git a/docs/2.2/CloudStack2.2.12InstallGuide.docx b/docs/2.2/CloudStack2.2.12InstallGuide.docx index 3392490eec3..6286d5439f6 100644 Binary files a/docs/2.2/CloudStack2.2.12InstallGuide.docx and b/docs/2.2/CloudStack2.2.12InstallGuide.docx differ diff --git a/docs/2.2/CloudStack2.2.13InstallGuide.docx b/docs/2.2/CloudStack2.2.13InstallGuide.docx index a799de55d87..ca036e04d88 100644 Binary files a/docs/2.2/CloudStack2.2.13InstallGuide.docx and b/docs/2.2/CloudStack2.2.13InstallGuide.docx differ diff --git a/docs/2.2/CloudStack2.2.4InstallGuide.docx b/docs/2.2/CloudStack2.2.4InstallGuide.docx index f351f96b74a..c9b458f74d5 100644 Binary files a/docs/2.2/CloudStack2.2.4InstallGuide.docx and b/docs/2.2/CloudStack2.2.4InstallGuide.docx differ diff --git a/docs/2.2/CloudStack2.2.8InstallGuide.docx b/docs/2.2/CloudStack2.2.8InstallGuide.docx index 55d2621cb41..d9aea40af96 100644 Binary files a/docs/2.2/CloudStack2.2.8InstallGuide.docx and b/docs/2.2/CloudStack2.2.8InstallGuide.docx differ diff --git a/docs/2.2/CloudStack2.2DeveloperGuide.docx b/docs/2.2/CloudStack2.2DeveloperGuide.docx index 69c05c28837..49685c16fad 100644 Binary files a/docs/2.2/CloudStack2.2DeveloperGuide.docx and b/docs/2.2/CloudStack2.2DeveloperGuide.docx differ diff --git a/docs/3.0/CloudPortal1.3FeaturesList.docx b/docs/3.0/CloudPortal1.3FeaturesList.docx new file mode 100644 index 00000000000..efc85822757 Binary files /dev/null and b/docs/3.0/CloudPortal1.3FeaturesList.docx differ diff --git a/docs/2.2/CloudStack3.0AdminGuide.docx b/docs/3.0/CloudStack3.0AdminGuide.docx similarity index 62% rename from docs/2.2/CloudStack3.0AdminGuide.docx rename to docs/3.0/CloudStack3.0AdminGuide.docx index 7933c41290f..8b86bb76d18 100644 Binary files a/docs/2.2/CloudStack3.0AdminGuide.docx and b/docs/3.0/CloudStack3.0AdminGuide.docx differ diff --git a/docs/3.0/CloudStack3.0AdminGuide_BareMetal.docx b/docs/3.0/CloudStack3.0AdminGuide_BareMetal.docx new file mode 100644 index 00000000000..aa55a17d98b Binary files /dev/null and b/docs/3.0/CloudStack3.0AdminGuide_BareMetal.docx differ diff --git a/docs/3.0/CloudStack3.0FeaturesList.docx b/docs/3.0/CloudStack3.0FeaturesList.docx new file mode 100644 index 00000000000..a0e02ec9b0e Binary files /dev/null and b/docs/3.0/CloudStack3.0FeaturesList.docx differ diff --git a/docs/3.0/CloudStack3.0InstallGuide.docx b/docs/3.0/CloudStack3.0InstallGuide.docx new file mode 100644 index 00000000000..700505c575d Binary files /dev/null and b/docs/3.0/CloudStack3.0InstallGuide.docx differ diff --git a/docs/2.2/CloudStack3.0InstallGuide.docx b/docs/3.0/CloudStack3.0InstallGuide_BareMetal.docx similarity index 61% rename from docs/2.2/CloudStack3.0InstallGuide.docx rename to docs/3.0/CloudStack3.0InstallGuide_BareMetal.docx index 75cbf7bb327..304fdce44ad 100644 Binary files a/docs/2.2/CloudStack3.0InstallGuide.docx and b/docs/3.0/CloudStack3.0InstallGuide_BareMetal.docx differ diff --git a/docs/3.0/CloudStack3.0NewFeatures.docx b/docs/3.0/CloudStack3.0NewFeatures.docx new file mode 100644 index 00000000000..0cafbb7b1c2 Binary files /dev/null and b/docs/3.0/CloudStack3.0NewFeatures.docx differ diff --git a/docs/3.0/CloudStack3.0Overview.docx b/docs/3.0/CloudStack3.0Overview.docx new file mode 100644 index 00000000000..414c6317023 Binary files /dev/null and b/docs/3.0/CloudStack3.0Overview.docx differ diff --git a/docs/2.2/CloudStack3.0QuickInstallGuide.docx b/docs/3.0/CloudStack3.0QuickInstallGuide.docx similarity index 67% rename from docs/2.2/CloudStack3.0QuickInstallGuide.docx rename to docs/3.0/CloudStack3.0QuickInstallGuide.docx index c81a04ab2a8..2cd2d24fbbb 100644 Binary files a/docs/2.2/CloudStack3.0QuickInstallGuide.docx and b/docs/3.0/CloudStack3.0QuickInstallGuide.docx differ diff --git a/docs/3.0/CloudStackAndCloudPortalFeaturesList.docx b/docs/3.0/CloudStackAndCloudPortalFeaturesList.docx new file mode 100644 index 00000000000..1a6657ab32a Binary files /dev/null and b/docs/3.0/CloudStackAndCloudPortalFeaturesList.docx differ diff --git a/server/src/com/cloud/agent/manager/AgentManagerImpl.java b/server/src/com/cloud/agent/manager/AgentManagerImpl.java index 563a42cdbe7..06931c9146b 100755 --- a/server/src/com/cloud/agent/manager/AgentManagerImpl.java +++ b/server/src/com/cloud/agent/manager/AgentManagerImpl.java @@ -823,7 +823,9 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory, Manager { s_logger.debug("Cant not find host " + agent.getId()); } } else { - agentStatusTransitTo(host, Event.ManagementServerDown, _nodeId); + if (!agent.forForward()) { + agentStatusTransitTo(host, Event.ManagementServerDown, _nodeId); + } } } } diff --git a/server/src/com/cloud/api/ApiDBUtils.java b/server/src/com/cloud/api/ApiDBUtils.java index eb7393641f9..308d98a77bf 100755 --- a/server/src/com/cloud/api/ApiDBUtils.java +++ b/server/src/com/cloud/api/ApiDBUtils.java @@ -52,6 +52,7 @@ import com.cloud.host.HostVO; import com.cloud.host.dao.HostDao; import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.network.IPAddressVO; +import com.cloud.network.IpAddress; import com.cloud.network.LoadBalancerVO; import com.cloud.network.Network.Capability; import com.cloud.network.Network.Provider; @@ -730,4 +731,8 @@ public class ApiDBUtils { ServiceOfferingVO serviceOffering = _serviceOfferingDao.findByName("Cloud.Com-SoftwareRouter"); return serviceOffering.getId(); } + + public static IpAddress findIpByAssociatedVmId(long vmId) { + return _ipAddressDao.findByAssociatedVmId(vmId); + } } diff --git a/server/src/com/cloud/api/ApiResponseHelper.java b/server/src/com/cloud/api/ApiResponseHelper.java index 910c09202b8..0049a44cec0 100755 --- a/server/src/com/cloud/api/ApiResponseHelper.java +++ b/server/src/com/cloud/api/ApiResponseHelper.java @@ -759,6 +759,15 @@ public class ApiResponseHelper implements ResponseGenerator { ipResponse.setVlanId(ipAddress.getVlanId()); ipResponse.setVlanName(ApiDBUtils.findVlanById(ipAddress.getVlanId()).getVlanTag()); } + + if (ipAddress.getElastic()) { + if (ipAddress.isOneToOneNat()) { + ipResponse.setPurpose(IpAddress.Purpose.StaticNat.toString()); + } else { + ipResponse.setPurpose(IpAddress.Purpose.Lb.toString()); + } + } + ipResponse.setObjectName("ipaddress"); return ipResponse; } @@ -1239,6 +1248,8 @@ public class ApiResponseHelper implements ResponseGenerator { if (userVm.getDisplayName() != null) { userVmResponse.setDisplayName(userVm.getDisplayName()); + } else { + userVmResponse.setDisplayName(userVm.getHostName()); } if (userVm.getPassword() != null) { @@ -1440,6 +1451,12 @@ public class ApiResponseHelper implements ResponseGenerator { } userVmResponse.setNics(nicResponses); } + + IpAddress ip = ApiDBUtils.findIpByAssociatedVmId(userVm.getId()); + if (ip != null) { + userVmResponse.setPublicIpId(ip.getId()); + userVmResponse.setPublicIp(ip.getAddress().addr()); + } userVmResponse.setObjectName(objectName); vmResponses.add(userVmResponse); @@ -2867,6 +2884,8 @@ public class ApiResponseHelper implements ResponseGenerator { } if (userVm.getDisplayName() != null) { userVmData.setDisplayName(userVm.getDisplayName()); + } else { + userVmData.setDisplayName(userVm.getHostName()); } userVmData.setDomainId(userVm.getDomainId()); @@ -2889,6 +2908,7 @@ public class ApiResponseHelper implements ResponseGenerator { userVmResponse.setHypervisor(userVmData.getHypervisor()); userVmResponse.setId(userVmData.getId()); userVmResponse.setName(userVmData.getName()); + userVmResponse.setDisplayName(userVmData.getDisplayName()); populateAccount(userVmResponse, userVmData.getAccountId()); @@ -2966,6 +2986,8 @@ public class ApiResponseHelper implements ResponseGenerator { nicResponses.add(nr); } userVmResponse.setNics(new ArrayList(nicResponses)); + userVmResponse.setPublicIpId(userVmData.getPublicIpId()); + userVmResponse.setPublicIp(userVmData.getPublicIp()); return userVmResponse; } @@ -3287,7 +3309,8 @@ public class ApiResponseHelper implements ResponseGenerator { response.setZoneUuid(result.getZoneUuid()); response.setNetworkUuid(result.getNetworkUuid()); response.setNetmask(result.getNetmask()); - response.setObjectName("storagenetworkiprange"); + response.setGateway(result.getGateway()); + response.setObjectName("storagenetworkiprange"); return response; } diff --git a/server/src/com/cloud/baremetal/BareMetalResourceBase.java b/server/src/com/cloud/baremetal/BareMetalResourceBase.java index 13f52319e3f..ca1d4411fce 100755 --- a/server/src/com/cloud/baremetal/BareMetalResourceBase.java +++ b/server/src/com/cloud/baremetal/BareMetalResourceBase.java @@ -29,6 +29,8 @@ import org.apache.log4j.Logger; import com.cloud.agent.IAgentControl; import com.cloud.agent.api.Answer; +import com.cloud.agent.api.CheckNetworkAnswer; +import com.cloud.agent.api.CheckNetworkCommand; import com.cloud.agent.api.CheckVirtualMachineAnswer; import com.cloud.agent.api.CheckVirtualMachineCommand; import com.cloud.agent.api.Command; @@ -385,6 +387,10 @@ public class BareMetalResourceBase implements ServerResource { } + protected CheckNetworkAnswer execute(CheckNetworkCommand cmd) { + return new CheckNetworkAnswer(cmd, true, "Success"); + } + @Override public Answer executeRequest(Command cmd) { if (cmd instanceof ReadyCommand) { @@ -407,6 +413,8 @@ public class BareMetalResourceBase implements ServerResource { return execute((CheckVirtualMachineCommand)cmd); } else if (cmd instanceof IpmiBootorResetCommand) { return execute((IpmiBootorResetCommand)cmd); + } else if (cmd instanceof CheckNetworkCommand) { + return execute((CheckNetworkCommand)cmd); } else { return Answer.createUnsupportedCommandAnswer(cmd); } diff --git a/server/src/com/cloud/configuration/Config.java b/server/src/com/cloud/configuration/Config.java index e9190a41931..6a071bb4790 100755 --- a/server/src/com/cloud/configuration/Config.java +++ b/server/src/com/cloud/configuration/Config.java @@ -43,7 +43,7 @@ public enum Config { AlertEmailAddresses("Alert", ManagementServer.class, String.class, "alert.email.addresses", null, "Comma separated list of email addresses used for sending alerts.", null), AlertEmailSender("Alert", ManagementServer.class, String.class, "alert.email.sender", null, "Sender of alert email (will be in the From header of the email).", null), AlertSMTPHost("Alert", ManagementServer.class, String.class, "alert.smtp.host", null, "SMTP hostname used for sending out email alerts.", null), - AlertSMTPPassword("Alert", ManagementServer.class, String.class, "alert.smtp.password", null, "Password for SMTP authentication (applies only if alert.smtp.useAuth is true).", null), + AlertSMTPPassword("Secure", ManagementServer.class, String.class, "alert.smtp.password", null, "Password for SMTP authentication (applies only if alert.smtp.useAuth is true).", null), AlertSMTPPort("Alert", ManagementServer.class, Integer.class, "alert.smtp.port", "465", "Port the SMTP server is listening on.", null), AlertSMTPUseAuth("Alert", ManagementServer.class, String.class, "alert.smtp.useAuth", null, "If true, use SMTP authentication when sending emails.", null), AlertSMTPUsername("Alert", ManagementServer.class, String.class, "alert.smtp.username", null, "Username for SMTP authentication (applies only if alert.smtp.useAuth is true).", null), @@ -84,7 +84,7 @@ public enum Config { // Network NetworkLBHaproxyStatsVisbility("Network", ManagementServer.class, String.class, "network.loadbalancer.haproxy.stats.visibility", "global", "Load Balancer(haproxy) stats visibilty, the value can be one of the following six parameters : global,guest-network,link-local,disabled,all,default", null), NetworkLBHaproxyStatsUri("Network", ManagementServer.class, String.class, "network.loadbalancer.haproxy.stats.uri","/admin?stats","Load Balancer(haproxy) uri.",null), - NetworkLBHaproxyStatsAuth("Network", ManagementServer.class, String.class, "network.loadbalancer.haproxy.stats.auth","admin1:AdMiN123","Load Balancer(haproxy) authetication string in the format username:password",null), + NetworkLBHaproxyStatsAuth("Secure", ManagementServer.class, String.class, "network.loadbalancer.haproxy.stats.auth","admin1:AdMiN123","Load Balancer(haproxy) authetication string in the format username:password",null), NetworkLBHaproxyStatsPort("Network", ManagementServer.class, String.class, "network.loadbalancer.haproxy.stats.port","8081","Load Balancer(haproxy) stats port number.",null), NetworkRouterRpFilter("Network", ManagementServer.class, Integer.class, "network.disable.rpfilter", "true", "disable rp_filter on Domain Router VM public interfaces.", null), @@ -327,7 +327,7 @@ public enum Config { ProjectEmailSender("Project Defaults", ManagementServer.class, String.class, "project.email.sender", null, "Sender of project invitation email (will be in the From header of the email)", null), ProjectSMTPHost("Project Defaults", ManagementServer.class, String.class, "project.smtp.host", null, "SMTP hostname used for sending out email project invitations", null), - ProjectSMTPPassword("Project Defaults", ManagementServer.class, String.class, "project.smtp.password", null, "Password for SMTP authentication (applies only if project.smtp.useAuth is true)", null), + ProjectSMTPPassword("Secure", ManagementServer.class, String.class, "project.smtp.password", null, "Password for SMTP authentication (applies only if project.smtp.useAuth is true)", null), ProjectSMTPPort("Project Defaults", ManagementServer.class, Integer.class, "project.smtp.port", "465", "Port the SMTP server is listening on", null), ProjectSMTPUseAuth("Project Defaults", ManagementServer.class, String.class, "project.smtp.useAuth", null, "If true, use SMTP authentication when sending emails", null), ProjectSMTPUsername("Project Defaults", ManagementServer.class, String.class, "project.smtp.username", null, "Username for SMTP authentication (applies only if project.smtp.useAuth is true)", null), @@ -360,6 +360,7 @@ public enum Config { _configs.put("Hidden", new ArrayList()); _configs.put("Account Defaults", new ArrayList()); _configs.put("Project Defaults", new ArrayList()); + _configs.put("Secure", new ArrayList()); // Add values into HashMap for (Config c : Config.values()) { diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java index 923d7846b6f..6468a7bebf7 100755 --- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java @@ -3561,6 +3561,13 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura if (offering.isDefault() == true) { throw new InvalidParameterValueException("Default network offering can't be deleted"); } + + //don't allow to delete network offering if it's in use by existing networks (the offering can be disabled though) + int networkCount = _networkDao.getNetworkCountByNetworkOffId(offeringId); + if (networkCount > 0) { + throw new InvalidParameterValueException("Can't delete network offering " + offeringId + " as its used by " + networkCount + " networks. " + + "To make the network offering unavaiable, disable it"); + } if (_networkOfferingDao.remove(offeringId)) { return true; diff --git a/server/src/com/cloud/configuration/dao/ConfigurationDaoImpl.java b/server/src/com/cloud/configuration/dao/ConfigurationDaoImpl.java index 88b615eddda..68ce1f39bd2 100644 --- a/server/src/com/cloud/configuration/dao/ConfigurationDaoImpl.java +++ b/server/src/com/cloud/configuration/dao/ConfigurationDaoImpl.java @@ -142,7 +142,7 @@ public class ConfigurationDaoImpl extends GenericDaoBase 0) { hostTag = tags[0]; } diff --git a/server/src/com/cloud/hypervisor/kvm/discoverer/KvmServerDiscoverer.java b/server/src/com/cloud/hypervisor/kvm/discoverer/KvmServerDiscoverer.java index a19f821e005..bbf5dd5e2fa 100755 --- a/server/src/com/cloud/hypervisor/kvm/discoverer/KvmServerDiscoverer.java +++ b/server/src/com/cloud/hypervisor/kvm/discoverer/KvmServerDiscoverer.java @@ -183,25 +183,21 @@ public class KvmServerDiscoverer extends DiscovererBase implements Discoverer, List networks = _networkMgr.getPhysicalNetworkInfo(dcId, HypervisorType.KVM); if (networks.size() < 1) { - _kvmPublicNic = "cloudbr0"; - _kvmPrivateNic = "cloudbr0"; - _kvmGuestNic = "cloudbr0"; - s_logger.debug("Can't find physical network devices on zone: " + dcId + ", use the default cloudbr0"); + s_logger.debug("Can't find physical network devices on zone: " + dcId + ", use the default from kvm.{private|public|guest}.devices"); } else { PhysicalNetworkSetupInfo network = networks.get(0); - _kvmPublicNic = network.getPublicNetworkName(); - if (_kvmPublicNic == null) { - _kvmPublicNic = "cloudbr0"; + String pubNetName = network.getPublicNetworkName(); + if (pubNetName != null) { + _kvmPublicNic = pubNetName; } - _kvmPrivateNic = network.getPrivateNetworkName(); - if (_kvmPrivateNic == null) { - _kvmPrivateNic = _kvmPublicNic; + String prvNetName = network.getPrivateNetworkName(); + if (prvNetName != null) { + _kvmPrivateNic = prvNetName; } - _kvmGuestNic = network.getGuestNetworkName(); - if (_kvmGuestNic == null) { - _kvmGuestNic = _kvmPrivateNic; + String guestNetName = network.getGuestNetworkName(); + if (guestNetName != null) { + _kvmGuestNic = guestNetName; } - } String parameters = " -m " + _hostIp + " -z " + dcId + " -p " + podId + " -c " + clusterId + " -g " + guid + " -a"; diff --git a/server/src/com/cloud/network/ExternalFirewallDeviceManagerImpl.java b/server/src/com/cloud/network/ExternalFirewallDeviceManagerImpl.java index 900ff1665e5..4b6a0d09bf6 100644 --- a/server/src/com/cloud/network/ExternalFirewallDeviceManagerImpl.java +++ b/server/src/com/cloud/network/ExternalFirewallDeviceManagerImpl.java @@ -138,11 +138,13 @@ public abstract class ExternalFirewallDeviceManagerImpl extends AdapterBase impl @Inject HostDetailsDao _hostDetailDao; private static final org.apache.log4j.Logger s_logger = Logger.getLogger(ExternalFirewallDeviceManagerImpl.class); + private long _defaultFwCapacity; @Override public boolean configure(String name, Map params) throws ConfigurationException { super.configure(name, params); _resourceMgr.registerResourceStateAdapter(this.getClass().getSimpleName(), this); + _defaultFwCapacity = NumbersUtil.parseLong(_configDao.getValue(Config.DefaultExternalFirewallCapacity.key()), 50); return true; } @@ -211,6 +213,9 @@ public abstract class ExternalFirewallDeviceManagerImpl extends AdapterBase impl boolean dedicatedUse = (configParams.get(ApiConstants.FIREWALL_DEVICE_DEDICATED) != null) ? Boolean.parseBoolean(configParams.get(ApiConstants.FIREWALL_DEVICE_DEDICATED)) : false; long capacity = NumbersUtil.parseLong((String)configParams.get(ApiConstants.FIREWALL_DEVICE_CAPACITY), 0); + if (capacity == 0) { + capacity = _defaultFwCapacity; + } ExternalFirewallDeviceVO fwDevice = new ExternalFirewallDeviceVO(externalFirewall.getId(), pNetwork.getId(), ntwkSvcProvider.getProviderName(), deviceName, capacity, dedicatedUse); @@ -298,6 +303,9 @@ public abstract class ExternalFirewallDeviceManagerImpl extends AdapterBase impl for (ExternalFirewallDeviceVO fwDevice: fwDevices) { // max number of guest networks that can be mapped to this device long fullCapacity = fwDevice.getCapacity(); + if (fullCapacity == 0) { + fullCapacity = _defaultFwCapacity; // if capacity not configured then use the default + } // get the list of guest networks that are mapped to this load balancer List mappedNetworks = _networkExternalFirewallDao.listByFirewallDeviceId(fwDevice.getId()); @@ -308,7 +316,7 @@ public abstract class ExternalFirewallDeviceManagerImpl extends AdapterBase impl } } throw new InsufficientNetworkCapacityException("Unable to find a firewall provider with sufficient capcity " + - " to implement the network", Network.class, network.getId()); + " to implement the network", DataCenter.class, network.getDataCenterId()); } public String getExternalNetworkResourceGuid(long physicalNetworkId, String deviceName, String ip) { @@ -363,6 +371,11 @@ public abstract class ExternalFirewallDeviceManagerImpl extends AdapterBase impl } } else { ExternalFirewallDeviceVO fwDeviceVO = getExternalFirewallForNetwork(network); + if (fwDeviceVO == null) { + s_logger.warn("Network shutdown requested on external firewall element, which did not implement the network." + + " Either network implement failed half way through or already network shutdown is completed."); + return true; + } externalFirewall = _hostDao.findById(fwDeviceVO.getHostId()); } diff --git a/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java b/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java index 499b8db5579..86822b781c2 100644 --- a/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java +++ b/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java @@ -257,6 +257,9 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase boolean dedicatedUse = (configParams.get(ApiConstants.LOAD_BALANCER_DEVICE_DEDICATED) != null) ? Boolean.parseBoolean(configParams.get(ApiConstants.LOAD_BALANCER_DEVICE_DEDICATED)) : false; boolean inline = (configParams.get(ApiConstants.INLINE) != null) ? Boolean.parseBoolean(configParams.get(ApiConstants.INLINE)) : false; long capacity = NumbersUtil.parseLong((String) configParams.get(ApiConstants.LOAD_BALANCER_DEVICE_CAPACITY), 0); + if (capacity == 0) { + capacity = _defaultLbCapacity; + } txn.start(); ExternalLoadBalancerDeviceVO lbDeviceVO = new ExternalLoadBalancerDeviceVO(host.getId(), pNetwork.getId(), ntwkSvcProvider.getProviderName(), diff --git a/server/src/com/cloud/network/ExternalNetworkDeviceManagerImpl.java b/server/src/com/cloud/network/ExternalNetworkDeviceManagerImpl.java old mode 100644 new mode 100755 index ca561dacbb7..c895825b800 --- a/server/src/com/cloud/network/ExternalNetworkDeviceManagerImpl.java +++ b/server/src/com/cloud/network/ExternalNetworkDeviceManagerImpl.java @@ -33,6 +33,7 @@ import org.apache.log4j.Logger; import com.cloud.agent.AgentManager; import com.cloud.api.ApiConstants; +import com.cloud.api.IdentityService; import com.cloud.api.PlugService; import com.cloud.api.commands.AddNetworkDeviceCmd; import com.cloud.api.commands.DeleteNetworkDeviceCmd; @@ -69,12 +70,14 @@ import com.cloud.network.resource.NetscalerResource; import com.cloud.network.rules.dao.PortForwardingRulesDao; import com.cloud.offerings.dao.NetworkOfferingDao; import com.cloud.resource.ServerResource; +import com.cloud.server.ManagementServer; import com.cloud.server.api.response.NetworkDeviceResponse; import com.cloud.server.api.response.NwDeviceDhcpResponse; import com.cloud.server.api.response.PxePingResponse; import com.cloud.user.AccountManager; import com.cloud.user.dao.AccountDao; import com.cloud.user.dao.UserStatisticsDao; +import com.cloud.utils.component.ComponentLocator; import com.cloud.utils.component.Inject; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.vm.dao.DomainRouterDao; @@ -116,6 +119,7 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa ScheduledExecutorService _executor; int _externalNetworkStatsInterval; + private final static IdentityService _identityService = (IdentityService)ComponentLocator.getLocator(ManagementServer.Name).getManager(IdentityService.class); private static final org.apache.log4j.Logger s_logger = Logger.getLogger(ExternalNetworkDeviceManagerImpl.class); protected String _name; @@ -151,8 +155,10 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa Collection paramsCollection = paramList.values(); HashMap params = (HashMap) (paramsCollection.toArray())[0]; if (cmd.getDeviceType().equalsIgnoreCase(NetworkDevice.ExternalDhcp.getName())) { - Long zoneId = Long.parseLong((String) params.get(ApiConstants.ZONE_ID)); - Long podId = Long.parseLong((String)params.get(ApiConstants.POD_ID)); + //Long zoneId = _identityService.getIdentityId("data_center", (String) params.get(ApiConstants.ZONE_ID)); + //Long podId = _identityService.getIdentityId("host_pod_ref", (String)params.get(ApiConstants.POD_ID)); + Long zoneId = Long.valueOf((String) params.get(ApiConstants.ZONE_ID)); + Long podId = Long.valueOf((String)params.get(ApiConstants.POD_ID)); String type = (String) params.get(ApiConstants.DHCP_SERVER_TYPE); String url = (String) params.get(ApiConstants.URL); String username = (String) params.get(ApiConstants.USERNAME); @@ -162,6 +168,8 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa } else if (cmd.getDeviceType().equalsIgnoreCase(NetworkDevice.PxeServer.getName())) { Long zoneId = Long.parseLong((String) params.get(ApiConstants.ZONE_ID)); Long podId = Long.parseLong((String)params.get(ApiConstants.POD_ID)); + //Long zoneId = _identityService.getIdentityId("data_center", (String) params.get(ApiConstants.ZONE_ID)); + //Long podId = _identityService.getIdentityId("host_pod_ref", (String)params.get(ApiConstants.POD_ID)); String type = (String) params.get(ApiConstants.PXE_SERVER_TYPE); String url = (String) params.get(ApiConstants.URL); String username = (String) params.get(ApiConstants.USERNAME); diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java old mode 100644 new mode 100755 index 1baa2c79196..7c962c4ca67 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -1738,7 +1738,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag DeployDestination dest, ReservationContext context) throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException { element.prepare(network, profile, vmProfile, dest, context); - if (vmProfile.getType() == Type.User && element.getProvider() != null) { + if (vmProfile.getType() == Type.User && vmProfile.getHypervisorType() != HypervisorType.BareMetal && element.getProvider() != null) { if (areServicesSupportedInNetwork(network.getId(), Service.Dhcp) && isProviderSupportServiceInNetwork(network.getId(), Service.Dhcp, element.getProvider()) && (element instanceof DhcpServiceProvider)) { diff --git a/server/src/com/cloud/network/StorageNetworkManagerImpl.java b/server/src/com/cloud/network/StorageNetworkManagerImpl.java index 7cb2f50e1fa..b8cdaff84ca 100755 --- a/server/src/com/cloud/network/StorageNetworkManagerImpl.java +++ b/server/src/com/cloud/network/StorageNetworkManagerImpl.java @@ -227,7 +227,7 @@ public class StorageNetworkManagerImpl implements StorageNetworkManager, Storage StorageNetworkIpRangeVO range = null; txn.start(); - range = new StorageNetworkIpRangeVO(zoneId, podId, nw.getId(), startIp, endIp, vlan, netmask); + range = new StorageNetworkIpRangeVO(zoneId, podId, nw.getId(), startIp, endIp, vlan, netmask, cmd.getGateWay()); _sNwIpRangeDao.persist(range); try { createStorageIpEntires(txn, range.getId(), startIp, endIp, zoneId); diff --git a/server/src/com/cloud/network/dao/NetworkDao.java b/server/src/com/cloud/network/dao/NetworkDao.java index 9990d350a83..561b48c8d54 100644 --- a/server/src/com/cloud/network/dao/NetworkDao.java +++ b/server/src/com/cloud/network/dao/NetworkDao.java @@ -93,5 +93,7 @@ public interface NetworkDao extends GenericDao { List listByZoneAndTrafficType(long zoneId, TrafficType trafficType); void setCheckForGc(long networkId); + + int getNetworkCountByNetworkOffId(long networkOfferingId); } diff --git a/server/src/com/cloud/network/dao/NetworkDaoImpl.java b/server/src/com/cloud/network/dao/NetworkDaoImpl.java index fac6128d7c8..080307bcb4b 100644 --- a/server/src/com/cloud/network/dao/NetworkDaoImpl.java +++ b/server/src/com/cloud/network/dao/NetworkDaoImpl.java @@ -60,13 +60,16 @@ public class NetworkDaoImpl extends GenericDaoBase implements N final SearchBuilder ZoneSecurityGroupSearch; final GenericSearchBuilder CountByOfferingId; final SearchBuilder PhysicalNetworkSearch; - final SearchBuilder securityGroupSearch; + final SearchBuilder SecurityGroupSearch; + private final GenericSearchBuilder NetworksCount; + NetworkAccountDaoImpl _accountsDao = ComponentLocator.inject(NetworkAccountDaoImpl.class); NetworkDomainDaoImpl _domainsDao = ComponentLocator.inject(NetworkDomainDaoImpl.class); NetworkOpDaoImpl _opDao = ComponentLocator.inject(NetworkOpDaoImpl.class); NetworkServiceMapDaoImpl _ntwkSvcMap = ComponentLocator.inject(NetworkServiceMapDaoImpl.class); + final TableGenerator _tgMacAddress; Random _rand = new Random(System.currentTimeMillis()); long _prefix = 0x2; @@ -132,11 +135,16 @@ public class NetworkDaoImpl extends GenericDaoBase implements N PhysicalNetworkSearch.and("physicalNetworkId", PhysicalNetworkSearch.entity().getPhysicalNetworkId(), Op.EQ); PhysicalNetworkSearch.done(); - securityGroupSearch = createSearchBuilder(); + SecurityGroupSearch = createSearchBuilder(); SearchBuilder join3 = _ntwkSvcMap.createSearchBuilder(); join3.and("service", join3.entity().getService(), Op.EQ); - securityGroupSearch.join("services", join3, securityGroupSearch.entity().getId(), join3.entity().getNetworkId(), JoinBuilder.JoinType.INNER); - securityGroupSearch.done(); + SecurityGroupSearch.join("services", join3, SecurityGroupSearch.entity().getId(), join3.entity().getNetworkId(), JoinBuilder.JoinType.INNER); + SecurityGroupSearch.done(); + + NetworksCount = createSearchBuilder(Integer.class); + NetworksCount.select(null, Func.COUNT, NetworksCount.entity().getId()); + NetworksCount.and("networkOfferingId", NetworksCount.entity().getNetworkOfferingId(), SearchCriteria.Op.EQ); + NetworksCount.done(); _tgMacAddress = _tgs.get("macAddress"); @@ -344,7 +352,7 @@ public class NetworkDaoImpl extends GenericDaoBase implements N @Override public List listSecurityGroupEnabledNetworks() { - SearchCriteria sc = securityGroupSearch.create(); + SearchCriteria sc = SecurityGroupSearch.create(); sc.setJoinParameters("services", "service", Service.SecurityGroup.getName()); return listBy(sc); } @@ -400,5 +408,13 @@ public class NetworkDaoImpl extends GenericDaoBase implements N return listBy(sc, null); } + + @Override + public int getNetworkCountByNetworkOffId(long networkOfferingId) { + SearchCriteria sc = NetworksCount.create(); + sc.setParameters("networkOfferingId", networkOfferingId); + List count = customSearch(sc, null); + return count.get(0); + } } diff --git a/server/src/com/cloud/network/dao/PhysicalNetworkTrafficTypeDaoImpl.java b/server/src/com/cloud/network/dao/PhysicalNetworkTrafficTypeDaoImpl.java index 9da2e5c3434..f6e27a45892 100755 --- a/server/src/com/cloud/network/dao/PhysicalNetworkTrafficTypeDaoImpl.java +++ b/server/src/com/cloud/network/dao/PhysicalNetworkTrafficTypeDaoImpl.java @@ -109,6 +109,8 @@ public class PhysicalNetworkTrafficTypeDaoImpl extends GenericDaoBase> setCapabilities() { // No external dhcp support for Acton release Map> capabilities = new HashMap>(); -// capabilities.put(Service.Dhcp, null); + //capabilities.put(Service.Dhcp, null); return capabilities; } diff --git a/server/src/com/cloud/network/element/JuniperSRXExternalFirewallElement.java b/server/src/com/cloud/network/element/JuniperSRXExternalFirewallElement.java index 77f7f41f4dc..37f07d72b26 100644 --- a/server/src/com/cloud/network/element/JuniperSRXExternalFirewallElement.java +++ b/server/src/com/cloud/network/element/JuniperSRXExternalFirewallElement.java @@ -167,7 +167,8 @@ public class JuniperSRXExternalFirewallElement extends ExternalFirewallDeviceMan return manageGuestNetworkWithExternalFirewall(true, network); } catch (InsufficientCapacityException capacityException) { // TODO: handle out of capacity exception in more gracefule manner when multiple providers are present for -// the network + // the network + s_logger.error("Fail to implement the JuniperSRX for network " + network, capacityException); return false; } } @@ -422,7 +423,7 @@ public class JuniperSRXExternalFirewallElement extends ExternalFirewallDeviceMan if (fwDeviceVO == null || !fwDeviceVO.getDeviceName().equalsIgnoreCase(NetworkDevice.JuniperSRXFirewall.getName())) { throw new InvalidParameterValueException("No SRX firewall device found with ID: " + fwDeviceId); } - return deleteExternalFirewall(fwDeviceId); + return deleteExternalFirewall(fwDeviceVO.getHostId()); } @Override diff --git a/server/src/com/cloud/network/element/VirtualRouterElement.java b/server/src/com/cloud/network/element/VirtualRouterElement.java old mode 100644 new mode 100755 index d6f1fb5b14f..c84b4e20a90 --- a/server/src/com/cloud/network/element/VirtualRouterElement.java +++ b/server/src/com/cloud/network/element/VirtualRouterElement.java @@ -38,6 +38,7 @@ import com.cloud.exception.InsufficientCapacityException; import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.ResourceUnavailableException; import com.cloud.host.dao.HostDao; +import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.network.Network; import com.cloud.network.Network.Capability; import com.cloud.network.Network.Provider; @@ -169,7 +170,7 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl @Override public boolean prepare(Network network, NicProfile nic, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context) throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException { - if (vm.getType() != VirtualMachine.Type.User) { + if (vm.getType() != VirtualMachine.Type.User || vm.getHypervisorType() == HypervisorType.BareMetal) { return false; } diff --git a/server/src/com/cloud/network/guru/StorageNetworkGuru.java b/server/src/com/cloud/network/guru/StorageNetworkGuru.java index ad58018853d..197abe4a90a 100755 --- a/server/src/com/cloud/network/guru/StorageNetworkGuru.java +++ b/server/src/com/cloud/network/guru/StorageNetworkGuru.java @@ -119,7 +119,8 @@ public class StorageNetworkGuru extends PodBasedNetworkGuru implements NetworkGu nic.setMacAddress(NetUtils.long2Mac(NetUtils.createSequenceBasedMacAddress(ip.getMac()))); nic.setFormat(AddressFormat.Ip4); nic.setNetmask(ip.getNetmask()); - nic.setBroadcastType(BroadcastDomainType.Storage); + nic.setBroadcastType(BroadcastDomainType.Storage); + nic.setGateway(ip.getGateway()); if (vlan != null) { nic.setBroadcastUri(BroadcastDomainType.Storage.toUri(vlan)); } else { diff --git a/server/src/com/cloud/server/ConfigurationServerImpl.java b/server/src/com/cloud/server/ConfigurationServerImpl.java index 42a23b81dea..43126b036cc 100755 --- a/server/src/com/cloud/server/ConfigurationServerImpl.java +++ b/server/src/com/cloud/server/ConfigurationServerImpl.java @@ -179,7 +179,7 @@ public class ConfigurationServerImpl implements ConfigurationServer { String instance = "DEFAULT"; String component = c.getComponent(); String value = c.getDefaultValue(); - value = ("Hidden".equals(category)) ? DBEncryptionUtil.encrypt(value) : value; + value = ("Hidden".equals(category) || "Secure".equals(category)) ? DBEncryptionUtil.encrypt(value) : value; String description = c.getDescription(); ConfigurationVO configVO = new ConfigurationVO(category, instance, component, name, value, description); _configDao.persist(configVO); diff --git a/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java b/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java index 76e0c2ee533..c933309aef3 100755 --- a/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java +++ b/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java @@ -1090,6 +1090,7 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V } else if (nic.getTrafficType() == TrafficType.Storage) { buf.append(" storageip=").append(nic.getIp4Address()); buf.append(" storagenetmask=").append(nic.getNetmask()); + buf.append(" storagegateway=").append(nic.getGateway()); } } diff --git a/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java b/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java index 0ffec94516a..f4c9d1f8ff3 100755 --- a/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java +++ b/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java @@ -668,8 +668,6 @@ public class SnapshotManagerImpl implements SnapshotManager, SnapshotService, Ma } else { s_logger.warn("Failed to back up snapshot on secondary storage, deleting the record from the DB"); _snapshotDao.remove(snapshotId); - UsageEventVO usageEvent = new UsageEventVO(EventTypes.EVENT_SNAPSHOT_DELETE, snapshot.getAccountId(), snapshot.getDataCenterId(), snapshotId, snapshot.getName(), null, null, 0L); - _usageEventDao.persist(usageEvent); } txn.commit(); @@ -741,7 +739,7 @@ public class SnapshotManagerImpl implements SnapshotManager, SnapshotService, Ma Account caller = UserContext.current().getCaller(); // Verify parameters - Snapshot snapshotCheck = _snapshotDao.findByIdIncludingRemoved(snapshotId); + Snapshot snapshotCheck = _snapshotDao.findById(snapshotId); if (snapshotCheck == null) { throw new InvalidParameterValueException("unable to find a snapshot with id " + snapshotId); } diff --git a/server/src/com/cloud/upgrade/dao/Upgrade2214to30.java b/server/src/com/cloud/upgrade/dao/Upgrade2214to30.java index 8eea2304c6c..da6d0acbeb3 100644 --- a/server/src/com/cloud/upgrade/dao/Upgrade2214to30.java +++ b/server/src/com/cloud/upgrade/dao/Upgrade2214to30.java @@ -354,7 +354,7 @@ public class Upgrade2214to30 implements DbUpgrade { PreparedStatement pstmt = null; ResultSet rs = null; try { - pstmt = conn.prepareStatement("select name, value from configuration where category = 'Hidden'"); + pstmt = conn.prepareStatement("select name, value from configuration where category in ('Hidden', 'Secure')"); rs = pstmt.executeQuery(); while (rs.next()) { String name = rs.getString(1); diff --git a/server/src/com/cloud/vm/dao/UserVmDaoImpl.java b/server/src/com/cloud/vm/dao/UserVmDaoImpl.java index 9ad01476452..a9a82753ae7 100755 --- a/server/src/com/cloud/vm/dao/UserVmDaoImpl.java +++ b/server/src/com/cloud/vm/dao/UserVmDaoImpl.java @@ -81,7 +81,7 @@ public class UserVmDaoImpl extends GenericDaoBase implements Use "vm_template.enable_password, service_offering.id, disk_offering.name, storage_pool.id, storage_pool.pool_type, " + "service_offering.cpu, service_offering.speed, service_offering.ram_size, volumes.id, volumes.device_id, volumes.volume_type, security_group.id, security_group.name, " + "security_group.description, nics.id, nics.ip4_address, nics.default_nic, nics.gateway, nics.network_id, nics.netmask, nics.mac_address, nics.broadcast_uri, nics.isolation_uri, " + - "networks.traffic_type, networks.guest_type from vm_instance " + + "networks.traffic_type, networks.guest_type, user_ip_address.id, user_ip_address.public_ip_address from vm_instance " + "left join account on vm_instance.account_id=account.id " + "left join domain on vm_instance.domain_id=domain.id " + "left join instance_group_vm_map on vm_instance.id=instance_group_vm_map.instance_id " + @@ -99,6 +99,7 @@ public class UserVmDaoImpl extends GenericDaoBase implements Use "left join security_group on security_group_vm_map.security_group_id=security_group.id " + "left join nics on vm_instance.id=nics.instance_id " + "left join networks on nics.network_id=networks.id " + + "left join user_ip_address on user_ip_address.vm_id=vm_instance.id " + "where vm_instance.id in ("; private static final int VM_DETAILS_BATCH_SIZE=100; @@ -516,6 +517,13 @@ public class UserVmDaoImpl extends GenericDaoBase implements Use nicResponse.setObjectName("nic"); userVmData.addNic(nicResponse); } + + long publicIpId = rs.getLong("user_ip_address.id"); + if (publicIpId > 0){ + userVmData.setPublicIpId(publicIpId); + userVmData.setPublicIp(rs.getString("user_ip_address.public_ip_address")); + } + return userVmData; } diff --git a/server/src/com/cloud/vm/dao/UserVmData.java b/server/src/com/cloud/vm/dao/UserVmData.java index 4cb014bd67f..e07beae0bec 100644 --- a/server/src/com/cloud/vm/dao/UserVmData.java +++ b/server/src/com/cloud/vm/dao/UserVmData.java @@ -68,6 +68,8 @@ public class UserVmData { private Set nics; private String hypervisor; private long accountId; + private Long publicIpId; + private String publicIp; private boolean initialized; @@ -684,10 +686,21 @@ public class UserVmData { public void setAccountId(long accountId) { this.accountId = accountId; } - - - - - + + public Long getPublicIpId() { + return publicIpId; + } + + public void setPublicIpId(Long publicIpId) { + this.publicIpId = publicIpId; + } + + public String getPublicIp() { + return publicIp; + } + + public void setPublicIp(String publicIp) { + this.publicIp = publicIp; + } } diff --git a/setup/db/create-schema.sql b/setup/db/create-schema.sql index ed39d73b994..44cb8ca3f11 100755 --- a/setup/db/create-schema.sql +++ b/setup/db/create-schema.sql @@ -586,6 +586,7 @@ CREATE TABLE `cloud`.`dc_storage_network_ip_range` ( `uuid` varchar(40), `start_ip` char(40) NOT NULL COMMENT 'start ip address', `end_ip` char(40) NOT NULL COMMENT 'end ip address', + `gateway` varchar(15) NOT NULL COMMENT 'gateway ip address', `vlan` int unsigned DEFAULT NULL COMMENT 'vlan the storage network on', `netmask` varchar(15) NOT NULL COMMENT 'netmask for storage network', `data_center_id` bigint unsigned NOT NULL, diff --git a/setup/db/db/schema-2214to30.sql b/setup/db/db/schema-2214to30.sql index a49bfd586ec..d276bedb941 100755 --- a/setup/db/db/schema-2214to30.sql +++ b/setup/db/db/schema-2214to30.sql @@ -647,6 +647,7 @@ UPDATE `cloud`.`configuration` SET category = 'Hidden' WHERE name = 'kvm.private UPDATE `cloud`.`configuration` SET category = 'Hidden' WHERE name = 'kvm.guest.network.device'; ALTER TABLE `cloud`.`physical_network_traffic_types` ADD COLUMN `ovm_network_label` varchar(255) COMMENT 'The network name label of the physical device dedicated to this traffic on a Ovm host'; +ALTER TABLE `cloud`.`dc_storage_network_ip_range` ADD COLUMN `gateway` varchar(15) NOT NULL COMMENT 'gateway ip address'; CREATE TABLE `cloud_usage`.`usage_security_group` ( `zone_id` bigint unsigned NOT NULL, diff --git a/tools/testClient/deployDataCenter.py b/tools/testClient/deployDataCenter.py index 3b94f5bc3dd..eaa25d11eaf 100644 --- a/tools/testClient/deployDataCenter.py +++ b/tools/testClient/deployDataCenter.py @@ -163,12 +163,12 @@ class deployDataCenters(): def configureProviders(self, phynetwrk, zone): pnetprov = listNetworkServiceProviders.listNetworkServiceProvidersCmd() pnetprov.physicalnetworkid = phynetwrk.id - pnetprov.state = "Enabled" + pnetprov.state = "Disabled" pnetprov.name = "VirtualRouter" - vrprov = self.apiClient.listNetworkServiceProviders(pnetprov) + pnetprovres = self.apiClient.listNetworkServiceProviders(pnetprov) vrprov = listVirtualRouterElements.listVirtualRouterElementsCmd() - vrprov.nspid = vrprov.id + vrprov.nspid = pnetprovres[0].id vrprovresponse = self.apiClient.listVirtualRouterElements(vrprov) vrprovid = vrprovresponse[0].id @@ -179,7 +179,7 @@ class deployDataCenters(): vrconfigresponse = \ self.apiClient.configureVirtualRouterElement(vrconfig) - if zone.securitygroupenabled: + if zone.networktype == "Basic" and zone.securitygroupenabled: sgprovider = configGenerator.provider() sgprovider.name = "SecurityGroupProvider" zone.providers.append(sgprovider) @@ -209,7 +209,13 @@ class deployDataCenters(): traffic_type = addTrafficType.addTrafficTypeCmd() traffic_type.physicalnetworkid = physical_network_id traffic_type.traffictype = traffictype - self.apiClient.addTrafficType(traffic_type) + return self.apiClient.addTrafficType(traffic_type) + + def enableZone(self, zoneid, allocation_state="Enabled"): + zoneCmd = updateZone.updateZoneCmd() + zoneCmd.zoneid = zoneid + zoneCmd.allocationstate = allocation_state + return self.apiClient.updateZone(zoneCmd) def createZones(self, zones): for zone in zones: @@ -263,6 +269,7 @@ class deployDataCenters(): zoneId) self.createSecondaryStorages(zone.secondaryStorages, zoneId) + return self.enableZone(zoneId, "Enabled") def registerApiKey(self): listuser = listUsers.listUsersCmd() diff --git a/ui/css/cloudstack3.css b/ui/css/cloudstack3.css index 515552e069a..c6cfc47e524 100644 --- a/ui/css/cloudstack3.css +++ b/ui/css/cloudstack3.css @@ -236,6 +236,27 @@ body.login { box-shadow: 0px 3px 5px #D5D5D5; } +.login .select-language { + margin-top: 10px; + float: left; +} + +.login .select-language select { + width: 125px; + border: 1px solid #808080; + /*+border-radius:4px;*/ + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + -khtml-border-radius: 4px; + border-radius: 4px 4px 4px 4px; + font-size: 12px; + /*+box-shadow:inset 0px 1px 1px #838383;*/ + -moz-box-shadow: inset 0px 1px 1px #838383; + -webkit-box-shadow: inset 0px 1px 1px #838383; + -o-box-shadow: inset 0px 1px 1px #838383; + box-shadow: inset 0px 1px 1px #838383; +} + .login .fields { width: 409px; float: left; @@ -4471,6 +4492,12 @@ label.error { border: 1px solid #E0DFDF; } +.multi-wizard.instance-wizard .service-offering .content { + width: 463px; + max-height: 365px; + overflow: auto; +} + .multi-wizard .content .section .select-area { width: 334px; height: 45px; diff --git a/ui/index.jsp b/ui/index.jsp index ee1e6ca0229..0dde35ca9a4 100644 --- a/ui/index.jsp +++ b/ui/index.jsp @@ -50,6 +50,14 @@ + + +
+ +
@@ -577,7 +585,8 @@
- + +
@@ -615,7 +624,8 @@
- + +
@@ -675,7 +685,7 @@
-