From 4572810b72c4d4db54956c0520e411157db01603 Mon Sep 17 00:00:00 2001 From: anthony Date: Mon, 25 Jul 2011 17:47:03 -0700 Subject: [PATCH 01/72] bug 10854: get basecopy physical size before destroying VDI, basecopy might be coalesced after destroying VDI status 10854: resolved fixed --- .../cloud/hypervisor/xen/resource/CitrixResourceBase.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java index dfca85c8c50..ac0496004f1 100644 --- a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java +++ b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java @@ -2138,15 +2138,15 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe VDI snapshotvdi = tmpl.snapshot(conn, new HashMap()); String snapshotUuid = snapshotvdi.getUuid(conn); snapshotvdi.setNameLabel(conn, "Template " + cmd.getName()); + String parentuuid = getVhdParent(conn, pUuid, snapshotUuid, isISCSI); + VDI parent = getVDIbyUuid(conn, parentuuid); + Long phySize = parent.getPhysicalUtilisation(conn); tmpl.destroy(conn); poolsr.scan(conn); try{ Thread.sleep(5000); } catch (Exception e) { } - String parentuuid = getVhdParent(conn, pUuid, snapshotUuid, isISCSI); - VDI parent = getVDIbyUuid(conn, parentuuid); - Long phySize = parent.getPhysicalUtilisation(conn); return new PrimaryStorageDownloadAnswer(snapshotvdi.getUuid(conn), phySize); } catch (Exception e) { String msg = "Catch Exception " + e.getClass().getName() + " on host:" + _host.uuid + " for template: " From bad0f776596b215dd6bcac13fb2175c69670bc5d Mon Sep 17 00:00:00 2001 From: anthony Date: Fri, 22 Jul 2011 19:29:19 -0700 Subject: [PATCH 02/72] use the safe way to delete secondary storage directory --- .../xen/resource/CitrixResourceBase.java | 16 ++++---- scripts/vm/hypervisor/xenserver/vmopsSnapshot | 40 ++++--------------- 2 files changed, 14 insertions(+), 42 deletions(-) diff --git a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java index ac0496004f1..1def2998593 100644 --- a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java +++ b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java @@ -5716,10 +5716,12 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe if (uri != null) { String secondaryStorageMountPath = uri.getHost() + ":" + uri.getPath(); - details = deleteSnapshotsDir(conn, dcId, accountId, volumeId, secondaryStorageMountPath); + success = deleteSnapshotsDir(conn, dcId, accountId, volumeId, secondaryStorageMountPath); success = (details != null && details.equals("1")); if (success) { s_logger.debug("Successfully deleted snapshotsDir for volume: " + volumeId); + } else { + s_logger.debug("Failed to delete snapshotsDir for volume: " + volumeId); } } @@ -5879,8 +5881,8 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe } protected boolean deleteSecondaryStorageFolder(Connection conn, String remoteMountPath, String folder) { - String result = callHostPlugin(conn, "vmopsSnapshot", "delete_secondary_storage_folder", "remoteMountPath", remoteMountPath, "folder", folder); - return (result != null); + String details = callHostPlugin(conn, "vmopsSnapshot", "delete_secondary_storage_folder", "remoteMountPath", remoteMountPath, "folder", folder); + return (details != null && details.equals("1")); } protected boolean postCreatePrivateTemplate(Connection conn, String templatePath, String tmpltFilename, String templateName, String templateDescription, String checksum, long size, long virtualSize, long templateId) { @@ -5953,12 +5955,8 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe return result; } - protected String deleteSnapshotsDir(Connection conn, Long dcId, Long accountId, Long volumeId, String secondaryStorageMountPath) { - // If anybody modifies the formatting below again, I'll skin them - String result = callHostPlugin(conn, "vmopsSnapshot", "deleteSnapshotsDir", "dcId", dcId.toString(), "accountId", accountId.toString(), "volumeId", volumeId.toString(), - "secondaryStorageMountPath", secondaryStorageMountPath); - - return result; + protected boolean deleteSnapshotsDir(Connection conn, Long dcId, Long accountId, Long volumeId, String secondaryStorageMountPath) { + return deleteSecondaryStorageFolder(conn, secondaryStorageMountPath, dcId.toString() + "/" + accountId.toString() + "/" + volumeId.toString()); } diff --git a/scripts/vm/hypervisor/xenserver/vmopsSnapshot b/scripts/vm/hypervisor/xenserver/vmopsSnapshot index 081a7fa1b00..21c263e87dd 100755 --- a/scripts/vm/hypervisor/xenserver/vmopsSnapshot +++ b/scripts/vm/hypervisor/xenserver/vmopsSnapshot @@ -64,7 +64,7 @@ def create_secondary_storage_folder(session, args): # Unmount the local folder umount(local_mount_path) # Remove the local folder - os.system("rm -rf " + local_mount_path) + os.system("rmdir " + local_mount_path) return "1" @@ -84,7 +84,8 @@ def delete_secondary_storage_folder(session, args): # Delete the specified folder folder = local_mount_path + "/" + args["folder"] if os.path.isdir(folder): - os.system("rm -rf " + folder) + os.system("rm -f " + folder + "/*") + os.system("rmdir " + folder) except OSError, (errno, strerror): errMsg = "delete_secondary_storage_folder failed: errno: " + str(errno) + ", strerr: " + strerror util.SMlog(errMsg) @@ -98,7 +99,7 @@ def delete_secondary_storage_folder(session, args): # Unmount the local folder umount(local_mount_path) # Remove the local folder - os.system("rm -rf " + local_mount_path) + os.system("rmdir " + local_mount_path) return "1" @@ -154,7 +155,7 @@ def post_create_private_template(session, args): # Unmount the local folder umount(local_mount_path) # Remove the local folder - os.system("rm -rf " + local_mount_path) + os.system("rmdir " + local_mount_path) return "1" def isfile(path, isISCSI): @@ -303,7 +304,7 @@ def umount(localDir): except CommandException: errMsg = "CommandException raised while trying to umount " + localDir util.SMlog(errMsg) - return + raise xs_errors.XenError(errMsg) util.SMlog("Successfully unmounted " + localDir) return @@ -539,33 +540,6 @@ def deleteSnapshotBackup(session, args): return "1" -def rmtree(path): - if os.path.isdir(path): - try: - shutil.rmtree(path) - except OSError, (errno, strerror): - errMsg = "Error while deleting " + path + " on secondary storage with errno: " + str(errno) + " and strerr: " + strerror + ". Please delete it manually" - util.SMlog(errMsg) - util.SMlog("Successfully deleted " + path) - else: - util.SMlog("Could not find directory with path " + path) - return - -@echo -def deleteSnapshotsDir(session, args): - util.SMlog("Calling deleteSnapshotsDir with " + str(args)) - dcId = args['dcId'] - accountId = args['accountId'] - volumeId = args['volumeId'] - secondaryStorageMountPath = args['secondaryStorageMountPath'] - - backupsDir = mountSnapshotsDir(secondaryStorageMountPath, "snapshots", dcId, accountId, volumeId) - accountDir = os.path.dirname(backupsDir) - util.SMlog("accountDir is " + accountDir) - rmtree(accountDir) - - return "1" - if __name__ == "__main__": - XenAPIPlugin.dispatch({"getVhdParent":getVhdParent, "create_secondary_storage_folder":create_secondary_storage_folder, "delete_secondary_storage_folder":delete_secondary_storage_folder, "post_create_private_template":post_create_private_template, "backupSnapshot": backupSnapshot, "deleteSnapshotBackup": deleteSnapshotBackup, "unmountSnapshotsDir": unmountSnapshotsDir, "deleteSnapshotsDir": deleteSnapshotsDir}) + XenAPIPlugin.dispatch({"getVhdParent":getVhdParent, "create_secondary_storage_folder":create_secondary_storage_folder, "delete_secondary_storage_folder":delete_secondary_storage_folder, "post_create_private_template":post_create_private_template, "backupSnapshot": backupSnapshot, "deleteSnapshotBackup": deleteSnapshotBackup, "unmountSnapshotsDir": unmountSnapshotsDir}) From 4c8f5e0591e7bb9c83d849a22274f33a5ec7e7fa Mon Sep 17 00:00:00 2001 From: anthony Date: Tue, 26 Jul 2011 17:39:24 -0700 Subject: [PATCH 03/72] fixed NPE, secondary storage VM host may not exist even the secondary storage VM is running --- .../cloud/storage/secondary/SecondaryStorageManagerImpl.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java b/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java index a8ada877a8b..f6687540790 100644 --- a/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java +++ b/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java @@ -391,6 +391,9 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V } String instanceName = ssVm.getInstanceName(); HostVO host = _hostDao.findByName(instanceName); + if ( host == null ) { + continue; + } Answer answer = _agentMgr.easySend(host.getId(), thiscpc); if (answer != null && answer.getResult()) { if (s_logger.isDebugEnabled()) { From cd8e069f80913caa3c4d41cfb39a8c920ad30f37 Mon Sep 17 00:00:00 2001 From: Chiradeep Vittal Date: Thu, 21 Jul 2011 18:04:48 -0700 Subject: [PATCH 04/72] Acquire an ip and launch an ELB vm --- .../api/commands/AssociateIPAddrCmd.java | 8 + .../commands/CreateLoadBalancerRuleCmd.java | 103 ++++- .../commands/ListLoadBalancerRulesCmd.java | 11 + api/src/com/cloud/network/Network.java | 2 + .../cloud/network/router/VirtualRouter.java | 4 +- .../com/cloud/network/rules/LoadBalancer.java | 2 +- api/src/com/cloud/vm/VirtualMachine.java | 2 + client/tomcatconf/components.xml.in | 2 + .../DefaultComponentLibrary.java | 2 + server/src/com/cloud/dc/DataCenterVO.java | 1 + .../com/cloud/network/NetworkManagerImpl.java | 16 +- .../element/ElasticLoadBalancerElement.java | 144 ++++++ .../lb/ElasticLoadBalancerManager.java | 39 ++ .../lb/ElasticLoadBalancerManagerImpl.java | 428 ++++++++++++++++++ .../lb/LoadBalancingRulesManagerImpl.java | 32 +- .../cloud/server/ConfigurationServerImpl.java | 4 +- 16 files changed, 781 insertions(+), 19 deletions(-) create mode 100644 server/src/com/cloud/network/element/ElasticLoadBalancerElement.java create mode 100644 server/src/com/cloud/network/lb/ElasticLoadBalancerManager.java create mode 100644 server/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java diff --git a/api/src/com/cloud/api/commands/AssociateIPAddrCmd.java b/api/src/com/cloud/api/commands/AssociateIPAddrCmd.java index fe5a2838be1..1e44db06aeb 100644 --- a/api/src/com/cloud/api/commands/AssociateIPAddrCmd.java +++ b/api/src/com/cloud/api/commands/AssociateIPAddrCmd.java @@ -189,5 +189,13 @@ public class AssociateIPAddrCmd extends BaseAsyncCreateCmd { @Override public AsyncJob.Type getInstanceType() { return AsyncJob.Type.IpAddress; + } + + public AssociateIPAddrCmd(String accountName, Long domainId, Long zoneId, Long networkId) { + super(); + this.accountName = accountName; + this.domainId = domainId; + this.zoneId = zoneId; + this.networkId = networkId; } } diff --git a/api/src/com/cloud/api/commands/CreateLoadBalancerRuleCmd.java b/api/src/com/cloud/api/commands/CreateLoadBalancerRuleCmd.java index 45bd5d7ed46..78fd2dc823f 100644 --- a/api/src/com/cloud/api/commands/CreateLoadBalancerRuleCmd.java +++ b/api/src/com/cloud/api/commands/CreateLoadBalancerRuleCmd.java @@ -18,6 +18,8 @@ package com.cloud.api.commands; +import java.util.List; + import org.apache.log4j.Logger; import com.cloud.api.ApiConstants; @@ -26,10 +28,16 @@ import com.cloud.api.Implementation; import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.api.response.LoadBalancerResponse; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientAddressCapacityException; import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; import com.cloud.network.IpAddress; import com.cloud.network.rules.LoadBalancer; +import com.cloud.user.Account; +import com.cloud.user.UserContext; import com.cloud.utils.net.NetUtils; @Implementation(description="Creates a load balancer rule", responseObject=LoadBalancerResponse.class) @@ -54,13 +62,21 @@ public class CreateLoadBalancerRuleCmd extends BaseCmd implements LoadBalancer @Parameter(name=ApiConstants.PRIVATE_PORT, type=CommandType.INTEGER, required=true, description="the private port of the private ip address/virtual machine where the network traffic will be load balanced to") private Integer privatePort; - @Parameter(name=ApiConstants.PUBLIC_IP_ID, type=CommandType.LONG, required=true, description="public ip address id from where the network traffic will be load balanced from") + @Parameter(name=ApiConstants.PUBLIC_IP_ID, type=CommandType.LONG, required=false, description="public ip address id from where the network traffic will be load balanced from") private Long publicIpId; + + @Parameter(name=ApiConstants.ZONE_ID, type=CommandType.LONG, required=false, description="public ip address id from where the network traffic will be load balanced from") + private Long zoneId; @Parameter(name=ApiConstants.PUBLIC_PORT, type=CommandType.INTEGER, required=true, description="the public port from where the network traffic will be load balanced from") private Integer publicPort; + @Parameter(name=ApiConstants.ACCOUNT, type=CommandType.STRING, description="the account associated with the load balancer. Must be used with the domainId parameter.") + private String accountName; + @Parameter(name=ApiConstants.DOMAIN_ID, type=CommandType.LONG, description="the domain ID associated with the load balancer") + private Long domainId; + ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// @@ -86,7 +102,7 @@ public class CreateLoadBalancerRuleCmd extends BaseCmd implements LoadBalancer public Long getPublicIpId() { IpAddress ipAddr = _networkService.getIp(publicIpId); if (ipAddr == null || !ipAddr.readyToUse()) { - throw new InvalidParameterValueException("Unable to create load balancer rule, invalid IP address id" + ipAddr.getId()); + throw new InvalidParameterValueException("Unable to create load balancer rule, invalid IP address id " + ipAddr.getId()); } return publicIpId; @@ -109,10 +125,51 @@ public class CreateLoadBalancerRuleCmd extends BaseCmd implements LoadBalancer return s_name; } + protected LoadBalancer findExistingLB() { + List lbs = _lbService.searchForLoadBalancers(new ListLoadBalancerRulesCmd(getAccountName(), getDomainId(), null, getName(), publicIpId, null, getZoneId()) ); + if (lbs != null && lbs.size() > 0) { + return lbs.get(0); + } + return null; + } + + protected void allocateIp() throws ResourceAllocationException, ResourceUnavailableException { + AssociateIPAddrCmd allocIpCmd = new AssociateIPAddrCmd(getAccountName(), getDomainId(), getZoneId(), null); + try { + IpAddress ip = _networkService.allocateIP(allocIpCmd); + if (ip != null) { + this.setPublicIpId(ip.getId()); + allocIpCmd.setEntityId(ip.getId()); + } else { + throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to allocate ip address"); + } + //UserContext.current().setEventDetails("Ip Id: "+ ip.getId()); + //IpAddress result = _networkService.associateIP(allocIpCmd); + } catch (ConcurrentOperationException ex) { + s_logger.warn("Exception: ", ex); + throw new ServerApiException(BaseCmd.INTERNAL_ERROR, ex.getMessage()); + } catch (InsufficientAddressCapacityException ex) { + s_logger.info(ex); + s_logger.trace(ex); + throw new ServerApiException(BaseCmd.INSUFFICIENT_CAPACITY_ERROR, ex.getMessage()); + } + } + @Override - public void execute() { + public void execute() throws ResourceAllocationException, ResourceUnavailableException { LoadBalancer result = null; try { + if (publicIpId == null) { + if (getZoneId() == null ) { + throw new InvalidParameterValueException("Either zone id or public ip id needs to be specified"); + } + LoadBalancer existing = findExistingLB(); + if (existing == null) { + allocateIp(); + } else { + this.setPublicIpId(existing.getSourceIpAddressId()); + } + } result = _lbService.createLoadBalancerRule(this); } catch (NetworkRuleConflictException e) { s_logger.warn("Exception: ", e); @@ -171,12 +228,33 @@ public class CreateLoadBalancerRuleCmd extends BaseCmd implements LoadBalancer @Override public long getAccountId() { - return _networkService.getIp(getPublicIpId()).getAccountId(); + if (publicIpId != null) + return _networkService.getIp(getPublicIpId()).getAccountId(); + Account account = UserContext.current().getCaller(); + if ((account == null) ) { + if ((domainId != null) && (accountName != null)) { + Account userAccount = _responseGenerator.findAccountByNameDomain(accountName, domainId); + if (userAccount != null) { + return userAccount.getId(); + } + } + } + + if (account != null) { + return account.getId(); + } + + return Account.ACCOUNT_ID_SYSTEM; } @Override public long getDomainId() { - return _networkService.getIp(getPublicIpId()).getDomainId(); + if (publicIpId != null) + return _networkService.getIp(getPublicIpId()).getDomainId(); + if (domainId != null) { + return domainId; + } + return UserContext.current().getCaller().getDomainId(); } @Override @@ -192,5 +270,18 @@ public class CreateLoadBalancerRuleCmd extends BaseCmd implements LoadBalancer @Override public long getEntityOwnerId() { return getAccountId(); - } + } + + public String getAccountName() { + return accountName; + } + + public Long getZoneId() { + return zoneId; + } + + public void setPublicIpId(Long publicIpId) { + this.publicIpId = publicIpId; + } + } diff --git a/api/src/com/cloud/api/commands/ListLoadBalancerRulesCmd.java b/api/src/com/cloud/api/commands/ListLoadBalancerRulesCmd.java index 9bded66ae8b..1ceda4854ac 100644 --- a/api/src/com/cloud/api/commands/ListLoadBalancerRulesCmd.java +++ b/api/src/com/cloud/api/commands/ListLoadBalancerRulesCmd.java @@ -119,4 +119,15 @@ public class ListLoadBalancerRulesCmd extends BaseListCmd { response.setResponseName(getCommandName()); this.setResponseObject(response); } + + public ListLoadBalancerRulesCmd(String accountName, Long domainId, Long id, String loadBalancerRuleName, Long publicIpId, Long virtualMachineId, Long zoneId) { + super(); + this.accountName = accountName; + this.domainId = domainId; + this.id = id; + this.loadBalancerRuleName = loadBalancerRuleName; + this.publicIpId = publicIpId; + this.virtualMachineId = virtualMachineId; + this.zoneId = zoneId; + } } diff --git a/api/src/com/cloud/network/Network.java b/api/src/com/cloud/network/Network.java index 3287369ce53..9630d48e732 100644 --- a/api/src/com/cloud/network/Network.java +++ b/api/src/com/cloud/network/Network.java @@ -93,6 +93,8 @@ public interface Network extends ControlledEntity { public static final Provider F5BigIp = new Provider("F5BigIp"); public static final Provider ExternalDhcpServer = new Provider("ExternalDhcpServer"); public static final Provider ExternalGateWay = new Provider("ExternalGateWay"); + public static final Provider ElasticLoadBalancerVm = new Provider("ElasticLoadBalancerVm"); + public static final Provider None = new Provider("None"); private String name; diff --git a/api/src/com/cloud/network/router/VirtualRouter.java b/api/src/com/cloud/network/router/VirtualRouter.java index 32009620c88..624bd928e4c 100755 --- a/api/src/com/cloud/network/router/VirtualRouter.java +++ b/api/src/com/cloud/network/router/VirtualRouter.java @@ -26,7 +26,7 @@ import com.cloud.vm.VirtualMachine; public interface VirtualRouter extends VirtualMachine { public enum Role { DHCP_FIREWALL_LB_PASSWD_USERDATA, - DHCP_USERDATA + DHCP_USERDATA, LB } Role getRole(); -} +} \ No newline at end of file diff --git a/api/src/com/cloud/network/rules/LoadBalancer.java b/api/src/com/cloud/network/rules/LoadBalancer.java index 5cee5b7cfe6..40fdc7e34c2 100644 --- a/api/src/com/cloud/network/rules/LoadBalancer.java +++ b/api/src/com/cloud/network/rules/LoadBalancer.java @@ -32,5 +32,5 @@ public interface LoadBalancer extends FirewallRule { int getDefaultPortEnd(); String getAlgorithm(); - + } diff --git a/api/src/com/cloud/vm/VirtualMachine.java b/api/src/com/cloud/vm/VirtualMachine.java index 82b09762016..69fec11a219 100755 --- a/api/src/com/cloud/vm/VirtualMachine.java +++ b/api/src/com/cloud/vm/VirtualMachine.java @@ -151,6 +151,8 @@ public interface VirtualMachine extends RunningOn, ControlledEntity, StateObject DomainRouter, ConsoleProxy, SecondaryStorageVm, + ElasticIpVm, + ElasticLoadBalancerVm, /* * UserBareMetal is only used for selecting VirtualMachineGuru, there is no diff --git a/client/tomcatconf/components.xml.in b/client/tomcatconf/components.xml.in index 7d3e1772bca..b83b8df2beb 100755 --- a/client/tomcatconf/components.xml.in +++ b/client/tomcatconf/components.xml.in @@ -89,6 +89,8 @@ + + diff --git a/server/src/com/cloud/configuration/DefaultComponentLibrary.java b/server/src/com/cloud/configuration/DefaultComponentLibrary.java index be2c399bf51..b2259a0e226 100644 --- a/server/src/com/cloud/configuration/DefaultComponentLibrary.java +++ b/server/src/com/cloud/configuration/DefaultComponentLibrary.java @@ -79,6 +79,7 @@ import com.cloud.network.dao.LoadBalancerVMMapDaoImpl; import com.cloud.network.dao.NetworkDaoImpl; import com.cloud.network.dao.NetworkDomainDaoImpl; import com.cloud.network.dao.NetworkRuleConfigDaoImpl; +import com.cloud.network.lb.ElasticLoadBalancerManagerImpl; import com.cloud.network.lb.LoadBalancingRulesManagerImpl; import com.cloud.network.ovs.OvsNetworkManagerImpl; import com.cloud.network.ovs.OvsTunnelManagerImpl; @@ -315,6 +316,7 @@ public class DefaultComponentLibrary extends ComponentLibraryBase implements Com ComponentInfo info = addManager("ConsoleProxyManager", ConsoleProxyManagerImpl.class); info.addParameter("consoleproxy.sslEnabled", "true"); addManager("ClusteredAgentManager", ClusteredAgentManagerImpl.class); + addManager("ElasticLoadBalancerManager", ElasticLoadBalancerManagerImpl.class); } @Override diff --git a/server/src/com/cloud/dc/DataCenterVO.java b/server/src/com/cloud/dc/DataCenterVO.java index 301f90b7f60..d8900b9460d 100644 --- a/server/src/com/cloud/dc/DataCenterVO.java +++ b/server/src/com/cloud/dc/DataCenterVO.java @@ -205,6 +205,7 @@ public class DataCenterVO implements DataCenter { dhcpProvider = Provider.DhcpServer.getName(); dnsProvider = Provider.DhcpServer.getName(); userDataProvider = Provider.DhcpServer.getName(); + loadBalancerProvider = Provider.ElasticLoadBalancerVm.getName(); } this.zoneToken = zoneToken; diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index 5a64dcba743..6d188b79c7e 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -559,6 +559,16 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag if (zone.getNetworkType() != NetworkType.Basic && network.getAccountId() != ipOwner.getId()) { throw new InvalidParameterValueException("The owner of the network is not the same as owner of the IP"); } + VlanType vlanType = VlanType.VirtualNetwork; + boolean assign = false; + //For basic zone, if there isn't a public network outside of the guest network, specify the vlan type to be direct attached + if (zone.getNetworkType() == NetworkType.Basic) { + if (network.getTrafficType() == TrafficType.Guest){ + vlanType = VlanType.DirectAttached; + assign = true; + } + + } PublicIp ip = null; @@ -601,7 +611,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } } - ip = fetchNewPublicIp(zoneId, null, null, ipOwner, VlanType.VirtualNetwork, network.getId(), isSourceNat, false, null); + ip = fetchNewPublicIp(zoneId, null, null, ipOwner, vlanType, network.getId(), isSourceNat, assign, null); if (ip == null) { throw new InsufficientAddressCapacityException("Unable to find available public IP addresses", DataCenter.class, zoneId); @@ -754,8 +764,8 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag defaultGuestNetworkOffering = _networkOfferingDao.persistDefaultNetworkOffering(defaultGuestNetworkOffering); NetworkOfferingVO defaultGuestDirectNetworkOffering = new NetworkOfferingVO(NetworkOffering.DefaultDirectNetworkOffering, "Direct", TrafficType.Guest, false, true, null, null, null, true, Availability.Optional, - // services - all true except for firewall/lb/vpn and gateway services - true, true, true, false, false, false, false, GuestIpType.Direct); + // services - all true except for firewall/vpn and gateway services + true, true, true, false, false, true, false, GuestIpType.Direct); defaultGuestDirectNetworkOffering = _networkOfferingDao.persistDefaultNetworkOffering(defaultGuestDirectNetworkOffering); AccountsUsingNetworkSearch = _accountDao.createSearchBuilder(); diff --git a/server/src/com/cloud/network/element/ElasticLoadBalancerElement.java b/server/src/com/cloud/network/element/ElasticLoadBalancerElement.java new file mode 100644 index 00000000000..551a78a9de5 --- /dev/null +++ b/server/src/com/cloud/network/element/ElasticLoadBalancerElement.java @@ -0,0 +1,144 @@ +/** + * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +package com.cloud.network.element; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.ejb.Local; + +import org.apache.log4j.Logger; + +import com.cloud.configuration.ConfigurationManager; +import com.cloud.dc.DataCenter; +import com.cloud.deploy.DeployDestination; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.network.Network; +import com.cloud.network.NetworkManager; +import com.cloud.network.Network.Capability; +import com.cloud.network.Network.Provider; +import com.cloud.network.Network.Service; +import com.cloud.network.Networks.TrafficType; +import com.cloud.network.PublicIpAddress; +import com.cloud.network.lb.ElasticLoadBalancerManager; +import com.cloud.network.rules.FirewallRule; +import com.cloud.offering.NetworkOffering; +import com.cloud.utils.component.AdapterBase; +import com.cloud.utils.component.Inject; +import com.cloud.vm.NicProfile; +import com.cloud.vm.ReservationContext; +import com.cloud.vm.VirtualMachine; +import com.cloud.vm.VirtualMachineProfile; + + +@Local(value=NetworkElement.class) +public class ElasticLoadBalancerElement extends AdapterBase implements NetworkElement{ + private static final Logger s_logger = Logger.getLogger(ElasticLoadBalancerElement.class); + private static final Map> capabilities = setCapabilities(); + @Inject ConfigurationManager _configMgr; + @Inject NetworkManager _networkManager; + @Inject ElasticLoadBalancerManager _lbMgr; + + private boolean canHandle(Network config) { + DataCenter zone = _configMgr.getZone(config.getDataCenterId()); + if (config.getGuestType() != Network.GuestIpType.Virtual || config.getTrafficType() != TrafficType.Guest) { + s_logger.trace("Not handling network with guest Type " + config.getGuestType() + " and traffic type " + config.getTrafficType()); + return false; + } + + return (_networkManager.zoneIsConfiguredForExternalNetworking(zone.getId()) && + zone.getLoadBalancerProvider() != null && zone.getLoadBalancerProvider().equals(Network.Provider.F5BigIp.getName())); + } + + @Override + public Provider getProvider() { + return Provider.ElasticLoadBalancerVm; + } + + @Override + public Map> getCapabilities() { + return capabilities; + } + + private static Map> setCapabilities() { + Map> capabilities = new HashMap>(); + + Map lbCapabilities = new HashMap(); + lbCapabilities.put(Capability.SupportedLBAlgorithms, "roundrobin,leastconn,source"); + lbCapabilities.put(Capability.SupportedProtocols, "tcp, udp"); + + capabilities.put(Service.Lb, lbCapabilities); + return capabilities; + } + + @Override + public boolean implement(Network network, NetworkOffering offering, DeployDestination dest, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException, + InsufficientCapacityException { + + return true; + } + + @Override + public boolean prepare(Network network, NicProfile nic, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context) + throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException { + + return true; + } + + @Override + public boolean release(Network network, NicProfile nic, VirtualMachineProfile vm, ReservationContext context) throws ConcurrentOperationException, + ResourceUnavailableException { + + return true; + } + + @Override + public boolean shutdown(Network network, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException { + // TODO kill all loadbalancer vms by calling the ElasticLoadBalancerManager + return false; + } + + @Override + public boolean restart(Network network, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException { + // TODO restart all loadbalancer vms by calling the ElasticLoadBalancerManager + return false; + } + + @Override + public boolean destroy(Network network) throws ConcurrentOperationException, ResourceUnavailableException { + // TODO kill all loadbalancer vms by calling the ElasticLoadBalancerManager + return false; + } + + @Override + public boolean applyIps(Network network, List ipAddress) throws ResourceUnavailableException { + return true; + } + + @Override + public boolean applyRules(Network network, List rules) throws ResourceUnavailableException { + if (!canHandle(network)) { + return false; + } + + return _lbMgr.applyLoadBalancerRules(network, rules); + } +} diff --git a/server/src/com/cloud/network/lb/ElasticLoadBalancerManager.java b/server/src/com/cloud/network/lb/ElasticLoadBalancerManager.java new file mode 100644 index 00000000000..4c26d33c87e --- /dev/null +++ b/server/src/com/cloud/network/lb/ElasticLoadBalancerManager.java @@ -0,0 +1,39 @@ +/** + * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +package com.cloud.network.lb; + +import java.util.List; + +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.network.Network; +import com.cloud.network.lb.LoadBalancingRule.LbDestination; +import com.cloud.network.rules.FirewallRule; +import com.cloud.user.Account; + +public interface ElasticLoadBalancerManager { + public static final int DEFAULT_ELB_VM_RAMSIZE = 512; // 512 MB + public static final int DEFAULT_ELB_VM_CPU_MHZ = 500; // 500 MHz + public long deployLoadBalancerVM(Long networkId, Long accountId); + + public boolean applyLoadBalancerRules(Network network, + List rules) + throws ResourceUnavailableException;; + +} diff --git a/server/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java b/server/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java new file mode 100644 index 00000000000..4b9c1520c7b --- /dev/null +++ b/server/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java @@ -0,0 +1,428 @@ +/** + * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +package com.cloud.network.lb; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.ejb.Local; +import javax.naming.ConfigurationException; + +import org.apache.log4j.Logger; + +import com.cloud.agent.AgentManager; +import com.cloud.agent.AgentManager.OnError; +import com.cloud.agent.api.Answer; +import com.cloud.agent.api.routing.LoadBalancerConfigCommand; +import com.cloud.agent.api.routing.NetworkElementCommand; +import com.cloud.agent.api.to.LoadBalancerTO; +import com.cloud.agent.manager.Commands; +import com.cloud.configuration.Config; +import com.cloud.configuration.dao.ConfigurationDao; +import com.cloud.dc.DataCenter; +import com.cloud.dc.HostPodVO; +import com.cloud.dc.dao.ClusterDao; +import com.cloud.dc.dao.DataCenterDao; +import com.cloud.dc.dao.HostPodDao; +import com.cloud.deploy.DataCenterDeployment; +import com.cloud.deploy.DeployDestination; +import com.cloud.exception.AgentUnavailableException; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.InvalidParameterValueException; +import com.cloud.exception.OperationTimedoutException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.exception.StorageUnavailableException; +import com.cloud.network.IPAddressVO; +import com.cloud.network.LoadBalancerVO; +import com.cloud.network.Network; +import com.cloud.network.NetworkManager; +import com.cloud.network.NetworkVO; +import com.cloud.network.Networks.BroadcastDomainType; +import com.cloud.network.dao.IPAddressDao; +import com.cloud.network.dao.LoadBalancerDao; +import com.cloud.network.dao.NetworkDao; +import com.cloud.network.lb.LoadBalancingRule.LbDestination; +import com.cloud.network.router.VirtualNetworkApplianceManager; +import com.cloud.network.router.VirtualRouter; +import com.cloud.network.router.VirtualRouter.Role; +import com.cloud.network.rules.FirewallRule; +import com.cloud.network.rules.FirewallRule.Purpose; +import com.cloud.offering.NetworkOffering; +import com.cloud.offerings.NetworkOfferingVO; +import com.cloud.offerings.dao.NetworkOfferingDao; +import com.cloud.org.Cluster; +import com.cloud.service.ServiceOfferingVO; +import com.cloud.service.dao.ServiceOfferingDao; +import com.cloud.storage.VMTemplateVO; +import com.cloud.storage.dao.VMTemplateDao; +import com.cloud.user.Account; +import com.cloud.user.AccountService; +import com.cloud.user.User; +import com.cloud.utils.NumbersUtil; +import com.cloud.utils.Pair; +import com.cloud.utils.component.Inject; +import com.cloud.utils.component.Manager; +import com.cloud.utils.db.DB; +import com.cloud.vm.DomainRouterVO; +import com.cloud.vm.NicProfile; +import com.cloud.vm.VirtualMachine; +import com.cloud.vm.VirtualMachine.State; +import com.cloud.vm.VirtualMachineManager; +import com.cloud.vm.VirtualMachineName; +import com.cloud.vm.VirtualMachineProfile; +import com.cloud.vm.VirtualMachineProfile.Param; +import com.cloud.vm.dao.DomainRouterDao; + +@Local(value = { ElasticLoadBalancerManager.class }) +public class ElasticLoadBalancerManagerImpl implements + ElasticLoadBalancerManager, Manager { + private static final Logger s_logger = Logger + .getLogger(ElasticLoadBalancerManagerImpl.class); + + @Inject + IPAddressDao _ipAddressDao; + @Inject + AgentManager _agentMgr; + @Inject + NetworkManager _networkMgr; + @Inject + LoadBalancerDao _loadBalancerDao = null; + @Inject + LoadBalancingRulesManager _lbMgr; + @Inject + VirtualNetworkApplianceManager _routerMgr; + @Inject + DomainRouterDao _routerDao = null; + @Inject + protected HostPodDao _podDao = null; + @Inject + protected ClusterDao _clusterDao; + @Inject + DataCenterDao _dcDao = null; + @Inject + protected NetworkDao _networkDao; + @Inject + protected NetworkOfferingDao _networkOfferingDao; + @Inject + VMTemplateDao _templateDao = null; + @Inject + VirtualMachineManager _itMgr; + @Inject + ConfigurationDao _configDao; + @Inject + ServiceOfferingDao _serviceOfferingDao = null; + @Inject + AccountService _accountService; + + + String _name; + String _instance; + + Account _systemAcct; + ServiceOfferingVO _elasticLbVmOffering; + + int _elasticLbVmRamSize; + int _elasticLbvmCpuMHz; + + + + + public long deployLoadBalancerVM(Long networkId, Long accountId) { /* ELB_TODO :need to remove hardcoded network id,account id,pod id , cluster id */ + NetworkVO network = _networkDao.findById(networkId); + + DataCenter dc = _dcDao.findById(network.getDataCenterId()); + + Map params = new HashMap( + 1); + params.put(VirtualMachineProfile.Param.RestartNetwork, true); + Account owner = _accountService.getActiveAccount("system", new Long(1)); + DeployDestination dest = new DeployDestination(dc, null, null, null); + + s_logger.debug("About to deploy elastic LB vm if necessary"); + + try { + VirtualRouter elbVm = deployELBVm(network, dest, owner, params); + + s_logger.debug("ELB vm = " + elbVm); + if (elbVm == null) { + throw new InvalidParameterValueException("No VM with id '" + + elbVm + "' found."); + } + DomainRouterVO elbRouterVm = _routerDao.findById(elbVm.getId()); + String publicIp = elbRouterVm.getGuestIpAddress(); + IPAddressVO ipvo = _ipAddressDao.findByIpAndSourceNetworkId(networkId, publicIp); + ipvo.setAssociatedWithNetworkId(networkId); + _ipAddressDao.update(ipvo.getId(), ipvo); + return ipvo.getId(); + } catch (Throwable t) { + String errorMsg = "Error while deploying Loadbalancer VM: " + t; + s_logger.warn(errorMsg); + return 0; + } + + } + + private boolean sendCommandsToRouter(final DomainRouterVO router, + Commands cmds) throws AgentUnavailableException { + Answer[] answers = null; + try { + answers = _agentMgr.send(router.getHostId(), cmds); + } catch (OperationTimedoutException e) { + s_logger.warn("Timed Out", e); + throw new AgentUnavailableException( + "Unable to send commands to virtual router ", + router.getHostId(), e); + } + + if (answers == null) { + return false; + } + + if (answers.length != cmds.size()) { + return false; + } + + // FIXME: Have to return state for individual command in the future + if (answers.length > 0) { + Answer ans = answers[0]; + return ans.getResult(); + } + return true; + } + + private void createApplyLoadBalancingRulesCommands( + List rules, DomainRouterVO router, Commands cmds) { + + String elbIp = ""; + + LoadBalancerTO[] lbs = new LoadBalancerTO[rules.size()]; + int i = 0; + for (LoadBalancingRule rule : rules) { + boolean revoked = (rule.getState() + .equals(FirewallRule.State.Revoke)); + String protocol = rule.getProtocol(); + String algorithm = rule.getAlgorithm(); + + elbIp = _networkMgr.getIp(rule.getSourceIpAddressId()).getAddress() + .addr(); + int srcPort = rule.getSourcePortStart(); + List destinations = rule.getDestinations(); + LoadBalancerTO lb = new LoadBalancerTO(elbIp, srcPort, protocol, + algorithm, revoked, false, destinations); + lbs[i++] = lb; + } + + LoadBalancerConfigCommand cmd = new LoadBalancerConfigCommand(lbs); + cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, + router.getPrivateIpAddress()); + cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, + router.getInstanceName()); + cmds.addCommand(cmd); + + } + + protected boolean applyLBRules(DomainRouterVO router, + List rules) throws ResourceUnavailableException { + Commands cmds = new Commands(OnError.Continue); + createApplyLoadBalancingRulesCommands(rules, router, cmds); + // Send commands to router + return sendCommandsToRouter(router, cmds); + } + + public boolean applyLoadBalancerRules(Network network, + List rules) + throws ResourceUnavailableException { + DomainRouterVO router = _routerDao.findByNetwork(network.getId());/* ELB_TODO :may have multiple LB's , need to get the correct LB based on network id and account id */ + + if (router == null) { + s_logger.warn("Unable to apply lb rules, virtual router doesn't exist in the network " + + network.getId()); + throw new ResourceUnavailableException("Unable to apply lb rules", + DataCenter.class, network.getDataCenterId()); + } + + if (router.getState() == State.Running) { + if (rules != null && !rules.isEmpty()) { + if (rules.get(0).getPurpose() == Purpose.LoadBalancing) { + // for elastic load balancer we have to resend all lb rules + // belonging to same sourceIpAddressId for the network + List lbs = _loadBalancerDao + .listByNetworkId(network.getId()); + List lbRules = new ArrayList(); + for (LoadBalancerVO lb : lbs) { + if (lb.getSourceIpAddressId() == rules.get(0) + .getSourceIpAddressId()) { + List dstList = _lbMgr + .getExistingDestinations(lb.getId()); + LoadBalancingRule loadBalancing = new LoadBalancingRule( + lb, dstList); + lbRules.add(loadBalancing); + } + } + + return applyLBRules(router, lbRules); + } else { + s_logger.warn("Unable to apply rules of purpose: " + + rules.get(0).getPurpose()); + return false; + } + } else { + return true; + } + } else if (router.getState() == State.Stopped + || router.getState() == State.Stopping) { + s_logger.debug("Router is in " + + router.getState() + + ", so not sending apply firewall rules commands to the backend"); + return true; + } else { + s_logger.warn("Unable to apply firewall rules, virtual router is not in the right state " + + router.getState()); + throw new ResourceUnavailableException( + "Unable to apply firewall rules, virtual router is not in the right state", + VirtualRouter.class, router.getId()); + } + } + + @Override + public boolean configure(String name, Map params) + throws ConfigurationException { + _name = name; + final Map configs = _configDao.getConfiguration("AgentManager", params); + _systemAcct = _accountService.getSystemAccount(); + _instance = configs.get("instance.name"); + if (_instance == null) { + _instance = "VM"; + } + boolean useLocalStorage = Boolean.parseBoolean(configs.get(Config.SystemVMUseLocalStorage.key())); + + _elasticLbVmRamSize = NumbersUtil.parseInt(configs.get("elastic.lb.vm.ram.size"), DEFAULT_ELB_VM_RAMSIZE); + _elasticLbvmCpuMHz = NumbersUtil.parseInt(configs.get("elastic.lb.vm.cpu.mhz"), DEFAULT_ELB_VM_CPU_MHZ); + _elasticLbVmOffering = new ServiceOfferingVO("System Offering For Elastic LB VM", 1, _elasticLbVmRamSize, _elasticLbvmCpuMHz, 0, 0, true, null, useLocalStorage, true, null, true, VirtualMachine.Type.ElasticLoadBalancerVm, true); + _elasticLbVmOffering.setUniqueName("Cloud.Com-ElasticLBVm"); + _elasticLbVmOffering = _serviceOfferingDao.persistSystemServiceOffering(_elasticLbVmOffering); + + + return true; + } + + @Override + public boolean start() { + return true; + } + + @Override + public boolean stop() { + return true; + } + + @Override + public String getName() { + return _name; + } + + + @DB + public DomainRouterVO deployELBVm(Network guestNetwork, DeployDestination dest, Account owner, Map params) throws + ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException { + long dcId = dest.getDataCenter().getId(); + + // lock guest network + Long guestNetworkId = guestNetwork.getId(); + guestNetwork = _networkDao.acquireInLockTable(guestNetworkId); + + if (guestNetwork == null) { + throw new ConcurrentOperationException("Unable to acquire network configuration: " + guestNetworkId); + } + + try { + + NetworkOffering offering = _networkOfferingDao.findByIdIncludingRemoved(guestNetwork.getNetworkOfferingId()); + if (offering.isSystemOnly() || guestNetwork.getIsShared()) { + owner = _accountService.getSystemAccount(); + } + + if (s_logger.isDebugEnabled()) { + s_logger.debug("Starting a elastic ip vm for network configurations: " + guestNetwork + " in " + dest); + } + assert guestNetwork.getState() == Network.State.Implemented + || guestNetwork.getState() == Network.State.Setup + || guestNetwork.getState() == Network.State.Implementing + : "Network is not yet fully implemented: "+ guestNetwork; + + DataCenterDeployment plan = null; + DomainRouterVO router = null; + + //router = _routerDao.findByNetworkAndPodAndRole(guestNetwork.getId(), podId, Role.LB); + plan = new DataCenterDeployment(dcId, null, null, null, null); + + // } else { + // s_logger.debug("Not deploying elastic ip vm"); + // return null; + // } + + if (router == null) { + long id = _routerDao.getNextInSequence(Long.class, "id"); + if (s_logger.isDebugEnabled()) { + s_logger.debug("Creating the elastic LB vm " + id); + } + + List offerings = _networkMgr.getSystemAccountNetworkOfferings(NetworkOfferingVO.SystemControlNetwork); + NetworkOfferingVO controlOffering = offerings.get(0); + NetworkVO controlConfig = _networkMgr.setupNetwork(_systemAcct, controlOffering, plan, null, null, false, false).get(0); + + List> networks = new ArrayList>(2); + NicProfile guestNic = new NicProfile(); + networks.add(new Pair((NetworkVO) guestNetwork, guestNic)); + networks.add(new Pair(controlConfig, null)); + + VMTemplateVO template = _templateDao.findSystemVMTemplate(dcId); + + + router = new DomainRouterVO(id, _elasticLbVmOffering.getId(), VirtualMachineName.getRouterName(id, _instance), template.getId(), template.getHypervisorType(), template.getGuestOSId(), + owner.getDomainId(), owner.getId(), guestNetwork.getId(), _elasticLbVmOffering.getOfferHA()); + router.setRole(Role.LB); + router = _itMgr.allocate(router, template, _elasticLbVmOffering, networks, plan, null, owner); + } + + State state = router.getState(); + if (state != State.Running) { + router = this.start(router, _accountService.getSystemUser(), _accountService.getSystemAccount(), params); + } + + + return router; + } finally { + _networkDao.releaseFromLockTable(guestNetworkId); + } + } + + private DomainRouterVO start(DomainRouterVO router, User user, Account caller, Map params) throws StorageUnavailableException, InsufficientCapacityException, + ConcurrentOperationException, ResourceUnavailableException { + s_logger.debug("Starting router " + router); + if (_itMgr.start(router, params, user, caller) != null) { + return _routerDao.findById(router.getId()); + } else { + return null; + } + } + +} diff --git a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java b/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java index 760a06fe657..d69adb008fa 100755 --- a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java +++ b/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java @@ -50,12 +50,15 @@ import com.cloud.network.IPAddressVO; import com.cloud.network.LoadBalancerVMMapVO; import com.cloud.network.LoadBalancerVO; import com.cloud.network.Network; +import com.cloud.network.Network.GuestIpType; import com.cloud.network.Network.Service; import com.cloud.network.NetworkManager; +import com.cloud.network.NetworkVO; import com.cloud.network.dao.FirewallRulesDao; import com.cloud.network.dao.IPAddressDao; import com.cloud.network.dao.LoadBalancerDao; import com.cloud.network.dao.LoadBalancerVMMapDao; +import com.cloud.network.dao.NetworkDao; import com.cloud.network.lb.LoadBalancingRule.LbDestination; import com.cloud.network.rules.FirewallRule; import com.cloud.network.rules.FirewallRule.Purpose; @@ -118,6 +121,10 @@ public class LoadBalancingRulesManagerImpl implements LoadBalancingRulesManager, NicDao _nicDao; @Inject UsageEventDao _usageEventDao; + @Inject + ElasticLoadBalancerManager _elbMgr; + @Inject + NetworkDao _networkDao; @Override @DB @@ -346,9 +353,25 @@ public class LoadBalancingRulesManagerImpl implements LoadBalancingRulesManager, UserContext caller = UserContext.current(); long ipId = lb.getSourceIpAddressId(); - - // make sure ip address exists IPAddressVO ipAddr = _ipAddressDao.findById(ipId); + Long networkId= ipAddr.getSourceNetworkId(); + NetworkVO network=_networkDao.findById(networkId); + + if (network.getGuestType() == GuestIpType.Direct) { + LoadBalancerVO lbvo; + Account account = caller.getCaller(); + lbvo = _lbDao.findByAccountAndName(account.getId(), lb.getName()); + if (lbvo == null) { + _elbMgr.deployLoadBalancerVM(networkId, account.getId()); + IPAddressVO ipvo = _ipAddressDao.findById(ipId); + ipvo.setAssociatedWithNetworkId(networkId); + _ipAddressDao.update(ipvo.getId(), ipvo); + ipAddr.setAssociatedWithNetworkId(networkId); + } else { + + } + } + // make sure ip address exists if (ipAddr == null || !ipAddr.readyToUse()) { throw new InvalidParameterValueException("Unable to create load balancer rule, invalid IP address id" + ipId); } @@ -380,7 +403,7 @@ public class LoadBalancingRulesManagerImpl implements LoadBalancingRulesManager, throw new InvalidParameterValueException("Invalid algorithm: " + lb.getAlgorithm()); } - Long networkId = ipAddr.getAssociatedWithNetworkId(); + networkId = ipAddr.getAssociatedWithNetworkId(); if (networkId == null) { throw new InvalidParameterValueException("Unable to create load balancer rule ; ip id=" + ipId + " is not associated with any network"); @@ -389,9 +412,8 @@ public class LoadBalancingRulesManagerImpl implements LoadBalancingRulesManager, _accountMgr.checkAccess(caller.getCaller(), ipAddr); // verify that lb service is supported by the network - Network network = _networkMgr.getNetwork(networkId); if (!_networkMgr.isServiceSupported(network.getNetworkOfferingId(), Service.Lb)) { - throw new InvalidParameterValueException("LB service is not supported in network id=" + networkId); + throw new InvalidParameterValueException("LB service is not supported in network id= " + networkId); } LoadBalancerVO newRule = new LoadBalancerVO(lb.getXid(), lb.getName(), lb.getDescription(), lb.getSourceIpAddressId(), lb.getSourcePortEnd(), lb.getDefaultPortStart(), lb.getAlgorithm(), diff --git a/server/src/com/cloud/server/ConfigurationServerImpl.java b/server/src/com/cloud/server/ConfigurationServerImpl.java index 89ba2ed7f90..ef74240961c 100644 --- a/server/src/com/cloud/server/ConfigurationServerImpl.java +++ b/server/src/com/cloud/server/ConfigurationServerImpl.java @@ -809,7 +809,7 @@ public class ConfigurationServerImpl implements ConfigurationServer { true, false, null, null, null, true, Availability.Required, true, true, true, //services - all true except for lb/vpn and gateway - false, true, false, false, GuestIpType.Direct); + false, true, true, false, GuestIpType.Direct); guestNetworkOffering = _networkOfferingDao.persistDefaultNetworkOffering(guestNetworkOffering); @@ -829,7 +829,7 @@ public class ConfigurationServerImpl implements ConfigurationServer { false, true, null, null, null, true, Availability.Optional, true, true, true, //services - all true except for firewall/lb/vpn and gateway - false, false, false, false, GuestIpType.Direct); + false, false, true, false, GuestIpType.Direct); defaultGuestNetworkOffering = _networkOfferingDao.persistDefaultNetworkOffering(defaultGuestDirectNetworkOffering); } From 2447830c554a59a3c4265091585950c4f60314be Mon Sep 17 00:00:00 2001 From: Chiradeep Vittal Date: Fri, 22 Jul 2011 15:45:15 -0700 Subject: [PATCH 05/72] fix network type check --- .../network/element/ElasticLoadBalancerElement.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/server/src/com/cloud/network/element/ElasticLoadBalancerElement.java b/server/src/com/cloud/network/element/ElasticLoadBalancerElement.java index 551a78a9de5..e25ff5d44c8 100644 --- a/server/src/com/cloud/network/element/ElasticLoadBalancerElement.java +++ b/server/src/com/cloud/network/element/ElasticLoadBalancerElement.java @@ -57,15 +57,14 @@ public class ElasticLoadBalancerElement extends AdapterBase implements NetworkEl @Inject NetworkManager _networkManager; @Inject ElasticLoadBalancerManager _lbMgr; - private boolean canHandle(Network config) { - DataCenter zone = _configMgr.getZone(config.getDataCenterId()); - if (config.getGuestType() != Network.GuestIpType.Virtual || config.getTrafficType() != TrafficType.Guest) { - s_logger.trace("Not handling network with guest Type " + config.getGuestType() + " and traffic type " + config.getTrafficType()); + private boolean canHandle(Network network) { + // DataCenter zone = _configMgr.getZone(network.getDataCenterId()); + if (network.getGuestType() != Network.GuestIpType.Direct || network.getTrafficType() != TrafficType.Guest) { + s_logger.debug("Not handling network with guest Type " + network.getGuestType() + " and traffic type " + network.getTrafficType()); return false; } - return (_networkManager.zoneIsConfiguredForExternalNetworking(zone.getId()) && - zone.getLoadBalancerProvider() != null && zone.getLoadBalancerProvider().equals(Network.Provider.F5BigIp.getName())); + return true; } @Override From e1c5d4ef55f3b55c7b9c1baf34823c7943b1ee88 Mon Sep 17 00:00:00 2001 From: Chiradeep Vittal Date: Fri, 22 Jul 2011 17:43:46 -0700 Subject: [PATCH 06/72] fix npe --- .../com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/server/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java b/server/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java index 4b9c1520c7b..33047ad3219 100644 --- a/server/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java +++ b/server/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java @@ -163,8 +163,7 @@ public class ElasticLoadBalancerManagerImpl implements s_logger.debug("ELB vm = " + elbVm); if (elbVm == null) { - throw new InvalidParameterValueException("No VM with id '" - + elbVm + "' found."); + throw new InvalidParameterValueException("Could not deploy or find existing ELB VM"); } DomainRouterVO elbRouterVm = _routerDao.findById(elbVm.getId()); String publicIp = elbRouterVm.getGuestIpAddress(); From 07c2f6cdc761bb21266c7badecd9789c05770fdb Mon Sep 17 00:00:00 2001 From: Chiradeep Vittal Date: Sat, 23 Jul 2011 19:14:42 -0700 Subject: [PATCH 07/72] differentiate between dhcp server and elb vm --- .../debian/config/root/loadbalancer.sh | 90 ++++++-- .../lb/ElasticLoadBalancerManager.java | 7 +- .../lb/ElasticLoadBalancerManagerImpl.java | 197 ++++++++++++------ .../lb/LoadBalancingRulesManagerImpl.java | 20 +- .../VirtualNetworkApplianceManagerImpl.java | 9 +- .../src/com/cloud/vm/dao/DomainRouterDao.java | 6 + .../com/cloud/vm/dao/DomainRouterDaoImpl.java | 17 ++ 7 files changed, 250 insertions(+), 96 deletions(-) diff --git a/patches/systemvm/debian/config/root/loadbalancer.sh b/patches/systemvm/debian/config/root/loadbalancer.sh index b01cb38f497..223f1ad943f 100755 --- a/patches/systemvm/debian/config/root/loadbalancer.sh +++ b/patches/systemvm/debian/config/root/loadbalancer.sh @@ -32,15 +32,42 @@ usage() { # set -x -# check if gateway domain is up and running -check_gw() { - ping -c 1 -n -q $1 > /dev/null - if [ $? -gt 0 ] +# ensure that the nic has the public ip we are load balancing on +ip_entry() { + local added=$1 + local removed=$2 + + if [ "$added" == "none" ] then - sleep 1 - ping -c 1 -n -q $1 > /dev/null + added="" fi - return $?; + + if [ "$removed" == "none" ] + then + removed="" + fi + + local a=$(echo $added | cut -d, -f1- --output-delimiter=" ") + local r=$(echo $removed | cut -d, -f1- --output-delimiter=" ") + + for i in $a + do + local pubIp=$(echo $i | cut -d: -f1) + for vif in $VIF_LIST; do + ip addr add dev $vif $pubIp/32 + #ignore error since it is because the ip is already there + done + done + + for i in $r + do + local pubIp=$(echo $i | cut -d: -f1) + for vif in $VIF_LIST; do + ip addr del $pubIp/32 dev $vif + done + done + + return 0 } # firewall entry to ensure that haproxy can receive on specified port @@ -117,6 +144,10 @@ get_vif_list() { vif_list="$vif_list $vif"; fi done + if [ "$vif_list" == "" ] + then + vif_list="eth0" + fi echo $vif_list } @@ -148,16 +179,18 @@ do esac done +if [ "$addedIps" == "" ] +then + addedIps="none" +fi + +if [ "$removedIps" == "" ] +then + removedIps="none" +fi + VIF_LIST=$(get_vif_list) -# hot reconfigure haproxy -reconfig_lb $cfgfile - -if [ $? -gt 0 ] -then - printf "Reconfiguring loadbalancer failed\n" - exit 1 -fi if [ "$addedIps" == "" ] then @@ -169,6 +202,27 @@ then removedIps="none" fi +#FIXME: make this explicit via check on vm type or passed in flag +if [ "$VIF_LIST" == "eth0" ] +then + ip_entry $addedIps $removedIps +fi + + +# hot reconfigure haproxy +reconfig_lb $cfgfile + +if [ $? -gt 0 ] +then + printf "Reconfiguring loadbalancer failed\n" + #FIXME: make this explicit via check on vm type or passed in flag + if [ "$VIF_LIST" == "eth0" ] + then + ip_entry $removedIps $addedIps + fi + exit 1 +fi + # iptables entry to ensure that haproxy receives traffic fw_entry $addedIps $removedIps @@ -180,6 +234,12 @@ then # Revert iptables rules on DomR, with addedIps and removedIps swapped fw_entry $removedIps $addedIps + #FIXME: make this explicit via check on vm type or passed in flag + if [ "$VIF_LIST" == "eth0" ] + then + ip_entry $removedIps $addedIps + fi + exit 1 fi diff --git a/server/src/com/cloud/network/lb/ElasticLoadBalancerManager.java b/server/src/com/cloud/network/lb/ElasticLoadBalancerManager.java index 4c26d33c87e..3fa840e7f00 100644 --- a/server/src/com/cloud/network/lb/ElasticLoadBalancerManager.java +++ b/server/src/com/cloud/network/lb/ElasticLoadBalancerManager.java @@ -23,17 +23,20 @@ import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InsufficientCapacityException; import com.cloud.exception.ResourceUnavailableException; import com.cloud.network.Network; +import com.cloud.network.NetworkVO; import com.cloud.network.lb.LoadBalancingRule.LbDestination; import com.cloud.network.rules.FirewallRule; +import com.cloud.network.rules.LoadBalancer; import com.cloud.user.Account; public interface ElasticLoadBalancerManager { public static final int DEFAULT_ELB_VM_RAMSIZE = 512; // 512 MB public static final int DEFAULT_ELB_VM_CPU_MHZ = 500; // 500 MHz - public long deployLoadBalancerVM(Long networkId, Long accountId); public boolean applyLoadBalancerRules(Network network, List rules) - throws ResourceUnavailableException;; + throws ResourceUnavailableException; + + public void handleCreateLoadBalancerRule(LoadBalancer lb, Account caller); } diff --git a/server/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java b/server/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java index 33047ad3219..267c3e29070 100644 --- a/server/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java +++ b/server/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java @@ -18,6 +18,8 @@ package com.cloud.network.lb; import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -30,17 +32,25 @@ import org.apache.log4j.Logger; import com.cloud.agent.AgentManager; import com.cloud.agent.AgentManager.OnError; import com.cloud.agent.api.Answer; +import com.cloud.agent.api.routing.IpAssocCommand; import com.cloud.agent.api.routing.LoadBalancerConfigCommand; import com.cloud.agent.api.routing.NetworkElementCommand; +import com.cloud.agent.api.to.IpAddressTO; import com.cloud.agent.api.to.LoadBalancerTO; import com.cloud.agent.manager.Commands; import com.cloud.configuration.Config; import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.dc.DataCenter; +import com.cloud.dc.DataCenterVO; import com.cloud.dc.HostPodVO; +import com.cloud.dc.Pod; +import com.cloud.dc.PodVlanMapVO; +import com.cloud.dc.VlanVO; import com.cloud.dc.dao.ClusterDao; import com.cloud.dc.dao.DataCenterDao; import com.cloud.dc.dao.HostPodDao; +import com.cloud.dc.dao.PodVlanMapDao; +import com.cloud.dc.dao.VlanDao; import com.cloud.deploy.DataCenterDeployment; import com.cloud.deploy.DeployDestination; import com.cloud.exception.AgentUnavailableException; @@ -51,11 +61,15 @@ import com.cloud.exception.OperationTimedoutException; import com.cloud.exception.ResourceUnavailableException; import com.cloud.exception.StorageUnavailableException; import com.cloud.network.IPAddressVO; +import com.cloud.network.IpAddress; import com.cloud.network.LoadBalancerVO; import com.cloud.network.Network; import com.cloud.network.NetworkManager; import com.cloud.network.NetworkVO; +import com.cloud.network.PublicIpAddress; +import com.cloud.network.Network.GuestIpType; import com.cloud.network.Networks.BroadcastDomainType; +import com.cloud.network.addr.PublicIp; import com.cloud.network.dao.IPAddressDao; import com.cloud.network.dao.LoadBalancerDao; import com.cloud.network.dao.NetworkDao; @@ -65,6 +79,7 @@ import com.cloud.network.router.VirtualRouter; import com.cloud.network.router.VirtualRouter.Role; import com.cloud.network.rules.FirewallRule; import com.cloud.network.rules.FirewallRule.Purpose; +import com.cloud.network.rules.LoadBalancer; import com.cloud.offering.NetworkOffering; import com.cloud.offerings.NetworkOfferingVO; import com.cloud.offerings.dao.NetworkOfferingDao; @@ -81,6 +96,7 @@ import com.cloud.utils.Pair; import com.cloud.utils.component.Inject; import com.cloud.utils.component.Manager; import com.cloud.utils.db.DB; +import com.cloud.utils.net.NetUtils; import com.cloud.vm.DomainRouterVO; import com.cloud.vm.NicProfile; import com.cloud.vm.VirtualMachine; @@ -131,6 +147,12 @@ public class ElasticLoadBalancerManagerImpl implements ServiceOfferingDao _serviceOfferingDao = null; @Inject AccountService _accountService; + @Inject + LoadBalancerDao _lbDao; + @Inject + VlanDao _vlanDao; + @Inject + PodVlanMapDao _podVlanMapDao; String _name; @@ -142,39 +164,41 @@ public class ElasticLoadBalancerManagerImpl implements int _elasticLbVmRamSize; int _elasticLbvmCpuMHz; + private Long getPodIdForDirectIp(IPAddressVO ipAddr) { + List podVlanMaps = _podVlanMapDao.listPodVlanMapsByVlan(ipAddr.getVlanId()); + if (podVlanMaps.isEmpty()) { + return null; + } else { + return podVlanMaps.get(0).getPodId(); + } + } - - public long deployLoadBalancerVM(Long networkId, Long accountId) { /* ELB_TODO :need to remove hardcoded network id,account id,pod id , cluster id */ + public DomainRouterVO deployLoadBalancerVM(Long networkId, IPAddressVO ipAddr, Long accountId) { NetworkVO network = _networkDao.findById(networkId); - DataCenter dc = _dcDao.findById(network.getDataCenterId()); - + Long podId = getPodIdForDirectIp(ipAddr); + Pod pod = podId == null?null:_podDao.findById(podId); Map params = new HashMap( 1); params.put(VirtualMachineProfile.Param.RestartNetwork, true); Account owner = _accountService.getActiveAccount("system", new Long(1)); - DeployDestination dest = new DeployDestination(dc, null, null, null); - - s_logger.debug("About to deploy elastic LB vm if necessary"); + DeployDestination dest = new DeployDestination(dc, pod, null, null); + s_logger.debug("About to deploy elastic LB vm "); try { - VirtualRouter elbVm = deployELBVm(network, dest, owner, params); + DomainRouterVO elbVm = deployELBVm(network, dest, owner, params); s_logger.debug("ELB vm = " + elbVm); if (elbVm == null) { throw new InvalidParameterValueException("Could not deploy or find existing ELB VM"); } - DomainRouterVO elbRouterVm = _routerDao.findById(elbVm.getId()); - String publicIp = elbRouterVm.getGuestIpAddress(); - IPAddressVO ipvo = _ipAddressDao.findByIpAndSourceNetworkId(networkId, publicIp); - ipvo.setAssociatedWithNetworkId(networkId); - _ipAddressDao.update(ipvo.getId(), ipvo); - return ipvo.getId(); + return elbVm; + } catch (Throwable t) { String errorMsg = "Error while deploying Loadbalancer VM: " + t; s_logger.warn(errorMsg); - return 0; + return null; } } @@ -245,59 +269,58 @@ public class ElasticLoadBalancerManagerImpl implements // Send commands to router return sendCommandsToRouter(router, cmds); } + + protected DomainRouterVO findElbVmForLb(FirewallRule lb) {//TODO: use a table to lookup + List elbVms = _routerDao.listByNetworkAndRole(lb.getNetworkId(), Role.LB); + if (elbVms != null && elbVms.size() > 0) + return elbVms.get(0); + + return null; + } public boolean applyLoadBalancerRules(Network network, List rules) throws ResourceUnavailableException { - DomainRouterVO router = _routerDao.findByNetwork(network.getId());/* ELB_TODO :may have multiple LB's , need to get the correct LB based on network id and account id */ + if (rules == null || rules.isEmpty()) { + return true; + } + if (rules.get(0).getPurpose() != Purpose.LoadBalancing) { + s_logger.warn("Not handling non-LB firewall rules"); + return false; + } + + DomainRouterVO elbVm = findElbVmForLb(rules.get(0)); - if (router == null) { - s_logger.warn("Unable to apply lb rules, virtual router doesn't exist in the network " + if (elbVm == null) { + s_logger.warn("Unable to apply lb rules, ELB vm doesn't exist in the network " + network.getId()); throw new ResourceUnavailableException("Unable to apply lb rules", DataCenter.class, network.getDataCenterId()); } - if (router.getState() == State.Running) { - if (rules != null && !rules.isEmpty()) { - if (rules.get(0).getPurpose() == Purpose.LoadBalancing) { - // for elastic load balancer we have to resend all lb rules - // belonging to same sourceIpAddressId for the network - List lbs = _loadBalancerDao - .listByNetworkId(network.getId()); - List lbRules = new ArrayList(); - for (LoadBalancerVO lb : lbs) { - if (lb.getSourceIpAddressId() == rules.get(0) - .getSourceIpAddressId()) { - List dstList = _lbMgr - .getExistingDestinations(lb.getId()); - LoadBalancingRule loadBalancing = new LoadBalancingRule( - lb, dstList); - lbRules.add(loadBalancing); - } - } - - return applyLBRules(router, lbRules); - } else { - s_logger.warn("Unable to apply rules of purpose: " - + rules.get(0).getPurpose()); - return false; - } - } else { - return true; + if (elbVm.getState() == State.Running) { + //resend all rules for the public ip + List lbs = _lbDao.listByIpAddress(rules.get(0).getSourceIpAddressId()); + List lbRules = new ArrayList(); + for (LoadBalancerVO lb : lbs) { + List dstList = _lbMgr.getExistingDestinations(lb.getId()); + LoadBalancingRule loadBalancing = new LoadBalancingRule( + lb, dstList); + lbRules.add(loadBalancing); } - } else if (router.getState() == State.Stopped - || router.getState() == State.Stopping) { - s_logger.debug("Router is in " - + router.getState() - + ", so not sending apply firewall rules commands to the backend"); + return applyLBRules(elbVm, lbRules); + } else if (elbVm.getState() == State.Stopped + || elbVm.getState() == State.Stopping) { + s_logger.debug("ELB VM is in " + + elbVm.getState() + + ", so not sending apply LoadBalancing rules commands to the backend"); return true; } else { - s_logger.warn("Unable to apply firewall rules, virtual router is not in the right state " - + router.getState()); + s_logger.warn("Unable to apply loadbalancing rules, ELB VM is not in the right state " + + elbVm.getState()); throw new ResourceUnavailableException( - "Unable to apply firewall rules, virtual router is not in the right state", - VirtualRouter.class, router.getId()); + "Unable to apply loadbalancing rules, ELB VM is not in the right state", + VirtualRouter.class, elbVm.getId()); } } @@ -338,6 +361,10 @@ public class ElasticLoadBalancerManagerImpl implements return _name; } + private DomainRouterVO findELBVmWithCapacity(Network guestNetwork, IPAddressVO ipAddr) { + List elbVms = _routerDao.listByNetworkAndRole(guestNetwork.getId(), Role.LB); + return null; + } @DB public DomainRouterVO deployELBVm(Network guestNetwork, DeployDestination dest, Account owner, Map params) throws @@ -368,7 +395,7 @@ public class ElasticLoadBalancerManagerImpl implements : "Network is not yet fully implemented: "+ guestNetwork; DataCenterDeployment plan = null; - DomainRouterVO router = null; + DomainRouterVO elbVm = null; //router = _routerDao.findByNetworkAndPodAndRole(guestNetwork.getId(), podId, Role.LB); plan = new DataCenterDeployment(dcId, null, null, null, null); @@ -378,7 +405,7 @@ public class ElasticLoadBalancerManagerImpl implements // return null; // } - if (router == null) { + if (elbVm == null) { long id = _routerDao.getNextInSequence(Long.class, "id"); if (s_logger.isDebugEnabled()) { s_logger.debug("Creating the elastic LB vm " + id); @@ -396,19 +423,19 @@ public class ElasticLoadBalancerManagerImpl implements VMTemplateVO template = _templateDao.findSystemVMTemplate(dcId); - router = new DomainRouterVO(id, _elasticLbVmOffering.getId(), VirtualMachineName.getRouterName(id, _instance), template.getId(), template.getHypervisorType(), template.getGuestOSId(), + elbVm = new DomainRouterVO(id, _elasticLbVmOffering.getId(), VirtualMachineName.getRouterName(id, _instance), template.getId(), template.getHypervisorType(), template.getGuestOSId(), owner.getDomainId(), owner.getId(), guestNetwork.getId(), _elasticLbVmOffering.getOfferHA()); - router.setRole(Role.LB); - router = _itMgr.allocate(router, template, _elasticLbVmOffering, networks, plan, null, owner); + elbVm.setRole(Role.LB); + elbVm = _itMgr.allocate(elbVm, template, _elasticLbVmOffering, networks, plan, null, owner); } - State state = router.getState(); + State state = elbVm.getState(); if (state != State.Running) { - router = this.start(router, _accountService.getSystemUser(), _accountService.getSystemAccount(), params); + elbVm = this.start(elbVm, _accountService.getSystemUser(), _accountService.getSystemAccount(), params); } - return router; + return elbVm; } finally { _networkDao.releaseFromLockTable(guestNetworkId); } @@ -424,4 +451,50 @@ public class ElasticLoadBalancerManagerImpl implements } } + @Override + public void handleCreateLoadBalancerRule( LoadBalancer lb, Account account) { + long ipId = lb.getSourceIpAddressId(); + IPAddressVO ipAddr = _ipAddressDao.findById(ipId); + Long networkId= ipAddr.getSourceNetworkId(); + NetworkVO network=_networkDao.findById(networkId); + DomainRouterVO elbVm = null; + if (network.getGuestType() == GuestIpType.Direct) { + LoadBalancerVO lbvo; + lbvo = _lbDao.findByAccountAndName(account.getId(), lb.getName()); + if (lbvo == null) { + elbVm = findELBVmWithCapacity(network, ipAddr); + if (elbVm == null) { + elbVm = deployLoadBalancerVM(networkId, ipAddr, account.getId()); + } + IPAddressVO ipvo = _ipAddressDao.findById(ipId); + ipvo.setAssociatedWithNetworkId(networkId); + _ipAddressDao.update(ipvo.getId(), ipvo); + + } + + } + + } + + private void createAssociateIPCommand(final DomainRouterVO router, final Network network, final PublicIp ip, Commands cmds) { + + + IpAddressTO[] ipsToSend = new IpAddressTO[1]; + + IpAddressTO ipTO = new IpAddressTO(ip.getAddress().addr(), true, false, false, ip.getVlanTag(), ip.getVlanGateway(), ip.getVlanNetmask(), ip.getMacAddress(), null, 0); + ipTO.setTrafficType(network.getTrafficType()); + ipTO.setNetworkTags(network.getTags()); + ipsToSend[0] = ipTO; + + IpAssocCommand cmd = new IpAssocCommand(ipsToSend); + cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, router.getPrivateIpAddress()); + cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, router.getGuestIpAddress()); + cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); + DataCenterVO dcVo = _dcDao.findById(router.getDataCenterIdToDeployIn()); + cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString()); + + cmds.addCommand("IPAssocCommand", cmd); + + } + } diff --git a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java b/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java index d69adb008fa..a0a42f1259a 100755 --- a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java +++ b/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java @@ -353,24 +353,14 @@ public class LoadBalancingRulesManagerImpl implements LoadBalancingRulesManager, UserContext caller = UserContext.current(); long ipId = lb.getSourceIpAddressId(); + + + _elbMgr.handleCreateLoadBalancerRule(lb, caller.getCaller()); + + IPAddressVO ipAddr = _ipAddressDao.findById(ipId); Long networkId= ipAddr.getSourceNetworkId(); NetworkVO network=_networkDao.findById(networkId); - - if (network.getGuestType() == GuestIpType.Direct) { - LoadBalancerVO lbvo; - Account account = caller.getCaller(); - lbvo = _lbDao.findByAccountAndName(account.getId(), lb.getName()); - if (lbvo == null) { - _elbMgr.deployLoadBalancerVM(networkId, account.getId()); - IPAddressVO ipvo = _ipAddressDao.findById(ipId); - ipvo.setAssociatedWithNetworkId(networkId); - _ipAddressDao.update(ipvo.getId(), ipvo); - ipAddr.setAssociatedWithNetworkId(networkId); - } else { - - } - } // make sure ip address exists if (ipAddr == null || !ipAddr.readyToUse()) { throw new InvalidParameterValueException("Unable to create load balancer rule, invalid IP address id" + ipId); diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java index 52940e1df1c..227b88ac6f7 100755 --- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java +++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java @@ -812,7 +812,10 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian // In Basic zone and Guest network we have to start domR per pod, not per network if ((dc.getNetworkType() == NetworkType.Basic || guestNetwork.isSecurityGroupEnabled()) && guestNetwork.getTrafficType() == TrafficType.Guest) { - router = _routerDao.findByNetworkAndPod(guestNetwork.getId(), podId); + List dhcpServers = _routerDao.listByNetworkAndPodAndRole(guestNetwork.getId(), podId, Role.DHCP_USERDATA); + if (dhcpServers != null && dhcpServers.size() > 0) { + router = dhcpServers.get(0); + } plan = new DataCenterDeployment(dcId, podId, null, null, null); } else { router = _routerDao.findByNetwork(guestNetwork.getId()); @@ -852,7 +855,9 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian // In Basic zone and Guest network we have to start domR per pod, not per network if ((dc.getNetworkType() == NetworkType.Basic || guestNetwork.isSecurityGroupEnabled()) && guestNetwork.getTrafficType() == TrafficType.Guest) { - router = _routerDao.findByNetworkAndPod(guestNetwork.getId(), podId); + List routers = _routerDao.listByNetworkAndPodAndRole(guestNetwork.getId(), podId, Role.DHCP_USERDATA); + if (routers != null && routers.size() > 0) + router = routers.get(0); plan = new DataCenterDeployment(dcId, podId, null, null, null); } else { router = _routerDao.findByNetwork(guestNetwork.getId()); diff --git a/server/src/com/cloud/vm/dao/DomainRouterDao.java b/server/src/com/cloud/vm/dao/DomainRouterDao.java index 93cf692bd96..abbb729cb6e 100755 --- a/server/src/com/cloud/vm/dao/DomainRouterDao.java +++ b/server/src/com/cloud/vm/dao/DomainRouterDao.java @@ -91,4 +91,10 @@ public interface DomainRouterDao extends GenericDao { * @return */ List listByStateAndNetworkType(State state, GuestIpType ipType); + + List listByNetworkAndPodAndRole(long networkId, long podId, Role role); + + List listByNetworkAndRole(long networkId, Role role); + + } diff --git a/server/src/com/cloud/vm/dao/DomainRouterDaoImpl.java b/server/src/com/cloud/vm/dao/DomainRouterDaoImpl.java index 353e2c2479f..ed103d85eb5 100755 --- a/server/src/com/cloud/vm/dao/DomainRouterDaoImpl.java +++ b/server/src/com/cloud/vm/dao/DomainRouterDaoImpl.java @@ -194,4 +194,21 @@ public class DomainRouterDaoImpl extends GenericDaoBase im sc.setJoinParameters("network", "guestType", ipType); return listBy(sc); } + + @Override + public List listByNetworkAndPodAndRole(long networkId, long podId, Role role) { + SearchCriteria sc = AllFieldsSearch.create(); + sc.setParameters("network", networkId); + sc.setParameters("podId", podId); + sc.setParameters("role", role); + return listBy(sc); + } + + @Override + public List listByNetworkAndRole(long networkId, Role role) { + SearchCriteria sc = AllFieldsSearch.create(); + sc.setParameters("network", networkId); + sc.setParameters("role", role); + return listBy(sc); + } } From f27116c50e8383344273b7fa7e2bfb1a6f6e0893 Mon Sep 17 00:00:00 2001 From: Chiradeep Vittal Date: Mon, 25 Jul 2011 19:01:07 -0700 Subject: [PATCH 08/72] log haproxy changes to system log and auth --- .../debian/config/root/loadbalancer.sh | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/patches/systemvm/debian/config/root/loadbalancer.sh b/patches/systemvm/debian/config/root/loadbalancer.sh index 223f1ad943f..d620b58415c 100755 --- a/patches/systemvm/debian/config/root/loadbalancer.sh +++ b/patches/systemvm/debian/config/root/loadbalancer.sh @@ -52,18 +52,20 @@ ip_entry() { for i in $a do + logger -t cloud "Adding public ips for load balancing" local pubIp=$(echo $i | cut -d: -f1) for vif in $VIF_LIST; do - ip addr add dev $vif $pubIp/32 + sudo ip addr add dev $vif $pubIp/32 #ignore error since it is because the ip is already there done done for i in $r do + logger -t cloud "Removing public ips for deleted loadbalancers" local pubIp=$(echo $i | cut -d: -f1) for vif in $VIF_LIST; do - ip addr del $pubIp/32 dev $vif + sudo ip addr del $pubIp/32 dev $vif done done @@ -87,15 +89,16 @@ fw_entry() { local a=$(echo $added | cut -d, -f1- --output-delimiter=" ") local r=$(echo $removed | cut -d, -f1- --output-delimiter=" ") - + for i in $a do + logger -t cloud "Opening up firewall (INPUT chain) for load balancing" local pubIp=$(echo $i | cut -d: -f1) local dport=$(echo $i | cut -d: -f2) for vif in $VIF_LIST; do - iptables -D INPUT -i $vif -p tcp -d $pubIp --dport $dport -j ACCEPT 2> /dev/null - iptables -A INPUT -i $vif -p tcp -d $pubIp --dport $dport -j ACCEPT + sudo iptables -D INPUT -i $vif -p tcp -d $pubIp --dport $dport -j ACCEPT 2> /dev/null + sudo iptables -A INPUT -i $vif -p tcp -d $pubIp --dport $dport -j ACCEPT if [ $? -gt 0 ] then @@ -106,11 +109,12 @@ fw_entry() { for i in $r do + logger -t cloud "Closing up firewall (INPUT chain) for deleted load balancers" local pubIp=$(echo $i | cut -d: -f1) local dport=$(echo $i | cut -d: -f2) for vif in $VIF_LIST; do - iptables -D INPUT -i $vif -p tcp -d $pubIp --dport $dport -j ACCEPT + sudo iptables -D INPUT -i $vif -p tcp -d $pubIp --dport $dport -j ACCEPT done done @@ -125,6 +129,7 @@ reconfig_lb() { # Restore the HA Proxy to its previous state, and revert iptables rules on DomR restore_lb() { + logger -t cloud "Restoring HA Proxy to previous state" # Copy the old version of haproxy.cfg into the file that reconfigLB.sh uses cp /etc/haproxy/haproxy.cfg.old /etc/haproxy/haproxy.cfg.new @@ -228,15 +233,18 @@ fw_entry $addedIps $removedIps if [ $? -gt 0 ] then + logger -t cloud "Failed to apply firewall rules for load balancing, reverting HA Proxy config" # Restore the LB restore_lb + logger -t cloud "Reverting firewall config" # Revert iptables rules on DomR, with addedIps and removedIps swapped fw_entry $removedIps $addedIps #FIXME: make this explicit via check on vm type or passed in flag if [ "$VIF_LIST" == "eth0" ] then + logger -t cloud "Reverting ip address changes to eth0" ip_entry $removedIps $addedIps fi From b829cde18fcb598e7ff893e969a438d9c402c9b0 Mon Sep 17 00:00:00 2001 From: Chiradeep Vittal Date: Tue, 26 Jul 2011 15:48:02 -0700 Subject: [PATCH 09/72] track ip to vm mapping --- .../DefaultComponentLibrary.java | 3 + .../com/cloud/network/ElasticLbVmMapVO.java | 102 ++++++++++++++++++ .../lb/ElasticLoadBalancerManager.java | 4 +- .../lb/ElasticLoadBalancerManagerImpl.java | 91 +++++++++------- .../network/lb/dao/ElasticLbVmMapDao.java | 35 ++++++ .../network/lb/dao/ElasticLbVmMapDaoImpl.java | 88 +++++++++++++++ .../cloud/network/dao/ElbVmMapDaoTest.java | 20 ++++ setup/db/create-schema.sql | 11 ++ 8 files changed, 313 insertions(+), 41 deletions(-) create mode 100644 server/src/com/cloud/network/ElasticLbVmMapVO.java create mode 100644 server/src/com/cloud/network/lb/dao/ElasticLbVmMapDao.java create mode 100644 server/src/com/cloud/network/lb/dao/ElasticLbVmMapDaoImpl.java create mode 100644 server/test/com/cloud/network/dao/ElbVmMapDaoTest.java diff --git a/server/src/com/cloud/configuration/DefaultComponentLibrary.java b/server/src/com/cloud/configuration/DefaultComponentLibrary.java index b2259a0e226..eb2a0783b73 100644 --- a/server/src/com/cloud/configuration/DefaultComponentLibrary.java +++ b/server/src/com/cloud/configuration/DefaultComponentLibrary.java @@ -81,6 +81,7 @@ import com.cloud.network.dao.NetworkDomainDaoImpl; import com.cloud.network.dao.NetworkRuleConfigDaoImpl; import com.cloud.network.lb.ElasticLoadBalancerManagerImpl; import com.cloud.network.lb.LoadBalancingRulesManagerImpl; +import com.cloud.network.lb.dao.ElasticLbVmMapDaoImpl; import com.cloud.network.ovs.OvsNetworkManagerImpl; import com.cloud.network.ovs.OvsTunnelManagerImpl; import com.cloud.network.ovs.dao.GreTunnelDaoImpl; @@ -270,6 +271,8 @@ public class DefaultComponentLibrary extends ComponentLibraryBase implements Com addDao("DcDetailsDao", DcDetailsDaoImpl.class); addDao("SwiftDao", SwiftDaoImpl.class); addDao("AgentTransferMapDao", HostTransferMapDaoImpl.class); + addDao("ElasticLbVmMap", ElasticLbVmMapDaoImpl.class); + } @Override diff --git a/server/src/com/cloud/network/ElasticLbVmMapVO.java b/server/src/com/cloud/network/ElasticLbVmMapVO.java new file mode 100644 index 00000000000..394f3ac2793 --- /dev/null +++ b/server/src/com/cloud/network/ElasticLbVmMapVO.java @@ -0,0 +1,102 @@ +/** + * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +package com.cloud.network; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.PrimaryKeyJoinColumn; +import javax.persistence.SecondaryTable; +import javax.persistence.SecondaryTables; +import javax.persistence.Table; + +import com.cloud.utils.net.Ip; + +@Entity +@Table(name = ("elastic_lb_vm_map")) +@SecondaryTables({ + @SecondaryTable(name = "user_ip_address", pkJoinColumns = { @PrimaryKeyJoinColumn(name = "ip_addr_id", referencedColumnName = "id") }) + }) +public class ElasticLbVmMapVO { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") + private Long id; + + @Column(name = "lb_id") + private Long lbId; + + @Column(name = "ip_addr_id") + private long ipAddressId; + + @Column(name = "elb_vm_id") + private long elbVmId; + + /*@Column(name = "name", table = "load_balancing_rules", insertable = false, updatable = false) + private String lbName;*/ + + @Column(name = "public_ip_address", table = "user_ip_address", insertable = false, updatable = false) + @Enumerated(value=EnumType.STRING) + private Ip address = null; + + public ElasticLbVmMapVO() { + } + + public ElasticLbVmMapVO(long ipId, long elbVmId) { + this.ipAddressId = ipId; + this.elbVmId = elbVmId; + } + + public Long getId() { + return id; + } + + public long getLbId() { + return lbId; + } + + + public long getElbVmId() { + return elbVmId; + } + + +// public String getLbName() { +// return lbName; +// } + + + public long getIpAddressId() { + return ipAddressId; + } + + public void setLbId(Long lbId) { + this.lbId = lbId; + } + + public Ip getAddress() { + return address; + } + +} + diff --git a/server/src/com/cloud/network/lb/ElasticLoadBalancerManager.java b/server/src/com/cloud/network/lb/ElasticLoadBalancerManager.java index 3fa840e7f00..a7a65b16000 100644 --- a/server/src/com/cloud/network/lb/ElasticLoadBalancerManager.java +++ b/server/src/com/cloud/network/lb/ElasticLoadBalancerManager.java @@ -30,8 +30,8 @@ import com.cloud.network.rules.LoadBalancer; import com.cloud.user.Account; public interface ElasticLoadBalancerManager { - public static final int DEFAULT_ELB_VM_RAMSIZE = 512; // 512 MB - public static final int DEFAULT_ELB_VM_CPU_MHZ = 500; // 500 MHz + public static final int DEFAULT_ELB_VM_RAMSIZE = 128; // 512 MB + public static final int DEFAULT_ELB_VM_CPU_MHZ = 256; // 500 MHz public boolean applyLoadBalancerRules(Network network, List rules) diff --git a/server/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java b/server/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java index 267c3e29070..b2ddb990654 100644 --- a/server/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java +++ b/server/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java @@ -1,5 +1,5 @@ /** - * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. + * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved. * * This software is licensed under the GNU General Public License v3 or later. * @@ -18,8 +18,6 @@ package com.cloud.network.lb; import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -42,10 +40,8 @@ import com.cloud.configuration.Config; import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.dc.DataCenter; import com.cloud.dc.DataCenterVO; -import com.cloud.dc.HostPodVO; import com.cloud.dc.Pod; import com.cloud.dc.PodVlanMapVO; -import com.cloud.dc.VlanVO; import com.cloud.dc.dao.ClusterDao; import com.cloud.dc.dao.DataCenterDao; import com.cloud.dc.dao.HostPodDao; @@ -60,20 +56,19 @@ import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.OperationTimedoutException; import com.cloud.exception.ResourceUnavailableException; import com.cloud.exception.StorageUnavailableException; +import com.cloud.network.ElasticLbVmMapVO; import com.cloud.network.IPAddressVO; -import com.cloud.network.IpAddress; import com.cloud.network.LoadBalancerVO; import com.cloud.network.Network; +import com.cloud.network.Network.GuestIpType; import com.cloud.network.NetworkManager; import com.cloud.network.NetworkVO; -import com.cloud.network.PublicIpAddress; -import com.cloud.network.Network.GuestIpType; -import com.cloud.network.Networks.BroadcastDomainType; import com.cloud.network.addr.PublicIp; import com.cloud.network.dao.IPAddressDao; import com.cloud.network.dao.LoadBalancerDao; import com.cloud.network.dao.NetworkDao; import com.cloud.network.lb.LoadBalancingRule.LbDestination; +import com.cloud.network.lb.dao.ElasticLbVmMapDao; import com.cloud.network.router.VirtualNetworkApplianceManager; import com.cloud.network.router.VirtualRouter; import com.cloud.network.router.VirtualRouter.Role; @@ -83,7 +78,6 @@ import com.cloud.network.rules.LoadBalancer; import com.cloud.offering.NetworkOffering; import com.cloud.offerings.NetworkOfferingVO; import com.cloud.offerings.dao.NetworkOfferingDao; -import com.cloud.org.Cluster; import com.cloud.service.ServiceOfferingVO; import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.storage.VMTemplateVO; @@ -96,7 +90,7 @@ import com.cloud.utils.Pair; import com.cloud.utils.component.Inject; import com.cloud.utils.component.Manager; import com.cloud.utils.db.DB; -import com.cloud.utils.net.NetUtils; +import com.cloud.utils.db.Transaction; import com.cloud.vm.DomainRouterVO; import com.cloud.vm.NicProfile; import com.cloud.vm.VirtualMachine; @@ -153,6 +147,8 @@ public class ElasticLoadBalancerManagerImpl implements VlanDao _vlanDao; @Inject PodVlanMapDao _podVlanMapDao; + @Inject + ElasticLbVmMapDao _elbVmMapDao; String _name; @@ -271,11 +267,12 @@ public class ElasticLoadBalancerManagerImpl implements } protected DomainRouterVO findElbVmForLb(FirewallRule lb) {//TODO: use a table to lookup - List elbVms = _routerDao.listByNetworkAndRole(lb.getNetworkId(), Role.LB); - if (elbVms != null && elbVms.size() > 0) - return elbVms.get(0); - - return null; + ElasticLbVmMapVO map = _elbVmMapDao.findOneByIp(lb.getSourceIpAddressId()); + if (map == null) { + return null; + } + DomainRouterVO elbVm = _routerDao.findById(map.getElbVmId()); + return elbVm; } public boolean applyLoadBalancerRules(Network network, @@ -366,7 +363,6 @@ public class ElasticLoadBalancerManagerImpl implements return null; } - @DB public DomainRouterVO deployELBVm(Network guestNetwork, DeployDestination dest, Account owner, Map params) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException { long dcId = dest.getDataCenter().getId(); @@ -397,13 +393,7 @@ public class ElasticLoadBalancerManagerImpl implements DataCenterDeployment plan = null; DomainRouterVO elbVm = null; - //router = _routerDao.findByNetworkAndPodAndRole(guestNetwork.getId(), podId, Role.LB); - plan = new DataCenterDeployment(dcId, null, null, null, null); - - // } else { - // s_logger.debug("Not deploying elastic ip vm"); - // return null; - // } + plan = new DataCenterDeployment(dcId, dest.getPod().getId(), null, null, null); if (elbVm == null) { long id = _routerDao.getNextInSequence(Long.class, "id"); @@ -452,27 +442,50 @@ public class ElasticLoadBalancerManagerImpl implements } @Override + @DB public void handleCreateLoadBalancerRule( LoadBalancer lb, Account account) { + long ipId = lb.getSourceIpAddressId(); IPAddressVO ipAddr = _ipAddressDao.findById(ipId); Long networkId= ipAddr.getSourceNetworkId(); NetworkVO network=_networkDao.findById(networkId); - DomainRouterVO elbVm = null; - if (network.getGuestType() == GuestIpType.Direct) { - LoadBalancerVO lbvo; - lbvo = _lbDao.findByAccountAndName(account.getId(), lb.getName()); - if (lbvo == null) { - elbVm = findELBVmWithCapacity(network, ipAddr); - if (elbVm == null) { - elbVm = deployLoadBalancerVM(networkId, ipAddr, account.getId()); - } - IPAddressVO ipvo = _ipAddressDao.findById(ipId); - ipvo.setAssociatedWithNetworkId(networkId); - _ipAddressDao.update(ipvo.getId(), ipvo); - - } - + + if (network.getGuestType() != GuestIpType.Direct) { + s_logger.info("Elastic LB Manager: not handling guest traffic of type " + network.getGuestType()); + return; } + DomainRouterVO elbVm = null; + + LoadBalancerVO lbvo; + lbvo = _lbDao.findByAccountAndName(account.getId(), lb.getName()); + if (lbvo == null) { + elbVm = findELBVmWithCapacity(network, ipAddr); + if (elbVm == null) { + elbVm = deployLoadBalancerVM(networkId, ipAddr, account.getId()); + if (elbVm == null) { + s_logger.warn("Failed to deploy a new ELB vm for ip " + ipAddr + " in network " + network + "lb name=" + lb.getName()); + return; //TODO: throw exception + } + } + + } else { + ElasticLbVmMapVO elbVmMap = _elbVmMapDao.findOneByIp(lb.getSourceIpAddressId()); + if (elbVmMap != null) { + elbVm = _routerDao.findById(elbVmMap.getElbVmId()); + } + } + if (elbVm == null) { + s_logger.warn("No ELB VM can be found or deployed"); + return; + } + Transaction txn = Transaction.currentTxn(); + txn.start(); + IPAddressVO ipvo = _ipAddressDao.findById(ipId); + ipvo.setAssociatedWithNetworkId(networkId); + _ipAddressDao.update(ipvo.getId(), ipvo); + ElasticLbVmMapVO mapping = new ElasticLbVmMapVO(ipId, elbVm.getId()); + _elbVmMapDao.persist(mapping); + txn.commit(); } diff --git a/server/src/com/cloud/network/lb/dao/ElasticLbVmMapDao.java b/server/src/com/cloud/network/lb/dao/ElasticLbVmMapDao.java new file mode 100644 index 00000000000..50729f5647c --- /dev/null +++ b/server/src/com/cloud/network/lb/dao/ElasticLbVmMapDao.java @@ -0,0 +1,35 @@ +/** + * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +package com.cloud.network.lb.dao; + +import java.util.List; + +import com.cloud.network.ElasticLbVmMapVO; +import com.cloud.utils.db.GenericDao; + +public interface ElasticLbVmMapDao extends GenericDao { + ElasticLbVmMapVO findOneByLbIdAndElbVmId(long lbId, long elbVmId); + ElasticLbVmMapVO findOneByIpIdAndElbVmId(long ipId, long elbVmId); + ElasticLbVmMapVO findOneByIp(long ipId); + + List listByElbVmId(long elbVmId); + List listByLbId(long lbId); + int deleteLB(long lbId); + +} diff --git a/server/src/com/cloud/network/lb/dao/ElasticLbVmMapDaoImpl.java b/server/src/com/cloud/network/lb/dao/ElasticLbVmMapDaoImpl.java new file mode 100644 index 00000000000..71a5d4b5663 --- /dev/null +++ b/server/src/com/cloud/network/lb/dao/ElasticLbVmMapDaoImpl.java @@ -0,0 +1,88 @@ +/** + * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +package com.cloud.network.lb.dao; + +import java.util.List; + +import javax.ejb.Local; + +import com.cloud.network.ElasticLbVmMapVO; +import com.cloud.utils.db.GenericDaoBase; +import com.cloud.utils.db.SearchBuilder; +import com.cloud.utils.db.SearchCriteria; + +@Local(value={ElasticLbVmMapDao.class}) +public class ElasticLbVmMapDaoImpl extends GenericDaoBase implements ElasticLbVmMapDao { + private SearchBuilder AllFieldsSearch; + + protected ElasticLbVmMapDaoImpl() { + AllFieldsSearch = createSearchBuilder(); + AllFieldsSearch.and("ipId", AllFieldsSearch.entity().getIpAddressId(), SearchCriteria.Op.EQ); + AllFieldsSearch.and("lbId", AllFieldsSearch.entity().getLbId(), SearchCriteria.Op.EQ); + AllFieldsSearch.and("elbVmId", AllFieldsSearch.entity().getElbVmId(), SearchCriteria.Op.EQ); + AllFieldsSearch.done(); + + } + + @Override + public ElasticLbVmMapVO findOneByLbIdAndElbVmId(long lbId, long elbVmId) { + SearchCriteria sc = AllFieldsSearch.create(); + sc.setParameters("lbId", lbId); + sc.setParameters("elbVmId", elbVmId); + return findOneBy(sc); + } + + @Override + public List listByLbId(long lbId) { + SearchCriteria sc = AllFieldsSearch.create(); + sc.setParameters("lbId", lbId); + return listBy(sc); + } + + @Override + public List listByElbVmId(long elbVmId) { + SearchCriteria sc = AllFieldsSearch.create(); + sc.setParameters("elbVmId", elbVmId); + return listBy(sc); + } + + @Override + public int deleteLB(long lbId) { + SearchCriteria sc = AllFieldsSearch.create(); + sc.setParameters("lbId", lbId); + return super.expunge(sc); + } + + @Override + public ElasticLbVmMapVO findOneByIpIdAndElbVmId(long ipId, long elbVmId) { + SearchCriteria sc = AllFieldsSearch.create(); + sc.setParameters("ipId", ipId); + sc.setParameters("elbVmId", elbVmId); + return findOneBy(sc); + } + + @Override + public ElasticLbVmMapVO findOneByIp(long ipId) { + SearchCriteria sc = AllFieldsSearch.create(); + sc.setParameters("ipId", ipId); + return findOneBy(sc); + } + + +} diff --git a/server/test/com/cloud/network/dao/ElbVmMapDaoTest.java b/server/test/com/cloud/network/dao/ElbVmMapDaoTest.java new file mode 100644 index 00000000000..50dd7aefcf3 --- /dev/null +++ b/server/test/com/cloud/network/dao/ElbVmMapDaoTest.java @@ -0,0 +1,20 @@ +package com.cloud.network.dao; + +import junit.framework.TestCase; + +import com.cloud.network.ElasticLbVmMapVO; +import com.cloud.network.lb.dao.ElasticLbVmMapDaoImpl; +import com.cloud.utils.component.ComponentLocator; + +public class ElbVmMapDaoTest extends TestCase { + public void testTags() { + ElasticLbVmMapDaoImpl dao = ComponentLocator.inject(ElasticLbVmMapDaoImpl.class); + + ElasticLbVmMapVO map = dao.findOneByIp(3); + if (map == null) { + System.out.println("Not Found"); + } else { + System.out.println("Found"); + } + } +} diff --git a/setup/db/create-schema.sql b/setup/db/create-schema.sql index 3d49570ec02..329edd072bb 100755 --- a/setup/db/create-schema.sql +++ b/setup/db/create-schema.sql @@ -1542,4 +1542,15 @@ CREATE TABLE `cloud`.`op_host_transfer` ( CONSTRAINT `fk_op_host_transfer__future_mgmt_server_id` FOREIGN KEY `fk_op_host_transfer__future_mgmt_server_id`(`future_mgmt_server_id`) REFERENCES `mshost`(`msid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `cloud`.`elastic_lb_vm_map` ( + `id` bigint unsigned NOT NULL auto_increment, + `ip_addr_id` bigint unsigned NOT NULL, + `elb_vm_id` bigint unsigned NOT NULL, + `lb_id` bigint unsigned, + PRIMARY KEY (`id`), + CONSTRAINT `fk_elastic_lb_vm_map__ip_id` FOREIGN KEY `fk_elastic_lb_vm_map__ip_id` (`ip_addr_id`) REFERENCES `user_ip_address` (`id`) ON DELETE CASCADE, + CONSTRAINT `fk_elastic_lb_vm_map__elb_vm_id` FOREIGN KEY `fk_elastic_lb_vm_map__elb_vm_id` (`elb_vm_id`) REFERENCES `domain_router` (`id`) ON DELETE CASCADE, + CONSTRAINT `fk_elastic_lb_vm_map__lb_id` FOREIGN KEY `fk_elastic_lb_vm_map__lb_id` (`lb_id`) REFERENCES `load_balancing_rules` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + SET foreign_key_checks = 1; From 042c06fbb6ff7cb3fa3a864710ac568271cc550d Mon Sep 17 00:00:00 2001 From: Chiradeep Vittal Date: Wed, 27 Jul 2011 11:59:44 -0700 Subject: [PATCH 10/72] Make createLoadBalancer async --- .../commands/CreateLoadBalancerRuleCmd.java | 59 ++++++++----------- .../network/lb/LoadBalancingRulesService.java | 3 +- .../lb/ElasticLoadBalancerManager.java | 3 +- .../lb/ElasticLoadBalancerManagerImpl.java | 3 +- .../lb/LoadBalancingRulesManagerImpl.java | 3 +- 5 files changed, 31 insertions(+), 40 deletions(-) diff --git a/api/src/com/cloud/api/commands/CreateLoadBalancerRuleCmd.java b/api/src/com/cloud/api/commands/CreateLoadBalancerRuleCmd.java index 78fd2dc823f..ff7d9c5cc52 100644 --- a/api/src/com/cloud/api/commands/CreateLoadBalancerRuleCmd.java +++ b/api/src/com/cloud/api/commands/CreateLoadBalancerRuleCmd.java @@ -23,11 +23,13 @@ import java.util.List; import org.apache.log4j.Logger; import com.cloud.api.ApiConstants; +import com.cloud.api.BaseAsyncCmd; import com.cloud.api.BaseCmd; import com.cloud.api.Implementation; import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.api.response.LoadBalancerResponse; +import com.cloud.event.EventTypes; import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InsufficientAddressCapacityException; import com.cloud.exception.InvalidParameterValueException; @@ -38,10 +40,11 @@ import com.cloud.network.IpAddress; import com.cloud.network.rules.LoadBalancer; import com.cloud.user.Account; import com.cloud.user.UserContext; +import com.cloud.utils.StringUtils; import com.cloud.utils.net.NetUtils; @Implementation(description="Creates a load balancer rule", responseObject=LoadBalancerResponse.class) -public class CreateLoadBalancerRuleCmd extends BaseCmd implements LoadBalancer { +public class CreateLoadBalancerRuleCmd extends BaseAsyncCmd /*implements LoadBalancer */{ public static final Logger s_logger = Logger.getLogger(CreateLoadBalancerRuleCmd.class.getName()); private static final String s_name = "createloadbalancerruleresponse"; @@ -81,12 +84,10 @@ public class CreateLoadBalancerRuleCmd extends BaseCmd implements LoadBalancer /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// - @Override public String getAlgorithm() { return algorithm; } - @Override public String getDescription() { return description; } @@ -180,53 +181,26 @@ public class CreateLoadBalancerRuleCmd extends BaseCmd implements LoadBalancer this.setResponseObject(response); } - @Override - public long getId() { - throw new UnsupportedOperationException("not supported"); - } + - @Override - public String getXid() { - // FIXME: Should fix this. - return null; - } - - @Override - public long getSourceIpAddressId() { + public Long getSourceIpAddressId() { return publicIpId; } - @Override public int getSourcePortStart() { return publicPort.intValue(); } - @Override public int getSourcePortEnd() { return publicPort.intValue(); } - @Override public String getProtocol() { return NetUtils.TCP_PROTO; } - @Override - public Purpose getPurpose() { - return Purpose.LoadBalancing; - } + - @Override - public State getState() { - throw new UnsupportedOperationException("not supported"); - } - - @Override - public long getNetworkId() { - return -1; - } - - @Override public long getAccountId() { if (publicIpId != null) return _networkService.getIp(getPublicIpId()).getAccountId(); @@ -247,7 +221,6 @@ public class CreateLoadBalancerRuleCmd extends BaseCmd implements LoadBalancer return Account.ACCOUNT_ID_SYSTEM; } - @Override public long getDomainId() { if (publicIpId != null) return _networkService.getIp(getPublicIpId()).getDomainId(); @@ -257,12 +230,10 @@ public class CreateLoadBalancerRuleCmd extends BaseCmd implements LoadBalancer return UserContext.current().getCaller().getDomainId(); } - @Override public int getDefaultPortStart() { return privatePort.intValue(); } - @Override public int getDefaultPortEnd() { return privatePort.intValue(); } @@ -283,5 +254,21 @@ public class CreateLoadBalancerRuleCmd extends BaseCmd implements LoadBalancer public void setPublicIpId(Long publicIpId) { this.publicIpId = publicIpId; } + + @Override + public String getEventType() { + return EventTypes.EVENT_LOAD_BALANCER_CREATE; + } + + @Override + public String getEventDescription() { + return "creating load balancer: " + getName() + " account: " + getAccountName(); + + } + + public String getXid() { + /*FIXME*/ + return null; + } } diff --git a/api/src/com/cloud/network/lb/LoadBalancingRulesService.java b/api/src/com/cloud/network/lb/LoadBalancingRulesService.java index 1fb20959178..ae2eda46e6e 100644 --- a/api/src/com/cloud/network/lb/LoadBalancingRulesService.java +++ b/api/src/com/cloud/network/lb/LoadBalancingRulesService.java @@ -19,6 +19,7 @@ package com.cloud.network.lb; import java.util.List; +import com.cloud.api.commands.CreateLoadBalancerRuleCmd; import com.cloud.api.commands.ListLoadBalancerRuleInstancesCmd; import com.cloud.api.commands.ListLoadBalancerRulesCmd; import com.cloud.api.commands.UpdateLoadBalancerRuleCmd; @@ -33,7 +34,7 @@ public interface LoadBalancingRulesService { * @param cmd the command specifying the ip address, public port, protocol, private port, and algorithm * @return the newly created LoadBalancerVO if successful, null otherwise */ - LoadBalancer createLoadBalancerRule(LoadBalancer lb) throws NetworkRuleConflictException; + LoadBalancer createLoadBalancerRule(CreateLoadBalancerRuleCmd lb) throws NetworkRuleConflictException; LoadBalancer updateLoadBalancerRule(UpdateLoadBalancerRuleCmd cmd); diff --git a/server/src/com/cloud/network/lb/ElasticLoadBalancerManager.java b/server/src/com/cloud/network/lb/ElasticLoadBalancerManager.java index a7a65b16000..7bac4d97b49 100644 --- a/server/src/com/cloud/network/lb/ElasticLoadBalancerManager.java +++ b/server/src/com/cloud/network/lb/ElasticLoadBalancerManager.java @@ -19,6 +19,7 @@ package com.cloud.network.lb; import java.util.List; +import com.cloud.api.commands.CreateLoadBalancerRuleCmd; import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InsufficientCapacityException; import com.cloud.exception.ResourceUnavailableException; @@ -37,6 +38,6 @@ public interface ElasticLoadBalancerManager { List rules) throws ResourceUnavailableException; - public void handleCreateLoadBalancerRule(LoadBalancer lb, Account caller); + public void handleCreateLoadBalancerRule(CreateLoadBalancerRuleCmd lb, Account caller); } diff --git a/server/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java b/server/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java index b2ddb990654..345997978c8 100644 --- a/server/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java +++ b/server/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java @@ -36,6 +36,7 @@ import com.cloud.agent.api.routing.NetworkElementCommand; import com.cloud.agent.api.to.IpAddressTO; import com.cloud.agent.api.to.LoadBalancerTO; import com.cloud.agent.manager.Commands; +import com.cloud.api.commands.CreateLoadBalancerRuleCmd; import com.cloud.configuration.Config; import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.dc.DataCenter; @@ -443,7 +444,7 @@ public class ElasticLoadBalancerManagerImpl implements @Override @DB - public void handleCreateLoadBalancerRule( LoadBalancer lb, Account account) { + public void handleCreateLoadBalancerRule( CreateLoadBalancerRuleCmd lb, Account account) { long ipId = lb.getSourceIpAddressId(); IPAddressVO ipAddr = _ipAddressDao.findById(ipId); diff --git a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java b/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java index a0a42f1259a..6cca151b226 100755 --- a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java +++ b/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java @@ -30,6 +30,7 @@ import javax.naming.ConfigurationException; import org.apache.log4j.Logger; +import com.cloud.api.commands.CreateLoadBalancerRuleCmd; import com.cloud.api.commands.ListLoadBalancerRuleInstancesCmd; import com.cloud.api.commands.ListLoadBalancerRulesCmd; import com.cloud.api.commands.UpdateLoadBalancerRuleCmd; @@ -349,7 +350,7 @@ public class LoadBalancingRulesManagerImpl implements LoadBalancingRulesManager, @Override @ActionEvent(eventType = EventTypes.EVENT_LOAD_BALANCER_CREATE, eventDescription = "creating load balancer") - public LoadBalancer createLoadBalancerRule(LoadBalancer lb) throws NetworkRuleConflictException { + public LoadBalancer createLoadBalancerRule(CreateLoadBalancerRuleCmd lb) throws NetworkRuleConflictException { UserContext caller = UserContext.current(); long ipId = lb.getSourceIpAddressId(); From 5a3dd612455ad0550f7510332ebaa7ea39a74643 Mon Sep 17 00:00:00 2001 From: Jessica Wang Date: Wed, 27 Jul 2011 14:00:02 -0700 Subject: [PATCH 11/72] cloudStack - update localization labels. --- .../classes/resources/messages.properties | 34 +- .../classes/resources/messages_es.properties | 37 +- .../classes/resources/messages_ja.properties | 329 ++++++++++-------- .../resources/messages_zh_CN.properties | 35 +- 4 files changed, 275 insertions(+), 160 deletions(-) diff --git a/client/WEB-INF/classes/resources/messages.properties b/client/WEB-INF/classes/resources/messages.properties index e11ec462366..929d752b411 100644 --- a/client/WEB-INF/classes/resources/messages.properties +++ b/client/WEB-INF/classes/resources/messages.properties @@ -2,17 +2,43 @@ -#Labels -label.default.use=Default Use +#Labels +image.directory=Image Directory + +label.action.create.template.from.vm=Create Template from VM +label.action.create.template.from.volume=Create Template from Volume + +message.vm.create.template.confirm=Create Template will reboot the VM automatically. + +label.action.manage.cluster=Manage Cluster +message.action.manage.cluster=Please confirm that you want to manage the cluster. +label.action.manage.cluster.processing=Managing Cluster.... + +label.action.unmanage.cluster=Unmanage Cluster +message.action.unmanage.cluster=Please confirm that you want to unmanage the cluster. +label.action.unmanage.cluster.processing=Unmanaging Cluster.... + +allocation.state=Allocation State +managed.state=Managed State + +label.default.use=Default Use label.host.tags=Host Tags -label.storage.tags=Storage Tags + label.cidr=CIDR label.cidr.list=Source CIDR +label.storage.tags=Storage Tags + +label.redundant.router=Redundant Router +label.is.redundant.router=Redundant + force.delete=Force Delete force.delete.domain.warning=Warning: Choosing this option will cause the deletion of all child domains and all associated accounts and their resources. +force.remove=Force Remove +force.remove.host.warning=Warning: Choosing this option will cause CloudStack to forcefully stop all running virtual machines before removing this host from the cluster. + force.stop=Force Stop force.stop.instance.warning=Warning: Forcing a stop on this instance should be your last option. It can lead to data loss as well as inconsistent behavior of the virtual machine's state. Please consult with the Administrator Guide or Cloud.com Support before executing this command. @@ -99,12 +125,14 @@ label.action.update.resource.count.processing=Updating Resource Count.... label.action.delete.domain=Delete Domain label.action.delete.domain.processing=Deleting Domain.... + label.action.delete.firewall.processing=Deleting Firewall.... label.action.delete.firewall=Delete Firewall label.action.delete.ingress.rule.processing=Deleting Ingress Rule.... label.action.delete.ingress.rule=Delete Ingress Rule label.action.delete.load.balancer.processing=Deleting Load Balancer.... label.action.delete.load.balancer=Delete Load Balancer +label.action.edit.network.processing=Editing Network.... label.action.edit.network=Edit Network label.action.delete.network.processing=Deleting Network.... label.action.delete.network=Delete Network diff --git a/client/WEB-INF/classes/resources/messages_es.properties b/client/WEB-INF/classes/resources/messages_es.properties index 839bcf57068..0895551cf0c 100644 --- a/client/WEB-INF/classes/resources/messages_es.properties +++ b/client/WEB-INF/classes/resources/messages_es.properties @@ -2,17 +2,46 @@ -#Labels -label.default.use=Usar por defecto +#Labels +image.directory=Directorio de la imagen + +label.action.create.template.from.vm=Crear plantilla de VM +label.action.create.template.from.volume=Crear plantilla de volumen + +message.vm.create.template.confirm=Crear plantilla de la máquina virtual se reiniciará automáticamente. + +label.action.manage.cluster=gestionar racimo +message.action.manage.cluster=Por favor, confirme que desea para administrar el clúster. +label.action.manage.cluster.processing=La gestión de clústeres .... + +label.action.unmanage.cluster=Unmanage racimo +message.action.unmanage.cluster=Por favor, confirme que desea unmanage del clúster. +label.action.unmanage.cluster.processing=Unmanaging Grupo .... + +allocation.state=asignación del Estado +managed.state=Estado logró + +label.default.use=Usar por defecto label.host.tags=etiquetas de la máquina -label.storage.tags=Etiquetas de almacenamiento + label.cidr=CIDR -label.cidr.list=Fuente CIDR +label.cidr.list=fuente CIDR + +label.storage.tags=Etiquetas de almacenamiento + +label.redundant.router=enrutador redundante +label.is.redundant.router=redundante force.delete=Fuerza Borrar force.delete.domain.warning=Advertencia: Si elige esta opción, la supresión de todos los dominios secundarios y todas las cuentas asociadas y sus recursos. +force.remove=Fuerza Retire +force.remove.host.warning=Advertencia: Si elige esta opción, CloudStack para detener la fuerza todas las máquinas virtuales en ejecución antes de retirar este host del clúster. + +force.stop=Grupo de Alto +force.stop.instance.warning=Advertencia: Obligar a una parada en este caso debería ser su última opción. Puede conducir a la pérdida de datos, así como un comportamiento incoherente del estado de la máquina virtual. Por favor, consulte con la Guía del administrador o al Cloud.com antes de ejecutar este comando. + label.PreSetup=PreSetup label.SR.name = SR Nombre de etiqueta label.SharedMountPoint = SharedMountPoint diff --git a/client/WEB-INF/classes/resources/messages_ja.properties b/client/WEB-INF/classes/resources/messages_ja.properties index d2d6059878e..23cbf984189 100644 --- a/client/WEB-INF/classes/resources/messages_ja.properties +++ b/client/WEB-INF/classes/resources/messages_ja.properties @@ -2,55 +2,84 @@ -#Labels -label.default.use=デフォルトã®ä½¿ç”¨ -label.host.tags=ホストã®ã‚¿ã‚° -label.storage.tags=ストレージタグ +#Labels +image.directory=ç”»åƒãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª + +label.action.create.template.from.vm=VMã‹ã‚‰ã®ãƒ†ãƒ³ãƒ—レートを作æˆã™ã‚‹ +label.action.create.template.from.volume=ボリュームã‹ã‚‰ã®ãƒ†ãƒ³ãƒ—レートを作æˆã™ã‚‹ + +message.vm.create.template.confirm=テンプレートã®ä½œæˆã¯è‡ªå‹•çš„ã«VMã‚’å†èµ·å‹•ã—ã¾ã™ã€‚ + +label.action.manage.cluster=ã‚¯ãƒ©ã‚¹ã‚¿ç®¡ç† +message.action.manage.cluster=クラスタを管ç†ç™»éŒ²ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹? +label.action.manage.cluster.processing=クラスタを管ç†ç™»éŒ²ã—ã¦ã„ã¾ã™.... + +label.action.unmanage.cluster=éžç®¡ç†å¯¾è±¡ã‚¯ãƒ©ã‚¹ã‚¿ +message.action.unmanage.cluster=クラスタをéžç®¡ç†å¯¾è±¡ã«ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹? +label.action.unmanage.cluster.processing=クラスタをéžç®¡ç†å¯¾è±¡ã«ã—ã¦ã„ã¾ã™.... + +allocation.state=アロケーション状態 +managed.state=管ç†ã•れãŸçŠ¶æ…‹ + +label.default.use=デフォルト使用 +label.host.tags=ホストタグ + label.cidr=CIDR -label.cidr.list=æ ¹æº CIDR +label.cidr.list=ソースCIDR + +label.storage.tags=ストレージタグ + +label.redundant.router=冗長化ルータ +label.is.redundant.router=冗長 force.delete=強制削除 -force.delete.domain.warning=警告:ã“ã®ã‚ªãƒ—ã‚·ãƒ§ãƒ³ã‚’é¸æŠžã™ã‚‹ã¨ã™ã¹ã¦ã®å­ãƒ‰ãƒ¡ã‚¤ãƒ³ãŠã‚ˆã³é–¢é€£ã™ã‚‹ã™ã¹ã¦ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã¨ãã®ãƒªã‚½ãƒ¼ã‚¹ã®å‰Šé™¤ãŒç™ºç”Ÿã—ã¾ã™ã€‚ +force.delete.domain.warning=警告:ã“ã®ã‚ªãƒ—ã‚·ãƒ§ãƒ³ã‚’é¸æŠžã™ã‚‹ã¨ã€ã™ã¹ã¦ã®å­ãƒ‰ãƒ¡ã‚¤ãƒ³ãŠã‚ˆã³é–¢é€£ã™ã‚‹ã™ã¹ã¦ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã¨ãã®ãƒªã‚½ãƒ¼ã‚¹ã¯å‰Šé™¤ã•れã¾ã™ã€‚ + +force.remove=強制削除 +force.remove.host.warning=警告:ã“ã®ã‚ªãƒ—ã‚·ãƒ§ãƒ³ã‚’é¸æŠžã™ã‚‹ã¨ã€å®Ÿè¡Œä¸­ã®ã™ã¹ã¦ã®ä»®æƒ³ãƒžã‚·ãƒ³ã‚’強制的ã«åœæ­¢ã—ã¦ã€ã‚¯ãƒ©ã‚¹ã‚¿ã‹ã‚‰ãƒ›ã‚¹ãƒˆã‚’削除ã—ã¾ã™ã€‚ + +force.stop=å¼·åˆ¶åœæ­¢ +force.stop.instance.warning=警告:ã“ã®ã‚ªãƒ—ションã¯ä»–ã«é¸æŠžè‚¢ãŒç„¡ã„å ´åˆã«é¸æŠžã—ã¦ãã ã•ã„。インスタンスã®å¼·åˆ¶åœæ­¢ã¯ãƒ‡ãƒ¼ã‚¿ã®æå¤±ã ã‘ã§ãªãã€ä»®æƒ³ãƒžã‚·ãƒ³ã®çŠ¶æ…‹ã®ä¸€è²«æ€§ã‚’失ã†äº‹ãŒã‚りã¾ã™ã€‚ã“ã®æ“作を行ã†å‰ã«ã€ç®¡ç†è€…ガイドをå‚ç…§ã•れるã‹ã€ã¾ãŸã¯Cloud.comサãƒãƒ¼ãƒˆã«ã”連絡ãã ã•ã„。 label.PreSetup=PreSetup -label.SR.name=SRã®å -レーベル +label.SR.name=SRå-ラベル label.SharedMountPoint = SharedMountPoint -label.VMFS.datastore=VMFS データ ストア +label.VMFS.datastore=VMFSデータストア label.network.device=ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒ‡ãƒã‚¤ã‚¹ -label.add.network.device=ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒ‡ãƒã‚¤ã‚¹ã‚’追加ã—ã¾ã™ã€‚ +label.add.network.device=ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒ‡ãƒã‚¤ã‚¹è¿½åŠ  label.network.device.type=ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒ‡ãƒã‚¤ã‚¹ã®ç¨®é¡ž -label.DHCP.server.type=DHCPサーãƒãƒ¼ã®ç¨®é¡ž -label.Pxe.server.type=PXEサーãƒãƒ¼ã‚¿ã‚¤ãƒ— -label.PING.storage.IP=PINGをストレージã®IP -label.PING.dir=PINGをディレクトリ -label.TFTP.dir=TFTPã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª -label.PING.CIFS.username=PING CIFS ユーザーå +label.DHCP.server.type=DHCPサーãƒã®ç¨®é¡ž +label.Pxe.server.type=PXEサーãƒã®ç¨®é¡ž +label.PING.storage.IP=PING対象ストレージã®IPアドレス +label.PING.dir=PING対象ディレクトリ +label.TFTP.dir=TFTP対象ディレクトリ +label.PING.CIFS.username=PING CIFS ユーザå label.PING.CIFS.password=PING CIFS パスワード label.CPU.cap=CPU Cap label.network.domain=ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒ‰ãƒ¡ã‚¤ãƒ³ -label.action.enable.zone=ゾーンを有効ã«ã™ã‚‹ -label.action.enable.zone.processing=有効ゾーン.... +label.action.enable.zone=ゾーン有効化 +label.action.enable.zone.processing=ゾーンを有効化ã—ã¦ã„ã¾ã™.... message.action.enable.zone=ã“ã®ã‚¾ãƒ¼ãƒ³ã‚’有効ã«ã™ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。 -label.action.disable.zone=無効ゾーン -label.action.disable.zone.processing=無効ゾーン.... +label.action.disable.zone=ゾーン無効化 +label.action.disable.zone.processing=ゾーンを無効化ã—ã¦ã„ã¾ã™.... message.action.disable.zone=ã“ã®ã‚¾ãƒ¼ãƒ³ã‚’無効ã«ã™ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。 -label.action.enable.pod=有効ãƒãƒƒãƒ‰ -label.action.enable.pod.processing=有効ãƒãƒƒãƒ‰.... -message.action.enable.pod=ã“ã®ãƒãƒƒãƒ‰ã‚’有効ã«ã™ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。 -label.action.disable.pod=無効ãƒãƒƒãƒ‰ -label.action.disable.pod.processing=無効ãƒãƒƒãƒ‰.... -message.action.disable.pod=ã“ã®ãƒãƒƒãƒ‰ã‚’無効ã«ã™ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。 +label.action.enable.pod=Pod有効化 +label.action.enable.pod.processing=Podを有効化ã—ã¦ã„ã¾ã™.... +message.action.enable.pod=ã“ã®Podを有効ã«ã™ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。 +label.action.disable.pod=Pod無効化 +label.action.disable.pod.processing=Podを無効化ã—ã¦ã„ã¾ã™.... +message.action.disable.pod=ã“ã®Podを無効ã«ã™ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。 -label.action.enable.cluster=を有効ã«ã™ã‚‹ã‚¯ãƒ©ã‚¹ã‚¿ -label.action.enable.cluster.processing=有効ã«ã™ã‚‹ã‚¯ãƒ©ã‚¹ã‚¿.... +label.action.enable.cluster=クラスタ有効化 +label.action.enable.cluster.processing=クラスタを有効化ã—ã¦ã„ã¾ã™.... message.action.enable.cluster=ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã‚’有効ã«ã™ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。 -label.action.disable.cluster=無効クラスタ -label.action.disable.cluster.processing=無効ã«ã™ã‚‹ã‚¯ãƒ©ã‚¹ã‚¿.... +label.action.disable.cluster=クラスタ無効化 +label.action.disable.cluster.processing=クラスタを無効化ã—ã¦ã„ã¾ã™.... message.action.disable.cluster=ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã‚’無効ã«ã™ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。 label.account =アカウント @@ -58,9 +87,9 @@ label.account.id =アカウントID label.account.name =アカウントå label.account.specific =アカウント固有 label.accounts =アカウント -label.acquire.new.ip =æ–°è¦å–å¾—IP -label.show.ingress.rule=表示イングレスルール -label.hide.ingress.rule=éš ã™ã‚¤ãƒ³ã‚°ãƒ¬ã‚¹ãƒ«ãƒ¼ãƒ« +label.acquire.new.ip =æ–°è¦IPアドレスå–å¾— +label.show.ingress.rule=イングレスルールを表示ã™ã‚‹ +label.hide.ingress.rule=イングレスルールを表示ã—ãªã„ label.action.attach.disk.processing =ディスクをアタッãƒã—ã¦ã„ã¾ã™.... label.action.attach.disk=ディスクをアタッムlabel.action.attach.iso.processing =ISOをアタッãƒã—ã¦ã„ã¾ã™.... @@ -80,10 +109,10 @@ label.action.create.vm.processing= VMを作æˆã—ã¦ã„ã¾ã™.... label.action.create.vm=VMä½œæˆ label.action.create.volume.processing =ボリュームを作æˆã—ã¦ã„ã¾ã™.... label.action.create.volume=ãƒœãƒªãƒ¥ãƒ¼ãƒ ä½œæˆ -label.action.delete.IP.range =IPレンジ削除 -label.action.delete.IP.range.processing=IPレンジを削除ã—ã¦ã„ã¾ã™.... +label.action.delete.IP.range =IPアドレス範囲削除 +label.action.delete.IP.range.processing=IPアドレス範囲を削除ã—ã¦ã„ã¾ã™.... label.action.delete.ISO =ISO削除 -label.action.delete.ISO.processing=ISOイメージを削除ã—ã¦ã„ã¾ã™.... +label.action.delete.ISO.processing=ISOを削除ã—ã¦ã„ã¾ã™.... label.action.delete.account =アカウント削除 label.action.delete.account.processing=アカウントを削除ã—ã¦ã„ã¾ã™.... label.action.delete.cluster =クラスタ削除 @@ -97,7 +126,7 @@ label.action.update.resource.count.processing=リソースã®ã‚«ã‚¦ãƒ³ãƒˆã‚’æ›´ label.action.delete.domain =ドメイン削除 label.action.delete.domain.processing=ドメインを削除ã—ã¦ã„ã¾ã™.... label.action.delete.firewall =ファイアウォール削除 -label.action.delete.firewall.processing=Firewallを削除ã—ã¦ã„ã¾ã™.... +label.action.delete.firewall.processing=ファイアウォールを削除ã—ã¦ã„ã¾ã™.... label.action.delete.ingress.rule =イングレスルール削除 label.action.delete.ingress.rule.processing=イングレスルールを削除ã—ã¦ã„ã¾ã™.... label.action.delete.load.balancer =ロードãƒãƒ©ãƒ³ã‚µå‰Šé™¤ @@ -124,14 +153,14 @@ label.action.delete.user.processing =ユーザを削除ã—ã¦ã„ã¾ã™.... label.action.delete.volume =ボリューム削除 label.action.delete.volume.processing =ボリュームを削除ã—ã¦ã„ã¾ã™.... label.action.delete.zone =Zone削除 -label.action.delete.zone.processing=Zpneを削除ã—ã¦ã„ã¾ã™.... +label.action.delete.zone.processing=Zoneを削除ã—ã¦ã„ã¾ã™.... label.action.destroy.instance =インスタンス破棄 label.action.destroy.instance.processing =インスタンスを破棄ã—ã¦ã„ã¾ã™.... -label.action.destroy.systemvm.processing=破棄システムVM.... -label.action.destroy.systemvm=破壊システムVM -label.action.detach.disk =デタッãƒãƒ‡ã‚£ã‚¹ã‚¯ +label.action.destroy.systemvm.processing=システムVMを破棄ã—ã¦ã„ã¾ã™.... +label.action.destroy.systemvm=システムVM破棄 +label.action.detach.disk =ディスクをデタッムlabel.action.detach.disk.processing =ディスクをデタッãƒã—ã¦ã„ã¾ã™.... -label.action.detach.iso =ISOデタッム+label.action.detach.iso =ISOをデタッムlabel.action.detach.iso.processing =ISOをデタッãƒã—ã¦ã„ã¾ã™.... label.action.disable.account =アカウント無効化 label.action.disable.account.processing =アカウントを無効化ã—ã¦ã„ã¾ã™.... @@ -159,9 +188,9 @@ label.action.edit.user=ユーザ編集 label.action.edit.zone=Zone編集 label.action.enable.account =アカウント有効化 label.action.enable.account.processing =アカウントを有効ã«ã—ã¦ã„ã¾ã™.... -label.action.enable.maintenance.mode =メンテナンスモードを有効化ã—ã¦ã„ã¾ã™ -label.action.enable.maintenance.mode.processing =メンテナンスモードを有効化ã—ã¦ã„ã¾ã™.... -label.action.enable.static.NAT =スタティックNATを有効化ã—ã¦ã„ã¾ã™ +label.action.enable.maintenance.mode =メンテナンスモードã«ç§»è¡Œ +label.action.enable.maintenance.mode.processing =メンテナンスモードã«ç§»è¡Œã—ã¦ã„ã¾ã™.... +label.action.enable.static.NAT =スタティックNAT有効化 label.action.enable.static.NAT.processing =スタティックNATを有効化ã—ã¦ã„ã¾ã™.... label.action.enable.user =ユーザ有効化 label.action.enable.user.processing =ユーザを有効化ã—ã¦ã„ã¾ã™.... @@ -171,17 +200,17 @@ label.action.generate.keys =ã‚­ãƒ¼ç”Ÿæˆ label.action.generate.keys.processing =キーを生æˆã—ã¦ã„ã¾ã™.... label.action.lock.account =アカウントロック label.action.lock.account.processing =アカウントをロックã—ã¦ã„ã¾ã™.... -label.action.migrate.instance=移行インスタンス -label.action.migrate.instance.processing = 移行インスタンス.... +label.action.migrate.instance=インスタンス移行 +label.action.migrate.instance.processing = インスタンスを移行ã—ã¦ã„ã¾ã™.... label.action.reboot.instance =インスタンスå†èµ·å‹• label.action.reboot.instance.processing =インスタンスをå†èµ·å‹•ã—ã¦ã„ã¾ã™.... label.action.reboot.router =ルータå†èµ·å‹• label.action.reboot.router.processing =ルータをå†èµ·å‹•ã—ã¦ã„ã¾ã™.... label.action.reboot.systemvm =システムVMå†èµ·å‹• label.action.reboot.systemvm.processing =システムVMã‚’å†èµ·å‹•ã—ã¦ã„ã¾ã™.... -label.action.recurring.snapshot =循環スナップショット -label.action.release.ip =IP解放 -label.action.release.ip.processing =IPを解放ã—ã¦ã„ã¾ã™.... +label.action.recurring.snapshot =定期スナップショット +label.action.release.ip =IPアドレス解放 +label.action.release.ip.processing =IPアドレスを解放ã—ã¦ã„ã¾ã™.... label.action.remove.host.processing =ホストを削除ã—ã¦ã„ã¾ã™.... label.action.remove.host=ホスト削除 label.action.reset.password =パスワードリセット @@ -203,7 +232,7 @@ label.action.stop.systemvm =システムVMåœæ­¢ label.action.stop.systemvm.processing =システムVMを指定ã—ã¦ã„ã¾ã™.... label.action.take.snapshot.processing=スナップショットを作æˆã—ã¦ã„ã¾ã™.... label.action.take.snapshot=ã‚¹ãƒŠãƒƒãƒ—ã‚·ãƒ§ãƒƒãƒˆä½œæˆ -label.action.update.OS.preference = OS環境設定アップデート +label.action.update.OS.preference = OS優先設定アップデート label.action.update.OS.preference.processing =OS優先設定をアップデートã—ã¦ã„ã¾ã™.... label.actions =アクション label.active.sessions =アクティブセッション @@ -212,13 +241,13 @@ label.add.account =アカウント追加 label.add.by.cidr=CIDR毎追加 label.add.by.group =グループ毎追加 label.add.cluster =クラスタ追加 -label.add.direct.iprange =ダイレクトIPレンジ追加 +label.add.direct.iprange =ダイレクトIPアドレス範囲追加 label.add.disk.offering =ディスクオファリング追加 label.add.domain =ドメイン追加 label.add.firewall =ファイアウォール追加 label.add.host = ホスト追加 label.add.ingress.rule =イングレスルール追加 -label.add.ip.range =IPアドレスレンジ追加 +label.add.ip.range =IPアドレス範囲追加 label.add.iso =ISO追加 label.add.load.balancer =ロードãƒãƒ©ãƒ³ã‚µè¿½åŠ  label.add.more=ãã®ä»–追加 @@ -252,40 +281,40 @@ label.algorithm =アルゴリズム label.allocated=割り当㦠label.api.key = APIキー label.assign.to.load.balancer =ロードãƒãƒ©ãƒ³ã‚µã«ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã‚’割り当ã¦ã¦ã„ã¾ã™ -label.assign=割り当㦠+label.assign=割り当㦠label.associated.network.id =関連ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ID label.attached.iso=アタッãƒã•れãŸISO -label.availability =å¯ç”¨æ€§ -label.availability.zone =å¯ç”¨æ€§Zone +label.availability =アベイラビリティ +label.availability.zone =アベイラビリティZone label.available.public.ips =使用å¯èƒ½ãƒ‘ブリックIPアドレス label.available=å¯èƒ½ label.back =戻る label.basic.mode =基本モード label.bootable =ブータブル label.broadcast.domain.type =ブロードキャストドメイン種類 -label.by.account=アカウント㧠-label.by.availability =å¯ç”¨æ€§åˆ¥ -label.by.domain=ドメイン㧠-label.by.end.date=終了日㧠-label.by.level =レベル別 -label.by.pod=ãƒãƒƒãƒ‰ã§ -label.by.role =役割別 -label.by.start.date=開始日㧠-label.by.state =状態別 -label.by.traffic.type =トラフィックタイプ別 -label.by.type.id=IDを入力ã™ã‚‹ã“ã¨ã«ã‚ˆã‚Š -label.by.type=タイプ別 -label.by.zone=ゾーンã§ã¯ +label.by.account=アカウント +label.by.availability =アベイラビリティ +label.by.domain=ドメイン +label.by.end.date=終了日 +label.by.level =レベル +label.by.pod=Pod +label.by.role =ロール +label.by.start.date=é–‹å§‹æ—¥ +label.by.state =状態 +label.by.traffic.type =トラフィックタイプ +label.by.type.id=タイプID +label.by.type=タイプ +label.by.zone=ゾーン label.bytes.received =å—ä¿¡ãƒã‚¤ãƒˆæ•° label.bytes.sent =é€ä¿¡ãƒã‚¤ãƒˆæ•° label.cancel =キャンセル label.certificate=証明書 -label.privatekey=ã®PKCS#8ç§˜å¯†éµ -label.domain.suffix=DNSドメインサフィックス(ã¤ã¾ã‚Šã€xyz.com) +label.privatekey=PKCS#8ç§˜å¯†éµ +label.domain.suffix=DNSドメインサフィックス(例:xyz.com) label.character =キャラクタ label.cidr.account = CIDRã¾ãŸã¯ã‚¢ã‚«ã‚¦ãƒ³ãƒˆ/セキュリティグループ label.close =é–‰ã˜ã‚‹ -label.cloud.console=クラウド管ç†ã‚³ãƒ³ã‚½ãƒ¼ãƒ« +label.cloud.console=CloudStack管ç†ã‚³ãƒ³ã‚½ãƒ¼ãƒ« label.cloud.managed = Cloud.com ç®¡ç† label.cluster =クラスタ label.cluster.type =クラスタ種類 @@ -293,14 +322,14 @@ label.code =コード label.confirmation=ç¢ºèª label.cpu = CPU label.cpu.allocated = CPU割り当㦠-label.cpu.allocated.for.VMs=CPUã¯VMã®å‰²ã‚Šå½“㦠+label.cpu.allocated.for.VMs=VMã¸ã®CPU割り当㦠label.cpu.mhz =CPU(MHz) -label.cpu.utilized=CPUãŒæ´»ç”¨ã• -label.created=ä½œæˆ +label.cpu.utilized=CPU利用率 +label.created=ä½œæˆæ—¥ä»˜ label.cross.zones =クロスZone label.custom.disk.size =ディスクサイズ変更 label.daily =毎日 -label.data.disk.offering=データ ディスク Offering +label.data.disk.offering=データディスクオファリング label.date =日付 label.day.of.month =æ—¥(月毎) label.day.of.week =æ—¥(週毎) @@ -308,16 +337,16 @@ label.delete =削除 label.deleting.failed =削除失敗 label.deleting.processing=削除ã—ã¦ã„ã¾ã™.... label.description =説明 -label.detaching.disk =デタッãƒãƒ‡ã‚£ã‚¹ã‚¯ +label.detaching.disk =ディスクをデタッムlabel.details=詳細 label.device.id =デãƒã‚¤ã‚¹ID label.disabled=無効 -label.disabling.vpn.access =VPNアクセスを無効ã«ã—ã¦ã„ã¾ã™ +label.disabling.vpn.access =VPNアクセスを無効化ã—ã¦ã„ã¾ã™ label.disk.allocated =ディスク割り当㦠label.disk.offering =ディスクオファリング label.disk.size =ディスクサイズ label.disk.size.gb =ディスクサイズ(GBå˜ä½ï¼‰ -label.disk.total =åˆè¨ˆãƒ‡ã‚£ã‚¹ã‚¯ +label.disk.total =ç·ãƒ‡ã‚£ã‚¹ã‚¯å®¹é‡ label.disk.volume =ディスクボリューム label.display.text =表示テキスト label.dns.1 = DNS1 @@ -329,7 +358,7 @@ label.domain.name =ドメインå label.double.quotes.are.not.allowed =二é‡å¼•用符ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“ label.download.progress=ダウンロードã®é€²æ—çŠ¶æ³ label.edit =編集 -label.email =メール +label.email =メールアドレス label.enabling.vpn =VPN有効化 label.enabling.vpn.access =VPNアクセスを有効化ã—ã¦ã„ã¾ã™ label.end.port =終了ãƒãƒ¼ãƒˆ @@ -341,14 +370,14 @@ label.example =例 label.failed=失敗 label.featured =ãŠã™ã™ã‚ label.firewall =ファイアウォール -label.first.name =ファーストãƒãƒ¼ãƒ  +label.first.name = å label.format =フォーマット label.friday =金曜日 label.full=フル label.gateway =ゲートウェイ -label.general.alerts =一般的アラート -label.generating.url =生æˆURL -label.generating.url =生æˆURL +label.general.alerts =一般的ãªã‚¢ãƒ©ãƒ¼ãƒˆ +label.generating.url =URLを生æˆã—ã¦ã„ã¾ã™ +label.generating.url =URLを生æˆã—ã¦ã„ã¾ã™ label.go.step.2 = 2ã«é€²ã¿ã¾ã™ label.go.step.3 = 3ã«é€²ã¿ã¾ã™ label.go.step.4 = 4ã«é€²ã¿ã¾ã™ @@ -358,12 +387,12 @@ label.group.optional =グループ(オプション) label.guest.cidr =ゲストCIDR label.guest.gateway =ゲストゲートウェイ label.guest.ip =ゲストIPアドレス -label.guest.ip.range =ゲストIPレンジ +label.guest.ip.range =ゲストIPアドレス範囲 label.guest.netmask =ゲストãƒãƒƒãƒˆãƒžã‚¹ã‚¯ label.ha.enabled = HA有効 label.help =ヘルプ label.host =ホスト -label.host.alerts =ホスト警告 +label.host.alerts =ホストã®ã‚¢ãƒ©ãƒ¼ãƒˆ label.host.name =ホストå label.hosts =ホスト label.hourly =毎時 @@ -379,21 +408,21 @@ label.instance.name =インスタンスå label.instances =インスタンス label.internal.dns.1 =内部DNS1 label.internal.dns.2 =内部DNS2 -label.interval.type =間隔タイプ +label.interval.type =間隔種別 label.invalid.integer =ç„¡åŠ¹ãªæ•´æ•° label.invalid.number =無効ãªç•ªå· label.ip = IPアドレス label.ip.address = IPアドレス label.ip.allocations = IPアドレス割り当㦠-label.ip.limits =パブリックIPåˆ¶é™ +label.ip.limits =パブリックIPã‚¢ãƒ‰ãƒ¬ã‚¹åˆ¶é™ label.ip.or.fqdn = IPアドレスã¾ãŸã¯FQDN label.ip.range = IPアドレス範囲 label.ips = IPアドレス -label.is.default=ã¯ãƒ‡ãƒ•ォルトã§ã™ -label.is.shared=ã¯å…±æœ‰ã•れã¦ã„ã¾ã™ -label.is.system=ã¯ã‚·ã‚¹ãƒ†ãƒ ã§ã™ +label.is.default=デフォルト +label.is.shared=共有 +label.is.system=システム label.iscsi =iSCSI -label.iso.boot=ISOèµ·å‹• +label.iso.boot=ISOブート label.iso=ISO label.isolation.mode=分離モード label.keep =ä¿æŒ @@ -401,10 +430,10 @@ label.lang.chinese =中国語(簡体字) label.lang.english =英語 label.lang.japanese=日本語 label.lang.spanish=スペイン語 -label.last.disconnected =最終接続 +label.last.disconnected =最終ログイン label.last.name =å§“ label.level =レベル -label.linklocal.ip=リンクローカルIP Adddress +label.linklocal.ip=リンクローカルIPアドレス label.load.balancer = ロードãƒãƒ©ãƒ³ã‚µ label.loading =読ã¿è¾¼ã‚“ã§ã„ã¾ã™ label.local =ローカル @@ -419,14 +448,14 @@ label.memory.mb =メモリ(MB) label.memory.total =メモリåˆè¨ˆ label.memory.used =メモリ使用 label.menu.accounts =アカウント -label.menu.alerts =警告 +label.menu.alerts =アラート label.menu.all.accounts =ã™ã¹ã¦ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆ label.menu.all.instances =ã™ã¹ã¦ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ label.menu.community.isos =コミュニティISO label.menu.community.templates =コミュニティテンプレート label.menu.configuration =æ§‹æˆ label.menu.dashboard =ダッシュボード -label.menu.destroyed.instances =破壊ã•れãŸã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ +label.menu.destroyed.instances =破棄ã•れãŸã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ label.menu.disk.offerings =ディスクオファリング label.menu.domains =ドメイン label.menu.events =イベント @@ -455,11 +484,11 @@ label.menu.templates =テンプレート label.menu.virtual.appliances =仮想アプライアンス label.menu.virtual.resources =仮想リソース label.menu.volumes =ボリューム -label.migrate.instance.to=移行インスタンス㫠+label.migrate.instance.to=インスタンス移行先 label.minimum =æœ€å° -label.minute.past.hour =毎分(毎秒) +label.minute.past.hour =分 label.monday =月曜日 -label.monthly =月毎 +label.monthly =毎月 label.more.templates =ãã®ä»–ã®ãƒ†ãƒ³ãƒ—レート label.my.account =マイアカウント label.name =åå‰ @@ -475,11 +504,11 @@ label.network.offering.display.text =ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚ªãƒ•ァリング表示 label.network.offering.id =ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚ªãƒ•ァリングID label.network.offering.name =ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚ªãƒ•ァリングå label.network.rate =ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒ¬ãƒ¼ãƒˆ -label.network.read =ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯èª­å‡ºã— +label.network.read =ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯å—ä¿¡é‡ label.network.type =ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¿ã‚¤ãƒ— -label.network.write =ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯æ›¸è¾¼ã¿ +label.network.write =ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯é€ä¿¡é‡ label.new.password =æ–°ã—ã„パスワード -label.next =次㮠+label.next =次 label.nfs = NFS label.nfs.server = NFSサームlabel.nfs.storage = NFSストレージ @@ -495,17 +524,17 @@ label.no.thanks =å¿…è¦ã‚りã¾ã›ã‚“ label.none=ãªã— label.not.found=ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ label.num.cpu.cores= CPUコア数 -label.numretries=æ•°ã®å†è©¦è¡Œã® -label.offer.ha =HAオファー +label.numretries=å†è©¦è¡Œå›žæ•° +label.offer.ha =HA label.optional =オプション label.os.preference = OS優先設定 label.os.type = OSタイプ label.owned.public.ips =å‰²ã‚Šå½“ã¦æ¸ˆã¿ãƒ‘ブリックIPアドレス label.owner.account =所有者アカウント -label.owner.domain=所有者ã®ãƒ‰ãƒ¡ã‚¤ãƒ³ +label.owner.domain=所有者ドメイン label.parent.domain =親ドメイン label.password =パスワード -label.password.enabled = Password有効 +label.password.enabled = パスワード有効 label.path =パス label.please.wait=ãŠå¾…ã¡ãã ã•ã„ label.pod =Pod @@ -518,7 +547,7 @@ label.primary.storage =プライマリストレージ label.primary.used=ãƒ—ãƒ©ã‚¤ãƒžãƒªã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ä½¿ç”¨é‡ label.private.interface =プライベートインタフェイス label.private.ip =プライベートIPアドレス -label.private.ip.range =プライベートIP範囲 +label.private.ip.range =プライベートIPアドレス範囲 label.private.ips =プライベートIPアドレス label.private.port =プライベートãƒãƒ¼ãƒˆ label.private.zone =プライベートZone @@ -536,12 +565,12 @@ label.related =関連 label.remove.from.load.balancer =ロードãƒãƒ©ãƒ³ã‚µã‹ã‚‰ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã‚’削除ã—ã¦ã„ã¾ã™ label.removing.user =ユーザ削除 label.required=å¿…é ˆ -label.reserved.system.ip =予約済ã¿ã‚·ã‚¹ãƒ†ãƒ IP +label.reserved.system.ip =予約済ã¿ã‚·ã‚¹ãƒ†ãƒ IPアドレス label.resource =リソース label.resource.limits =ãƒªã‚½ãƒ¼ã‚¹åˆ¶é™ label.resources =リソース -label.role =役割 -label.root.disk.offering=Root ディスク Offering +label.role =ロール +label.root.disk.offering=ルートディスクオファリング label.running.vms= 実行中VM label.saturday =土曜日 label.save =ä¿å­˜ @@ -554,11 +583,11 @@ label.secret.key =ç§˜å¯†éµ label.security.group =セキュリティグループ label.security.group.name =セキュリティグループå label.security.groups =セキュリティグループ -label.security.groups.enabled=ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ã‚°ãƒ«ãƒ¼ãƒ—ãŒæœ‰åйã«ãªã£ã¦ +label.security.groups.enabled=セキュリティグループ有効 label.sent =é€ä¿¡ label.server =サームlabel.service.offering =サービスオファリング -label.session.expired=Session 期é™åˆ‡ã‚Œ +label.session.expired=セッション期é™åˆ‡ã‚Œ label.shared =共有 label.size =サイズ label.snapshot =スナップショット @@ -572,7 +601,7 @@ label.specify.vlan = VLAN指定 label.start.port =é–‹å§‹ãƒãƒ¼ãƒˆ label.state =状態 label.static.nat =スタティックNAT -label.static.nat.to =スタティックNAT +label.static.nat.to =スタティックNATå…ˆ label.statistics =統計 label.status =ステータス label.step.1 =ステップ1 @@ -610,14 +639,14 @@ label.time =時間 label.time.zone=タイムゾーン label.timeout.in.second=タイムアウト(秒) label.timezone =タイムゾーン -label.total.cpu=åˆè¨ˆCPU +label.total.cpu=CPUã®åˆè¨ˆ label.total.vms =VMã®åˆè¨ˆ label.traffic.type =トラフィックタイプ label.tuesday =ç«æ›œæ—¥ label.type =タイプ label.type.id =タイプID label.unavailable =使用ä¸å¯ -label.unlimited=無制é™ã® +label.unlimited=ç„¡åˆ¶é™ label.untagged=ã‚¿ã‚°ãªã— label.update.ssl =SSL証明書更新 label.update.ssl.cert =SSL証明書更新 @@ -641,12 +670,12 @@ label.virtual.appliances =仮想アプライアンス label.virtual.network =仮想ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ label.vlan = VLAN label.vlan.id = VLAN ID -label.vlan.range = VLANレンジ +label.vlan.range = VLAN ID範囲 label.vm.add =インスタンス追加 -label.vm.destroy =破壊 +label.vm.destroy =破棄 label.vm.reboot =å†èµ·å‹• -label.vm.start =スタート -label.vm.stop =ストップ +label.vm.start =é–‹å§‹ +label.vm.stop =åœæ­¢ label.vmfs =VMFS label.vms = VM label.volume =ボリューム @@ -655,32 +684,32 @@ label.volume.name =ボリュームå label.volumes =ボリューム label.vpn = VPN label.vsphere.managed = vSphereç®¡ç† -label.waiting =Wainting +label.waiting =ãŠå¾…ã¡ãã ã•ã„ label.warn =警告 label.wednesday =水曜日 -label.weekly =ウィークリー +label.weekly =毎週 label.welcome.cloud.console=管ç†ã‚³ãƒ³ã‚½ãƒ¼ãƒ«ã¸ã‚ˆã†ã“ã -label.welcome==よã†ã“ã +label.welcome=よã†ã“ã label.yes =ã¯ã„ label.zone =Zone label.zone.id =Zone ID label.zone.step.1.title =ステップ1:ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯é¸æŠž label.zone.step.2.title =ステップ2:Zone追加 label.zone.step.3.title =ステップ3:Pod追加 -label.zone.step.4.title =ステップ4:IPレンジ追加 +label.zone.step.4.title =ステップ4:IPアドレス範囲追加 label.zone.wide =Zone全体 #Messages message.acquire.public.ip =æ–°ã—ã„IPアドレスをå–å¾—ã™ã‚‹Zoneã‚’é¸æŠžã—ã¦ãã ã•ã„。 -message.action.cancel.maintenanceã¯=ã‚ãªãŸã®ãƒ›ã‚¹ãƒˆãŒæ­£å¸¸ã«ãƒ¡ãƒ³ãƒ†ãƒŠãƒ³ã‚¹ã®ãŸã‚キャンセルã•れã¾ã—ãŸã€‚ã“ã®ãƒ—ãƒ­ã‚»ã‚¹ã¯æ•°åˆ†ã‹ã‹ã‚‹ã“ã¨ãŒã‚りã¾ã™ã€‚ +message.action.cancel.maintenance=ã‚ãªãŸã®ãƒ›ã‚¹ãƒˆã¯ãƒ¡ãƒ³ãƒ†ãƒŠãƒ³ã‚¹ã®ãŸã‚ã«æ­£å¸¸ã«ã‚­ãƒ£ãƒ³ã‚»ãƒ«ã•れã¾ã—ãŸã€‚ã“ã®ãƒ—ãƒ­ã‚»ã‚¹ã¯æ•°åˆ†ã‹ã‹ã‚‹ã“ã¨ãŒã‚りã¾ã™ã€‚ message.action.cancel.maintenance.mode=メンテナンスをキャンセルã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹? message.action.delete.ISO.for.all.zones= ãã®ISOã¯å…¨ã¦ã®Zoneã§ä½¿ç”¨ã•れã¾ã™ã€‚å…¨ã¦ã®Zoneã‹ã‚‰å‰Šé™¤ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹? message.action.delete.ISO=ISOを削除ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹? message.action.delete.cluster=クラスタを削除ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹? message.action.delete.disk.offering=ディスクオファリングを削除ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹? message.action.delete.domain=ドメインを削除ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹? -message.action.delete.external.firewall=ã“ã®å¤–部ファイアウォールを削除ã—ãŸã„ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。警告:ã‚ãªãŸã¯åŒã˜å¤–部ファイアウォールをå†åº¦è¿½åŠ ã‚’è¨ˆç”»ã—ã¦ã„ã‚‹å ´åˆã¯ã€ãƒ‡ãƒã‚¤ã‚¹ã®ä½¿ç”¨çжæ³ãƒ‡ãƒ¼ã‚¿ã‚’リセットã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ -message.action.delete.external.load.balancer=ã“ã®å¤–部ロードãƒãƒ©ãƒ³ã‚µã‚’削除ã—ãŸã„ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。警告:ã‚ãªãŸã¯åŒã˜å¤–部ロードãƒãƒ©ãƒ³ã‚µã‚’å†åº¦è¿½åŠ ã‚’è¨ˆç”»ã—ã¦ã„ã‚‹å ´åˆã¯ã€ãƒ‡ãƒã‚¤ã‚¹ã®ä½¿ç”¨çжæ³ãƒ‡ãƒ¼ã‚¿ã‚’リセットã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ +message.action.delete.external.firewall=ã“ã®å¤–部ファイアウォールを削除ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹? 警告:åŒã˜å¤–部ファイアウォールã®å†åº¦è¿½åŠ ã‚’è¨ˆç”»ã—ã¦ã„ã‚‹å ´åˆã¯ã€ãƒ‡ãƒã‚¤ã‚¹ã®ä½¿ç”¨çжæ³ãƒ‡ãƒ¼ã‚¿ã‚’リセットã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ +message.action.delete.external.load.balancer=ã“ã®å¤–部ロードãƒãƒ©ãƒ³ã‚µã‚’削除ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹? 警告:åŒã˜å¤–部ロードãƒãƒ©ãƒ³ã‚µã®å†åº¦è¿½åŠ ã‚’è¨ˆç”»ã—ã¦ã„ã‚‹å ´åˆã¯ã€ãƒ‡ãƒã‚¤ã‚¹ã®ä½¿ç”¨çжæ³ãƒ‡ãƒ¼ã‚¿ã‚’リセットã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ message.action.delete.ingress.rule=イングレスルールを削除ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹? message.action.delete.network=ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’削除ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹? message.action.delete.pod=Podを削除ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹? @@ -694,13 +723,13 @@ message.action.delete.template=テンプレートを削除ã—ã¦ã‚‚よã‚ã—ã„ message.action.delete.volume=ボリュームを削除ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹? message.action.delete.zone=Zoneを削除ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹? message.action.destroy.instance=インスタンスを破棄ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹? -message.action.destroy.systemvm=ã“ã®ã‚·ã‚¹ãƒ†ãƒ VMを破壊ã™ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。 +message.action.destroy.systemvm=システムVMを破棄ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹? message.action.disable.static.NAT=スタティックNATを無効化ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹? -message.action.enable.maintenanceã¯=ã‚ãªãŸã®ãƒ›ã‚¹ãƒˆãŒæ­£å¸¸ã«ãƒ¡ãƒ³ãƒ†ãƒŠãƒ³ã‚¹ã®ãŸã‚ã«æº–å‚™ã•れã¦ã„ã¾ã™ã€‚ã“ã®å‡¦ç†ã«ã¯æ•°åˆ†ã‹ã‹ã‚‹ã“ã¨ãŒã‚りã¾ã™ä»¥ä¸Šã€å¤šãã®VMãŒã“ã®ãƒ›ã‚¹ãƒˆä¸Šã§ç¾åœ¨ã©ã®ã‚ˆã†ã«ç•°ãªã‚Šã¾ã™ã€‚ -message.action.force.reconnect=ã‚ãªãŸã®ãƒ›ã‚¹ãƒˆãŒæ­£å¸¸ã«å†æŽ¥ç¶šã‚’余儀ãªãã•れã¦ã„る。ã“ã®ãƒ—ãƒ­ã‚»ã‚¹ã¯æ•°åˆ†ã‹ã‹ã‚‹ã“ã¨ãŒã‚りã¾ã™ã€‚ +message.action.enable.maintenanceã¯=ホストã¯ãƒ¡ãƒ³ãƒ†ãƒŠãƒ³ã‚¹ã®æº–備を行ã£ã¦ã„ã¾ã™ã€‚ã“ã®å‡¦ç†ã«ã¯æ•°åˆ†ã‹ã‹ã‚‹ã“ã¨ãŒã‚りã¾ã™ã€‚(ホスト上ã®VMã®æ•°ã«ã‚ˆã£ã¦ç•°ãªã‚Šã¾ã™) +message.action.force.reconnect=ホストã¯å†æŽ¥ç¶šã‚’行ã£ã¦ã„ã¾ã™ã€‚ã“ã®ãƒ—ãƒ­ã‚»ã‚¹ã¯æ•°åˆ†ã‹ã‹ã‚‹ã“ã¨ãŒã‚りã¾ã™ã€‚ message.action.force.reconnect=ホストã«å¼·åˆ¶çš„ã«å†æŽ¥ç¶šã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹? message.action.host.enable.maintenance.mode =メンテナンスモードを有効ã«ã™ã‚‹ã¨ã€ãƒ›ã‚¹ãƒˆä¸Šã§å®Ÿè¡Œä¸­ã®ã™ã¹ã¦ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã‚’ä»–ã®ä½¿ç”¨å¯èƒ½ãªãƒ›ã‚¹ãƒˆã¸ãƒ©ã‚¤ãƒ–マイグレーションã™ã‚‹åŽŸå› ã¨ãªã‚Šã¾ã™ã€‚ -message.action.instance.reset.password=ã“ã®ä»®æƒ³ãƒžã‚·ãƒ³ã®ãƒ«ãƒ¼ãƒˆãƒ‘スワードを変更ã™ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。 +message.action.instance.reset.password=ã“ã®ä»®æƒ³ãƒžã‚·ãƒ³ã®ãƒ«ãƒ¼ãƒˆãƒ‘スワードを変更ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹? message.action.primarystorage.enable.maintenance.mode =警告:プライマリストレージをメンテナンスモードã«ã™ã‚‹ã¨ã€ãã®ãƒ—ライマリストレージ上ã®ãƒœãƒªãƒ¥ãƒ¼ãƒ ã‚’使用ã—ã¦ã„ã‚‹å…¨ã¦ã®VMãŒåœæ­¢ã—ã¾ã™ã€‚ã“ã®ã¾ã¾ç¶šã‘ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹ï¼Ÿ message.action.reboot.instance=インスタンスをå†èµ·å‹•ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹? message.action.reboot.router=ルータをå†èµ·å‹•ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹? @@ -720,9 +749,9 @@ message.add.cluster=Zone , Pod ã®ãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã«æ–°ã—ã„IPレンジを追加 -message.add.ip.range.to.pod=

Pod ã«IPレンジを追加

-message.add.ip.range=Zone内ã®ãƒ‘ブリックãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã«IPレンジを追加 +message.add.ip.range.direct.network=Zone ã®ãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã«æ–°ã—ã„IPアドレス範囲を追加 +message.add.ip.range.to.pod=

Pod ã«IPアドレス範囲を追加

+message.add.ip.range=Zone内ã®ãƒ‘ブリックãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã«IPアドレス範囲を追加 message.add.load.balancer=Zoneã«ãƒ­ãƒ¼ãƒ‰ãƒãƒ©ãƒ³ã‚µã‚’追加 message.add.network=Zone ã«æ–°ã—ã„ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’追加 message.add.pod=Zone ã«æ–°ã—ã„Podを追加 @@ -734,12 +763,12 @@ message.add.template=æ–°ã—ã„テンプレートを作æˆã™ã‚‹ãŸã‚ã«ã€æ¬¡ message.add.volume=æ–°ã—ã„ボリュームを追加ã™ã‚‹ãŸã‚ã«ã€æ¬¡ã®ãƒ‡ãƒ¼ã‚¿ã‚’入力ã—ã¦ãã ã•ã„。 message.additional.networks.desc=ä»®æƒ³ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ãŒæŽ¥ç¶šã™ã‚‹è¿½åŠ ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’é¸æŠžã—ã¦ãã ã•ã„。 message.advanced.mode.desc=VLANサãƒãƒ¼ãƒˆã‚’有効化ã—ãŸã„å ´åˆã¯ã“ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒ¢ãƒ‡ãƒ«ã‚’é¸æŠžã—ã¦ãã ã•ã„。ã“ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒ¢ãƒ‡ãƒ«ã¯ã€ç®¡ç†è€…ãŒæœ€ã‚‚フレキシブルã«ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚ªãƒ•ァリングを定義ã§ãるモデルã§ã€ãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã¨ä»®æƒ³ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’サãƒãƒ¼ãƒˆã—ã€ãƒ•ァイアウォールã€VPNã€ã¾ãŸã¯ãƒ­ãƒ¼ãƒ‰ãƒãƒ©ãƒ³ã‚µç­‰ã‚’æä¾›ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ -message.advanced.security.group=ã¯ã€ã“れをé¸ã‚“ã§ãã ã•ã„ã‚ãªãŸã¯ã€ã‚²ã‚¹ãƒˆVMã®ã‚¢ã‚¤ã‚½ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚’æä¾›ã™ã‚‹ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ã‚°ãƒ«ãƒ¼ãƒ—を使用ã™ã‚‹å ´åˆã€‚ -message.advanced.virtual=ã‚ãªãŸã¯ã€ã‚²ã‚¹ãƒˆVMã®åˆ†é›¢ã‚’æä¾›ã™ã‚‹ãŸã‚ã«ã€ã‚¾ãƒ¼ãƒ³å…¨ä½“ã®VLANを使用ã™ã‚‹å ´åˆã¯ã“ã®ã‚ªãƒ—ã‚·ãƒ§ãƒ³ã‚’é¸æŠžã€‚ +message.advanced.security.group=ゲストVMã®ã‚¢ã‚¤ã‚½ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚’æä¾›ã™ã‚‹ãŸã‚ã«ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ã‚°ãƒ«ãƒ¼ãƒ—を使用ã™ã‚‹å ´åˆã¯ã“ã®ã‚ªãƒ—ã‚·ãƒ§ãƒ³ã‚’é¸æŠžã—ã¦ãã ã•ã„。 +message.advanced.virtual=ゲストVMã®ã‚¢ã‚¤ã‚½ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚’æä¾›ã™ã‚‹ãŸã‚ã«ã‚¾ãƒ¼ãƒ³å…¨ä½“ã®VLANを使用ã™ã‚‹å ´åˆã¯ã“ã®ã‚ªãƒ—ã‚·ãƒ§ãƒ³ã‚’é¸æŠžã—ã¦ãã ã•ã„。 message.allow.vpn.access=VPNアクセスを許å¯ã™ã‚‹ãƒ¦ãƒ¼ã‚¶ã®ãƒ¦ãƒ¼ã‚¶åã¨ãƒ‘スワードを入力ã—ã¦ãã ã•ã„。 -message.attach.iso.confirm=仮想インスタンスã«ISOファイルをアタッãƒã—ã¦ã‚‚よã„ã§ã™ã‹? +message.attach.iso.confirm=仮想インスタンスã«ISOファイルをアタッãƒã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹? message.attach.volume=æ–°ã—ã„ボリュームをアタッãƒã™ã‚‹ãŸã‚ã«ã€æ¬¡ã®ãƒ‡ãƒ¼ã‚¿ã‚’入力ã—ã¦ãã ã•ã„。Windowsベースã®ä»®æƒ³ãƒžã‚·ãƒ³ã«ãƒ‡ã‚£ã‚¹ã‚¯ãƒœãƒªãƒ¥ãƒ¼ãƒ ã‚’アタッãƒã™ã‚‹å ´åˆã€æŽ¥ç¶šã•れãŸãƒ‡ã‚£ã‚¹ã‚¯ã‚’確èªã™ã‚‹ãŸã‚ã«ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã®å†èµ·å‹•ãŒå¿…è¦ã§ã™ã€‚ -message.basic.mode.desc=VLANサãƒãƒ¼ãƒˆãŒå¿…è¦ã§ãªã„å ´åˆã¯ã“ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒ¢ãƒ‡ãƒ«ã‚’é¸æŠžã—ã¦ãã ã•ã„。ã“ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒ¢ãƒ‡ãƒ«ã®ä¸‹ã§ä½œæˆã•れãŸã™ã¹ã¦ã®ä»®æƒ³ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã«ã¯å®‰å…¨ã«åˆ†é›¢ã•れãŸãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã¨ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ã‚°ãƒ«ãƒ¼ãƒ—ã‹ã‚‰ãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã«IPãŒå‰²ã‚Šå½“ã¦ã‚‰ã‚Œã¾ã™ã€‚ +message.basic.mode.desc=VLANサãƒãƒ¼ãƒˆãŒå¿…è¦ã§ãªã„å ´åˆã¯ã“ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒ¢ãƒ‡ãƒ«ã‚’é¸æŠžã—ã¦ãã ã•ã„。ã“ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒ¢ãƒ‡ãƒ«ã®ä¸‹ã§ä½œæˆã•れãŸã™ã¹ã¦ã®ä»®æƒ³ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã«ã¯å®‰å…¨ã«åˆ†é›¢ã•れãŸãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã¨ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ã‚°ãƒ«ãƒ¼ãƒ—ã‹ã‚‰ãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã«IPアドレスãŒå‰²ã‚Šå½“ã¦ã‚‰ã‚Œã¾ã™ã€‚ message.change.offering.confirmã¯=仮想インスタンスã®ã‚µãƒ¼ãƒ“スオファリングを変更ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹? message.copy.iso.confirm=ISOをコピーã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹? message.copy.template =テンプレート XXXã‚’Zoneã‹ã‚‰ã‚³ãƒ”ーã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹? @@ -749,9 +778,9 @@ message.delete.account=ã“ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’削除ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ message.detach.iso.confirm=仮想インスタンスã‹ã‚‰ISOをデタッãƒã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹? message.disable.account=ã“ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’無効ã«ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹? アカウントを無効ã«ã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šã€ã“ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã®ã™ã¹ã¦ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯ã‚¯ãƒ©ã‚¦ãƒ‰ãƒªã‚½ãƒ¼ã‚¹ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ããªããªã‚Šã¾ã™ã€‚実行中ã®ã™ã¹ã¦ã®ä»®æƒ³ãƒžã‚·ãƒ³ã¯ã™ãã«ã‚·ãƒ£ãƒƒãƒˆãƒ€ã‚¦ãƒ³ã•れã¾ã™ã€‚ message.disable.vpn.access=VPNアクセスを無効ã«ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹? -message.download.ISO=をクリックã—ã¦ãã ã•ã„。00000ã‚’ã¯ã€ISOをダウンロードã™ã‚‹ -message.download.template=をクリックã—ã¦ãã ã•ã„。00000をテンプレートをダウンロードã™ã‚‹ -message.download.volume=をクリックã—ã¦ãã ã•ã„。00000ã‚’ã€ãƒœãƒªãƒ¥ãƒ¼ãƒ ã‚’ダウンロードã™ã‚‹ +message.download.ISO=ISOをダウンロードã™ã‚‹ãŸã‚ã«00000をクリックã—ã¦ãã ã•ã„。 +message.download.template=テンプレートをダウンロードã™ã‚‹ãŸã‚ã«00000をクリックã—ã¦ãã ã•ã„。 +message.download.volume=ボリュームをダウンロードã™ã‚‹ãŸã‚ã«00000をクリックã—ã¦ãã ã•ã„。 message.edit.confirm='ä¿å­˜'をクリックã™ã‚‹å‰ã«å¤‰æ›´å†…容を確èªã—ã¦ãã ã•ã„ message.edit.limits =以下ã®ãƒªã‚½ãƒ¼ã‚¹ã¸ã®åˆ¶é™ã‚’指定ã—ã¦ãã ã•ã„。"-1"ã¯ãƒªã‚½ãƒ¼ã‚¹ã®ç”Ÿæˆã«åˆ¶é™ãŒãªã„ã“ã¨ã‚’示ã—ã¦ã„ã¾ã™ã€‚ message.enable.account=ã“ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’有効ã«ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹? @@ -761,10 +790,10 @@ message.enabled.vpn.ip.sec =IPSec事å‰å…±æœ‰ã‚­ãƒ¼ã¯ã€ message.enabled.vpn=ç¾åœ¨ã€VPNã‚¢ã‚¯ã‚»ã‚¹ã¯æœ‰åйã«ãªã£ã¦ã„ã¾ã™ã€‚次ã®IP経由ã§ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ message.launch.vm.on.private.networkã¯=ã‚ãªãŸè‡ªèº«ã®å°‚用ã®ãƒ—ライベートãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ä¸Šã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã‚’èµ·å‹•ã—ãŸã„ã§ã™ã‹ï¼Ÿ message.lock.account=ã“ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’ロックã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹? アカウントをロックã™ã‚‹ã¨ã€ã“ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã®ã™ã¹ã¦ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯ã‚¯ãƒ©ã‚¦ãƒ‰ãƒªã‚½ãƒ¼ã‚¹ã‚’管ç†ã™ã‚‹ã“ã¨ãŒã§ããªããªã‚Šã¾ã™ã€‚既存ã®ãƒªã‚½ãƒ¼ã‚¹ã«ã¯ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ -message.migrate.instance.confirm=ã‚ãªãŸã¯ä»®æƒ³ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã‚’移行ã™ã‚‹ãƒ›ã‚¹ãƒˆã‚’確èªã—ã¦ãã ã•ã„。 +message.migrate.instance.confirm=インスタンスを移行ã™ã‚‹ãƒ›ã‚¹ãƒˆã‚’確èªã—ã¦ãã ã•ã„。 message.new.user =ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã«æ–°ã—ã„ユーザーを追加ã™ã‚‹ãŸã‚ã«ã€æ¬¡ã®æƒ…報を設定ã—ã¦ãã ã•ã„ message.no.network.support =é¸æŠžã•れãŸãƒã‚¤ãƒ‘ーãƒã‚¤ã‚¶ã€vSphereã«ã¯è¿½åŠ ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯æ©Ÿèƒ½ãŒã‚りã¾ã›ã‚“。手順5ã«é€²ã‚“ã§ãã ã•ã„。 -message.no.network.support.configuration.not.true=ã‚ãªãŸã¯ã€ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ã‚°ãƒ«ãƒ¼ãƒ—ã‚’æŒã¤ã™ã¹ã¦ã®ã‚¾ãƒ¼ãƒ³ã‚’æŒã£ã¦ã„ãªã„ãŒæœ‰åŠ¹ã€‚ã—ãŸãŒã£ã¦ã€è¿½åŠ ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯æ©Ÿèƒ½ã‚’æä¾›ã—ã¾ã™ã€‚手順5ã«é€²ã¿ã¾ã™ã—ã¦ãã ã•ã„。 +message.no.network.support.configuration.not.true=ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ã‚°ãƒ«ãƒ¼ãƒ—ãŒæœ‰åйãªã‚¾ãƒ¼ãƒ³ãŒç„¡ã„ãŸã‚ã€è¿½åŠ ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯æ©Ÿèƒ½ã¯ã‚りã¾ã›ã‚“。手順5ã«é€²ã‚“ã§ãã ã•ã„。 message.number.clusters=

# -- クラスタ

message.number.hosts=

# -- ホスト

message.number.pods=

# -- Pod

@@ -773,27 +802,27 @@ message.number.zones=

# -- Zone

message.remove.vpn.access=次ã®ãƒ¦ãƒ¼ã‚¶ã‹ã‚‰ã®VPNアクセスを削除ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹? message.restart.mgmt.server=æ–°ã—ã„設定を有効ã«ã™ã‚‹ãŸã‚ã«ã€ç®¡ç†ã‚µãƒ¼ãƒï¼ˆè¤‡æ•°å¯ï¼‰ã‚’å†èµ·å‹•ã—ã¦ãã ã•ã„。 message.security.group.usage=å…¨ã¦ã®è©²å½“ã™ã‚‹ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ã‚°ãƒ«ãƒ¼ãƒ—ã‚’é¸æŠžã™ã‚‹ã«ã¯ã€ Ctrlキーを押ã—ãªãŒã‚‰ã‚¯ãƒªãƒƒã‚¯ã—ã¦ãã ã•ã„。 -message.snapshot.schedule =ã‚ãªãŸã¯ä»¥ä¸‹ã®ã‚ªãƒ—ションã‹ã‚‰é¸æŠžã—ã€é©ç”¨ã€ãƒãƒªã‚·ãƒ¼è¨­å®šã‚’ã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šã€ã‚»ãƒƒãƒˆã‚¢ãƒƒãƒ—定期的ãªã‚¹ãƒŠãƒƒãƒ—ショットをスケジュールã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ -message.step.1.continue=テンプレートã¾ãŸã¯ISOã‚¤ãƒ¡ãƒ¼ã‚¸ã‚’é¸æŠžã—ã¦ç¶šè¡Œã—ã¦ãã ã•ã„ -message.step.1.desc=æ–°ã—ã„仮想インスタンス用ã®ãƒ†ãƒ³ãƒ—ãƒ¬ãƒ¼ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。ISOイメージãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„るブランクã®ãƒ†ãƒ³ãƒ—ãƒ¬ãƒ¼ãƒˆã‚’é¸æŠžã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ +message.snapshot.schedule =以下ã®ã‚ªãƒ—ションã‹ã‚‰ãƒãƒªã‚·ãƒ¼ã‚’é©ç”¨ã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šã€å®šæœŸçš„ãªã‚¹ãƒŠãƒƒãƒ—ショットã®ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ«ã‚’設定ã§ãã¾ã™ã€‚ +message.step.1.continue=テンプレートã¾ãŸã¯ISOã‚’é¸æŠžã—ã¦ç¶šè¡Œã—ã¦ãã ã•ã„ +message.step.1.desc=æ–°ã—ã„仮想インスタンス用ã®ãƒ†ãƒ³ãƒ—ãƒ¬ãƒ¼ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。ISOãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„るブランクã®ãƒ†ãƒ³ãƒ—ãƒ¬ãƒ¼ãƒˆã‚’é¸æŠžã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ message.step.2.continue=ã‚µãƒ¼ãƒ“ã‚¹ã‚ªãƒ•ã‚¡ãƒªãƒ³ã‚°ã‚’é¸æŠžã—ã¦ç¶šè¡Œã—ã¦ãã ã•ã„ message.step.2.desc = message.step.3.continue=ãƒ‡ã‚£ã‚¹ã‚¯ã‚ªãƒ•ã‚¡ãƒªãƒ³ã‚°ã‚’é¸æŠžã—ã¦ç¶šè¡Œã—ã¦ãã ã•ã„ message.step.3.desc = message.step.4.continue=å°‘ãªãã¨ã‚‚1ã¤ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’é¸æŠžã—ã¦ç¶šè¡Œã—ã¦ãã ã•ã„ message.step.4.desc=ä»®æƒ³ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã«æŽ¥ç¶šã™ã‚‹ãƒ—ライマリãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’é¸æŠžã—ã¦ãã ã•ã„。 -message.update.os.preference=ã“ã®ãƒ›ã‚¹ãƒˆã®å„ªå…ˆOSè¨­å®šã‚’é¸æŠžã—ã¦ãã ã•ã„ã€‚åŒæ§˜ã®è¨­å®šã‚’æŒã¤ã™ã¹ã¦ã®ä»®æƒ³ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã¯ã“ã®ãƒ›ã‚¹ãƒˆå„ªå…ˆçš„ã«å‰²ã‚Šå½“ã¦ã‚‰ã‚Œã¾ã™ã€‚ +message.update.os.preference=ã“ã®ãƒ›ã‚¹ãƒˆã®å„ªå…ˆOSè¨­å®šã‚’é¸æŠžã—ã¦ãã ã•ã„ã€‚åŒæ§˜ã®è¨­å®šã‚’æŒã¤ã™ã¹ã¦ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã¯ã“ã®ãƒ›ã‚¹ãƒˆã¸å„ªå…ˆçš„ã«å‰²ã‚Šå½“ã¦ã‚‰ã‚Œã¾ã™ã€‚ message.update.ssl=å„コンソールプロキシã®ä»®æƒ³ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã‚’æ›´æ–°ã™ã‚‹ãŸã‚ã®X.509ã«æº–æ‹ ã—ãŸSSL証明書をæå‡ºã—ã¦ãã ã•ã„: message.virtual.network.desc=アカウント用ã®å°‚用仮想ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã§ã™ã€‚ブロードキャストドメインã¯VLAN内ã«ç½®ã‹ã‚Œã€ã™ã¹ã¦ã®ãƒ‘ブリックãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã¯ä»®æƒ³ãƒ«ãƒ¼ã‚¿ã«ã‚ˆã£ã¦ãƒ«ãƒ¼ãƒ†ã‚£ãƒ³ã‚°ã•れã¾ã™ã€‚ message.volume.create.template.confirm=ã“ã®ãƒ‡ã‚£ã‚¹ã‚¯ãƒœãƒªãƒ¥ãƒ¼ãƒ ç”¨ã®ãƒ†ãƒ³ãƒ—レートを作æˆã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹?テンプレートã®ä½œæˆã¯ãƒœãƒªãƒ¥ãƒ¼ãƒ ã®ã‚µã‚¤ã‚ºã«å¿œã˜ã¦æ•°åˆ†ï½žã‚ˆã‚Šé•·ã„é–“éš”ã§æŒ‡å®šã§ãã¾ã™ã€‚ message.zone.step.1.desc=Zoneã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒ¢ãƒ‡ãƒ«ã‚’é¸æŠžã—ã¦ãã ã•ã„。 message.zone.step.2.desc=æ–°ã—ã„Zoneを追加ã™ã‚‹ãŸã‚ã«ã€æ¬¡ã®æƒ…報を入力ã—ã¦ãã ã•ã„。 message.zone.step.3.desc=æ–°ã—ã„Podを追加ã™ã‚‹ãŸã‚ã«ã€æ¬¡ã®æƒ…報を入力ã—ã¦ãã ã•ã„。 -message.apply.snapshot.policy=ã‚ãªãŸãŒæ­£å¸¸ã«ç¾åœ¨ã®ã‚¹ãƒŠãƒƒãƒ—ショットã®ãƒãƒªã‚·ãƒ¼ã‚’æ›´æ–°ã—ã¦ã„る。 -message.disable.snapshot.policy=ã‚ãªãŸãŒæ­£å¸¸ã«ç¾åœ¨ã®ã‚¹ãƒŠãƒƒãƒ—ショットã®ãƒãƒªã‚·ãƒ¼ã‚’無効ã«ã—ã¦ã„る。 -message.action.change.service.warning=ã‚ãªãŸã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã¯ã€ç¾åœ¨ã®ã‚µãƒ¼ãƒ“ã‚¹ã®æä¾›ã‚’å¤‰æ›´ã™ã‚‹å‰ã«åœæ­¢ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ -message.action.reset.password.warning=ã‚ãªãŸã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã¯ã€ãã®ç¾åœ¨ã®ãƒ‘スワードを変更ã—よã†ã¨ã™ã‚‹å‰ã«åœæ­¢ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ -message.action.reset.password.off=ã‚ãªãŸã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã¯ã€ç¾åœ¨ã“ã®æ©Ÿèƒ½ã‚’サãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“。 +message.apply.snapshot.policy=ç¾åœ¨ã®ã‚¹ãƒŠãƒƒãƒ—ショットã®ãƒãƒªã‚·ãƒ¼ã‚’æ›´æ–°ã—ã¾ã—ãŸã€‚ +message.disable.snapshot.policy=ç¾åœ¨ã®ã‚¹ãƒŠãƒƒãƒ—ショットã®ãƒãƒªã‚·ãƒ¼ã‚’無効ã«ã—ã¾ã—ãŸã€‚ +message.action.change.service.warning=ã‚µãƒ¼ãƒ“ã‚¹ã®æä¾›ã‚’å¤‰æ›´ã™ã‚‹å‰ã«ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã‚’åœæ­¢ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ +message.action.reset.password.warning=パスワードを変更ã™ã‚‹å‰ã«ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã‚’åœæ­¢ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ +message.action.reset.password.off=インスタンスã¯ã“ã®æ©Ÿèƒ½ã‚’サãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“。 #Errors error.login=ユーザå/パスワードãŒè¨˜éŒ²ã¨ä¸€è‡´ã—ã¾ã›ã‚“ diff --git a/client/WEB-INF/classes/resources/messages_zh_CN.properties b/client/WEB-INF/classes/resources/messages_zh_CN.properties index fe14c600332..7827a075f4b 100644 --- a/client/WEB-INF/classes/resources/messages_zh_CN.properties +++ b/client/WEB-INF/classes/resources/messages_zh_CN.properties @@ -2,17 +2,46 @@ -#Labels -label.default.use=默认使用 +#Labels +image.directory=图片目录 + +label.action.create.template.from.vm=åˆ›å»ºè™šæ‹Ÿæœºæ¨¡æ¿ +label.action.create.template.from.volume=从å·åˆ›å»ºæ¨¡æ¿ + +message.vm.create.template.confirm=创建模æ¿ä¼šè‡ªåЍ釿–°å¯åŠ¨è™šæ‹Ÿæœºã€‚ + +label.action.manage.cluster=管ç†ç¾¤é›† +message.action.manage.cluster=请确认您è¦ç®¡ç†çš„群集。 +label.action.manage.cluster.processing=管ç†ç¾¤é›†.... + +label.action.unmanage.cluster=å–æ¶ˆç®¡ç†ç¾¤é›† +message.action.unmanage.cluster=请确认您è¦å–消管ç†ç¾¤é›†ã€‚ +label.action.unmanage.cluster.processing=å–æ¶ˆç®¡ç†ç¾¤é›†.... + +allocation.state=分é…çŠ¶æ€ +managed.state=管ç†çŠ¶æ€ + +label.default.use=默认使用 label.host.tags=主机标签 -label.storage.tags=存储标签 + label.cidr=CIDR label.cidr.list=æ ¹æº CIDR +label.storage.tags=存储标签 + +label.redundant.router=冗余路由器 +label.is.redundant.router=冗余 + force.delete=力删除 force.delete.domain.warning=警告:选择此选项将导致所有å­åŸŸå’Œæ‰€æœ‰ç›¸å…³çš„叿ˆ·å’Œèµ„æºåˆ é™¤ã€‚ +force.remove=强行移走 +force.remove.host.warning=警告:选择此选项将导致CloudStack强行删除此之å‰åœæ­¢ä»Žç¾¤é›†ä¸»æœºä¸Šçš„æ‰€æœ‰æ­£åœ¨è¿è¡Œçš„虚拟机。 + +force.stop=å¼ºåˆ¶åœæ­¢ +force.stop.instance.warning=è­¦å‘Šï¼šå¼ºåˆ¶åœæ­¢åœ¨è¿™ç§æƒ…况下应该是你最åŽçš„选择。它å¯ä»¥å¯¼è‡´æ•°æ®ä¸¢å¤±ï¼Œä»¥åŠè™šæ‹Ÿæœºçš„状æ€ä¸ä¸€è‡´çš„行为。请与系统管ç†å‘˜æŒ‡å—或Cloud.com支æ´ä¸Žé¡¾é—®åœ¨æ‰§è¡Œæ­¤å‘½ä»¤ã€‚ + label.PreSetup=PreSetup label.SR.name=简å称标签 label.SharedMountPoint = SharedMountPoint From 0ee45261e7e4b2f6a42e3e054923ec41aa294360 Mon Sep 17 00:00:00 2001 From: Chiradeep Vittal Date: Wed, 27 Jul 2011 16:00:59 -0700 Subject: [PATCH 12/72] set a flag so that api clients know whether to use the elb api --- .../com/cloud/api/commands/ListCapabilitiesCmd.java | 1 + .../com/cloud/api/response/CapabilitiesResponse.java | 12 ++++++++++++ server/src/com/cloud/configuration/Config.java | 4 ++++ .../src/com/cloud/server/ManagementServerImpl.java | 4 ++++ 4 files changed, 21 insertions(+) diff --git a/api/src/com/cloud/api/commands/ListCapabilitiesCmd.java b/api/src/com/cloud/api/commands/ListCapabilitiesCmd.java index 22d44848484..be9ad1b329d 100644 --- a/api/src/com/cloud/api/commands/ListCapabilitiesCmd.java +++ b/api/src/com/cloud/api/commands/ListCapabilitiesCmd.java @@ -49,6 +49,7 @@ public class ListCapabilitiesCmd extends BaseCmd { response.setSecurityGroupsEnabled((Boolean)capabilities.get("securityGroupsEnabled")); response.setCloudStackVersion((String)capabilities.get("cloudStackVersion")); response.setUserPublicTemplateEnabled((Boolean)capabilities.get("userPublicTemplateEnabled")); + response.setSupportELB((Boolean)capabilities.get("supportELB")); response.setObjectName("capability"); response.setResponseName(getCommandName()); this.setResponseObject(response); diff --git a/api/src/com/cloud/api/response/CapabilitiesResponse.java b/api/src/com/cloud/api/response/CapabilitiesResponse.java index 808770b3edc..33dd5145d29 100644 --- a/api/src/com/cloud/api/response/CapabilitiesResponse.java +++ b/api/src/com/cloud/api/response/CapabilitiesResponse.java @@ -30,6 +30,10 @@ public class CapabilitiesResponse extends BaseResponse { @SerializedName("userpublictemplateenabled") @Param(description="true if user and domain admins can set templates to be shared, false otherwise") private boolean userPublicTemplateEnabled; + + + @SerializedName("supportELB") @Param(description="true if region supports elastic load balancer on basic zones") + private boolean supportELB; public boolean getSecurityGroupsEnabled() { return securityGroupsEnabled; @@ -54,4 +58,12 @@ public class CapabilitiesResponse extends BaseResponse { public void setUserPublicTemplateEnabled(boolean userPublicTemplateEnabled) { this.userPublicTemplateEnabled = userPublicTemplateEnabled; } + + public void setSupportELB(boolean supportELB) { + this.supportELB = supportELB; + } + + public boolean isSupportELB() { + return supportELB; + } } diff --git a/server/src/com/cloud/configuration/Config.java b/server/src/com/cloud/configuration/Config.java index f80c90560b8..3bac354aede 100755 --- a/server/src/com/cloud/configuration/Config.java +++ b/server/src/com/cloud/configuration/Config.java @@ -171,6 +171,10 @@ public enum Config { UseUserConcentratedPodAllocation("Advanced", ManagementServer.class, Boolean.class, "use.user.concentrated.pod.allocation", "true", "If true, deployment planner applies the user concentration heuristic during VM resource allocation", "true,false"), HostCapacityTypeToOrderClusters("Advanced", ManagementServer.class, String.class, "host.capacityType.to.order.clusters", "CPU", "The host capacity type (CPU or RAM) is used by deployment planner to order clusters during VM resource allocation", "CPU,RAM"), EndpointeUrl("Advanced", ManagementServer.class, String.class, "endpointe.url", "http://localhost:8080/client/api", "Endpointe Url", "The endpoint callback URL"), + ElasticLoadBalancerEnabled("Advanced", ManagementServer.class, String.class, "network.loadbalancer.basiczone.elb.enabled", "true", "Whether the load balancing service is enabled for basic zones", "true,false"), + ElasticLoadBalancerNetwork("Advanced", ManagementServer.class, String.class, "network.loadbalancer.basiczone.elb.network", "guest", "Whether the elastic load balancing service public ips are taken from the public or guest network", "guest,public"), + + // XenServer VmAllocationAlgorithm("Advanced", ManagementServer.class, String.class, "vm.allocation.algorithm", "random", "If 'random', hosts within a pod will be randomly considered for VM/volume allocation. If 'firstfit', they will be considered on a first-fit basis.", null), diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index 04c53d278d5..f0b9cc07520 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -4179,9 +4179,12 @@ public class ManagementServerImpl implements ManagementServer { Map capabilities = new HashMap(); boolean securityGroupsEnabled = false; + boolean elasticLoadBalancerEnabled = false; List dc = _dcDao.listSecurityGroupEnabledZones(); if (dc != null && !dc.isEmpty()) { securityGroupsEnabled = true; + String elbEnabled = _configDao.getValue(Config.ElasticLoadBalancerEnabled.key()); + elasticLoadBalancerEnabled = elbEnabled==null?false:Boolean.parseBoolean(elbEnabled); } String userPublicTemplateEnabled = _configs.get(Config.AllowPublicUserTemplates.key()); @@ -4189,6 +4192,7 @@ public class ManagementServerImpl implements ManagementServer { capabilities.put("securityGroupsEnabled", securityGroupsEnabled); capabilities.put("userPublicTemplateEnabled", (userPublicTemplateEnabled == null || userPublicTemplateEnabled.equals("false") ? false : true)); capabilities.put("cloudStackVersion", getVersion()); + capabilities.put("supportELB", elasticLoadBalancerEnabled); return capabilities; } From 37fc68bcd309e5184b483aa637b2665141fb2d2a Mon Sep 17 00:00:00 2001 From: frank Date: Wed, 27 Jul 2011 17:32:12 -0700 Subject: [PATCH 13/72] Bug 10860 - PremiumUpgrade is not run when upgrading to 2.2.8 Use a new target "system-integrity-checker" in components.xml/components-premium.xml. All checkers must be explicitly specified in XML file, they will execute before any components load status 10860: resolved fixed --- .../AgentComponentLibraryBase.java | 6 --- client/tomcatconf/components.xml.in | 7 ++- .../cloud/cluster/ManagementServerNode.java | 3 ++ .../ConfigurationCompoentLibrary.java | 47 ------------------- .../DefaultComponentLibrary.java | 9 ---- .../cloud/servlet/CloudStartupServlet.java | 10 ++-- .../cloud/upgrade/DatabaseUpgradeChecker.java | 3 ++ .../utils/component/ComponentLibrary.java | 9 +--- .../utils/component/ComponentLocator.java | 39 ++++++++++----- .../component/SystemIntegrityChecker.java | 2 + .../utils/component/MockComponentLocator.java | 13 ++--- 11 files changed, 55 insertions(+), 93 deletions(-) mode change 100644 => 100755 agent/src/com/cloud/agent/configuration/AgentComponentLibraryBase.java mode change 100644 => 100755 server/src/com/cloud/cluster/ManagementServerNode.java delete mode 100644 server/src/com/cloud/configuration/ConfigurationCompoentLibrary.java mode change 100644 => 100755 server/src/com/cloud/configuration/DefaultComponentLibrary.java mode change 100644 => 100755 server/src/com/cloud/servlet/CloudStartupServlet.java mode change 100644 => 100755 server/src/com/cloud/upgrade/DatabaseUpgradeChecker.java mode change 100644 => 100755 utils/src/com/cloud/utils/component/ComponentLibrary.java mode change 100644 => 100755 utils/src/com/cloud/utils/component/SystemIntegrityChecker.java mode change 100644 => 100755 utils/test/com/cloud/utils/component/MockComponentLocator.java diff --git a/agent/src/com/cloud/agent/configuration/AgentComponentLibraryBase.java b/agent/src/com/cloud/agent/configuration/AgentComponentLibraryBase.java old mode 100644 new mode 100755 index c7df72d4208..31e0f95145c --- a/agent/src/com/cloud/agent/configuration/AgentComponentLibraryBase.java +++ b/agent/src/com/cloud/agent/configuration/AgentComponentLibraryBase.java @@ -30,12 +30,6 @@ import com.cloud.utils.db.GenericDao; public class AgentComponentLibraryBase extends ComponentLibraryBase { - - @Override - public List getSystemIntegrityCheckers() { - return null; - } - @Override public Map>> getDaos() { return null; diff --git a/client/tomcatconf/components.xml.in b/client/tomcatconf/components.xml.in index b83b8df2beb..2d30f2c0730 100755 --- a/client/tomcatconf/components.xml.in +++ b/client/tomcatconf/components.xml.in @@ -23,6 +23,11 @@ documented, please contact the author. --> + + + + + @@ -101,7 +106,7 @@ - + false diff --git a/server/src/com/cloud/cluster/ManagementServerNode.java b/server/src/com/cloud/cluster/ManagementServerNode.java old mode 100644 new mode 100755 index bb04fead6d0..8a47f2a4e5e --- a/server/src/com/cloud/cluster/ManagementServerNode.java +++ b/server/src/com/cloud/cluster/ManagementServerNode.java @@ -17,10 +17,13 @@ */ package com.cloud.cluster; +import javax.ejb.Local; + import com.cloud.utils.component.SystemIntegrityChecker; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.net.MacAddress; +@Local(value = {SystemIntegrityChecker.class}) public class ManagementServerNode implements SystemIntegrityChecker { private static final long s_nodeId = MacAddress.getMacAddress().toLong(); diff --git a/server/src/com/cloud/configuration/ConfigurationCompoentLibrary.java b/server/src/com/cloud/configuration/ConfigurationCompoentLibrary.java deleted file mode 100644 index 5d1b0cb07ec..00000000000 --- a/server/src/com/cloud/configuration/ConfigurationCompoentLibrary.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.cloud.configuration; - -import java.io.Serializable; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -import com.cloud.upgrade.DatabaseUpgradeChecker; -import com.cloud.utils.component.Adapter; -import com.cloud.utils.component.ComponentLibraryBase; -import com.cloud.utils.component.Manager; -import com.cloud.utils.component.SystemIntegrityChecker; -import com.cloud.utils.component.ComponentLocator.ComponentInfo; -import com.cloud.utils.db.GenericDao; - -public class ConfigurationCompoentLibrary extends ComponentLibraryBase { - - @Override - public List getSystemIntegrityCheckers() { - ArrayList checkers = new ArrayList(); - checkers.add(new DatabaseUpgradeChecker()); - return checkers; - } - - @Override - public Map>> getDaos() { - return new LinkedHashMap>>(0); - } - - @Override - public Map> getManagers() { - return new LinkedHashMap>(0); - } - - @Override - public Map>> getAdapters() { - return new LinkedHashMap>>(0); - } - - @Override - public Map, Class> getFactories() { - return new HashMap, Class>(0); - } - -} diff --git a/server/src/com/cloud/configuration/DefaultComponentLibrary.java b/server/src/com/cloud/configuration/DefaultComponentLibrary.java old mode 100644 new mode 100755 index eb2a0783b73..83c4e4370a4 --- a/server/src/com/cloud/configuration/DefaultComponentLibrary.java +++ b/server/src/com/cloud/configuration/DefaultComponentLibrary.java @@ -159,15 +159,6 @@ import com.cloud.vm.dao.UserVmDetailsDaoImpl; import com.cloud.vm.dao.VMInstanceDaoImpl; public class DefaultComponentLibrary extends ComponentLibraryBase implements ComponentLibrary { - - @Override - public List getSystemIntegrityCheckers() { - ArrayList checkers = new ArrayList(); - checkers.add(new ManagementServerNode()); - checkers.add(new DatabaseUpgradeChecker()); - return checkers; - } - protected void populateDaos() { addDao("StackMaidDao", StackMaidDaoImpl.class); addDao("VMTemplateZoneDao", VMTemplateZoneDaoImpl.class); diff --git a/server/src/com/cloud/servlet/CloudStartupServlet.java b/server/src/com/cloud/servlet/CloudStartupServlet.java old mode 100644 new mode 100755 index ab43b8c2d5f..dbb65fb988a --- a/server/src/com/cloud/servlet/CloudStartupServlet.java +++ b/server/src/com/cloud/servlet/CloudStartupServlet.java @@ -29,6 +29,8 @@ import com.cloud.server.ConfigurationServer; import com.cloud.server.ManagementServer; import com.cloud.utils.SerialVersionUID; import com.cloud.utils.component.ComponentLocator; +import com.cloud.utils.component.SystemIntegrityChecker; + import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; @@ -40,9 +42,11 @@ public class CloudStartupServlet extends HttpServlet implements ServletContextLi protected static ComponentLocator s_locator; @Override - public void init() throws ServletException { - // Save Configuration Values - //ComponentLocator loc = ComponentLocator.getLocator(ConfigurationServer.Name); + public void init() throws ServletException { + /* System Integrity checker will run before all components really loaded */ + ComponentLocator.getComponent(SystemIntegrityChecker.Name); + // Save Configuration Values + //ComponentLocator loc = ComponentLocator.getLocator(ConfigurationServer.Name); ConfigurationServer c = (ConfigurationServer)ComponentLocator.getComponent(ConfigurationServer.Name); //ConfigurationServer c = new ConfigurationServerImpl(); try { diff --git a/server/src/com/cloud/upgrade/DatabaseUpgradeChecker.java b/server/src/com/cloud/upgrade/DatabaseUpgradeChecker.java old mode 100644 new mode 100755 index 56e53ae3eed..967eb5de832 --- a/server/src/com/cloud/upgrade/DatabaseUpgradeChecker.java +++ b/server/src/com/cloud/upgrade/DatabaseUpgradeChecker.java @@ -31,6 +31,8 @@ import java.util.HashMap; import java.util.List; import java.util.TreeMap; +import javax.ejb.Local; + import org.apache.log4j.Logger; import com.cloud.cluster.ClusterManagerImpl; @@ -58,6 +60,7 @@ import com.cloud.utils.db.ScriptRunner; import com.cloud.utils.db.Transaction; import com.cloud.utils.exception.CloudRuntimeException; +@Local(value = {SystemIntegrityChecker.class}) public class DatabaseUpgradeChecker implements SystemIntegrityChecker { private final Logger s_logger = Logger.getLogger(DatabaseUpgradeChecker.class); diff --git a/utils/src/com/cloud/utils/component/ComponentLibrary.java b/utils/src/com/cloud/utils/component/ComponentLibrary.java old mode 100644 new mode 100755 index e6b91e5b539..18aed723996 --- a/utils/src/com/cloud/utils/component/ComponentLibrary.java +++ b/utils/src/com/cloud/utils/component/ComponentLibrary.java @@ -33,14 +33,7 @@ import com.cloud.utils.db.GenericDao; * within the components.xml overrides the one within ComponentLibrary. * */ -public interface ComponentLibrary { - /** - * @return a list of SytemIntegrityCheckers which is run before other - * components are started to check if the system are fit to check - * the system. - */ - List getSystemIntegrityCheckers(); - +public interface ComponentLibrary { /** * @return all of the daos */ diff --git a/utils/src/com/cloud/utils/component/ComponentLocator.java b/utils/src/com/cloud/utils/component/ComponentLocator.java index 8ac6dcc8eba..73060907722 100755 --- a/utils/src/com/cloud/utils/component/ComponentLocator.java +++ b/utils/src/com/cloud/utils/component/ComponentLocator.java @@ -94,6 +94,7 @@ public class ComponentLocator implements ComponentLocatorMBean { protected HashMap> _adapterMap; protected HashMap> _managerMap; + protected HashMap> _checkerMap; protected LinkedHashMap>> _daoMap; protected String _serverName; protected Object _component; @@ -123,12 +124,13 @@ public class ComponentLocator implements ComponentLocatorMBean { return getLocatorName(); } - protected Ternary>>, List> parse2(String filename) { + protected Pair>>> parse2(String filename) { try { SAXParserFactory spfactory = SAXParserFactory.newInstance(); SAXParser saxParser = spfactory.newSAXParser(); _daoMap = new LinkedHashMap>>(); _managerMap = new LinkedHashMap>(); + _checkerMap = new HashMap>(); _adapterMap = new HashMap>(); _factories = new HashMap, Class>(); File file = PropertiesUtil.findConfigFile(filename); @@ -157,7 +159,6 @@ public class ComponentLocator implements ComponentLocatorMBean { } ComponentLibrary library = null; - List checkers = null; if (handler.library != null) { Class clazz = Class.forName(handler.library); library = (ComponentLibrary)clazz.newInstance(); @@ -165,15 +166,14 @@ public class ComponentLocator implements ComponentLocatorMBean { _managerMap.putAll(library.getManagers()); adapters.putAll(library.getAdapters()); _factories.putAll(library.getFactories()); - checkers = library.getSystemIntegrityCheckers(); } _daoMap.putAll(handler.daos); _managerMap.putAll(handler.managers); + _checkerMap.putAll(handler.checkers); adapters.putAll(handler.adapters); - return new Ternary>>, List>(handler, adapters, checkers); - + return new Pair>>>(handler, adapters); } catch (ParserConfigurationException e) { s_logger.error("Unable to load " + _serverName + " due to errors while parsing " + filename, e); System.exit(1); @@ -194,7 +194,7 @@ public class ComponentLocator implements ComponentLocatorMBean { } protected void parse(String filename) { - Ternary>>, List> result = parse2(filename); + Pair>>> result = parse2(filename); if (result == null) { s_logger.info("Skipping configuration using " + filename); return; @@ -203,11 +203,7 @@ public class ComponentLocator implements ComponentLocatorMBean { XmlHandler handler = result.first(); HashMap>> adapters = result.second(); try { - if (result.third() != null) { - for (SystemIntegrityChecker checker : result.third()) { - checker.check(); - } - } + runCheckers(); startDaos(); // daos should not be using managers and adapters. instantiateAdapters(adapters); instantiateManagers(); @@ -227,6 +223,19 @@ public class ComponentLocator implements ComponentLocatorMBean { } } + protected void runCheckers() { + Set>> entries = _checkerMap.entrySet(); + for (Map.Entry> entry : entries) { + ComponentInfo info = entry.getValue(); + try { + info.instance = (SystemIntegrityChecker)createInstance(info.clazz, false, info.singleton); + info.instance.check(); + } catch (Exception e) { + s_logger.error("Problems with running checker:" + info.name, e); + System.exit(1); + } + } + } /** * Daos should not refer to any other components so it is safe to start them * here. @@ -848,6 +857,7 @@ public class ComponentLocator implements ComponentLocatorMBean { protected class XmlHandler extends DefaultHandler { public HashMap>> adapters; public HashMap> managers; + public HashMap> checkers; public LinkedHashMap>> daos; public String parent; public String library; @@ -865,6 +875,7 @@ public class ComponentLocator implements ComponentLocatorMBean { parse = false; adapters = new HashMap>>(); managers = new HashMap>(); + checkers = new HashMap>(); daos = new LinkedHashMap>>(); value = null; parent = null; @@ -966,6 +977,12 @@ public class ComponentLocator implements ComponentLocatorMBean { daos.put(key, info); } currentInfo = info; + } else if (qName.equals("checker")) { + ComponentInfo info = new ComponentInfo(); + fillInfo(atts, SystemIntegrityChecker.class, info); + checkers.put(info.name, info); + s_logger.info("Adding system integrity checker: " + info.name); + currentInfo = info; } else { // ignore } diff --git a/utils/src/com/cloud/utils/component/SystemIntegrityChecker.java b/utils/src/com/cloud/utils/component/SystemIntegrityChecker.java old mode 100644 new mode 100755 index c0a6275f4db..95af731e145 --- a/utils/src/com/cloud/utils/component/SystemIntegrityChecker.java +++ b/utils/src/com/cloud/utils/component/SystemIntegrityChecker.java @@ -24,5 +24,7 @@ package com.cloud.utils.component; * database upgrades and other verification to make sure it works. */ public interface SystemIntegrityChecker { + public static final String Name = "system-integrity-checker"; + void check(); } diff --git a/utils/test/com/cloud/utils/component/MockComponentLocator.java b/utils/test/com/cloud/utils/component/MockComponentLocator.java old mode 100644 new mode 100755 index 2e74bdbe7fc..a74b3833bd2 --- a/utils/test/com/cloud/utils/component/MockComponentLocator.java +++ b/utils/test/com/cloud/utils/component/MockComponentLocator.java @@ -29,6 +29,7 @@ import net.sf.cglib.proxy.NoOp; import com.cloud.utils.Pair; import com.cloud.utils.Ternary; +import com.cloud.utils.component.ComponentLocator.ComponentInfo; import com.cloud.utils.db.DatabaseCallback; import com.cloud.utils.db.DatabaseCallbackFilter; import com.cloud.utils.db.GenericDao; @@ -62,10 +63,11 @@ public class MockComponentLocator extends ComponentLocator { } @Override - protected Ternary>>, List> parse2(String filename) { - Ternary>>, List> result = new Ternary>>, List>(new XmlHandler("fake"), new HashMap>>(), new ArrayList()); + protected Pair>>> parse2(String filename) { + Pair>>> result = new Pair>>>(new XmlHandler("fake"), new HashMap>>()); _daoMap = new LinkedHashMap>>(); _managerMap = new LinkedHashMap>(); + _checkerMap = new HashMap>(); _adapterMap = new HashMap>(); _factories = new HashMap, Class>(); _daoMap.putAll(_library.getDaos()); @@ -88,12 +90,7 @@ public class MockComponentLocator extends ComponentLocator { } protected class MockComponentLibrary extends ComponentLibraryBase implements ComponentLibrary { - - @Override - public List getSystemIntegrityCheckers() { - return new ArrayList(); - } - + @Override public Map>> getAdapters() { return _adapters; From 2abb9824699c9c750a82f70e84976074b349af8d Mon Sep 17 00:00:00 2001 From: Jessica Wang Date: Wed, 27 Jul 2011 19:36:29 -0700 Subject: [PATCH 14/72] cloudStack - add new localization labels. --- client/WEB-INF/classes/resources/messages.properties | 2 ++ client/WEB-INF/classes/resources/messages_es.properties | 2 ++ client/WEB-INF/classes/resources/messages_ja.properties | 2 ++ client/WEB-INF/classes/resources/messages_zh_CN.properties | 2 ++ 4 files changed, 8 insertions(+) diff --git a/client/WEB-INF/classes/resources/messages.properties b/client/WEB-INF/classes/resources/messages.properties index 929d752b411..5b60938ca4b 100644 --- a/client/WEB-INF/classes/resources/messages.properties +++ b/client/WEB-INF/classes/resources/messages.properties @@ -42,6 +42,8 @@ force.remove.host.warning=Warning: Choosing this option will cause CloudStack to force.stop=Force Stop force.stop.instance.warning=Warning: Forcing a stop on this instance should be your last option. It can lead to data loss as well as inconsistent behavior of the virtual machine's state. Please consult with the Administrator Guide or Cloud.com Support before executing this command. +label.add.load.balancer.and.ip=Add Load Balancer and IP + label.PreSetup=PreSetup label.SR.name = SR Name-Label label.SharedMountPoint=SharedMountPoint diff --git a/client/WEB-INF/classes/resources/messages_es.properties b/client/WEB-INF/classes/resources/messages_es.properties index 0895551cf0c..aff411f91de 100644 --- a/client/WEB-INF/classes/resources/messages_es.properties +++ b/client/WEB-INF/classes/resources/messages_es.properties @@ -42,6 +42,8 @@ force.remove.host.warning=Advertencia: Si elige esta opción, CloudStack para de force.stop=Grupo de Alto force.stop.instance.warning=Advertencia: Obligar a una parada en este caso debería ser su última opción. Puede conducir a la pérdida de datos, así como un comportamiento incoherente del estado de la máquina virtual. Por favor, consulte con la Guía del administrador o al Cloud.com antes de ejecutar este comando. +label.add.load.balancer.and.ip=Añadir el equilibrador de carga y de propiedad intelectual + label.PreSetup=PreSetup label.SR.name = SR Nombre de etiqueta label.SharedMountPoint = SharedMountPoint diff --git a/client/WEB-INF/classes/resources/messages_ja.properties b/client/WEB-INF/classes/resources/messages_ja.properties index 23cbf984189..b125ea50795 100644 --- a/client/WEB-INF/classes/resources/messages_ja.properties +++ b/client/WEB-INF/classes/resources/messages_ja.properties @@ -42,6 +42,8 @@ force.remove.host.warning=警告:ã“ã®ã‚ªãƒ—ã‚·ãƒ§ãƒ³ã‚’é¸æŠžã™ã‚‹ã¨ã€å®Ÿ force.stop=å¼·åˆ¶åœæ­¢ force.stop.instance.warning=警告:ã“ã®ã‚ªãƒ—ションã¯ä»–ã«é¸æŠžè‚¢ãŒç„¡ã„å ´åˆã«é¸æŠžã—ã¦ãã ã•ã„。インスタンスã®å¼·åˆ¶åœæ­¢ã¯ãƒ‡ãƒ¼ã‚¿ã®æå¤±ã ã‘ã§ãªãã€ä»®æƒ³ãƒžã‚·ãƒ³ã®çŠ¶æ…‹ã®ä¸€è²«æ€§ã‚’失ã†äº‹ãŒã‚りã¾ã™ã€‚ã“ã®æ“作を行ã†å‰ã«ã€ç®¡ç†è€…ガイドをå‚ç…§ã•れるã‹ã€ã¾ãŸã¯Cloud.comサãƒãƒ¼ãƒˆã«ã”連絡ãã ã•ã„。 +label.add.load.balancer.and.ip=ロードãƒãƒ©ãƒ³ã‚µã¨IPを追加ã—ã¾ã™ã€‚ + label.PreSetup=PreSetup label.SR.name=SRå-ラベル label.SharedMountPoint = SharedMountPoint diff --git a/client/WEB-INF/classes/resources/messages_zh_CN.properties b/client/WEB-INF/classes/resources/messages_zh_CN.properties index 7827a075f4b..9404b82d969 100644 --- a/client/WEB-INF/classes/resources/messages_zh_CN.properties +++ b/client/WEB-INF/classes/resources/messages_zh_CN.properties @@ -42,6 +42,8 @@ force.remove.host.warning=警告:选择此选项将导致CloudStack强行删 force.stop=å¼ºåˆ¶åœæ­¢ force.stop.instance.warning=è­¦å‘Šï¼šå¼ºåˆ¶åœæ­¢åœ¨è¿™ç§æƒ…况下应该是你最åŽçš„选择。它å¯ä»¥å¯¼è‡´æ•°æ®ä¸¢å¤±ï¼Œä»¥åŠè™šæ‹Ÿæœºçš„状æ€ä¸ä¸€è‡´çš„行为。请与系统管ç†å‘˜æŒ‡å—或Cloud.com支æ´ä¸Žé¡¾é—®åœ¨æ‰§è¡Œæ­¤å‘½ä»¤ã€‚ +label.add.load.balancer.and.ip=添加负载平衡器和IP + label.PreSetup=PreSetup label.SR.name=简å称标签 label.SharedMountPoint = SharedMountPoint From b999980ce85457a276bf0cda085c8dae9e0e8aaa Mon Sep 17 00:00:00 2001 From: Jessica Wang Date: Wed, 27 Jul 2011 19:41:28 -0700 Subject: [PATCH 15/72] cloudStack - Elastic Load Balancer feature - if listCapabilities returns supportELB as true, hide Acquire IP button and show Add Load Balancer and IP button on IP Address page. Clicking Add Load Balancer and IP button will pop up a dialog containing zone dropdown (populated with basic zones), name, public port, private port, algorithm dropdown. --- ui/jsp/ipaddress.jsp | 48 ++ ui/scripts/cloud.core.init.js | 4 +- ui/scripts/cloud.core.ipaddress.js | 745 +++++++++++++++++------------ ui/scripts/cloud.core.js | 4 +- 4 files changed, 480 insertions(+), 321 deletions(-) diff --git a/ui/jsp/ipaddress.jsp b/ui/jsp/ipaddress.jsp index dc8e2a85770..14711f57bfe 100644 --- a/ui/jsp/ipaddress.jsp +++ b/ui/jsp/ipaddress.jsp @@ -486,6 +486,15 @@ dictionary = { + + @@ -772,6 +781,45 @@ dictionary = { + + @@ -781,7 +781,7 @@ dictionary = { -